pax_global_header00006660000000000000000000000064121453574410014520gustar00rootroot0000000000000052 comment=cc0c44f36bd6eff7d80f4c4380d1e3c943bfa11a fish/000077500000000000000000000000001214535744100120155ustar00rootroot00000000000000fish/CHANGELOG000066400000000000000000000002151214535744100132250ustar00rootroot0000000000000024-01-2012 Jan Kanis * Added a changelog file * removed unescaping if the 'commandline' builtin is called without the -o (tokenise) flag fish/Doxyfile000066400000000000000000001320321214535744100135240ustar00rootroot00000000000000# Doxyfile 1.3.9.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = fish # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. SHOW_DIRECTORIES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h *.c # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = print_help.c xdgmimealias.c xdgmimealias.h xdgmime.c xdgmimeglob.c xdgmimeglob.h xdgmime.h xdgmimeint.c xdgmimeint.h xdgmimemagic.c xdgmimemagic.h xdgmimeparent.c xdgmimeparent.h # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = NO # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO fish/Doxyfile.help000066400000000000000000001341241214535744100144570ustar00rootroot00000000000000# Doxyfile 1.3.9.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = fish # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @PACKAGE_VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = help_doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. SHOW_DIRECTORIES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = doc_src # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.doxygen # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = NO # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .1 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = YES #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO fish/Doxyfile.user000066400000000000000000000106761214535744100145120ustar00rootroot00000000000000PROJECT_NAME = fish PROJECT_NUMBER = 1 OUTPUT_DIRECTORY = user_doc CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = YES ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = YES QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = INPUT = FILE_PATTERNS = doc.h RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = user_doc.head.html HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = YES ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = NO COLLABORATION_GRAPH = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = NO INCLUDED_BY_GRAPH = YES CALL_GRAPH = YES GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 750 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 0 GENERATE_LEGEND = YES DOT_CLEANUP = YES SEARCHENGINE = NO fish/Makefile.in000066400000000000000000000724241214535744100140730ustar00rootroot00000000000000 # Copyright (C) 2005-2006 Axel Liljencrantz # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # 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 # binary distributions in tar.bz2, tar.gz and rpm formats. # # # The fish buildprocess is quite complex. Do not stare directly into # the Makefile. Doing so may cause nausea, dizziness and # hallucinations. # # Used by docdir PACKAGE_TARNAME = @PACKAGE_TARNAME@ # # Programs # CXX := @CXX@ INSTALL:=@INSTALL@ # # Installation directories # prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ bindir = @bindir@ mandir = @mandir@ sysconfdir = @sysconfdir@ docdir = @docdir@ localedir = @localedir@ optbindirs = @optbindirs@ # # Various flags # MACROS = -DLOCALEDIR=\"$(localedir)\" -DPREFIX=L\"$(prefix)\" -DDATADIR=L\"$(datadir)\" -DSYSCONFDIR=L\"$(sysconfdir)\" -DBINDIR=L\"$(bindir)\" CXXFLAGS = @CXXFLAGS@ $(MACROS) $(EXTRA_CXXFLAGS) LDFLAGS = @LIBS@ @LDFLAGS@ LDFLAGS_FISH = ${LDFLAGS} @LIBS_FISH@ @LDFLAGS_FISH@ LDFLAGS_FISH_INDENT = ${LDFLAGS} @LIBS_FISH_INDENT@ LDFLAGS_FISH_PAGER = ${LDFLAGS} @LIBS_FISH_PAGER@ LDFLAGS_FISHD = ${LDFLAGS} @LIBS_FISHD@ LDFLAGS_MIMEDB = ${LDFLAGS} @LIBS_MIMEDB@ # # Set to 1 if we have gettext # HAVE_GETTEXT=@HAVE_GETTEXT@ # #Additional .cpp files used by common.o. These also have a corresponding #.h file. # COMMON_FILES := util.cpp fallback.cpp # # All objects that the system needs to build fish, except fish.o # FISH_OBJS := function.o builtin.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 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 parse_util.o common.o screen.o path.o autoload.o \ parser_keywords.o iothread.o color.o postfork.o \ builtin_test.o FISH_INDENT_OBJS := fish_indent.o print_help.o common.o \ parser_keywords.o wutil.o tokenizer.o # # Additional files used by builtin.o # BUILTIN_FILES := builtin_set.cpp builtin_commandline.cpp \ builtin_ulimit.cpp builtin_complete.cpp builtin_jobs.cpp \ builtin_set_color.cpp builtin_printf.cpp # # All objects that the system needs to build fish_pager # FISH_PAGER_OBJS := fish_pager.o output.o wutil.o \ input_common.o env_universal.o env_universal_common.o common.o \ print_help.o iothread.o color.o # # All objects that the system needs to build fish_tests # FISH_TESTS_OBJS := $(FISH_OBJS) fish_tests.o # # All objects that the system needs to build fishd # FISHD_OBJS := fishd.o env_universal_common.o wutil.o print_help.o \ common.o # # All objects needed to build mimedb # MIME_OBJS := mimedb.o print_help.o xdgmimealias.o xdgmime.o \ xdgmimeglob.o xdgmimeint.o xdgmimemagic.o xdgmimeparent.o wutil.o \ common.o # # Files containing user documentation # # # These files are the source files, they contain a few @FOO@-style substitutions # HDR_FILES_SRC := doc_src/index.hdr.in doc_src/commands.hdr.in doc_src/design.hdr doc_src/license.hdr doc_src/faq.hdr # # These are the generated result files # HDR_FILES := $(HDR_FILES_SRC:.hdr.in=.hdr) # Use a pattern rule so that Make knows to only issue one invocation # per http://www.gnu.org/software/make/manual/make.html#Pattern-Intro # Internalized scripts are currently disabled. # For now, we just generate empty arrays. # To generate them again, you would run this: # ./internalize_scripts.py share/functions/*.fish share/completions/*.fish # # Files containing documentation for external commands. # HELP_SRC := $(wildcard doc_src/*.txt) # # Files in the test directory # TEST_IN := $(wildcard tests/test*.in) # # Files that should be added to the tar archives # # # Files in ./doc_src/ # DOC_SRC_DIR_FILES := $(HDR_FILES_SRC) $(HELP_SRC) # # Files in ./ # MAIN_DIR_FILES_UNSORTED := Doxyfile Doxyfile.user Doxyfile.help \ Makefile.in configure configure.ac config.h.in install-sh \ key_reader.cpp $(MIME_OBJS:.o=.h) \ $(MIME_OBJS:.o=.cpp) $(FISH_OBJS:.o=.h) $(BUILTIN_FILES) \ $(COMMON_FILES) $(COMMON_FILES:.cpp=.h) $(FISH_OBJS:.o=.cpp) \ fish.spec.in INSTALL README user_doc.head.html \ ChangeLog config.sub config.guess fish_tests.cpp fish.cpp fish_pager.cpp \ fishd.cpp make_vcs_completions.fish $(FISH_INDENT_OBJS:.o=.cpp) # # The sorting is not meaningful in itself, but it has the side effect # of removing duplicates, which means there will be fewer warnings # during building. # MAIN_DIR_FILES := $(sort $(MAIN_DIR_FILES_UNSORTED)) # # Files in ./tests/ # TESTS_DIR_FILES := $(TEST_IN) $(TEST_IN:.in=.out) $(TEST_IN:.in=.err) \ $(TEST_IN:.in=.status) tests/test.fish tests/gen_output.fish # # Files in ./share/completions/ # COMPLETIONS_DIR_FILES := $(wildcard share/completions/*.fish) # # Files in ./share/functions/ # FUNCTIONS_DIR_FILES := $(wildcard share/functions/*.fish) # # Programs to install # PROGRAMS := fish mimedb fish_pager fishd fish_indent # # Manual pages to install # MANUALS := $(addsuffix .1, $(addprefix share/man/man1/, \ $(PROGRAMS))) # # All translation message catalogs # TRANSLATIONS_SRC := $(wildcard po/*.po) TRANSLATIONS := $(TRANSLATIONS_SRC:.po=.gmo) # # Make everything needed for installing fish # all: $(PROGRAMS) user_doc share/man $(TRANSLATIONS) @echo fish has now been built. @echo Use \'$(MAKE) install\' to install fish. .PHONY: all # # These dependencies make sure that autoconf and configure are run # when the source code for the build configuration has changed. # configure: configure.ac ./config.status --recheck Makefile: Makefile.in configure ./config.status # # Build fish with some debug flags specified. This is GCC specific, # and should only be used when debuging fish. # prof: EXTRA_CXXFLAGS += -pg prof: LDFLAGS += -pg prof: all .PHONY: prof # # User documentation, describing the features of the fish shell. # # Depend on the sources (*.hdr.in) and manually make the # intermediate *.hdr and doc.h files if needed # Allow doxygen to fail, e.g. if it does not exist user_doc: $(HDR_FILES_SRC) Doxyfile.user user_doc.head.html $(HELP_SRC) doc.h $(HDR_FILES) - (cat Doxyfile.user ; echo PROJECT_NUMBER=@PACKAGE_VERSION@) | doxygen - && touch user_doc # # Source code documentation. Also includes user documentation. # doc: *.h *.cpp doc.h Doxyfile (cat Doxyfile ; echo PROJECT_NUMBER=@PACKAGE_VERSION@) | doxygen - ; # # PDF version of the source code documentation. # doc/refman.pdf: doc cd doc/latex; make; mv refman.pdf ..; cd ../..; rm -r doc/latex; # # This target runs both the low level code tests and the high level script tests. # test: $(PROGRAMS) fish_tests ./fish_tests; cd tests; ../fish " >>command_list.tmp; \ cat $$i >>command_list.tmp; \ echo >>command_list.tmp; \ echo >>command_list.tmp; \ echo "Back to index". >>command_list.tmp; \ done mv command_list.tmp command_list.txt cat $@.in | awk '{if ($$0 ~ /@command_list@/){ system("cat command_list.txt");} else{ print $$0;}}' >$@ toc.txt: $(HDR_FILES:index.hdr=index.hdr.in) -rm toc.tmp $@ for i in $(HDR_FILES:index.hdr=index.hdr.in); do\ NAME=`basename $$i .hdr`; \ NAME=`basename $$NAME .hdr.in`; \ sed <$$i >>toc.tmp -n \ -e 's,.*\\page *\([^ ]*\) *\(.*\)$$,- \2,p' \ -e 's,.*\\section *\([^ ]*\) *\(.*\)$$, - \2,p'; \ done mv toc.tmp $@ doc_src/index.hdr: toc.txt doc_src/index.hdr.in cat $@.in | awk '{if ($$0 ~ /@toc@/){ system("cat toc.txt");} else{ print $$0;}}' >$@ # # doc.h is a compilation of the various snipptes of text used both for # the user documentation and for internal help functions into a single # file that can be parsed dy Doxygen to generate the user # documentation. # doc.h: $(HDR_FILES) cat $(HDR_FILES) >$@ # # This rule creates complete doxygen headers from each of the various # snipptes of text used both for the user documentation and for # internal help functions, that can be parsed to Doxygen to generate # the internal help function text. # %.doxygen:%.txt echo "/** \page " `basename $*` >$@; cat $*.txt >>$@; echo "*/" >>$@ %: %.in sed <$@.in >$@ \ -e "s,@sysconfdir\@,$(sysconfdir),g" \ -e "s,@datadir\@,$(datadir),g" \ -e "s,@docdir\@,$(docdir),g" \ -e "s|@configure_input\@|$@, generated from $@.in by the Makefile. DO NOT MANUALLY EDIT THIS FILE!|g" \ -e "s,@prefix\@,$(prefix),g" \ -e "s,@optbindirs\@,$(optbindirs),g" #-e "s,@\@,$()," # # Compile translation files to binary format # %.gmo: if test "$(HAVE_GETTEXT)" = 1; then \ msgfmt -o $*.gmo $*.po; \ fi # # Update existing po file or copy messages.pot # %.po:messages.pot if test $(HAVE_GETTEXT) = 1;then \ if test -f $*.po; then \ msgmerge -U --backup=existing $*.po messages.pot;\ else \ cp messages.pot $*.po;\ fi; \ fi # # Create a template translation object # messages.pot: *.cpp *.h share/completions/*.fish share/functions/*.fish if test $(HAVE_GETTEXT) = 1;then \ xgettext -k_ -kN_ *.cpp *.h -o messages.pot; \ if xgettext -j -k_ -kN_ -k--description -LShell share/completions/*.fish share/functions/*.fish -o messages.pot; then true; else \ echo "Your xgettext version is too old to build the messages.pot file"\ rm messages.pot\ false;\ fi; \ fi builtin.o: $(BUILTIN_FILES) common.o: $(COMMON_FILES) # # Generate the internal help functions by making doxygen create # man-pages. The convertion path looks like this: # # .txt file # || # (make) # || # \/ # .doxygen file # || # (doxygen) # || # \/ # roff file # || # (__fish_print_help) # || # \/ # formated text # with escape # sequences # # # There ought to be something simpler. # share/man: $(HELP_SRC) -mkdir share/man touch share/man -rm -Rf share/man/man1 ./build_tools/build_documentation.sh Doxyfile.help ./doc_src ./share # # The build rules for installing/uninstalling fish # # # Check for an incompatible installed fish version, and fail with an # error if found # check-uninstall: if test -f $(DESTDIR)$(sysconfdir)/fish.d/fish_function.fish -o -f $(DESTDIR)$(sysconfdir)/fish.d/fish_complete.fish; then \ echo;\ echo ERROR;\ echo;\ echo An older fish installation using an incompatible filesystem hierarchy was detected;\ echo You must uninstall this fish version before proceeding;\ echo type \'$(MAKE) uninstall-legacy\' to uninstall these files,;\ echo or type \'$(MAKE) force-install\' to force installation.;\ echo The latter may result in a broken installation.;\ echo;\ false;\ fi; if test -f $(DESTDIR)$(sysconfdir)/fish; then \ echo;\ echo ERROR;\ echo;\ echo An older fish installation using an incompatible filesystem hierarchy was detected;\ echo You must remove the file $(DESTDIR)$(sysconfdir)/fish before proceeding;\ echo type \'$(MAKE) uninstall-legacy\' to uninstall this file,;\ echo or remove it manually using \'rm $(DESTDIR)$(sysconfdir)/fish\'.;\ echo;\ false;\ fi; .PHONY: check-uninstall check-legacy-binaries: @SEQLOC=$(prefix)/bin/seq;\ if test -f "$$SEQLOC" && grep -q '\(^#!/.*/fish\|^#!/usr/bin/env fish\)' "$$SEQLOC"; then\ echo "An outdated seq from a previous fish install was found. You should remove it with:";\ echo " rm '$$SEQLOC'";\ fi; @SETCOLOR_LOC=$(prefix)/bin/set_color;\ if test -x "$$SETCOLOR_LOC" && $$SETCOLOR_LOC -v 2>&1 >/dev/null | grep -q "^set_color, version "; then\ echo "An outdated set_color from a previous fish install was found. You should remove it with:";\ echo " rm '$$SETCOLOR_LOC'";\ fi; @true; .PHONY: check-legacy-binaries # # This check makes sure that the install-sh script is executable. The # darcs repo doesn't preserve the executable bit, so this needs to be # run after checkout. # install-sh: if test -x $@; then true; else chmod 755 $@; fi .PHONY: install-sh # # Try to install after checking for incompatible installed versions. # install: all install-sh check-uninstall install-force check-legacy-binaries .PHONY: install # # Xcode install # xcode-install: rm -Rf /tmp/fish_build;\ xcodebuild install DSTROOT=/tmp/fish_build;\ ditto /tmp/fish_build / .PHONY: xcode-install # # Force installation, even in presense of incompatible previous # version. This may fail. # These 'true' lines are to prevent installs from failing for (e.g.) missing man pages. # install-force: all install-translations $(INSTALL) -m 755 -d $(DESTDIR)$(bindir) for i in $(PROGRAMS); do\ $(INSTALL) -m 755 $$i $(DESTDIR)$(bindir) ; \ true ;\ done; $(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)/fish $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/completions $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/functions $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/man/man1 $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools/web_config $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/tools/web_config/sample_prompts $(INSTALL) -m 644 etc/config.fish $(DESTDIR)$(sysconfdir)/fish/ $(INSTALL) -m 644 share/config.fish $(DESTDIR)$(datadir)/fish/ for i in $(COMPLETIONS_DIR_FILES:%='%'); do \ $(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/completions/; \ true; \ done; for i in $(FUNCTIONS_DIR_FILES:%='%'); do \ $(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/functions/; \ true; \ done; for i in share/man/man1/*.1; do \ $(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/man/man1/; \ true; \ done; for i in share/tools/*.py; do\ $(INSTALL) -m 755 $$i $(DESTDIR)$(datadir)/fish/tools/; \ true; \ done; for i in share/tools/web_config/*; do\ $(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/; \ true; \ done; for i in share/tools/web_config/sample_prompts/*.fish; do\ $(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/sample_prompts/; \ true; \ done; for i in share/tools/web_config/*.py; do\ $(INSTALL) -m 755 $$i $(DESTDIR)$(datadir)/fish/tools/web_config/; \ true; \ done; $(INSTALL) -m 755 -d $(DESTDIR)$(docdir) for i in user_doc/html/* ChangeLog; do \ if test -f $$i; then \ $(INSTALL) -m 644 $$i $(DESTDIR)$(docdir); \ fi; \ done; $(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man1 for i in $(MANUALS); do \ $(INSTALL) -m 644 $$i $(DESTDIR)$(mandir)/man1/; \ true; \ done; @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: @grep -q -- "$(DESTDIR)$(bindir)/fish" /etc/shells || echo \* add the line \'$(DESTDIR)$(bindir)/fish\' to the file \'/etc/shells\'. @echo \* use the command \'chsh -s $(DESTDIR)$(bindir)/fish\'. @echo @echo To set your colors, run \'fish_config\' @echo To scan your man pages for completions, run \'fish_update_completions\' @echo To autocomplete command suggestions press Ctrl + F or right arrow key. @echo @echo Have fun! .PHONY: install-force # # Uninstall this fish version # uninstall: uninstall-translations -for i in $(PROGRAMS); do \ rm -f $(DESTDIR)$(bindir)/$$i; \ done; -rm -rf $(DESTDIR)$(sysconfdir)/fish -if test -d $(DESTDIR)$(datadir)/fish; then \ rm -r $(DESTDIR)$(datadir)/fish; \ fi -if test -d $(DESTDIR)$(docdir); then \ rm -rf $(DESTDIR)$(docdir);\ fi -for i in $(MANUALS); do \ rm -rf $(DESTDIR)$(mandir)/man1/`basename $$i`*; \ done; .PHONY: uninstall # # Uninstall an older fish release. This is not the default uninstall # since there is a slight chance that it removes a file put in place by # the sysadmin. But if 'make install' detects a file confligt, it # suggests using this target. # uninstall-legacy: uninstall -rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_interactive.fish -rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_complete.fish -rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_function.fish -rm -f $(DESTDIR)$(sysconfdir)/fish/fish_inputrc -if test -d $(DESTDIR)$(sysconfdir)/fish.d/completions; then \ for i in $(COMPLETIONS_DIR_FILES); do \ basename=`basename $$i`; \ if test -f $(DESTDIR)$(sysconfdir)/fish.d/completions/$$basename; then \ rm $(DESTDIR)$(sysconfdir)/fish.d/completions/$$basename; \ fi; \ done; \ fi; -rmdir $(DESTDIR)$(sysconfdir)/fish.d/completions -rmdir $(DESTDIR)$(sysconfdir)/fish.d -rm $(DESTDIR)$(sysconfdir)/fish @echo The previous fish installation has been removed. .PHONY: uninstall-legacy 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;\ done; \ fi; .PHONY: install-translations uninstall-translations: if test $(HAVE_GETTEXT) = 1; then \ for i in $(TRANSLATIONS_SRC); do \ rm -f $(DESTDIR)$(datadir)/locale/*/LC_MESSAGES/fish.mo; \ done; \ fi .PHONY: uninstall-translations # # The build rules for all the commands # # # Build the fish program. # fish: $(FISH_OBJS) fish.o $(CXX) $(FISH_OBJS) fish.o $(LDFLAGS_FISH) -o $@ # # Build the fish_pager program. # fish_pager: $(FISH_PAGER_OBJS) $(CXX) $(FISH_PAGER_OBJS) $(LDFLAGS_FISH_PAGER) -o $@ # # Build the fishd program. # fishd: $(FISHD_OBJS) $(CXX) $(FISHD_OBJS) $(LDFLAGS_FISHD) -o $@ # # Build the fish_tests program. # fish_tests: $(FISH_TESTS_OBJS) $(CXX) $(FISH_TESTS_OBJS) $(LDFLAGS_FISH) -o $@ # # Build the mimedb program. # # mimedb does not need any libraries, so we don't use LDFLAGS here. # mimedb: $(MIME_OBJS) $(CXX) $(MIME_OBJS) $(LDFLAGS_MIMEDB) -o $@ # # Build the fish_indent program. # fish_indent: $(FISH_INDENT_OBJS) $(CXX) $(FISH_INDENT_OBJS) $(LDFLAGS_FISH_INDENT) -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 wutil.o iothread.o $(CXX) key_reader.o input_common.o common.o env_universal.o env_universal_common.o wutil.o iothread.o $(LDFLAGS_FISH) -o $@ # # Update dependencies # depend: makedepend -fMakefile.in -Y *.cpp ./config.status .PHONY: depend # # Make compressed tar archives # fish-@PACKAGE_VERSION@.tar.gz: fish-@PACKAGE_VERSION@.tar gzip -f --best -c fish-@PACKAGE_VERSION@.tar >fish-@PACKAGE_VERSION@.tar.gz fish-@PACKAGE_VERSION@.tar.bz2: fish-@PACKAGE_VERSION@.tar bzip2 -f --best -k fish-@PACKAGE_VERSION@.tar dist: fish-@PACKAGE_VERSION@.tar.bz2 .PHONY: dist # # Build the RPM spec file. # fish.spec: fish.spec.in ./config.status # # Create .rpm file for the current systems architecture and an # .src.rpm file. # rpm: fish-@PACKAGE_VERSION@.tar.bz2 fish.spec @if which rpmbuild; then true; else \ echo Could not find the rpmbuild command, needed to build an rpm; \ echo You may be able to install it using the following command:; \ echo \'yum install rpm-build\'; \ false; \ fi cp fish.spec /usr/src/redhat/SPECS/ cp fish-@PACKAGE_VERSION@.tar.bz2 /usr/src/redhat/SOURCES/ 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 should restore the tree to the state right after extracting a tarball. # distclean: clean rm -f fish.spec rm -f config.status config.log config.h Makefile .PHONY: distclean # # clean removes everything built by the makefile, but not things that # are created by the configure script. # # Don't delete the docs unless we have Doxygen installed # We provide pre-built docs in the tarball, and if they get # deleted we won't be able to regenerate them clean: rm -f *.o doc.h doc.tmp doc_src/*.doxygen doc_src/*.cpp doc_src/*.o doc_src/commands.hdr rm -f $(GENERATED_INTERN_SCRIPT_FILES) rm -f tests/tmp.err tests/tmp.out tests/tmp.status tests/foo.txt rm -f $(PROGRAMS) fish_tests key_reader rm -f command_list.txt toc.txt rm -f doc_src/index.hdr doc_src/commands.hdr rm -f fish-@PACKAGE_VERSION@.tar rm -f fish-@PACKAGE_VERSION@.tar.gz rm -f fish-@PACKAGE_VERSION@.tar.bz2 if command -v doxygen; then \ rm -rf doc user_doc share/man; \ fi rm -rf fish-@PACKAGE_VERSION@ rm -f $(TRANSLATIONS) .PHONY: clean # DO NOT DELETE THIS LINE -- make depend depends on it. autoload.o: config.h autoload.h common.h util.h lru.h wutil.h signal.h env.h autoload.o: exec.h proc.h io.h builtin.o: config.h signal.h fallback.h util.h wutil.h common.h builtin.h builtin.o: io.h function.h event.h complete.h proc.h parser.h reader.h env.h builtin.o: wgetopt.h sanity.h tokenizer.h wildcard.h expand.h input_common.h builtin.o: input.h intern.h exec.h highlight.h screen.h color.h parse_util.h builtin.o: autoload.h lru.h parser_keywords.h path.h history.h builtin.o: builtin_set.cpp builtin_commandline.cpp builtin_complete.cpp builtin.o: builtin_ulimit.cpp builtin_jobs.cpp builtin_printf.cpp builtin_commandline.o: config.h signal.h fallback.h util.h wutil.h common.h builtin_commandline.o: builtin.h io.h wgetopt.h reader.h complete.h proc.h builtin_commandline.o: parser.h event.h function.h tokenizer.h input_common.h builtin_commandline.o: input.h parse_util.h autoload.h lru.h builtin_complete.o: config.h signal.h fallback.h util.h wutil.h common.h builtin_complete.o: builtin.h io.h complete.h wgetopt.h parser.h proc.h builtin_complete.o: event.h function.h reader.h builtin_jobs.o: config.h fallback.h signal.h util.h wutil.h common.h builtin_jobs.o: builtin.h io.h proc.h parser.h event.h function.h wgetopt.h builtin_set.o: config.h signal.h fallback.h util.h wutil.h common.h builtin.h builtin_set.o: io.h env.h expand.h wgetopt.h proc.h parser.h event.h builtin_set.o: function.h builtin_test.o: config.h common.h util.h builtin.h io.h wutil.h proc.h builtin_test.o: signal.h builtin_ulimit.o: config.h fallback.h signal.h util.h builtin.h io.h common.h builtin_ulimit.o: wgetopt.h builtin_printf.o: wgetopt.h color.o: color.h config.h common.h util.h fallback.h signal.h common.o: config.h fallback.h signal.h util.h wutil.h common.h expand.h common.o: proc.h io.h wildcard.h parser.h event.h function.h complete.h common.o: util.cpp fallback.cpp complete.o: config.h signal.h fallback.h util.h tokenizer.h common.h complete.o: wildcard.h expand.h proc.h io.h parser.h event.h function.h complete.o: complete.h builtin.h env.h exec.h reader.h history.h wutil.h complete.o: intern.h parse_util.h autoload.h lru.h parser_keywords.h path.h env.o: config.h signal.h fallback.h util.h wutil.h common.h proc.h io.h env.h env.o: sanity.h expand.h history.h reader.h complete.h parser.h event.h env.o: function.h env_universal.h env_universal_common.h input.h env.o: input_common.h path.h env_universal.o: config.h signal.h fallback.h util.h common.h wutil.h env_universal.o: env_universal_common.h env_universal.h env_universal_common.o: config.h signal.h fallback.h util.h common.h wutil.h env_universal_common.o: env_universal_common.h event.o: config.h signal.h fallback.h util.h wutil.h common.h function.h event.o: event.h proc.h io.h parser.h exec.o: config.h signal.h fallback.h util.h iothread.h postfork.h common.h exec.o: proc.h io.h wutil.h exec.h parser.h event.h function.h builtin.h exec.o: env.h wildcard.h expand.h sanity.h parse_util.h autoload.h lru.h expand.o: config.h signal.h fallback.h util.h common.h wutil.h env.h proc.h expand.o: io.h parser.h event.h function.h expand.h wildcard.h exec.h expand.o: tokenizer.h complete.h parse_util.h autoload.h lru.h fallback.o: config.h fallback.h signal.h util.h fish.o: config.h signal.h fallback.h util.h common.h reader.h io.h complete.h fish.o: builtin.h function.h event.h wutil.h env.h sanity.h proc.h parser.h fish.o: expand.h intern.h exec.h output.h screen.h color.h history.h path.h fish_indent.o: config.h fallback.h signal.h util.h common.h wutil.h fish_indent.o: tokenizer.h print_help.h parser_keywords.h fish_pager.o: config.h signal.h fallback.h util.h wutil.h common.h complete.h fish_pager.o: output.h screen.h color.h input_common.h env_universal.h fish_pager.o: env_universal_common.h print_help.h fish_tests.o: config.h signal.h fallback.h util.h common.h proc.h io.h fish_tests.o: reader.h complete.h builtin.h function.h event.h autoload.h fish_tests.o: lru.h wutil.h env.h expand.h parser.h tokenizer.h output.h fish_tests.o: screen.h color.h exec.h path.h history.h highlight.h iothread.h fish_tests.o: postfork.h fishd.o: config.h signal.h fallback.h util.h common.h wutil.h fishd.o: env_universal_common.h path.h env.h print_help.h function.o: config.h signal.h wutil.h common.h util.h fallback.h function.h function.o: event.h proc.h io.h parser.h intern.h reader.h complete.h function.o: parse_util.h autoload.h lru.h parser_keywords.h env.h expand.h highlight.o: config.h signal.h fallback.h util.h wutil.h common.h highlight.h highlight.o: env.h screen.h color.h tokenizer.h proc.h io.h parser.h event.h highlight.o: function.h parse_util.h autoload.h lru.h parser_keywords.h highlight.o: builtin.h expand.h sanity.h complete.h output.h wildcard.h highlight.o: path.h history.h history.o: config.h fallback.h signal.h util.h sanity.h tokenizer.h common.h history.o: wutil.h history.h intern.h path.h env.h autoload.h lru.h history.o: iothread.h input.o: config.h signal.h fallback.h util.h wutil.h common.h reader.h io.h input.o: complete.h proc.h sanity.h input_common.h input.h parser.h event.h input.o: function.h env.h expand.h output.h screen.h color.h intern.h input_common.o: config.h fallback.h signal.h util.h common.h wutil.h input_common.o: input_common.h env_universal.h env_universal_common.h input_common.o: iothread.h intern.o: config.h fallback.h signal.h util.h wutil.h common.h intern.h io.o: config.h fallback.h signal.h util.h wutil.h common.h exec.h proc.h io.h iothread.o: config.h iothread.h common.h util.h signal.h key_reader.o: config.h common.h util.h fallback.h signal.h input_common.h kill.o: config.h signal.h fallback.h util.h wutil.h common.h kill.h proc.h kill.o: io.h sanity.h env.h exec.h path.h mimedb.o: config.h xdgmime.h fallback.h signal.h util.h print_help.h output.o: config.h signal.h fallback.h util.h wutil.h common.h expand.h output.o: output.h screen.h color.h highlight.h env.h parse_util.o: config.h fallback.h signal.h util.h wutil.h common.h parse_util.o: tokenizer.h parse_util.h autoload.h lru.h expand.h intern.h parse_util.o: exec.h proc.h io.h env.h wildcard.h parser.o: config.h signal.h fallback.h util.h common.h wutil.h proc.h io.h parser.o: parser.h event.h function.h parser_keywords.h tokenizer.h exec.h parser.o: wildcard.h expand.h builtin.h env.h reader.h complete.h sanity.h parser.o: env_universal.h env_universal_common.h intern.h parse_util.h parser.o: autoload.h lru.h path.h parser_keywords.o: config.h fallback.h signal.h common.h util.h parser_keywords.o: parser_keywords.h path.o: config.h fallback.h signal.h util.h common.h env.h wutil.h path.h path.o: expand.h postfork.o: signal.h postfork.h config.h common.h util.h proc.h io.h wutil.h postfork.o: iothread.h exec.h print_help.o: print_help.h proc.o: config.h signal.h fallback.h util.h wutil.h common.h proc.h io.h proc.o: reader.h complete.h sanity.h env.h parser.h event.h function.h proc.o: output.h screen.h color.h reader.o: config.h signal.h fallback.h util.h wutil.h common.h highlight.h reader.o: env.h screen.h color.h reader.h io.h complete.h proc.h parser.h reader.o: event.h function.h history.h sanity.h exec.h expand.h tokenizer.h reader.o: kill.h input_common.h input.h output.h iothread.h intern.h path.h reader.o: parse_util.h autoload.h lru.h sanity.o: config.h signal.h fallback.h util.h common.h sanity.h proc.h io.h sanity.o: history.h wutil.h reader.h complete.h kill.h screen.o: config.h fallback.h signal.h common.h util.h wutil.h output.h screen.o: screen.h color.h highlight.h env.h signal.o: config.h signal.h common.h util.h fallback.h wutil.h event.h signal.o: reader.h io.h complete.h proc.h tokenizer.o: config.h fallback.h signal.h util.h wutil.h common.h tokenizer.h util.o: config.h fallback.h signal.h util.h common.h wutil.h wgetopt.o: config.h wgetopt.h wutil.h common.h util.h fallback.h signal.h wildcard.o: config.h fallback.h signal.h util.h wutil.h common.h complete.h wildcard.o: wildcard.h expand.h reader.h io.h exec.h proc.h wutil.o: config.h fallback.h signal.h util.h common.h wutil.h xdgmime.o: xdgmime.h xdgmimeint.h xdgmimeglob.h xdgmimemagic.h xdgmimealias.h xdgmime.o: xdgmimeparent.h xdgmimealias.o: xdgmimealias.h xdgmime.h xdgmimeint.h xdgmimeglob.o: xdgmimeglob.h xdgmime.h xdgmimeint.h xdgmimeint.o: xdgmimeint.h xdgmime.h xdgmimemagic.o: xdgmimemagic.h xdgmime.h xdgmimeint.h xdgmimeparent.o: xdgmimeparent.h xdgmime.h xdgmimeint.h fish/README.md000066400000000000000000000046001214535744100132740ustar00rootroot00000000000000[fish](http://ridiculousfish.com/shell/) - the friendly interactive shell ================================================ fish is a smart and user-friendly command line shell for OS X, Linux, and the rest of the family. fish includes features like syntax highlighting, autosuggest-as-you-type, and fancy tab completions that just work, with no configuration required. For more on fish's design philosophy, see the [design document](http://ridiculousfish.com/shell/user_doc/html/design.html). ## Quick Start fish generally works like other shells, like bash or zsh. A few important differences are documented at Detailed user documentation is available by running `help` within fish, and also at ## Building fish is written in a sane subset of C++98, with a few components from C++TR1. It builds successfully with g++ 4.2 or later, and with clang. It also will build as C++11. fish can be built using autotools or Xcode. ### Autotools Build autoconf ./configure make [gmake on BSD] sudo make install ### Xcode Development Build * Build the `base` target in Xcode * Run the fish executable, for example, in `DerivedData/fish/Build/Products/Debug/base/bin/fish` ### Xcode Build and Install xcodebuild install sudo ditto /tmp/fish.dst / ## Help, it didn't build! If fish reports that it could not find curses, try installing a curses development package and build again. On Debian or Ubuntu you want: sudo apt-get install libncurses5-dev libncursesw5-dev on RedHat, CentOS, or Amazon EC2: sudo yum install ncurses-devel ## Packages for Linux Nightly builds for several Linux distros can be downloaded from ## Switching to fish If you wish to use fish as your default shell, use the following command: chsh -s /usr/local/bin/fish chsh will prompt you for your password, and change your default shell. To switch your default shell back, you can run: chsh -s /bin/bash Substitute /bin/bash with /bin/tcsh or /bin/zsh as appropriate. ## Contact Us Questions, comments, rants and raves can be posted to the official fish mailing list at or join us on our IRC channel #fish at irc.oftc.net Found a bug? Have an awesome idea? Please open an issue on this github page. fish/STYLEGUIDE.md000066400000000000000000000040211214535744100140120ustar00rootroot00000000000000# Style guide This is style guide for fish contributors. You should use it for any new code that you would add to this project and try to format existing code to use this style. ## Formatting 1. fish uses the Allman/BSD style of indentation. 2. Indent with spaces, not tabs. 3. Use 4 spaces per indent (unless needed like `Makefile`). 4. Opening curly bracket is on the following line: // ✔: struct name { // code }; void func() { // code } if (...) { // code } // ✗: void func() { // code } 5. Put space after `if`, `while` and `for` before conditions. // ✔: if () {} // ✗: if() {} 6. Put spaces before and after operators excluding increment and decrement; // ✔: int a = 1 + 2 * 3; a++; // ✗: int a=1+2*3; a ++; 7. Never put spaces between function name and parameters list. // ✔: func(args); // ✗: func (args); 8. Never put spaces after `(` and before `)`. 9. Always put space after comma and semicolon. // ✔: func(arg1, arg2); for (int i = 0; i < LENGTH; i++) {} // ✗: func(arg1,arg2); for (int i = 0;i #include /* The time before we'll recheck an autoloaded file */ static const int kAutoloadStalenessInterval = 15; file_access_attempt_t access_file(const wcstring &path, int mode) { //printf("Touch %ls\n", path.c_str()); file_access_attempt_t result = {0}; struct stat statbuf; if (wstat(path, &statbuf)) { result.error = errno; } else { result.mod_time = statbuf.st_mtime; if (waccess(path, mode)) { result.error = errno; } else { result.accessible = true; } } // Note that we record the last checked time after the call, on the assumption that in a slow filesystem, the lag comes before the kernel check, not after. result.stale = false; result.last_checked = time(NULL); return result; } autoload_t::autoload_t(const wcstring &env_var_name_var, const builtin_script_t * const scripts, size_t script_count) : lock(), env_var_name(env_var_name_var), builtin_scripts(scripts), builtin_script_count(script_count), last_path(), is_loading_set() { pthread_mutex_init(&lock, NULL); } autoload_t::~autoload_t() { pthread_mutex_destroy(&lock); } void autoload_t::node_was_evicted(autoload_function_t *node) { // This should only ever happen on the main thread ASSERT_IS_MAIN_THREAD(); // Tell ourselves that the command was removed if it was loaded if (! node->is_loaded) this->command_removed(node->key); delete node; } int autoload_t::unload(const wcstring &cmd) { return this->evict_node(cmd); } int autoload_t::load(const wcstring &cmd, bool reload) { int res; CHECK_BLOCK(0); ASSERT_IS_MAIN_THREAD(); env_var_t path_var = env_get_string(env_var_name); /* Do we know where to look? */ if (path_var.empty()) return 0; /* Check if the lookup path has changed. If so, drop all loaded files. path_var may only be inspected on the main thread. */ if (path_var != this->last_path) { this->last_path = path_var; scoped_lock locker(lock); this->evict_all_nodes(); } /** Warn and fail on infinite recursion. It's OK to do this because this function is only called on the main thread. */ if (this->is_loading(cmd)) { debug(0, _(L"Could not autoload item '%ls', it is already being autoloaded. " L"This is a circular dependency in the autoloading scripts, please remove it."), cmd.c_str()); return 1; } /* Mark that we're loading this */ is_loading_set.insert(cmd); /* Get the list of paths from which we will try to load */ std::vector path_list; tokenize_variable_array(path_var, path_list); /* Try loading it */ res = this->locate_file_and_maybe_load_it(cmd, true, reload, path_list); /* Clean up */ bool erased = !! is_loading_set.erase(cmd); assert(erased); return res; } bool autoload_t::can_load(const wcstring &cmd, const env_vars_snapshot_t &vars) { const env_var_t path_var = vars.get(env_var_name); if (path_var.missing_or_empty()) return false; std::vector path_list; tokenize_variable_array(path_var, path_list); return this->locate_file_and_maybe_load_it(cmd, false, false, path_list); } static bool script_name_precedes_script_name(const builtin_script_t &script1, const builtin_script_t &script2) { return wcscmp(script1.name, script2.name) < 0; } void autoload_t::unload_all(void) { scoped_lock locker(lock); this->evict_all_nodes(); } /** Check whether the given command is loaded. */ bool autoload_t::has_tried_loading(const wcstring &cmd) { scoped_lock locker(lock); autoload_function_t * func = this->get_node(cmd); return func != NULL; } static bool is_stale(const autoload_function_t *func) { /** Return whether this function is stale. Internalized functions can never be stale. */ return ! func->is_internalized && time(NULL) - func->access.last_checked > kAutoloadStalenessInterval; } autoload_function_t *autoload_t::get_autoloaded_function_with_creation(const wcstring &cmd, bool allow_eviction) { ASSERT_IS_LOCKED(lock); autoload_function_t *func = this->get_node(cmd); if (! func) { func = new autoload_function_t(cmd); if (allow_eviction) { this->add_node(func); } else { this->add_node_without_eviction(func); } } return func; } /** This internal helper function does all the real work. By using two functions, the internal function can return on various places in the code, and the caller can take care of various cleanup work. cmd: the command name ('grep') really_load: whether to actually parse it as a function, or just check it it exists reload: whether to reload it if it's already loaded path_list: the set of paths to check Result: if really_load is true, returns whether the function was loaded. Otherwise returns whether the function existed. */ bool autoload_t::locate_file_and_maybe_load_it(const wcstring &cmd, bool really_load, bool reload, const wcstring_list_t &path_list) { /* Note that we are NOT locked in this function! */ size_t i; bool reloaded = 0; /* Try using a cached function. If we really want the function to be loaded, require that it be really loaded. If we're not reloading, allow stale functions. */ { bool allow_stale_functions = ! reload; /* Take a lock */ scoped_lock locker(lock); /* Get the function */ autoload_function_t * func = this->get_node(cmd); /* Determine if we can use this cached function */ bool use_cached; if (! func) { /* Can't use a function that doesn't exist */ use_cached = false; } else if (really_load && ! func->is_placeholder && ! func->is_loaded) { /* Can't use an unloaded function */ use_cached = false; } else if (! allow_stale_functions && is_stale(func)) { /* Can't use a stale function */ use_cached = false; } else { /* I guess we can use it */ use_cached = true; } /* If we can use this function, return whether we were able to access it */ if (use_cached) { return func->is_internalized || func->access.accessible; } } /* The source of the script will end up here */ wcstring script_source; bool has_script_source = false; /* Whether we found an accessible file */ bool found_file = false; /* Look for built-in scripts via a binary search */ const builtin_script_t *matching_builtin_script = NULL; if (builtin_script_count > 0) { const builtin_script_t test_script = {cmd.c_str(), NULL}; const builtin_script_t *array_end = builtin_scripts + builtin_script_count; const builtin_script_t *found = std::lower_bound(builtin_scripts, array_end, test_script, script_name_precedes_script_name); if (found != array_end && ! wcscmp(found->name, test_script.name)) { /* We found it */ matching_builtin_script = found; } } if (matching_builtin_script) { has_script_source = true; script_source = str2wcstring(matching_builtin_script->def); /* Make a node representing this function */ scoped_lock locker(lock); autoload_function_t *func = this->get_autoloaded_function_with_creation(cmd, really_load); /* This function is internalized */ func->is_internalized = true; /* It's a fiction to say the script is loaded at this point, but we're definitely going to load it down below. */ if (really_load) func->is_loaded = true; } if (! has_script_source) { /* Iterate over path searching for suitable completion files */ for (i=0; iget_node(cmd); /* Generate the source if we need to load it */ bool need_to_load_function = really_load && (func == NULL || func->access.mod_time != access.mod_time || ! func->is_loaded); if (need_to_load_function) { /* Generate the script source */ wcstring esc = escape_string(path, 1); script_source = L". " + esc; has_script_source = true; /* Remove any loaded command because we are going to reload it. Note that this will deadlock if command_removed calls back into us. */ if (func && func->is_loaded) { command_removed(cmd); func->is_placeholder = false; } /* Mark that we're reloading it */ reloaded = true; } /* Create the function if we haven't yet. This does not load it. Do not trigger eviction unless we are actually loading, because we don't want to evict off of the main thread. */ if (! func) { func = get_autoloaded_function_with_creation(cmd, really_load); } /* It's a fiction to say the script is loaded at this point, but we're definitely going to load it down below. */ if (need_to_load_function) func->is_loaded = true; /* Unconditionally record our access time */ func->access = access; break; } } /* If no file or builtin script was found we insert a placeholder function. Later we only research if the current time is at least five seconds later. This way, the files won't be searched over and over again. */ if (! found_file && ! has_script_source) { scoped_lock locker(lock); /* Generate a placeholder */ autoload_function_t *func = this->get_node(cmd); if (! func) { func = new autoload_function_t(cmd); func->is_placeholder = true; if (really_load) { this->add_node(func); } else { this->add_node_without_eviction(func); } } func->access.last_checked = time(NULL); } } /* If we have a script, either built-in or a file source, then run it */ if (really_load && has_script_source) { if (exec_subshell(script_source, false /* do not apply exit status */) == -1) { /* Do nothing on failure */ } } if (really_load) { return reloaded; } else { return found_file || has_script_source; } } fish/autoload.h000066400000000000000000000106671214535744100140100ustar00rootroot00000000000000/** \file autoload.h The classes responsible for autoloading functions and completions. */ #ifndef FISH_AUTOLOAD_H #define FISH_AUTOLOAD_H #include #include #include #include #include "common.h" #include "lru.h" /** A struct responsible for recording an attempt to access a file. */ struct file_access_attempt_t { time_t mod_time; /** The modification time of the file */ time_t last_checked; /** When we last checked the file */ bool accessible; /** Whether we believe we could access this file */ bool stale; /** Whether the access attempt is stale */ int error; /** If we could not access the file, the error code */ }; file_access_attempt_t access_file(const wcstring &path, int mode); struct autoload_function_t : public lru_node_t { autoload_function_t(const wcstring &key) : lru_node_t(key), access(), is_loaded(false), is_placeholder(false), is_internalized(false) { } file_access_attempt_t access; /** The last access attempt */ bool is_loaded; /** Whether we have actually loaded this function */ bool is_placeholder; /** Whether we are a placeholder that stands in for "no such function". If this is true, then is_loaded must be false. */ bool is_internalized; /** Whether this function came from a builtin "internalized" script */ }; struct builtin_script_t { const wchar_t *name; const char *def; }; struct builtin_script_t; class env_vars_snapshot_t; /** A class that represents a path from which we can autoload, and the autoloaded contents. */ class autoload_t : private lru_cache_t { private: /** Lock for thread safety */ pthread_mutex_t lock; /** The environment variable name */ const wcstring env_var_name; /** Builtin script array */ const struct builtin_script_t *const builtin_scripts; /** Builtin script count */ const size_t builtin_script_count; /** The path from which we most recently autoloaded */ wcstring last_path; /** A table containing all the files that are currently being loaded. This is here to help prevent recursion. */ std::set is_loading_set; bool is_loading(const wcstring &name) const { return is_loading_set.find(name) != is_loading_set.end(); } void remove_all_functions(void) { this->evict_all_nodes(); } bool locate_file_and_maybe_load_it(const wcstring &cmd, bool really_load, bool reload, const wcstring_list_t &path_list); virtual void node_was_evicted(autoload_function_t *node); autoload_function_t *get_autoloaded_function_with_creation(const wcstring &cmd, bool allow_eviction); protected: /** Overridable callback for when a command is removed */ virtual void command_removed(const wcstring &cmd) { } public: /** Create an autoload_t for the given environment variable name */ autoload_t(const wcstring &env_var_name_var, const builtin_script_t *scripts, size_t script_count); /** Destructor */ virtual ~autoload_t(); /** Autoload the specified file, if it exists in the specified path. Do not load it multiple times unless its timestamp changes or parse_util_unload is called. Autoloading one file may unload another. \param cmd the filename to search for. The suffix '.fish' is always added to this name \param on_unload a callback function to run if a suitable file is found, which has not already been run. unload will also be called for old files which are unloaded. \param reload wheter to recheck file timestamps on already loaded files */ int load(const wcstring &cmd, bool reload); /** Check whether we have tried loading the given command. Does not do any I/O. */ bool has_tried_loading(const wcstring &cmd); /** Tell the autoloader that the specified file, in the specified path, is no longer loaded. \param cmd the filename to search for. The suffix '.fish' is always added to this name \param on_unload a callback function which will be called before (re)loading a file, may be used to unload the previous file. \return non-zero if the file was removed, zero if the file had not yet been loaded */ int unload(const wcstring &cmd); /** Unloads all files. */ void unload_all(); /** Check whether the given command could be loaded, but do not load it. */ bool can_load(const wcstring &cmd, const env_vars_snapshot_t &vars); }; #endif fish/builtin.cpp000066400000000000000000003224561214535744100142030ustar00rootroot00000000000000/** \file builtin.c Functions for executing builtin functions. How to add a new builtin function: 1). Create a function in builtin.c with the following signature: static int builtin_NAME( parser_t &parser, wchar_t ** args ) where NAME is the name of the builtin, and args is a zero-terminated list of arguments. 2). Add a line like { L"NAME", &builtin_NAME, N_(L"Bla bla bla") }, to the builtin_data_t variable. The description is used by the completion system. Note that this array is sorted! 3). Create a file doc_src/NAME.txt, containing the manual for the builtin in Doxygen-format. Check the other builtin manuals for proper syntax. 4). Use 'git add doc_src/NAME.txt' to start tracking changes to the documentation file. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "builtin.h" #include "function.h" #include "complete.h" #include "proc.h" #include "parser.h" #include "reader.h" #include "env.h" #include "common.h" #include "wgetopt.h" #include "sanity.h" #include "tokenizer.h" #include "wildcard.h" #include "input_common.h" #include "input.h" #include "intern.h" #include "event.h" #include "signal.h" #include "exec.h" #include "highlight.h" #include "parse_util.h" #include "parser_keywords.h" #include "expand.h" #include "path.h" #include "history.h" /** The default prompt for the read command */ #define DEFAULT_READ_PROMPT L"set_color green; echo -n read; set_color normal; echo -n \"> \"" /** The mode name to pass to history and input */ #define READ_MODE_NAME L"fish_read" /** The send stuff to foreground message */ #define FG_MSG _( L"Send job %d, '%ls' to foreground\n" ) /** Datastructure to describe a builtin. */ struct builtin_data_t { /** Name of the builtin */ const wchar_t *name; /** Function pointer tothe builtin implementation */ int (*func)(parser_t &parser, wchar_t **argv); /** Description of what the builtin does */ const wchar_t *desc; bool operator<(const wcstring &) const; bool operator<(const builtin_data_t *) const; }; bool builtin_data_t::operator<(const wcstring &other) const { return wcscmp(this->name, other.c_str()) < 0; } bool builtin_data_t::operator<(const builtin_data_t *other) const { return wcscmp(this->name, other->name) < 0; } int builtin_out_redirect; int builtin_err_redirect; /* Buffers for storing the output of builtin functions */ wcstring stdout_buffer, stderr_buffer; const wcstring &get_stdout_buffer() { ASSERT_IS_MAIN_THREAD(); return stdout_buffer; } const wcstring &get_stderr_buffer() { ASSERT_IS_MAIN_THREAD(); return stderr_buffer; } void builtin_show_error(const wcstring &err) { ASSERT_IS_MAIN_THREAD(); stderr_buffer.append(err); } /** Stack containing builtin I/O for recursive builtin calls. */ struct io_stack_elem_t { int in; wcstring out; wcstring err; }; static std::stack > io_stack; /** The file from which builtin functions should attempt to read, use instead of stdin. */ static int builtin_stdin; /** The underlying IO redirections behind the current builtin. This should normally not be used - sb_out and friends are already configured to handle everything. */ static const io_chain_t *real_io; /** Counts the number of non null pointers in the specified array */ static int builtin_count_args(wchar_t **argv) { int argc = 1; while (argv[argc] != NULL) { argc++; } return argc; } /** This function works like wperror, but it prints its result into the sb_err string instead of to stderr. Used by the builtin commands. */ static void builtin_wperror(const wchar_t *s) { if (s != 0) { stderr_buffer.append(s); stderr_buffer.append(L": "); } char *err = strerror(errno); if (err) { const wcstring werr = str2wcstring(err); stderr_buffer.append(werr); stderr_buffer.push_back(L'\n'); } } /** Count the number of times the specified character occurs in the specified string */ static int count_char(const wchar_t *str, wchar_t c) { int res = 0; for (; *str; str++) { res += (*str==c); } return res; } wcstring builtin_help_get(parser_t &parser, const wchar_t *name) { /* This won't ever work if no_exec is set */ if (no_exec) return wcstring(); wcstring_list_t lst; wcstring out; const wcstring name_esc = escape_string(name, 1); const wcstring cmd = format_string(L"__fish_print_help %ls", name_esc.c_str()); if (exec_subshell(cmd, lst, false /* don't apply exit status */) >= 0) { for (size_t i=0; i 2*screen_height/3)) { wchar_t *pos; int cut=0; int i; is_short = 1; /* First move down 4 lines */ pos = str; for (i=0; (i<4) && pos && *pos; i++) { pos = wcschr(pos+1, L'\n'); } if (pos && *pos) { /* Then find the next empty line */ for (; *pos; pos++) { if (*pos == L'\n') { wchar_t *pos2; int is_empty = 1; for (pos2 = pos+1; *pos2; pos2++) { if (*pos2 == L'\n') break; if (*pos2 != L'\t' && *pos2 !=L' ') { is_empty = 0; break; } } if (is_empty) { /* And cut it */ *(pos2+1)=L'\0'; cut = 1; break; } } } } /* We did not find a good place to cut message to shorten it - so we make sure we don't print anything. */ if (!cut) { *str = 0; } } } b.append(str); if (is_short) { append_format(b, _(L"%ls: Type 'help %ls' for related documentation\n\n"), cmd, cmd); } free(str); } } /** Perform error reporting for encounter with unknown option */ static void builtin_unknown_option(parser_t &parser, const wchar_t *cmd, const wchar_t *opt) { append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, cmd, opt); builtin_print_help(parser, cmd, stderr_buffer); } /** Perform error reporting for encounter with missing argument */ static void builtin_missing_argument(parser_t &parser, const wchar_t *cmd, const wchar_t *opt) { append_format(stderr_buffer, BUILTIN_ERR_MISSING, cmd, opt); builtin_print_help(parser, cmd, stderr_buffer); } /* Here follows the definition of all builtin commands. The function names are all on the form builtin_NAME where NAME is the name of the builtin. so the function name for the builtin 'fg' is 'builtin_fg'. A few builtins, including 'while', 'command' and 'builtin' are not defined here as they are handled directly by the parser. (They are not parsed as commands, instead they only alter the parser state) The builtins 'break' and 'continue' are so closely related that they share the same implementation, namely 'builtin_break_continue. Several other builtins, including jobs, ulimit and set are so big that they have been given their own file. These files are all named 'builtin_NAME.c', where NAME is the name of the builtin. These files are included directly below. */ #include "builtin_set.cpp" #include "builtin_commandline.cpp" #include "builtin_complete.cpp" #include "builtin_ulimit.cpp" #include "builtin_jobs.cpp" #include "builtin_set_color.cpp" #include "builtin_printf.cpp" /* builtin_test lives in builtin_test.cpp */ int builtin_test(parser_t &parser, wchar_t **argv); /** List all current key bindings */ static void builtin_bind_list() { size_t i; wcstring_list_t lst; input_mapping_get_names(lst); for (i=0; iouter) block=0; break; } case GLOBAL: { block=0; } case UNSET: { while (block && block->type() != FUNCTION_CALL && block->type() != FUNCTION_CALL_NO_SHADOW) block = block->outer; } } if (block) { block->event_blocks.push_front(eb); } else { parser.global_event_blocks.push_front(eb); } } return STATUS_BUILTIN_OK; } /** The builtin builtin, used for giving builtins precedence over functions. Mostly handled by the parser. All this code does is some additional operational modes, such as printing a list of all builtins, printing help, etc. */ static int builtin_builtin(parser_t &parser, wchar_t **argv) { int argc=builtin_count_args(argv); int list=0; woptind=0; static const struct woption long_options[] = { { L"names", no_argument, 0, 'n' } , { L"help", no_argument, 0, 'h' } , { 0, 0, 0, 0 } } ; while (1) { int opt_index = 0; int opt = wgetopt_long(argc, argv, L"nh", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; case 'n': list=1; break; case '?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; } } if (list) { wcstring_list_t names = builtin_get_names(); sort(names.begin(), names.end()); for (size_t i=0; i ev; event_get(search, &ev); out.append(L"function "); /* Typically we prefer to specify the function name first, e.g. "function foo --description bar" But If the function name starts with a -, we'll need to output it after all the options. */ bool defer_function_name = (name.at(0) == L'-'); if (! defer_function_name) { out.append(name); } if (! desc.empty()) { wcstring esc_desc = escape_string(desc, true); out.append(L" --description "); out.append(esc_desc); } if (!function_get_shadows(name)) { out.append(L" --no-scope-shadowing"); } for (size_t i=0; itype) { case EVENT_SIGNAL: { append_format(out, L" --on-signal %ls", sig2wcs(next->param1.signal)); break; } case EVENT_VARIABLE: { append_format(out, L" --on-variable %ls", next->str_param1.c_str()); break; } case EVENT_EXIT: { if (next->param1.pid > 0) append_format(out, L" --on-process-exit %d", next->param1.pid); else append_format(out, L" --on-job-exit %d", -next->param1.pid); break; } case EVENT_JOB_ID: { const job_t *j = job_get(next->param1.job_id); if (j) append_format(out, L" --on-job-exit %d", j->pgid); break; } case EVENT_GENERIC: { append_format(out, L" --on-event %ls", next->str_param1.c_str()); break; } } } wcstring_list_t named = function_get_named_arguments(name); if (! named.empty()) { append_format(out, L" --argument"); for (size_t i=0; i < named.size(); i++) { append_format(out, L" %ls", named.at(i).c_str()); } } /* Output the function name if we deferred it */ if (defer_function_name) { out.append(L" -- "); out.append(name); } /* This forced tab is sort of crummy - not all functions start with a tab */ append_format(out, L"\n\t%ls", def.c_str()); /* Append a newline before the 'end', unless there already is one there */ if (! string_suffixes_string(L"\n", def)) { out.push_back(L'\n'); } out.append(L"end\n"); } /** The functions builtin, used for listing and erasing functions. */ static int builtin_functions(parser_t &parser, wchar_t **argv) { int i; int erase=0; wchar_t *desc=0; int argc=builtin_count_args(argv); int list=0; int show_hidden=0; int res = STATUS_BUILTIN_OK; int query = 0; int copy = 0; woptind=0; static const struct woption long_options[] = { { L"erase", no_argument, 0, 'e' } , { L"description", required_argument, 0, 'd' } , { L"names", no_argument, 0, 'n' } , { L"all", no_argument, 0, 'a' } , { L"help", no_argument, 0, 'h' } , { L"query", no_argument, 0, 'q' } , { L"copy", no_argument, 0, 'c' } , { 0, 0, 0, 0 } } ; while (1) { int opt_index = 0; int opt = wgetopt_long(argc, argv, L"ed:nahqc", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; case 'e': erase=1; break; case 'd': desc=woptarg; break; case 'n': list=1; break; case 'a': show_hidden=1; break; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; case 'q': query = 1; break; case 'c': copy = 1; break; case '?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; } } /* Erase, desc, query, copy and list are mutually exclusive */ if ((erase + (!!desc) + list + query + copy) > 1) { append_format(stderr_buffer, _(L"%ls: Invalid combination of options\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } if (erase) { int i; for (i=woptind; i start) { *consumed = idx; *out_val = val; success = true; } } return success; } /** The echo builtin. bash only respects -n if it's the first argument. We'll do the same. We also support a new option -s to mean "no spaces" */ static int builtin_echo(parser_t &parser, wchar_t **argv) { /* Skip first arg */ if (! *argv++) return STATUS_BUILTIN_ERROR; /* Process options */ bool print_newline = true, print_spaces = true, interpret_special_chars = false; while (*argv) { if (! wcscmp(*argv, L"-n")) { print_newline = false; } else if (! wcscmp(*argv, L"-e")) { interpret_special_chars = true; } else if (! wcscmp(*argv, L"-ne")) { print_newline = false; interpret_special_chars = true; } else if (! wcscmp(*argv, L"-s")) { // fish-specific extension, which we should try to nix print_spaces = false; } else if (! wcscmp(*argv, L"-E")) { interpret_special_chars = false; } else { break; } argv++; } /* The special character \c can be used to indicate no more output */ bool continue_output = true; for (size_t idx = 0; continue_output && argv[idx] != NULL; idx++) { if (print_spaces && idx > 0) stdout_buffer.push_back(' '); const wchar_t *str = argv[idx]; for (size_t j=0; continue_output && str[j]; j++) { if (! interpret_special_chars || str[j] != L'\\') { /* Not an escape */ stdout_buffer.push_back(str[j]); } else { /* Most escapes consume one character in addition to the backslash; the numeric sequences may consume more, while an unrecognized escape sequence consumes none. */ wchar_t wc; size_t consumed = 1; switch (str[j+1]) { case L'a': wc = L'\a'; break; case L'b': wc = L'\b'; break; case L'e': wc = L'\e'; break; case L'f': wc = L'\f'; break; case L'n': wc = L'\n'; break; case L'r': wc = L'\r'; break; case L't': wc = L'\t'; break; case L'v': wc = L'\v'; break; case L'\\': wc = L'\\'; break; case L'c': wc = 0; continue_output = false; break; default: { /* Octal and hex escape sequences */ unsigned char narrow_val = 0; if (builtin_echo_parse_numeric_sequence(str + j + 1, &consumed, &narrow_val)) { /* Here consumed must have been set to something */ wc = narrow_val; //is this OK for conversion? } else { /* Not a recognized escape. We consume only the backslash. */ wc = L'\\'; consumed = 0; } break; } } /* Skip over characters that were part of this escape sequence (but not the backslash, which will be handled by the loop increment */ j += consumed; if (continue_output) stdout_buffer.push_back(wc); } } } if (print_newline && continue_output) stdout_buffer.push_back('\n'); return STATUS_BUILTIN_OK; } /** The pwd builtin. We don't respect -P to resolve symbolic links because we try to always resolve them. */ static int builtin_pwd(parser_t &parser, wchar_t **argv) { wchar_t dir_path[4096]; wchar_t *res = wgetcwd(dir_path, 4096); if (res == NULL) { return STATUS_BUILTIN_ERROR; } else { stdout_buffer.append(dir_path); stdout_buffer.push_back(L'\n'); return STATUS_BUILTIN_OK; } } /** The function builtin, used for providing subroutines. It calls various functions from function.c to perform any heavy lifting. */ static int builtin_function(parser_t &parser, wchar_t **argv) { int argc = builtin_count_args(argv); int res=STATUS_BUILTIN_OK; wchar_t *desc=0; std::vector events; std::auto_ptr named_arguments(NULL); wchar_t *name = 0; bool shadows = true; woptind=0; function_def_block_t * const fdb = new function_def_block_t(); parser.push_block(fdb); const struct woption long_options[] = { { L"description", required_argument, 0, 'd' }, { L"on-signal", required_argument, 0, 's' }, { L"on-job-exit", required_argument, 0, 'j' }, { L"on-process-exit", required_argument, 0, 'p' }, { L"on-variable", required_argument, 0, 'v' }, { L"on-event", required_argument, 0, 'e' }, { L"help", no_argument, 0, 'h' }, { L"argument-names", no_argument, 0, 'a' }, { L"no-scope-shadowing", no_argument, 0, 'S' }, { 0, 0, 0, 0 } }; while (1 && (!res)) { int opt_index = 0; int opt = wgetopt_long(argc, argv, L"d:s:j:p:v:e:haS", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); res = 1; break; case 'd': desc=woptarg; break; case 's': { int sig = wcs2sig(woptarg); if (sig < 0) { append_format(stderr_buffer, _(L"%ls: Unknown signal '%ls'\n"), argv[0], woptarg); res=1; break; } events.push_back(event_t::signal_event(sig)); break; } case 'v': { if (wcsvarname(woptarg)) { append_format(stderr_buffer, _(L"%ls: Invalid variable name '%ls'\n"), argv[0], woptarg); res=STATUS_BUILTIN_ERROR; break; } events.push_back(event_t::variable_event(woptarg)); break; } case 'e': { events.push_back(event_t::generic_event(woptarg)); break; } case 'j': case 'p': { pid_t pid; wchar_t *end; event_t e(EVENT_ANY); if ((opt == 'j') && (wcscasecmp(woptarg, L"caller") == 0)) { int job_id = -1; if (is_subshell) { block_t *b = parser.current_block; while (b && (b->type() != SUBST)) b = b->outer; if (b) { b=b->outer; } if (b->job) { job_id = b->job->job_id; } } if (job_id == -1) { append_format(stderr_buffer, _(L"%ls: Cannot find calling job for event handler\n"), argv[0]); res=1; } else { e.type = EVENT_JOB_ID; e.param1.job_id = job_id; } } else { errno = 0; pid = fish_wcstoi(woptarg, &end, 10); if (errno || !end || *end) { append_format(stderr_buffer, _(L"%ls: Invalid process id %ls\n"), argv[0], woptarg); res=1; break; } e.type = EVENT_EXIT; e.param1.pid = (opt=='j'?-1:1)*abs(pid); } if (res) { /* nothing */ } else { events.push_back(e); } break; } case 'a': if (named_arguments.get() == NULL) named_arguments.reset(new wcstring_list_t); break; case 'S': shadows = 0; break; case 'h': parser.pop_block(); parser.push_block(new fake_block_t()); builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; case '?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); res = 1; break; } } if (!res) { if (argc == woptind) { append_format(stderr_buffer, _(L"%ls: Expected function name\n"), argv[0]); res=1; } else if (wcsfuncname(argv[woptind])) { append_format(stderr_buffer, _(L"%ls: Illegal function name '%ls'\n"), argv[0], argv[woptind]); res=1; } else if (parser_keywords_is_reserved(argv[woptind])) { append_format(stderr_buffer, _(L"%ls: The name '%ls' is reserved,\nand can not be used as a function name\n"), argv[0], argv[woptind]); res=1; } else { name = argv[woptind++]; if (named_arguments.get()) { while (woptind < argc) { if (wcsvarname(argv[woptind])) { append_format(stderr_buffer, _(L"%ls: Invalid variable name '%ls'\n"), argv[0], argv[woptind]); res = STATUS_BUILTIN_ERROR; break; } named_arguments->push_back(argv[woptind++]); } } else if (woptind != argc) { append_format(stderr_buffer, _(L"%ls: Expected one argument, got %d\n"), argv[0], argc); res=1; } } } if (res) { size_t i; size_t chars=0; builtin_print_help(parser, argv[0], stderr_buffer); const wchar_t *cfa = _(L"Current functions are: "); stderr_buffer.append(cfa); chars += wcslen(cfa); wcstring_list_t names = function_get_names(0); sort(names.begin(), names.end()); for (i=0; i (size_t)common_get_width()) { chars = 0; stderr_buffer.push_back(L'\n'); } stderr_buffer.append(nxt); stderr_buffer.append(L" "); } stderr_buffer.push_back(L'\n'); parser.pop_block(); parser.push_block(new fake_block_t()); } else { function_data_t &d = fdb->function_data; d.name = name; if (desc) d.description = desc; d.events.swap(events); d.shadows = shadows; if (named_arguments.get()) d.named_arguments.swap(*named_arguments); for (size_t i=0; itok_pos = parser.get_pos(); parser.current_block->skip = 1; return STATUS_BUILTIN_OK; } /** The random builtin. For generating random numbers. */ static int builtin_random(parser_t &parser, wchar_t **argv) { static int seeded=0; static struct drand48_data seed_buffer; int argc = builtin_count_args(argv); woptind=0; static const struct woption long_options[] = { { L"help", no_argument, 0, 'h' } , { 0, 0, 0, 0 } } ; while (1) { int opt_index = 0; int opt = wgetopt_long(argc, argv, L"h", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); break; case '?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; } } switch (argc-woptind) { case 0: { long res; if (!seeded) { seeded=1; srand48_r(time(0), &seed_buffer); } lrand48_r(&seed_buffer, &res); append_format(stdout_buffer, L"%ld\n", labs(res%32767)); break; } case 1: { long foo; wchar_t *end=0; errno=0; foo = wcstol(argv[woptind], &end, 10); if (errno || *end) { append_format(stderr_buffer, _(L"%ls: Seed value '%ls' is not a valid number\n"), argv[0], argv[woptind]); return STATUS_BUILTIN_ERROR; } seeded=1; srand48_r(foo, &seed_buffer); break; } default: { append_format(stderr_buffer, _(L"%ls: Expected zero or one argument, got %d\n"), argv[0], argc-woptind); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } } return STATUS_BUILTIN_OK; } /** The read builtin. Reads from stdin and stores the values in environment variables. */ static int builtin_read(parser_t &parser, wchar_t **argv) { wchar_t *buff=0; int i, argc = builtin_count_args(argv); int place = ENV_USER; wchar_t *nxt; const wchar_t *prompt = DEFAULT_READ_PROMPT; const wchar_t *commandline = L""; int exit_res=STATUS_BUILTIN_OK; const wchar_t *mode_name = READ_MODE_NAME; int shell = 0; woptind=0; while (1) { static const struct woption long_options[] = { { L"export", no_argument, 0, 'x' } , { L"global", no_argument, 0, 'g' } , { L"local", no_argument, 0, 'l' } , { L"universal", no_argument, 0, 'U' } , { L"unexport", no_argument, 0, 'u' } , { L"prompt", required_argument, 0, 'p' } , { L"command", required_argument, 0, 'c' } , { L"mode-name", required_argument, 0, 'm' } , { L"shell", no_argument, 0, 's' } , { L"help", no_argument, 0, 'h' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = wgetopt_long(argc, argv, L"xglUup:c:hm:s", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; case L'x': place |= ENV_EXPORT; break; case L'g': place |= ENV_GLOBAL; break; case L'l': place |= ENV_LOCAL; break; case L'U': place |= ENV_UNIVERSAL; break; case L'u': place |= ENV_UNEXPORT; break; case L'p': prompt = woptarg; break; case L'c': commandline = woptarg; break; case L'm': mode_name = woptarg; break; case 's': shell = 1; break; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; case L'?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; } } if ((place & ENV_UNEXPORT) && (place & ENV_EXPORT)) { append_format(stderr_buffer, BUILTIN_ERR_EXPUNEXP, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } if ((place&ENV_LOCAL?1:0) + (place & ENV_GLOBAL?1:0) + (place & ENV_UNIVERSAL?1:0) > 1) { append_format(stderr_buffer, BUILTIN_ERR_GLOCAL, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } /* Verify all variable names */ for (i=woptind; i= 0 && (size_t)opt_index < sizeof long_options / sizeof *long_options); if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; case ':': builtin_missing_argument(parser, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; case '?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; case 'i': should_output_index = true; break; } } needle = argv[woptind]; if (!needle) { append_format(stderr_buffer, _(L"%ls: Key not specified\n"), argv[0]); } for (int i=woptind+1; i2)?(argv+2):(argv+1), wcstring_list_t()); res = reader_read(fd, real_io ? *real_io : io_chain_t()); parser.pop_block(); if (res) { append_format(stderr_buffer, _(L"%ls: Error while reading file '%ls'\n"), argv[0], fn_intern == intern_static(L"-") ? L"" : fn_intern); } else { res = proc_get_last_status(); } /* Do not close fd after calling reader_read. reader_read automatically closes it before calling eval. */ reader_pop_current_filename(); return res; } /** Make the specified job the first job of the job list. Moving jobs around in the list makes the list reflect the order in which the jobs were used. */ static void make_first(job_t *j) { job_promote(j); } /** Builtin for putting a job in the foreground */ static int builtin_fg(parser_t &parser, wchar_t **argv) { job_t *j=NULL; if (argv[1] == 0) { /* Select last constructed job (I.e. first job in the job que) that is possible to put in the foreground */ job_iterator_t jobs; while ((j = jobs.next())) { if (job_get_flag(j, JOB_CONSTRUCTED) && (!job_is_completed(j)) && ((job_is_stopped(j) || (!job_get_flag(j, JOB_FOREGROUND))) && job_get_flag(j, JOB_CONTROL))) { break; } } if (!j) { append_format(stderr_buffer, _(L"%ls: There are no suitable jobs\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); } } else if (argv[2] != 0) { /* Specifying what more than one job to put to the foreground is a syntax error, we still try to locate the job argv[1], since we want to know if this is an ambigous job specification or if this is an malformed job id */ wchar_t *endptr; int pid; int found_job = 0; errno = 0; pid = fish_wcstoi(argv[1], &endptr, 10); if (!(*endptr || errno)) { j = job_get_from_pid(pid); if (j) found_job = 1; } if (found_job) { append_format(stderr_buffer, _(L"%ls: Ambiguous job\n"), argv[0]); } else { append_format(stderr_buffer, _(L"%ls: '%ls' is not a job\n"), argv[0], argv[1]); } builtin_print_help(parser, argv[0], stderr_buffer); j=0; } else { wchar_t *end; int pid; errno = 0; pid = abs(fish_wcstoi(argv[1], &end, 10)); if (*end || errno) { append_format(stderr_buffer, BUILTIN_ERR_NOT_NUMBER, argv[0], argv[1]); builtin_print_help(parser, argv[0], stderr_buffer); } else { j = job_get_from_pid(pid); if (!j || !job_get_flag(j, JOB_CONSTRUCTED) || job_is_completed(j)) { append_format(stderr_buffer, _(L"%ls: No suitable job: %d\n"), argv[0], pid); builtin_print_help(parser, argv[0], stderr_buffer); j=0; } else if (!job_get_flag(j, JOB_CONTROL)) { append_format(stderr_buffer, _(L"%ls: Can't put job %d, '%ls' to foreground because it is not under job control\n"), argv[0], pid, j->command_wcstr()); builtin_print_help(parser, argv[0], stderr_buffer); j=0; } } } if (j) { if (builtin_err_redirect) { append_format(stderr_buffer, FG_MSG, j->job_id, j->command_wcstr()); } else { /* If we aren't redirecting, send output to real stderr, since stuff in sb_err won't get printed until the command finishes. */ fwprintf(stderr, FG_MSG, j->job_id, j->command_wcstr()); } const wcstring ft = tok_first(j->command_wcstr()); if (! ft.empty()) env_set(L"_", ft.c_str(), ENV_EXPORT); reader_write_title(); make_first(j); job_set_flag(j, JOB_FOREGROUND, 1); job_continue(j, job_is_stopped(j)); } return j != 0; } /** Helper function for builtin_bg() */ static int send_to_bg(parser_t &parser, job_t *j, const wchar_t *name) { if (j == 0) { append_format(stderr_buffer, _(L"%ls: Unknown job '%ls'\n"), L"bg", name); builtin_print_help(parser, L"bg", stderr_buffer); return STATUS_BUILTIN_ERROR; } else if (!job_get_flag(j, JOB_CONTROL)) { append_format(stderr_buffer, _(L"%ls: Can't put job %d, '%ls' to background because it is not under job control\n"), L"bg", j->job_id, j->command_wcstr()); builtin_print_help(parser, L"bg", stderr_buffer); return STATUS_BUILTIN_ERROR; } else { append_format(stderr_buffer, _(L"Send job %d '%ls' to background\n"), j->job_id, j->command_wcstr()); } make_first(j); job_set_flag(j, JOB_FOREGROUND, 0); job_continue(j, job_is_stopped(j)); return STATUS_BUILTIN_OK; } /** Builtin for putting a job in the background */ static int builtin_bg(parser_t &parser, wchar_t **argv) { int res = STATUS_BUILTIN_OK; if (argv[1] == 0) { job_t *j; job_iterator_t jobs; while ((j = jobs.next())) { if (job_is_stopped(j) && job_get_flag(j, JOB_CONTROL) && (!job_is_completed(j))) { break; } } if (!j) { append_format(stderr_buffer, _(L"%ls: There are no suitable jobs\n"), argv[0]); res = 1; } else { res = send_to_bg(parser, j, _(L"(default)")); } } else { wchar_t *end; int i; int pid; int err = 0; for (i=1; argv[i]; i++) { errno=0; pid = fish_wcstoi(argv[i], &end, 10); if (errno || pid < 0 || *end || !job_get_from_pid(pid)) { append_format(stderr_buffer, _(L"%ls: '%ls' is not a job\n"), argv[0], argv[i]); err = 1; break; } } if (!err) { for (i=1; !res && argv[i]; i++) { pid = fish_wcstoi(argv[i], 0, 10); res |= send_to_bg(parser, job_get_from_pid(pid), *argv); } } } return res; } /** Builtin for looping over a list */ static int builtin_for(parser_t &parser, wchar_t **argv) { int argc = builtin_count_args(argv); int res=STATUS_BUILTIN_ERROR; if (argc < 3) { append_format(stderr_buffer, BUILTIN_FOR_ERR_COUNT, argv[0] , argc); builtin_print_help(parser, argv[0], stderr_buffer); } else if (wcsvarname(argv[1])) { append_format(stderr_buffer, BUILTIN_FOR_ERR_NAME, argv[0], argv[1]); builtin_print_help(parser, argv[0], stderr_buffer); } else if (wcscmp(argv[2], L"in") != 0) { append_format(stderr_buffer, BUILTIN_FOR_ERR_IN, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); } else { res=0; } if (res) { parser.push_block(new fake_block_t()); } else { const wchar_t *for_variable = argv[1]; for_block_t *fb = new for_block_t(for_variable); parser.push_block(fb); fb->tok_pos = parser.get_pos(); /* Note that we store the sequence of values in opposite order */ wcstring_list_t &for_vars = fb->sequence; for (int i=argc-1; i>3; i--) for_vars.push_back(argv[i]); if (argc > 3) { env_set(for_variable, argv[3], ENV_LOCAL); } else { parser.current_block->skip=1; } } return res; } /** The begin builtin. Creates a nex block. */ static int builtin_begin(parser_t &parser, wchar_t **argv) { parser.push_block(new scope_block_t(BEGIN)); parser.current_block->tok_pos = parser.get_pos(); return proc_get_last_status(); } /** Builtin for ending a block of code, such as a for-loop or an if statement. The end command is whare a lot of the block-level magic happens. */ static int builtin_end(parser_t &parser, wchar_t **argv) { if (!parser.current_block->outer) { append_format(stderr_buffer, _(L"%ls: Not inside of block\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } else { /** By default, 'end' kills the current block scope. But if we are rewinding a loop, this should be set to false, so that variables in the current loop scope won't die between laps. */ bool kill_block = true; switch (parser.current_block->type()) { case WHILE: { /* If this is a while loop, we rewind the loop unless it's the last lap, in which case we continue. */ if (!(parser.current_block->skip && (parser.current_block->loop_status != LOOP_CONTINUE))) { parser.current_block->loop_status = LOOP_NORMAL; parser.current_block->skip = 0; kill_block = false; parser.set_pos(parser.current_block->tok_pos); while_block_t *blk = static_cast(parser.current_block); blk->status = WHILE_TEST_AGAIN; } break; } case IF: case SUBST: case BEGIN: case SWITCH: case FAKE: /* Nothing special happens at the end of these commands. The scope just ends. */ break; case FOR: { /* set loop variable to next element, and rewind to the beginning of the block. */ for_block_t *fb = static_cast(parser.current_block); wcstring_list_t &for_vars = fb->sequence; if (parser.current_block->loop_status == LOOP_BREAK) { for_vars.clear(); } if (! for_vars.empty()) { const wcstring val = for_vars.back(); for_vars.pop_back(); const wcstring &for_variable = fb->variable; env_set(for_variable, val.c_str(), ENV_LOCAL); parser.current_block->loop_status = LOOP_NORMAL; parser.current_block->skip = 0; kill_block = false; parser.set_pos(parser.current_block->tok_pos); } break; } case FUNCTION_DEF: { function_def_block_t *fdb = static_cast(parser.current_block); function_data_t &d = fdb->function_data; if (d.name.empty()) { /* Disallow empty function names */ append_format(stderr_buffer, _(L"%ls: No function name given\n"), argv[0]); /* Return an error via a crummy way. Don't just return here, since we need to pop the block. */ proc_set_last_status(STATUS_BUILTIN_ERROR); } else { /** Copy the text from the beginning of the function until the end command and use as the new definition for the specified function */ wchar_t *def = wcsndup(parser.get_buffer()+parser.current_block->tok_pos, parser.get_job_pos()-parser.current_block->tok_pos); d.definition = def; function_add(d, parser); free(def); } } break; default: assert(false); //should never get here break; } if (kill_block) { parser.pop_block(); } /* If everything goes ok, return status of last command to execute. */ return proc_get_last_status(); } } /** Builtin for executing commands if an if statement is false */ static int builtin_else(parser_t &parser, wchar_t **argv) { bool block_ok = false; if_block_t *if_block = NULL; if (parser.current_block != NULL && parser.current_block->type() == IF) { if_block = static_cast(parser.current_block); /* Ensure that we're past IF but not up to an ELSE */ if (if_block->if_expr_evaluated && ! if_block->else_evaluated) { block_ok = true; } } if (! block_ok) { append_format(stderr_buffer, _(L"%ls: Not inside of 'if' block\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } else { /* Run the else block if the IF expression was false and so were all the ELSEIF expressions (if any) */ bool run_else = ! if_block->any_branch_taken; if_block->skip = ! run_else; if_block->else_evaluated = true; env_pop(); env_push(false); } /* If everything goes ok, return status of last command to execute. */ return proc_get_last_status(); } /** This function handles both the 'continue' and the 'break' builtins that are used for loop control. */ static int builtin_break_continue(parser_t &parser, wchar_t **argv) { int is_break = (wcscmp(argv[0],L"break")==0); int argc = builtin_count_args(argv); block_t *b = parser.current_block; if (argc != 1) { append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[1]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } while ((b != 0) && (b->type() != WHILE) && (b->type() != FOR)) { b = b->outer; } if (b == 0) { append_format(stderr_buffer, _(L"%ls: Not inside of loop\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } b = parser.current_block; while ((b->type() != WHILE) && (b->type() != FOR)) { b->skip=1; b = b->outer; } b->skip=1; b->loop_status = is_break?LOOP_BREAK:LOOP_CONTINUE; return STATUS_BUILTIN_OK; } /** Implementation of the builtin breakpoint command, used to launch the interactive debugger. */ static int builtin_breakpoint(parser_t &parser, wchar_t **argv) { parser.push_block(new breakpoint_block_t()); reader_read(STDIN_FILENO, real_io ? *real_io : io_chain_t()); parser.pop_block(); return proc_get_last_status(); } /** Function for handling the \c return builtin */ static int builtin_return(parser_t &parser, wchar_t **argv) { int argc = builtin_count_args(argv); int status = proc_get_last_status(); block_t *b = parser.current_block; switch (argc) { case 1: break; case 2: { wchar_t *end; errno = 0; status = fish_wcstoi(argv[1],&end,10); if (errno || *end != 0) { append_format(stderr_buffer, _(L"%ls: Argument '%ls' must be an integer\n"), argv[0], argv[1]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } break; } default: append_format(stderr_buffer, _(L"%ls: Too many arguments\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } while ((b != 0) && (b->type() != FUNCTION_CALL && b->type() != FUNCTION_CALL_NO_SHADOW)) { b = b->outer; } if (b == 0) { append_format(stderr_buffer, _(L"%ls: Not inside of function\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } b = parser.current_block; while ((b->type() != FUNCTION_CALL && b->type() != FUNCTION_CALL_NO_SHADOW)) { b->mark_as_fake(); b->skip=1; b = b->outer; } b->skip=1; return status; } /** Builtin for executing one of several blocks of commands depending on the value of an argument. */ static int builtin_switch(parser_t &parser, wchar_t **argv) { int res=STATUS_BUILTIN_OK; int argc = builtin_count_args(argv); if (argc != 2) { append_format(stderr_buffer, _(L"%ls: Expected exactly one argument, got %d\n"), argv[0], argc-1); builtin_print_help(parser, argv[0], stderr_buffer); res=1; parser.push_block(new fake_block_t()); } else { parser.push_block(new switch_block_t(argv[1])); parser.current_block->skip=1; res = proc_get_last_status(); } return res; } /** Builtin used together with the switch builtin for conditional execution */ static int builtin_case(parser_t &parser, wchar_t **argv) { int argc = builtin_count_args(argv); int i; wchar_t *unescaped=0; if (parser.current_block->type() != SWITCH) { append_format(stderr_buffer, _(L"%ls: 'case' command while not in switch block\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return STATUS_BUILTIN_ERROR; } parser.current_block->skip = 1; switch_block_t *sb = static_cast(parser.current_block); if (sb->switch_taken) { return proc_get_last_status(); } const wcstring &switch_value = sb->switch_value; for (i=1; iskip = 0; sb->switch_taken = true; break; } } return proc_get_last_status(); } /** History of commands executed by user */ static int builtin_history(parser_t &parser, wchar_t **argv) { int argc = builtin_count_args(argv); bool search_history = false; bool delete_item = false; bool search_prefix = false; bool save_history = false; bool clear_history = false; static const struct woption long_options[] = { { L"prefix", no_argument, 0, 'p' }, { L"delete", no_argument, 0, 'd' }, { L"search", no_argument, 0, 's' }, { L"contains", no_argument, 0, 'c' }, { L"save", no_argument, 0, 'v' }, { L"clear", no_argument, 0, 'l' }, { L"help", no_argument, 0, 'h' }, { 0, 0, 0, 0 } }; int opt = 0; int opt_index = 0; woptind = 0; history_t *history = reader_get_history(); /* Use the default history if we have none (which happens if invoked non-interactively, e.g. from webconfig.py */ if (! history) history = &history_t::history_with_name(L"fish"); while ((opt = wgetopt_long_only(argc, argv, L"pdscvl", long_options, &opt_index)) != -1) { switch (opt) { case 'p': search_prefix = true; break; case 'd': delete_item = true; break; case 's': search_history = true; break; case 'c': break; case 'v': save_history = true; break; case 'l': clear_history = true; break; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; break; case EOF: /* Remainder are arguments */ break; case '?': append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; break; default: append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], argv[woptind-1]); return STATUS_BUILTIN_ERROR; } } /* Everything after is an argument */ const wcstring_list_t args(argv + woptind, argv + argc); if (argc == 1) { wcstring full_history; history->get_string_representation(full_history, wcstring(L"\n")); stdout_buffer.append(full_history); stdout_buffer.push_back('\n'); return STATUS_BUILTIN_OK; } if (search_history) { int res = STATUS_BUILTIN_ERROR; for (wcstring_list_t::const_iterator iter = args.begin(); iter != args.end(); ++iter) { const wcstring &search_string = *iter; if (search_string.empty()) { append_format(stderr_buffer, BUILTIN_ERR_COMBO2, argv[0], L"Use --search with either --contains or --prefix"); return res; } history_search_t searcher = history_search_t(*history, search_string, search_prefix?HISTORY_SEARCH_TYPE_PREFIX:HISTORY_SEARCH_TYPE_CONTAINS); while (searcher.go_backwards()) { stdout_buffer.append(searcher.current_string()); stdout_buffer.append(L"\n"); res = STATUS_BUILTIN_OK; } } return res; } if (delete_item) { for (wcstring_list_t::const_iterator iter = args.begin(); iter != args.end(); ++iter) { wcstring delete_string = *iter; if (delete_string[0] == '"' && delete_string[delete_string.length() - 1] == '"') delete_string = delete_string.substr(1, delete_string.length() - 2); history->remove(delete_string); } return STATUS_BUILTIN_OK; } if (save_history) { history->save(); return STATUS_BUILTIN_OK; } if (clear_history) { history->clear(); history->save(); return STATUS_BUILTIN_OK; } return STATUS_BUILTIN_ERROR; } /* END OF BUILTIN COMMANDS Below are functions for handling the builtin commands. THESE MUST BE SORTED BY NAME! Completion lookup uses binary search. */ /** Data about all the builtin commands in fish. Functions that are bound to builtin_generic are handled directly by the parser. NOTE: These must be kept in sorted order! */ static const builtin_data_t builtin_datas[]= { { L".", &builtin_source, N_(L"Evaluate contents of file") }, { L"[", &builtin_test, N_(L"Test a condition") }, { L"and", &builtin_generic, N_(L"Execute command if previous command suceeded") }, { L"begin", &builtin_begin, N_(L"Create a block of code") }, { L"bg", &builtin_bg, N_(L"Send job to background") }, { L"bind", &builtin_bind, N_(L"Handle fish key bindings") }, { L"block", &builtin_block, N_(L"Temporarily block delivery of events") }, { L"break", &builtin_break_continue, N_(L"Stop the innermost loop") }, { L"breakpoint", &builtin_breakpoint, N_(L"Temporarily halt execution of a script and launch an interactive debug prompt") }, { L"builtin", &builtin_builtin, N_(L"Run a builtin command instead of a function") }, { L"case", &builtin_case, N_(L"Conditionally execute a block of commands") }, { L"cd", &builtin_cd, N_(L"Change working directory") }, { L"command", &builtin_generic, N_(L"Run a program instead of a function or builtin") }, { L"commandline", &builtin_commandline, N_(L"Set or get the commandline") }, { L"complete", &builtin_complete, N_(L"Edit command specific completions") }, { L"contains", &builtin_contains, N_(L"Search for a specified string in a list") }, { L"continue", &builtin_break_continue, N_(L"Skip the rest of the current lap of the innermost loop") }, { L"count", &builtin_count, N_(L"Count the number of arguments") }, { L"echo", &builtin_echo, N_(L"Print arguments") }, { L"else", &builtin_else, N_(L"Evaluate block if condition is false") }, { L"emit", &builtin_emit, N_(L"Emit an event") }, { L"end", &builtin_end, N_(L"End a block of commands") }, { L"exec", &builtin_generic, N_(L"Run command in current process") }, { L"exit", &builtin_exit, N_(L"Exit the shell") }, { L"fg", &builtin_fg, N_(L"Send job to foreground") }, { L"for", &builtin_for, N_(L"Perform a set of commands multiple times") }, { L"function", &builtin_function, N_(L"Define a new function") }, { L"functions", &builtin_functions, N_(L"List or remove functions") }, { L"history", &builtin_history, N_(L"History of commands executed by user") }, { L"if", &builtin_generic, N_(L"Evaluate block if condition is true") }, { L"jobs", &builtin_jobs, N_(L"Print currently running jobs") }, { L"not", &builtin_generic, N_(L"Negate exit status of job") }, { L"or", &builtin_generic, N_(L"Execute command if previous command failed") }, { L"printf", &builtin_printf, N_(L"Prints formatted text") }, { L"pwd", &builtin_pwd, N_(L"Print the working directory") }, { L"random", &builtin_random, N_(L"Generate random number") }, { L"read", &builtin_read, N_(L"Read a line of input into variables") }, { L"return", &builtin_return, N_(L"Stop the currently evaluated function") }, { L"set", &builtin_set, N_(L"Handle environment variables") }, { L"set_color", &builtin_set_color, N_(L"Set the terminal color") }, { L"status", &builtin_status, N_(L"Return status information about fish") }, { L"switch", &builtin_switch, N_(L"Conditionally execute a block of commands") }, { L"test", &builtin_test, N_(L"Test a condition") }, { L"ulimit", &builtin_ulimit, N_(L"Set or get the shells resource usage limits") }, { L"while", &builtin_generic, N_(L"Perform a command multiple times") } }; #define BUILTIN_COUNT (sizeof builtin_datas / sizeof *builtin_datas) static const builtin_data_t *builtin_lookup(const wcstring &name) { const builtin_data_t *array_end = builtin_datas + BUILTIN_COUNT; const builtin_data_t *found = std::lower_bound(builtin_datas, array_end, name); if (found != array_end && name == found->name) { return found; } else { return NULL; } } void builtin_init() { wopterr = 0; for (size_t i=0; i < BUILTIN_COUNT; i++) { intern_static(builtin_datas[i].name); } } void builtin_destroy() { } int builtin_exists(const wcstring &cmd) { return !!builtin_lookup(cmd); } /** Return true if the specified builtin should handle it's own help, false otherwise. */ static int internal_help(const wchar_t *cmd) { CHECK(cmd, 0); return contains(cmd, L"for", L"while", L"function", L"if", L"end", L"switch", L"case", L"count"); } int builtin_run(parser_t &parser, const wchar_t * const *argv, const io_chain_t &io) { int (*cmd)(parser_t &parser, const wchar_t * const *argv)=0; real_io = &io; CHECK(argv, STATUS_BUILTIN_ERROR); CHECK(argv[0], STATUS_BUILTIN_ERROR); const builtin_data_t *data = builtin_lookup(argv[0]); cmd = (int (*)(parser_t &parser, const wchar_t * const*))(data ? data->func : NULL); if (argv[1] != 0 && !internal_help(argv[0])) { if (argv[2] == 0 && (parser.is_help(argv[1], 0))) { builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; } } if (data != NULL) { int status; status = cmd(parser, argv); return status; } else { debug(0, _(L"Unknown builtin '%ls'"), argv[0]); } return STATUS_BUILTIN_ERROR; } wcstring_list_t builtin_get_names(void) { wcstring_list_t result; result.reserve(BUILTIN_COUNT); for (size_t i=0; i < BUILTIN_COUNT; i++) { result.push_back(builtin_datas[i].name); } return result; } void builtin_get_names(std::vector &list) { for (size_t i=0; i < BUILTIN_COUNT; i++) { list.push_back(completion_t(builtin_datas[i].name)); } } wcstring builtin_get_desc(const wcstring &name) { wcstring result; const builtin_data_t *builtin = builtin_lookup(name); if (builtin) { result = _(builtin->desc); } return result; } void builtin_push_io(parser_t &parser, int in) { ASSERT_IS_MAIN_THREAD(); if (builtin_stdin != -1) { struct io_stack_elem_t elem = {builtin_stdin, stdout_buffer, stderr_buffer}; io_stack.push(elem); } builtin_stdin = in; stdout_buffer.clear(); stderr_buffer.clear(); } void builtin_pop_io(parser_t &parser) { ASSERT_IS_MAIN_THREAD(); builtin_stdin = 0; if (! io_stack.empty()) { struct io_stack_elem_t &elem = io_stack.top(); stderr_buffer = elem.err; stdout_buffer = elem.out; builtin_stdin = elem.in; io_stack.pop(); } else { stdout_buffer.clear(); stderr_buffer.clear(); builtin_stdin = 0; } } fish/builtin.h000066400000000000000000000112251214535744100136350ustar00rootroot00000000000000/** \file builtin.h Prototypes for functions for executing builtin functions. */ #ifndef FISH_BUILTIN_H #define FISH_BUILTIN_H #include #include "util.h" #include "io.h" #include "common.h" class parser_t; enum { COMMAND_NOT_BUILTIN, BUILTIN_REGULAR, BUILTIN_FUNCTION } ; /** Error message on missing argument */ #define BUILTIN_ERR_MISSING _( L"%ls: Expected argument\n" ) /** Error message on invalid combination of options */ #define BUILTIN_ERR_COMBO _( L"%ls: Invalid combination of options\n" ) /** Error message on invalid combination of options */ #define BUILTIN_ERR_COMBO2 _( L"%ls: Invalid combination of options,\n%ls\n" ) /** Error message on multiple scope levels for variables */ #define BUILTIN_ERR_GLOCAL _( L"%ls: Variable scope can only be one of universal, global and local\n" ) /** Error message for specifying both export and unexport to set/read */ #define BUILTIN_ERR_EXPUNEXP _( L"%ls: Variable can't be both exported and unexported\n" ) /** Error message for unknown switch */ #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" ) /** Error message when second argument to for isn't 'in' */ #define BUILTIN_FOR_ERR_IN _( L"%ls: Second argument must be 'in'\n" ) /** Error message for insufficient number of arguments */ #define BUILTIN_FOR_ERR_COUNT _( L"%ls: Expected at least two arguments, got %d\n") #define BUILTIN_FOR_ERR_NAME _( L"%ls: '%ls' is not a valid variable name\n" ) /** Error messages for 'else if' */ #define BUILTIN_ELSEIF_ERR_COUNT _( L"%ls: can only take 'if' and then another command as an argument\n") #define BUILTIN_ELSEIF_ERR_ARGUMENT _( L"%ls: any second argument must be 'if'\n") /** Error message when too many arguments are supplied to a builtin */ #define BUILTIN_ERR_TOO_MANY_ARGUMENTS _( L"%ls: Too many arguments\n" ) /** Error message when block types mismatch in the end builtin, e.g. 'begin; end for' */ #define BUILTIN_END_BLOCK_MISMATCH _( L"%ls: Block mismatch: '%ls' vs. '%ls'\n" ) /** Error message for unknown block type in the end builtin, e.g. 'begin; end beggin' */ #define BUILTIN_END_BLOCK_UNKNOWN _( L"%ls: Unknown block type '%ls'\n" ) #define BUILTIN_ERR_NOT_NUMBER _( L"%ls: Argument '%ls' is not a number\n" ) /** Get the string used to represent stdout and stderr */ const wcstring &get_stdout_buffer(); const wcstring &get_stderr_buffer(); /** Output an error */ void builtin_show_error(const wcstring &err); /** Kludge. Tells builtins if output is to screen */ extern int builtin_out_redirect; /** Kludge. Tells builtins if error is to screen */ extern int builtin_err_redirect; /** Initialize builtin data. */ void builtin_init(); /** Destroy builtin data. */ void builtin_destroy(); /** Is there a builtin command with the given name? */ int builtin_exists(const wcstring &cmd); /** Execute a builtin command \param parser The parser being used \param argv Array containing the command and parameters of the builtin. The list is terminated by a null pointer. This syntax resembles the syntax for exec. \param io the io redirections to perform on this builtin. \return the exit status of the builtin command */ int builtin_run(parser_t &parser, const wchar_t * const *argv, const io_chain_t &io); /** Returns a list of all builtin names */ wcstring_list_t builtin_get_names(void); /** Insert all builtin names into list. */ void builtin_get_names(std::vector &list); /** Pushes a new set of input/output to the stack. The new stdin is supplied, a new set of output strings is created. */ void builtin_push_io(parser_t &parser, int stdin_fd); /** Pops a set of input/output from the stack. The output strings are destroued, but the input file is not closed. */ void builtin_pop_io(parser_t &parser); /** Return a one-line description of the specified builtin. */ wcstring builtin_get_desc(const wcstring &b); /** Slightly kludgy function used with 'complete -C' in order to make the commandline builtin operate on the string to complete instead of operating on whatever is to be completed. */ const wchar_t *builtin_complete_get_temporary_buffer(); /** Run the __fish_print_help function to obtain the help information for the specified command. */ wcstring builtin_help_get(parser_t &parser, const wchar_t *cmd); #endif fish/builtin_commandline.cpp000066400000000000000000000360511214535744100165420ustar00rootroot00000000000000/** \file builtin_commandline.c Functions defining the commandline builtin Functions used for implementing the commandline builtin. */ #include "config.h" #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "builtin.h" #include "common.h" #include "wgetopt.h" #include "reader.h" #include "proc.h" #include "parser.h" #include "tokenizer.h" #include "input_common.h" #include "input.h" #include "parse_util.h" /** Which part of the comandbuffer are we operating on */ enum { STRING_MODE=1, /**< Operate on entire buffer */ JOB_MODE, /**< Operate on job under cursor */ PROCESS_MODE, /**< Operate on process under cursor */ TOKEN_MODE /**< Operate on token under cursor */ } ; /** For text insertion, how should it be done */ enum { REPLACE_MODE=1, /**< Replace current text */ INSERT_MODE, /**< Insert at cursor position */ APPEND_MODE /**< Insert at end of current token/command/buffer */ } ; /** Pointer to what the commandline builtin considers to be the current contents of the command line buffer. */ static const wchar_t *current_buffer=0; /** What the commandline builtin considers to be the current cursor position. */ static size_t current_cursor_pos = (size_t)(-1); /** Returns the current commandline buffer. */ static const wchar_t *get_buffer() { return current_buffer; } /** Returns the position of the cursor */ static size_t get_cursor_pos() { return current_cursor_pos; } /** Replace/append/insert the selection with/at/after the specified string. \param begin beginning of selection \param end end of selection \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(const wchar_t *begin, const wchar_t *end, const wchar_t *insert, int append_mode) { const wchar_t *buff = get_buffer(); size_t out_pos = get_cursor_pos(); wcstring out; out.append(buff, begin - buff); switch (append_mode) { case REPLACE_MODE: { out.append(insert); out_pos = wcslen(insert) + (begin-buff); break; } case APPEND_MODE: { out.append(begin, end-begin); out.append(insert); break; } case INSERT_MODE: { long cursor = get_cursor_pos() -(begin-buff); out.append(begin, cursor); out.append(insert); out.append(begin+cursor, end-begin-cursor); out_pos += wcslen(insert); break; } } out.append(end); reader_set_buffer(out, out_pos); } /** Output the specified selection. \param begin start of selection \param end end of selection \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(const wchar_t *begin, const wchar_t *end, int cut_at_cursor, int tokenize) { wcstring out; wchar_t *buff; size_t pos; pos = get_cursor_pos()-(begin-get_buffer()); if (tokenize) { buff = wcsndup(begin, end-begin); // fwprintf( stderr, L"Subshell: %ls, end char %lc\n", buff, *end ); out.clear(); tokenizer_t tok(buff, TOK_ACCEPT_UNFINISHED); for (; tok_has_next(&tok); tok_next(&tok)) { if ((cut_at_cursor) && (tok_get_pos(&tok)+wcslen(tok_last(&tok)) >= pos)) break; switch (tok_last_type(&tok)) { case TOK_STRING: { out.append(escape_string(tok_last(&tok), UNESCAPE_INCOMPLETE)); out.push_back(L'\n'); break; } } } stdout_buffer.append(out); free(buff); } else { if (cut_at_cursor) { end = begin+pos; } // debug( 0, L"woot2 %ls -> %ls", buff, esc ); stdout_buffer.append(begin, end - begin); stdout_buffer.append(L"\n"); } } /** The commandline builtin. It is used for specifying a new value for the commandline. */ static int builtin_commandline(parser_t &parser, wchar_t **argv) { int buffer_part=0; int cut_at_cursor=0; int argc = builtin_count_args(argv); int append_mode=0; int function_mode = 0; int tokenize = 0; int cursor_mode = 0; int line_mode = 0; int search_mode = 0; const wchar_t *begin, *end; current_buffer = (wchar_t *)builtin_complete_get_temporary_buffer(); if (current_buffer) { current_cursor_pos = wcslen(current_buffer); } else { current_buffer = reader_get_buffer(); current_cursor_pos = reader_get_cursor_pos(); } if (!get_buffer()) { if (is_interactive_session) { /* Prompt change requested while we don't have a prompt, most probably while reading the init files. Just ignore it. */ return 1; } stderr_buffer.append(argv[0]); stderr_buffer.append(L": Can not set commandline in non-interactive mode\n"); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } woptind=0; while (1) { static const struct woption long_options[] = { { L"append", no_argument, 0, 'a' } , { L"insert", no_argument, 0, 'i' } , { L"replace", no_argument, 0, 'r' } , { L"current-job", no_argument, 0, 'j' } , { L"current-process", no_argument, 0, 'p' } , { L"current-token", no_argument, 0, 't' } , { L"current-buffer", no_argument, 0, 'b' } , { L"cut-at-cursor", no_argument, 0, 'c' } , { L"function", no_argument, 0, 'f' } , { L"tokenize", no_argument, 0, 'o' } , { L"help", no_argument, 0, 'h' } , { L"input", required_argument, 0, 'I' } , { L"cursor", no_argument, 0, 'C' } , { L"line", no_argument, 0, 'L' } , { L"search-mode", no_argument, 0, 'S' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = wgetopt_long(argc, argv, L"abijpctwforhI:CLS", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return 1; case L'a': append_mode = APPEND_MODE; break; case L'b': buffer_part = STRING_MODE; break; case L'i': append_mode = INSERT_MODE; break; case L'r': append_mode = REPLACE_MODE; break; case 'c': cut_at_cursor=1; break; case 't': buffer_part = TOKEN_MODE; break; case 'j': buffer_part = JOB_MODE; break; case 'p': buffer_part = PROCESS_MODE; break; case 'f': function_mode=1; break; case 'o': tokenize=1; break; case 'I': current_buffer = woptarg; current_cursor_pos = wcslen(woptarg); break; case 'C': cursor_mode = 1; break; case 'L': line_mode = 1; break; case 'S': search_mode = 1; break; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return 0; case L'?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return 1; } } if (function_mode) { int i; /* Check for invalid switch combinations */ if (buffer_part || cut_at_cursor || append_mode || tokenize || cursor_mode || line_mode || search_mode) { append_format(stderr_buffer, BUILTIN_ERR_COMBO, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } if (argc == woptind) { append_format(stderr_buffer, BUILTIN_ERR_MISSING, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } for (i=woptind; i 1)) { append_format(stderr_buffer, argv[0], L": Too many arguments\n", NULL); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } if ((buffer_part || tokenize || cut_at_cursor) && (cursor_mode || line_mode || search_mode)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } if ((tokenize || cut_at_cursor) && (argc-woptind)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO2, argv[0], L"--cut-at-cursor and --tokenize can not be used when setting the commandline"); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } if (append_mode && !(argc-woptind)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO2, argv[0], L"insertion mode switches can not be used when not in insertion mode"); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } /* Set default modes */ if (!append_mode) { append_mode = REPLACE_MODE; } if (!buffer_part) { buffer_part = STRING_MODE; } if (cursor_mode) { if (argc-woptind) { wchar_t *endptr; long new_pos; errno = 0; new_pos = wcstol(argv[woptind], &endptr, 10); if (*endptr || errno) { append_format(stderr_buffer, BUILTIN_ERR_NOT_NUMBER, argv[0], argv[woptind]); builtin_print_help(parser, argv[0], stderr_buffer); } current_buffer = reader_get_buffer(); new_pos = maxi(0L, mini(new_pos, (long)wcslen(current_buffer))); reader_set_buffer(current_buffer, (size_t)new_pos); return 0; } else { append_format(stdout_buffer, L"%lu\n", (unsigned long)reader_get_cursor_pos()); return 0; } } if (line_mode) { size_t pos = reader_get_cursor_pos(); const wchar_t *buff = reader_get_buffer(); append_format(stdout_buffer, L"%lu\n", (unsigned long)parse_util_lineno(buff, pos)); return 0; } if (search_mode) { return !reader_search_mode(); } switch (buffer_part) { case STRING_MODE: { begin = get_buffer(); end = begin+wcslen(begin); break; } case PROCESS_MODE: { parse_util_process_extent(get_buffer(), get_cursor_pos(), &begin, &end); break; } case JOB_MODE: { parse_util_job_extent(get_buffer(), get_cursor_pos(), &begin, &end); break; } case TOKEN_MODE: { parse_util_token_extent(get_buffer(), get_cursor_pos(), &begin, &end, 0, 0); break; } } switch (argc-woptind) { case 0: { write_part(begin, end, cut_at_cursor, tokenize); break; } case 1: { replace_part(begin, end, argv[woptind], append_mode); break; } default: { wcstring sb = argv[woptind]; int i; for (i=woptind+1; i #include #include #include #include #include #include #include "fallback.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" /** Internal storage for the builtin_complete_get_temporary_buffer() function. */ static const 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. This is needed since complete allows you to specify multiple switches on a single commandline, like 'complete -s a -s b -s c', but the complete_add function only accepts one short switch and one long switch. */ /** Silly function */ static void builtin_complete_add2(const wchar_t *cmd, int cmd_type, const wchar_t *short_opt, const wcstring_list_t &gnu_opt, const wcstring_list_t &old_opt, int result_mode, const wchar_t *condition, const wchar_t *comp, const wchar_t *desc, int flags) { size_t i; const wchar_t *s; for (s=short_opt; *s; s++) { complete_add(cmd, cmd_type, *s, 0, 0, result_mode, condition, comp, desc, flags); } for (i=0; i comp; complete(do_complete_param, comp, COMPLETION_REQUEST_DEFAULT); for (size_t i=0; i< comp.size() ; i++) { const completion_t &next = comp.at(i); const wchar_t *prepend; if (next.flags & COMPLETE_REPLACES_TOKEN) { prepend = L""; } else { prepend = token; } if (!(next.description).empty()) { append_format(stdout_buffer, L"%ls%ls\t%ls\n", prepend, next.completion.c_str(), next.description.c_str()); } else { append_format(stdout_buffer, L"%ls%ls\n", prepend, next.completion.c_str()); } } recursion_level--; } temporary_buffer = prev_temporary_buffer; } else if (woptind != argc) { append_format(stderr_buffer, _(L"%ls: Too many arguments\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); res = true; } else if (cmd.empty() && path.empty()) { /* No arguments specified, meaning we print the definitions of * all specified completions to stdout.*/ complete_print(stdout_buffer); } else { if (remove) { builtin_complete_remove(cmd, path, short_opt.c_str(), gnu_opt, old_opt); } else { builtin_complete_add(cmd, path, short_opt.c_str(), gnu_opt, old_opt, result_mode, authoritative, condition, comp, desc, flags); } } } return res ? 1 : 0; } fish/builtin_jobs.cpp000066400000000000000000000175451214535744100152200ustar00rootroot00000000000000/** \file builtin_jobs.c Functions for executing the jobs builtin. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "builtin.h" #include "proc.h" #include "parser.h" #include "common.h" #include "wgetopt.h" /** Print modes for the jobs builtin */ enum { JOBS_DEFAULT, /**< Print lots of general info */ JOBS_PRINT_PID, /**< Print pid of each process in job */ JOBS_PRINT_COMMAND, /**< Print command name of each process in job */ JOBS_PRINT_GROUP, /**< Print group id of job */ } ; #ifdef HAVE__PROC_SELF_STAT /** Calculates the cpu usage (in percent) of the specified job. */ static int cpu_use(const job_t *j) { double u=0; process_t *p; for (p=j->first_process; p; p=p->next) { struct timeval t; int jiffies; gettimeofday(&t, 0); jiffies = proc_get_jiffies(p); double t1 = 1000000.0*p->last_time.tv_sec+p->last_time.tv_usec; double t2 = 1000000.0*t.tv_sec+t.tv_usec; /* fwprintf( stderr, L"t1 %f t2 %f p1 %d p2 %d\n", t1, t2, jiffies, p->last_jiffies ); */ u += ((double)(jiffies-p->last_jiffies))/(t2-t1); } return u*1000000; } #endif /** Print information about the specified job */ static void builtin_jobs_print(const job_t *j, int mode, int header) { process_t *p; switch (mode) { case JOBS_DEFAULT: { if (header) { /* Print table header before first job */ stdout_buffer.append(_(L"Job\tGroup\t")); #ifdef HAVE__PROC_SELF_STAT stdout_buffer.append(_(L"CPU\t")); #endif stdout_buffer.append(_(L"State\tCommand\n")); } append_format(stdout_buffer, L"%d\t%d\t", j->job_id, j->pgid); #ifdef HAVE__PROC_SELF_STAT append_format(stdout_buffer, L"%d%%\t", cpu_use(j)); #endif stdout_buffer.append(job_is_stopped(j)?_(L"stopped"):_(L"running")); stdout_buffer.append(L"\t"); stdout_buffer.append(j->command_wcstr()); stdout_buffer.append(L"\n"); break; } case JOBS_PRINT_GROUP: { if (header) { /* Print table header before first job */ stdout_buffer.append(_(L"Group\n")); } append_format(stdout_buffer, L"%d\n", j->pgid); break; } case JOBS_PRINT_PID: { if (header) { /* Print table header before first job */ stdout_buffer.append(_(L"Procces\n")); } for (p=j->first_process; p; p=p->next) { append_format(stdout_buffer, L"%d\n", p->pid); } break; } case JOBS_PRINT_COMMAND: { if (header) { /* Print table header before first job */ stdout_buffer.append(_(L"Command\n")); } for (p=j->first_process; p; p=p->next) { append_format(stdout_buffer, L"%ls\n", p->argv0()); } break; } } } /** The jobs builtin. Used fopr printing running jobs. Defined in builtin_jobs.c. */ static int builtin_jobs(parser_t &parser, wchar_t **argv) { int argc=0; int found=0; int mode=JOBS_DEFAULT; int print_last = 0; const job_t *j; argc = builtin_count_args(argv); woptind=0; while (1) { static const struct woption long_options[] = { { L"pid", no_argument, 0, 'p' } , { L"command", no_argument, 0, 'c' } , { L"group", no_argument, 0, 'g' } , { L"last", no_argument, 0, 'l' } , { L"help", no_argument, 0, 'h' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = wgetopt_long(argc, argv, L"pclgh", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return 1; case 'p': mode=JOBS_PRINT_PID; break; case 'c': mode=JOBS_PRINT_COMMAND; break; case 'g': mode=JOBS_PRINT_GROUP; break; case 'l': { print_last = 1; break; } case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return 0; case '?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return 1; } } /* Do not babble if not interactive */ if (builtin_out_redirect) { found=1; } if (print_last) { /* Ignore unconstructed jobs, i.e. ourself. */ job_iterator_t jobs; const job_t *j; while ((j = jobs.next())) { if ((j->flags & JOB_CONSTRUCTED) && !job_is_completed(j)) { builtin_jobs_print(j, mode, !found); return 0; } } } else { if (woptind < argc) { int i; found = 1; for (i=woptind; iflags & JOB_CONSTRUCTED) && !job_is_completed(j)) { builtin_jobs_print(j, mode, !found); found = 1; } } } } if (!found) { append_format(stdout_buffer, _(L"%ls: There are no jobs\n"), argv[0]); } return 0; } fish/builtin_printf.cpp000066400000000000000000000555741214535744100155710ustar00rootroot00000000000000/* printf - format and print data Copyright (C) 1990-2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Usage: printf format [argument...] A front end to the printf function that lets it be used from the shell. Backslash escapes: \" = double quote \\ = backslash \a = alert (bell) \b = backspace \c = produce no further output \f = form feed \n = new line \r = carriage return \t = horizontal tab \v = vertical tab \ooo = octal number (ooo is 1 to 3 digits) \xhh = hexadecimal number (hhh is 1 to 2 digits) \uhhhh = 16-bit Unicode character (hhhh is 4 digits) \Uhhhhhhhh = 32-bit Unicode character (hhhhhhhh is 8 digits) Additional directive: %b = print an argument string, interpreting backslash escapes, except that octal escapes are of the form \0 or \0ooo. The `format' argument is re-used as many times as necessary to convert all of the given arguments. David MacKenzie */ /* This file has been imported from source code of printf command in GNU Coreutils version 6.9 */ #include #include #include #include "common.h" struct builtin_printf_state_t { /* The status of the operation */ int exit_code; /* Whether we should stop outputting. This gets set in the case of an error, and also with the \c escape. */ bool early_exit; builtin_printf_state_t() : exit_code(0), early_exit(false) { } void verify_numeric(const wchar_t *s, const wchar_t *end, int errcode); void print_direc(const wchar_t *start, size_t length, wchar_t conversion, bool have_field_width, int field_width, bool have_precision, int precision, wchar_t const *argument); int print_formatted(const wchar_t *format, int argc, wchar_t **argv); void fatal_error(const wchar_t *format, ...); long print_esc(const wchar_t *escstart, bool octal_0); void print_esc_string(const wchar_t *str); void print_esc_char(wchar_t c); void append_output(wchar_t c); void append_output(const wchar_t *c); void append_format_output(const wchar_t *fmt, ...); }; static bool is_octal_digit(wchar_t c) { return c != L'\0' && wcschr(L"01234567", c) != NULL; } static bool is_hex_digit(wchar_t c) { return c != L'\0' && wcschr(L"0123456789ABCDEFabcdef", c) != NULL; } static int hex_to_bin(const wchar_t &c) { switch (c) { case L'0': return 0; case L'1': return 1; case L'2': return 2; case L'3': return 3; case L'4': return 4; case L'5': return 5; case L'6': return 6; case L'7': return 7; case L'8': return 8; case L'9': return 9; case L'a': case L'A': return 10; case L'b': case L'B': return 11; case L'c': case L'C': return 12; case L'd': case L'D': return 13; case L'e': case L'E': return 14; case L'f': case L'F': return 15; default: return -1; } } static int octal_to_bin(wchar_t c) { switch (c) { case L'0': return 0; case L'1': return 1; case L'2': return 2; case L'3': return 3; case L'4': return 4; case L'5': return 5; case L'6': return 6; case L'7': return 7; default: return -1; } } /* This message appears in N_() here rather than just in _() below because the sole use would have been in a #define. */ static wchar_t const *const cfcc_msg = N_(L"warning: %ls: character(s) following character constant have been ignored"); double C_STRTOD(wchar_t const *nptr, wchar_t **endptr) { double r; const wcstring saved_locale = wsetlocale(LC_NUMERIC, NULL); if (!saved_locale.empty()) { wsetlocale(LC_NUMERIC, L"C"); } r = wcstod(nptr, endptr); if (!saved_locale.empty()) { wsetlocale(LC_NUMERIC, saved_locale.c_str()); } return r; } static inline unsigned wchar_t to_uwchar_t(wchar_t ch) { return ch; } void builtin_printf_state_t::fatal_error(const wchar_t *fmt, ...) { // Don't error twice if (early_exit) return; va_list va; va_start(va, fmt); wcstring errstr = vformat_string(fmt, va); va_end(va); stderr_buffer.append(errstr); if (! string_suffixes_string(L"\n", errstr)) stderr_buffer.push_back(L'\n'); this->exit_code = STATUS_BUILTIN_ERROR; this->early_exit = true; } void builtin_printf_state_t::append_output(wchar_t c) { // Don't output if we're done if (early_exit) return; stdout_buffer.push_back(c); } void builtin_printf_state_t::append_output(const wchar_t *c) { // Don't output if we're done if (early_exit) return; stdout_buffer.append(c); } void builtin_printf_state_t::append_format_output(const wchar_t *fmt, ...) { // Don't output if we're done if (early_exit) return; va_list va; va_start(va, fmt); append_formatv(stdout_buffer, fmt, va); va_end(va); } void builtin_printf_state_t::verify_numeric(const wchar_t *s, const wchar_t *end, int errcode) { if (errcode != 0) { this->fatal_error(L"%ls: %s", s, strerror(errcode)); } else if (*end) { if (s == end) this->fatal_error(_(L"%ls: expected a numeric value"), s); else this->fatal_error(_(L"%ls: value not completely converted"), s); } } template static T raw_string_to_scalar_type(const wchar_t *s, wchar_t ** end); // we use wcstoll instead of wcstoimax because FreeBSD 8 has busted wcstoumax and wcstoimax - see #626 template<> intmax_t raw_string_to_scalar_type(const wchar_t *s, wchar_t ** end) { return wcstoll(s, end, 0); } template<> uintmax_t raw_string_to_scalar_type(const wchar_t *s, wchar_t ** end) { return wcstoull(s, end, 0); } template<> long double raw_string_to_scalar_type(const wchar_t *s, wchar_t ** end) { return C_STRTOD(s, end); } template static T string_to_scalar_type(const wchar_t *s, builtin_printf_state_t *state) { T val; if (*s == L'\"' || *s == L'\'') { unsigned wchar_t ch = *++s; val = ch; } else { wchar_t *end = NULL; errno = 0; val = raw_string_to_scalar_type(s, &end); state->verify_numeric(s, end, errno); } return val; } /* Output a single-character \ escape. */ void builtin_printf_state_t::print_esc_char(wchar_t c) { switch (c) { case L'a': /* Alert. */ this->append_output(L'\a'); break; case L'b': /* Backspace. */ this->append_output(L'\b'); break; case L'c': /* Cancel the rest of the output. */ this->early_exit = true; break; case L'f': /* Form feed. */ this->append_output(L'\f'); break; case L'n': /* New line. */ this->append_output(L'\n'); break; case L'r': /* Carriage return. */ this->append_output(L'\r'); break; case L't': /* Horizontal tab. */ this->append_output(L'\t'); break; case L'v': /* Vertical tab. */ this->append_output(L'\v'); break; default: this->append_output(c); break; } } /* Print a \ escape sequence starting at ESCSTART. Return the number of characters in the escape sequence besides the backslash. If OCTAL_0 is nonzero, octal escapes are of the form \0ooo, where o is an octal digit; otherwise they are of the form \ooo. */ long builtin_printf_state_t::print_esc(const wchar_t *escstart, bool octal_0) { const wchar_t *p = escstart + 1; int esc_value = 0; /* Value of \nnn escape. */ int esc_length; /* Length of \nnn escape. */ if (*p == L'x') { /* A hexadecimal \xhh escape sequence must have 1 or 2 hex. digits. */ for (esc_length = 0, ++p; esc_length < 2 && is_hex_digit(*p); ++esc_length, ++p) esc_value = esc_value * 16 + hex_to_bin(*p); if (esc_length == 0) this->fatal_error(_(L"missing hexadecimal number in escape")); this->append_format_output(L"%lc", esc_value); } else if (is_octal_digit(*p)) { /* Parse \0ooo (if octal_0 && *p == L'0') or \ooo (otherwise). Allow \ooo if octal_0 && *p != L'0'; this is an undocumented extension to POSIX that is compatible with Bash 2.05b. */ for (esc_length = 0, p += octal_0 && *p == L'0'; esc_length < 3 && is_octal_digit(*p); ++esc_length, ++p) esc_value = esc_value * 8 + octal_to_bin(*p); this->append_format_output(L"%c", esc_value); } else if (*p && wcschr(L"\"\\abcfnrtv", *p)) print_esc_char(*p++); else if (*p == L'u' || *p == L'U') { wchar_t esc_char = *p; p++; uint32_t uni_value = 0; for (size_t esc_length = 0; esc_length < (esc_char == L'u' ? 4 : 8); esc_length++) { if (! is_hex_digit(*p)) { /* Escape sequence must be done. Complain if we didn't get anything */ if (esc_length == 0) { this->fatal_error(_(L"Missing hexadecimal number in Unicode escape")); } break; } uni_value = uni_value * 16 + hex_to_bin(*p); p++; } /* PCA GNU printf respects the limitations described in ISO N717, about which universal characters "shall not" be specified. I believe this limitation is for the benefit of compilers; I see no reason to impose it in builtin_printf. If __STDC_ISO_10646__ is defined, then it means wchar_t can and does hold Unicode code points, so just use that. If not defined, use the %lc printf conversion; this probably won't do anything good if your wide character set is not Unicode, but such platforms are exceedingly rare. */ if (uni_value > 0x10FFFF) { this->fatal_error(_(L"Unicode character out of range: \\%c%0*x"), esc_char, (esc_char == L'u' ? 4 : 8), uni_value); } else { #if defined(__STDC_ISO_10646__) this->append_output(uni_value); #else this->append_format_output(L"%lc", uni_value); #endif } } else { this->append_output(L'\\'); if (*p) { this->append_output(*p); p++; } } return p - escstart - 1; } /* Print string STR, evaluating \ escapes. */ void builtin_printf_state_t::print_esc_string(const wchar_t *str) { for (; *str; str++) if (*str == L'\\') str += print_esc(str, true); else this->append_output(*str); } /* Evaluate a printf conversion specification. START is the start of the directive, LENGTH is its length, and CONVERSION specifies the type of conversion. LENGTH does not include any length modifier or the conversion specifier itself. FIELD_WIDTH and PRECISION are the field width and precision for '*' values, if HAVE_FIELD_WIDTH and HAVE_PRECISION are true, respectively. ARGUMENT is the argument to be formatted. */ void builtin_printf_state_t::print_direc(const wchar_t *start, size_t length, wchar_t conversion, bool have_field_width, int field_width, bool have_precision, int precision, wchar_t const *argument) { // Start with everything except the conversion specifier wcstring fmt(start, length); /* Create a copy of the % directive, with an intmax_t-wide width modifier substituted for any existing integer length modifier. */ switch (conversion) { case L'd': case L'i': case L'u': fmt.append(L"ll"); break; case L'a': case L'e': case L'f': case L'g': case L'A': case L'E': case L'F': case L'G': fmt.append(L"L"); break; case L's': fmt.append(L"l"); break; default: break; } // Append the conversion itself fmt.push_back(conversion); switch (conversion) { case L'd': case L'i': { intmax_t arg = string_to_scalar_type(argument, this); if (! have_field_width) { if (! have_precision) this->append_format_output(fmt.c_str(), arg); else this->append_format_output(fmt.c_str(), precision, arg); } else { if (! have_precision) this->append_format_output(fmt.c_str(), field_width, arg); else this->append_format_output(fmt.c_str(), field_width, precision, arg); } } break; case L'o': case L'u': case L'x': case L'X': { uintmax_t arg = string_to_scalar_type(argument, this); if (!have_field_width) { if (!have_precision) this->append_format_output(fmt.c_str(), arg); else this->append_format_output(fmt.c_str(), precision, arg); } else { if (!have_precision) this->append_format_output(fmt.c_str(), field_width, arg); else this->append_format_output(fmt.c_str(), field_width, precision, arg); } } break; case L'a': case L'A': case L'e': case L'E': case L'f': case L'F': case L'g': case L'G': { long double arg = string_to_scalar_type(argument, this); if (!have_field_width) { if (!have_precision) this->append_format_output(fmt.c_str(), arg); else this->append_format_output(fmt.c_str(), precision, arg); } else { if (!have_precision) this->append_format_output(fmt.c_str(), field_width, arg); else this->append_format_output(fmt.c_str(), field_width, precision, arg); } } break; case L'c': if (!have_field_width) this->append_format_output(fmt.c_str(), *argument); else this->append_format_output(fmt.c_str(), field_width, *argument); break; case L's': if (!have_field_width) { if (!have_precision) { this->append_format_output(fmt.c_str(), argument); } else this->append_format_output(fmt.c_str(), precision, argument); } else { if (!have_precision) this->append_format_output(fmt.c_str(), field_width, argument); else this->append_format_output(fmt.c_str(), field_width, precision, argument); } break; } } /* Print the text in FORMAT, using ARGV (with ARGC elements) for arguments to any `%' directives. Return the number of elements of ARGV used. */ int builtin_printf_state_t::print_formatted(const wchar_t *format, int argc, wchar_t **argv) { int save_argc = argc; /* Preserve original value. */ const wchar_t *f; /* Pointer into `format'. */ const wchar_t *direc_start; /* Start of % directive. */ size_t direc_length; /* Length of % directive. */ bool have_field_width; /* True if FIELD_WIDTH is valid. */ int field_width = 0; /* Arg to first '*'. */ bool have_precision; /* True if PRECISION is valid. */ int precision = 0; /* Arg to second '*'. */ bool ok[UCHAR_MAX + 1] = { }; /* ok['x'] is true if %x is allowed. */ for (f = format; *f != L'\0'; ++f) { switch (*f) { case L'%': direc_start = f++; direc_length = 1; have_field_width = have_precision = false; if (*f == L'%') { this->append_output(L'%'); break; } if (*f == L'b') { /* FIXME: Field width and precision are not supported for %b, even though POSIX requires it. */ if (argc > 0) { print_esc_string(*argv); ++argv; --argc; } break; } ok['a'] = ok['A'] = ok['c'] = ok['d'] = ok['e'] = ok['E'] = ok['f'] = ok['F'] = ok['g'] = ok['G'] = ok['i'] = ok['o'] = ok['s'] = ok['u'] = ok['x'] = ok['X'] = true; for (;; f++, direc_length++) { switch (*f) { case L'I': case L'\'': ok['a'] = ok['A'] = ok['c'] = ok['e'] = ok['E'] = ok['o'] = ok['s'] = ok['x'] = ok['X'] = false; break; case '-': case '+': case ' ': break; case L'#': ok['c'] = ok['d'] = ok['i'] = ok['s'] = ok['u'] = false; break; case '0': ok['c'] = ok['s'] = false; break; default: goto no_more_flag_characters; } } no_more_flag_characters: ; if (*f == L'*') { ++f; ++direc_length; if (argc > 0) { intmax_t width = string_to_scalar_type(*argv, this); if (INT_MIN <= width && width <= INT_MAX) field_width = static_cast(width); else this->fatal_error(_(L"invalid field width: %ls"), *argv); ++argv; --argc; } else { field_width = 0; } have_field_width = true; } else { while (iswdigit(*f)) { ++f; ++direc_length; } } if (*f == L'.') { ++f; ++direc_length; ok['c'] = false; if (*f == L'*') { ++f; ++direc_length; if (argc > 0) { intmax_t prec = string_to_scalar_type(*argv, this); if (prec < 0) { /* A negative precision is taken as if the precision were omitted, so -1 is safe here even if prec < INT_MIN. */ precision = -1; } else if (INT_MAX < prec) this->fatal_error(_(L"invalid precision: %ls"), *argv); else { precision = static_cast(prec); } ++argv; --argc; } else { precision = 0; } have_precision = true; } else { while (iswdigit(*f)) { ++f; ++direc_length; } } } while (*f == L'l' || *f == L'L' || *f == L'h' || *f == L'j' || *f == L't' || *f == L'z') ++f; { unsigned wchar_t conversion = *f; if (! ok[conversion]) { this->fatal_error(_(L"%.*ls: invalid conversion specification"), (int)(f + 1 - direc_start), direc_start); return 0; } } print_direc(direc_start, direc_length, *f, have_field_width, field_width, have_precision, precision, (argc <= 0 ? L"" : (argc--, *argv++))); break; case L'\\': f += print_esc(f, false); break; default: this->append_output(*f); } } return save_argc - argc; } static int builtin_printf(parser_t &parser, wchar_t **argv) { builtin_printf_state_t state; wchar_t *format; int args_used; int argc = builtin_count_args(argv); if (argc <= 1) { state.fatal_error(_(L"printf: not enough arguments")); return STATUS_BUILTIN_ERROR; } format = argv[1]; argc -= 2; argv += 2; do { args_used = state.print_formatted(format, argc, argv); argc -= args_used; argv += args_used; } while (args_used > 0 && argc > 0 && ! state.early_exit); return state.exit_code; } fish/builtin_set.cpp000066400000000000000000000472761214535744100150620ustar00rootroot00000000000000/** \file builtin_set.c Functions defining the set builtin Functions used for implementing the set builtin. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "builtin.h" #include "env.h" #include "expand.h" #include "common.h" #include "wgetopt.h" #include "proc.h" #include "parser.h" /* We know about these buffers */ extern wcstring stdout_buffer, stderr_buffer; /** Error message for invalid path operations */ #define BUILTIN_SET_PATH_ERROR L"%ls: Warning: path component %ls may not be valid in %ls.\n" /** Hint for invalid path operation with a colon */ #define BUILTIN_SET_PATH_HINT L"%ls: Did you mean 'set %ls $%ls %ls'?\n" /** Error for mismatch between index count and elements */ #define BUILTIN_SET_ARG_COUNT L"%ls: The number of variable indexes does not match the number of values\n" /** Test if the specified variable should be subject to path validation */ static int is_path_variable(const wchar_t *env) { return contains(env, L"PATH", L"CDPATH"); } /** Call env_set. If this is a path variable, e.g. PATH, validate the elements. On error, print a description of the problem to stderr. */ static int my_env_set(const wchar_t *key, const wcstring_list_t &val, int scope) { size_t i; int retcode = 0; const wchar_t *val_str=NULL; if (is_path_variable(key)) { /* Fix for https://github.com/fish-shell/fish-shell/issues/199 . Return success if any path setting succeeds. */ bool any_success = false; /* Don't bother validating (or complaining about) values that are already present */ wcstring_list_t existing_values; const env_var_t existing_variable = env_get_string(key); if (! existing_variable.missing_or_empty()) tokenize_variable_array(existing_variable, existing_values); for (i=0; i< val.size() ; i++) { const wcstring &dir = val.at(i); if (list_contains_string(existing_values, dir)) { any_success = true; continue; } bool show_perror = false; int show_hint = 0; bool error = false; struct stat buff; if (wstat(dir, &buff)) { error = true; show_perror = true; } if (!(S_ISDIR(buff.st_mode))) { error = true; } if (!error) { any_success = true; } else { append_format(stderr_buffer, _(BUILTIN_SET_PATH_ERROR), L"set", dir.c_str(), key); const wchar_t *colon = wcschr(dir.c_str(), L':'); if (colon && *(colon+1)) { show_hint = 1; } } if (show_perror) { builtin_wperror(L"set"); } if (show_hint) { append_format(stderr_buffer, _(BUILTIN_SET_PATH_HINT), L"set", key, key, wcschr(dir.c_str(), L':')+1); } } /* Fail at setting the path if we tried to set it to something non-empty, but it wound up empty. */ if (! val.empty() && ! any_success) { return 1; } } wcstring sb; if (! val.empty()) { for (i=0; i< val.size() ; i++) { sb.append(val[i]); if (i &indexes, const wchar_t *src, const wchar_t *name, size_t var_count) { size_t len; int count = 0; const wchar_t *src_orig = src; if (src == 0) { return 0; } while (*src != L'\0' && (iswalnum(*src) || *src == L'_')) { src++; } if (*src != L'[') { append_format(stderr_buffer, _(BUILTIN_SET_ARG_COUNT), L"set"); return 0; } len = src-src_orig; if ((wcsncmp(src_orig, name, len)!=0) || (wcslen(name) != (len))) { append_format(stderr_buffer, _(L"%ls: Multiple variable names specified in single call (%ls and %.*ls)\n"), L"set", name, len, src_orig); return 0; } src++; while (iswspace(*src)) { src++; } while (*src != L']') { wchar_t *end; long l_ind; errno = 0; l_ind = wcstol(src, &end, 10); if (end==src || errno) { append_format(stderr_buffer, _(L"%ls: Invalid index starting at '%ls'\n"), L"set", src); return 0; } if (l_ind < 0) { l_ind = var_count+l_ind+1; } src = end; if (*src==L'.' && *(src+1)==L'.') { src+=2; long l_ind2 = wcstol(src, &end, 10); if (end==src || errno) { return 1; } src = end; if (l_ind2 < 0) { l_ind2 = var_count+l_ind2+1; } int direction = l_ind2 &indexes, wcstring_list_t &values) { size_t i; /* Replace values where needed */ for (i = 0; i < indexes.size(); i++) { /* The '- 1' below is because the indices in fish are one-based, but the vector uses zero-based indices */ long ind = indexes[i] - 1; const wcstring newv = values[ i ]; if (ind < 0) { return 1; } if ((size_t)ind >= list.size()) { list.resize(ind+1); } // free((void *) al_get(list, ind)); list[ ind ] = newv; } return 0; } /** Erase from a list of wcstring values at specified indexes */ static void erase_values(wcstring_list_t &list, const std::vector &indexes) { // Make a set of indexes. // This both sorts them into ascending order and removes duplicates. const std::set indexes_set(indexes.begin(), indexes.end()); // Now walk the set backwards, so we encounter larger indexes first, and remove elements at the given (1-based) indexes. std::set::const_reverse_iterator iter; for (iter = indexes_set.rbegin(); iter != indexes_set.rend(); ++iter) { long val = *iter; if (val > 0 && (size_t)val <= list.size()) { // One-based indexing! list.erase(list.begin() + val - 1); } } } /** Print the names of all environment variables in the scope, with or without shortening, with or without values, with or without escaping */ static void print_variables(int include_values, int esc, bool shorten_ok, int scope) { wcstring_list_t names = env_get_names(scope); sort(names.begin(), names.end()); for (size_t i = 0; i < names.size(); i++) { const wcstring key = names.at(i); const wcstring e_key = escape_string(key, 0); stdout_buffer.append(e_key); if (include_values) { env_var_t value = env_get_string(key); if (!value.missing()) { int shorten = 0; if (shorten_ok && value.length() > 64) { shorten = 1; value.resize(60); } wcstring e_value = esc ? expand_escape_variable(value) : value; stdout_buffer.append(L" "); stdout_buffer.append(e_value); if (shorten) { stdout_buffer.push_back(ellipsis_char); } } } stdout_buffer.append(L"\n"); } } /** The set builtin. Creates, updates and erases environment variables and environemnt variable arrays. */ static int builtin_set(parser_t &parser, wchar_t **argv) { /** Variables used for parsing the argument list */ const struct woption long_options[] = { { L"export", no_argument, 0, 'x' }, { L"global", no_argument, 0, 'g' }, { L"local", no_argument, 0, 'l' }, { L"erase", no_argument, 0, 'e' }, { L"names", no_argument, 0, 'n' }, { L"unexport", no_argument, 0, 'u' }, { L"universal", no_argument, 0, 'U' }, { L"long", no_argument, 0, 'L' }, { L"query", no_argument, 0, 'q' }, { L"help", no_argument, 0, 'h' }, { 0, 0, 0, 0 } } ; const wchar_t *short_options = L"+xglenuULqh"; int argc = builtin_count_args(argv); /* Flags to set the work mode */ int local = 0, global = 0, exportv = 0; int erase = 0, list = 0, unexport=0; int universal = 0, query=0; bool shorten_ok = true; bool preserve_incoming_failure_exit_status = true; const int incoming_exit_status = proc_get_last_status(); /* Variables used for performing the actual work */ wchar_t *dest = 0; int retcode=0; int scope; int slice=0; int i; wchar_t *bad_char; /* Parse options to obtain the requested operation and the modifiers */ woptind = 0; while (1) { int c = wgetopt_long(argc, argv, short_options, long_options, 0); if (c == -1) { break; } switch (c) { case 0: break; case 'e': erase = 1; preserve_incoming_failure_exit_status = false; break; case 'n': list = 1; preserve_incoming_failure_exit_status = false; break; case 'x': exportv = 1; break; case 'l': local = 1; break; case 'g': global = 1; break; case 'u': unexport = 1; break; case 'U': universal = 1; break; case 'L': shorten_ok = false; break; case 'q': query = 1; preserve_incoming_failure_exit_status = false; break; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return 0; case '?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return 1; default: break; } } /* Ok, all arguments have been parsed, let's validate them */ /* If we are checking the existance of a variable (-q) we can not also specify scope */ if (query && (erase || list)) { append_format(stderr_buffer, BUILTIN_ERR_COMBO, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } /* We can't both list and erase varaibles */ if (erase && list) { append_format(stderr_buffer, BUILTIN_ERR_COMBO, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } /* Variables can only have one scope */ if (local + global + universal > 1) { append_format(stderr_buffer, BUILTIN_ERR_GLOCAL, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } /* Variables can only have one export status */ if (exportv && unexport) { append_format(stderr_buffer, BUILTIN_ERR_EXPUNEXP, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } /* Calculate the scope value for variable assignement */ scope = (local ? ENV_LOCAL : 0) | (global ? ENV_GLOBAL : 0) | (exportv ? ENV_EXPORT : 0) | (unexport ? ENV_UNEXPORT : 0) | (universal ? ENV_UNIVERSAL:0) | ENV_USER; if (query) { /* Query mode. Return the number of variables that do not exist out of the specified variables. */ int i; for (i=woptind; i indexes; wcstring_list_t result; size_t j; env_var_t dest_str = env_get_string(dest); if (! dest_str.missing()) tokenize_variable_array(dest_str, result); if (!parse_index(indexes, arg, dest, result.size())) { builtin_print_help(parser, argv[0], stderr_buffer); retcode = 1; break; } for (j=0; j < indexes.size() ; j++) { long idx = indexes[j]; if (idx < 1 || (size_t)idx > result.size()) { retcode++; } } } else { if (!env_exist(arg, scope)) { retcode++; } } free(dest); } return retcode; } if (list) { /* Maybe we should issue an error if there are any other arguments? */ print_variables(0, 0, shorten_ok, scope); return 0; } if (woptind == argc) { /* Print values of variables */ if (erase) { append_format(stderr_buffer, _(L"%ls: Erase needs a variable name\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); retcode = 1; } else { print_variables(1, 1, shorten_ok, scope); } return retcode; } if (!(dest = wcsdup(argv[woptind]))) { DIE_MEM(); } if (wcschr(dest, L'[')) { slice = 1; *wcschr(dest, L'[')=0; } if (!wcslen(dest)) { free(dest); append_format(stderr_buffer, BUILTIN_ERR_VARNAME_ZERO, argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } if ((bad_char = wcsvarname(dest))) { append_format(stderr_buffer, BUILTIN_ERR_VARCHAR, argv[0], *bad_char); builtin_print_help(parser, argv[0], stderr_buffer); free(dest); return 1; } if (slice && erase && (scope != ENV_USER)) { free(dest); append_format(stderr_buffer, _(L"%ls: Can not specify scope when erasing array slice\n"), argv[0]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } /* set assignment can work in two modes, either using slices or using the whole array. We detect which mode is used here. */ if (slice) { /* Slice mode */ size_t idx_count, val_count; wcstring_list_t values; std::vector indexes; wcstring_list_t result; const env_var_t dest_str = env_get_string(dest); if (! dest_str.missing()) tokenize_variable_array(dest_str, result); for (; woptind #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif /* We know about these buffers */ extern wcstring stdout_buffer, stderr_buffer; /** Error message for invalid path operations */ #define BUILTIN_SET_PATH_ERROR L"%ls: Warning: path component %ls may not be valid in %ls.\n" /** Hint for invalid path operation with a colon */ #define BUILTIN_SET_PATH_HINT L"%ls: Did you mean 'set %ls $%ls %ls'?\n" /** Error for mismatch between index count and elements */ #define BUILTIN_SET_ARG_COUNT L"%ls: The number of variable indexes does not match the number of values\n" static void print_colors(void) { const wcstring_list_t result = rgb_color_t::named_color_names(); size_t i; for (i=0; i < result.size(); i++) { stdout_buffer.append(result.at(i)); stdout_buffer.push_back(L'\n'); } } /* function we set as the output writer */ static std::string builtin_set_color_output; static int set_color_builtin_outputter(char c) { ASSERT_IS_MAIN_THREAD(); builtin_set_color_output.push_back(c); return 0; } /** set_color builtin */ static int builtin_set_color(parser_t &parser, wchar_t **argv) { /** Variables used for parsing the argument list */ const struct woption long_options[] = { { L"background", required_argument, 0, 'b'}, { L"help", no_argument, 0, 'h' }, { L"bold", no_argument, 0, 'o' }, { L"underline", no_argument, 0, 'u' }, { L"version", no_argument, 0, 'v' }, { L"print-colors", no_argument, 0, 'c' }, { 0, 0, 0, 0 } }; const wchar_t *short_options = L"b:hvocu"; int argc = builtin_count_args(argv); const wchar_t *bgcolor = NULL; bool bold = false, underline=false; int errret; /* Parse options to obtain the requested operation and the modifiers */ woptind = 0; while (1) { int c = wgetopt_long(argc, argv, short_options, long_options, 0); if (c == -1) { break; } switch (c) { case 0: break; case 'b': bgcolor = woptarg; break; case 'h': builtin_print_help(parser, argv[0], stdout_buffer); return STATUS_BUILTIN_OK; case 'o': bold = true; break; case 'u': underline = true; break; case 'c': print_colors(); return STATUS_BUILTIN_OK; case '?': return STATUS_BUILTIN_ERROR; } } /* Remaining argument is foreground color */ const wchar_t *fgcolor = NULL; if (woptind < argc) { if (woptind + 1 == argc) { fgcolor = argv[woptind]; } else { append_format(stderr_buffer, _(L"%ls: Too many arguments\n"), argv[0]); return STATUS_BUILTIN_ERROR; } } if (fgcolor == NULL && bgcolor == NULL && !bold && !underline) { append_format(stderr_buffer, _(L"%ls: Expected an argument\n"), argv[0]); return STATUS_BUILTIN_ERROR; } const rgb_color_t fg = rgb_color_t(fgcolor ? fgcolor : L""); if (fgcolor && fg.is_none()) { append_format(stderr_buffer, _(L"%ls: Unknown color '%ls'\n"), argv[0], fgcolor); return STATUS_BUILTIN_ERROR; } const rgb_color_t bg = rgb_color_t(bgcolor ? bgcolor : L""); if (bgcolor && bg.is_none()) { append_format(stderr_buffer, _(L"%ls: Unknown color '%ls'\n"), argv[0], bgcolor); return STATUS_BUILTIN_ERROR; } /* Make sure that the term exists */ if (cur_term == NULL && setupterm(0, STDOUT_FILENO, &errret) == ERR) { append_format(stderr_buffer, _(L"%ls: Could not set up terminal\n"), argv[0]); return STATUS_BUILTIN_ERROR; } /* Test if we have at least basic support for setting fonts, colors and related bits - otherwise just give up... */ if (! exit_attribute_mode) { return STATUS_BUILTIN_ERROR; } /* Save old output function so we can restore it */ int (* const saved_writer_func)(char) = output_get_writer(); /* Set our output function, which writes to a std::string */ builtin_set_color_output.clear(); output_set_writer(set_color_builtin_outputter); if (bold) { if (enter_bold_mode) writembs(tparm(enter_bold_mode)); } if (underline) { if (enter_underline_mode) writembs(enter_underline_mode); } if (bgcolor != NULL) { if (bg.is_normal()) { write_background_color(0); writembs(tparm(exit_attribute_mode)); } } if (fgcolor != NULL) { if (fg.is_normal()) { write_foreground_color(0); writembs(tparm(exit_attribute_mode)); } else { write_foreground_color(index_for_color(fg)); } } if (bgcolor != NULL) { if (! bg.is_normal()) { write_background_color(index_for_color(bg)); } } /* Restore saved writer function */ output_set_writer(saved_writer_func); /* Output the collected string */ std::string local_output; std::swap(builtin_set_color_output, local_output); stdout_buffer.append(str2wcstring(local_output)); return STATUS_BUILTIN_OK; } fish/builtin_test.cpp000066400000000000000000000737061214535744100152430ustar00rootroot00000000000000/** \file builtin_test.cpp Functions defining the test builtin Functions used for implementing the test builtin. Implemented from scratch (yes, really) by way of IEEE 1003.1 as reference. */ #include "config.h" #include "common.h" #include "builtin.h" #include "wutil.h" #include "proc.h" #include #include enum { BUILTIN_TEST_SUCCESS = STATUS_BUILTIN_OK, BUILTIN_TEST_FAIL = STATUS_BUILTIN_ERROR }; int builtin_test(parser_t &parser, wchar_t **argv); static const wchar_t * const condstr[] = { L"!", L"&&", L"||", L"==", L"!=", L"<", L">", L"-nt", L"-ot", L"-ef", L"-eq", L"-ne", L"-lt", L"-gt", L"-le", L"-ge", L"=~" }; namespace test_expressions { enum token_t { test_unknown, // arbitrary string test_bang, // "!", inverts sense test_filetype_b, // "-b", for block special files test_filetype_c, // "-c" for character special files test_filetype_d, // "-d" for directories test_filetype_e, // "-e" for files that exist test_filetype_f, // "-f" for for regular files test_filetype_g, // "-g" for set-group-id test_filetype_h, // "-h" for symbolic links test_filetype_L, // "-L", same as -h test_filetype_p, // "-p", for FIFO test_filetype_S, // "-S", socket test_filesize_s, // "-s", size greater than zero test_filedesc_t, // "-t", whether the fd is associated with a terminal test_fileperm_r, // "-r", read permission test_fileperm_u, // "-u", whether file is setuid test_fileperm_w, // "-w", whether file write permission is allowed test_fileperm_x, // "-x", whether file execute/search is allowed test_string_n, // "-n", non-empty string test_string_z, // "-z", true if length of string is 0 test_string_equal, // "=", true if strings are identical test_string_not_equal, // "!=", true if strings are not identical test_number_equal, // "-eq", true if numbers are equal test_number_not_equal, // "-ne", true if numbers are not equal test_number_greater, // "-gt", true if first number is larger than second test_number_greater_equal, // "-ge", true if first number is at least second test_number_lesser, // "-lt", true if first number is smaller than second test_number_lesser_equal, // "-le", true if first number is at most second test_combine_and, // "-a", true if left and right are both true test_combine_or, // "-o", true if either left or right is true test_paren_open, // "(", open paren test_paren_close, // ")", close paren }; static bool binary_primary_evaluate(test_expressions::token_t token, const wcstring &left, const wcstring &right, wcstring_list_t &errors); static bool unary_primary_evaluate(test_expressions::token_t token, const wcstring &arg, wcstring_list_t &errors); enum { UNARY_PRIMARY = 1 << 0, BINARY_PRIMARY = 1 << 1 }; static const struct token_info_t { token_t tok; const wchar_t *string; unsigned int flags; } token_infos[] = { {test_unknown, L"", 0}, {test_bang, L"!", 0}, {test_filetype_b, L"-b", UNARY_PRIMARY}, {test_filetype_c, L"-c", UNARY_PRIMARY}, {test_filetype_d, L"-d", UNARY_PRIMARY}, {test_filetype_e, L"-e", UNARY_PRIMARY}, {test_filetype_f, L"-f", UNARY_PRIMARY}, {test_filetype_g, L"-g", UNARY_PRIMARY}, {test_filetype_h, L"-h", UNARY_PRIMARY}, {test_filetype_L, L"-L", UNARY_PRIMARY}, {test_filetype_p, L"-p", UNARY_PRIMARY}, {test_filetype_S, L"-S", UNARY_PRIMARY}, {test_filesize_s, L"-s", UNARY_PRIMARY}, {test_filedesc_t, L"-t", UNARY_PRIMARY}, {test_fileperm_r, L"-r", UNARY_PRIMARY}, {test_fileperm_u, L"-u", UNARY_PRIMARY}, {test_fileperm_w, L"-w", UNARY_PRIMARY}, {test_fileperm_x, L"-x", UNARY_PRIMARY}, {test_string_n, L"-n", UNARY_PRIMARY}, {test_string_z, L"-z", UNARY_PRIMARY}, {test_string_equal, L"=", BINARY_PRIMARY}, {test_string_not_equal, L"!=", BINARY_PRIMARY}, {test_number_equal, L"-eq", BINARY_PRIMARY}, {test_number_not_equal, L"-ne", BINARY_PRIMARY}, {test_number_greater, L"-gt", BINARY_PRIMARY}, {test_number_greater_equal, L"-ge", BINARY_PRIMARY}, {test_number_lesser, L"-lt", BINARY_PRIMARY}, {test_number_lesser_equal, L"-le", BINARY_PRIMARY}, {test_combine_and, L"-a", 0}, {test_combine_or, L"-o", 0}, {test_paren_open, L"(", 0}, {test_paren_close, L")", 0} }; const token_info_t *token_for_string(const wcstring &str) { for (size_t i=0; i < sizeof token_infos / sizeof *token_infos; i++) { if (str == token_infos[i].string) { return &token_infos[i]; } } return &token_infos[0]; //unknown } /* Grammar. = = and/or | = bang | = arg | arg arg | '(' ')' */ class expression; class test_parser { private: wcstring_list_t strings; wcstring_list_t errors; expression *error(const wchar_t *fmt, ...); void add_error(const wchar_t *fmt, ...); const wcstring &arg(unsigned int idx) { return strings.at(idx); } public: test_parser(const wcstring_list_t &val) : strings(val) { } expression *parse_expression(unsigned int start, unsigned int end); expression *parse_3_arg_expression(unsigned int start, unsigned int end); expression *parse_4_arg_expression(unsigned int start, unsigned int end); expression *parse_combining_expression(unsigned int start, unsigned int end); expression *parse_unary_expression(unsigned int start, unsigned int end); expression *parse_primary(unsigned int start, unsigned int end); expression *parse_parenthentical(unsigned int start, unsigned int end); expression *parse_unary_primary(unsigned int start, unsigned int end); expression *parse_binary_primary(unsigned int start, unsigned int end); expression *parse_just_a_string(unsigned int start, unsigned int end); static expression *parse_args(const wcstring_list_t &args, wcstring &err); }; struct range_t { unsigned int start; unsigned int end; range_t(unsigned s, unsigned e) : start(s), end(e) { } }; /* Base class for expressions */ class expression { protected: expression(token_t what, range_t where) : token(what), range(where) { } public: const token_t token; range_t range; virtual ~expression() { } // evaluate returns true if the expression is true (i.e. BUILTIN_TEST_SUCCESS) virtual bool evaluate(wcstring_list_t &errors) = 0; }; typedef std::auto_ptr expr_ref_t; /* Single argument like -n foo or "just a string" */ class unary_primary : public expression { public: wcstring arg; unary_primary(token_t tok, range_t where, const wcstring &what) : expression(tok, where), arg(what) { } bool evaluate(wcstring_list_t &errors); }; /* Two argument primary like foo != bar */ class binary_primary : public expression { public: wcstring arg_left; wcstring arg_right; binary_primary(token_t tok, range_t where, const wcstring &left, const wcstring &right) : expression(tok, where), arg_left(left), arg_right(right) { } bool evaluate(wcstring_list_t &errors); }; /* Unary operator like bang */ class unary_operator : public expression { public: expr_ref_t subject; unary_operator(token_t tok, range_t where, expr_ref_t &exp) : expression(tok, where), subject(exp) { } bool evaluate(wcstring_list_t &errors); }; /* Combining expression. Contains a list of AND or OR expressions. It takes more than two so that we don't have to worry about precedence in the parser. */ class combining_expression : public expression { public: const std::vector subjects; const std::vector combiners; combining_expression(token_t tok, range_t where, const std::vector &exprs, const std::vector &combs) : expression(tok, where), subjects(exprs), combiners(combs) { /* We should have one more subject than combiner */ assert(subjects.size() == combiners.size() + 1); } /* We are responsible for destroying our expressions */ virtual ~combining_expression() { for (size_t i=0; i < subjects.size(); i++) { delete subjects[i]; } } bool evaluate(wcstring_list_t &errors); }; /* Parenthetical expression */ class parenthetical_expression : public expression { public: expr_ref_t contents; parenthetical_expression(token_t tok, range_t where, expr_ref_t &expr) : expression(tok, where), contents(expr) { } virtual bool evaluate(wcstring_list_t &errors); }; void test_parser::add_error(const wchar_t *fmt, ...) { assert(fmt != NULL); va_list va; va_start(va, fmt); this->errors.push_back(vformat_string(fmt, va)); va_end(va); } expression *test_parser::error(const wchar_t *fmt, ...) { assert(fmt != NULL); va_list va; va_start(va, fmt); this->errors.push_back(vformat_string(fmt, va)); va_end(va); return NULL; } expression *test_parser::parse_unary_expression(unsigned int start, unsigned int end) { if (start >= end) { return error(L"Missing argument at index %u", start); } token_t tok = token_for_string(arg(start))->tok; if (tok == test_bang) { expr_ref_t subject(parse_unary_expression(start + 1, end)); if (subject.get()) { return new unary_operator(tok, range_t(start, subject->range.end), subject); } else { return NULL; } } else { return parse_primary(start, end); } } /* Parse a combining expression (AND, OR) */ expression *test_parser::parse_combining_expression(unsigned int start, unsigned int end) { if (start >= end) return NULL; std::vector subjects; std::vector combiners; unsigned int idx = start; bool first = true; while (idx < end) { if (! first) { /* This is not the first expression, so we expect a combiner. */ token_t combiner = token_for_string(arg(idx))->tok; if (combiner != test_combine_and && combiner != test_combine_or) { /* Not a combiner, we're done */ this->errors.insert(this->errors.begin(), format_string(L"Expected a combining operator like '-a' at index %u", idx)); break; } combiners.push_back(combiner); idx++; } /* Parse another expression */ expression *expr = parse_unary_expression(idx, end); if (! expr) { add_error(L"Missing argument at index %u", idx); if (! first) { /* Clean up the dangling combiner, since it never got its right hand expression */ combiners.pop_back(); } break; } /* Go to the end of this expression */ idx = expr->range.end; subjects.push_back(expr); first = false; } if (! subjects.empty()) { /* Our new expression takes ownership of all expressions we created. The token we pass is irrelevant. */ return new combining_expression(test_combine_and, range_t(start, idx), subjects, combiners); } else { /* No subjects */ return NULL; } } expression *test_parser::parse_unary_primary(unsigned int start, unsigned int end) { /* We need two arguments */ if (start >= end) { return error(L"Missing argument at index %u", start); } if (start + 1 >= end) { return error(L"Missing argument at index %u", start + 1); } /* All our unary primaries are prefix, so the operator is at start. */ const token_info_t *info = token_for_string(arg(start)); if (!(info->flags & UNARY_PRIMARY)) return NULL; return new unary_primary(info->tok, range_t(start, start + 2), arg(start + 1)); } expression *test_parser::parse_just_a_string(unsigned int start, unsigned int end) { /* Handle a string as a unary primary that is not a token of any other type. e.g. 'test foo -a bar' should evaluate to true We handle this with a unary primary of test_string_n */ /* We need one arguments */ if (start >= end) { return error(L"Missing argument at index %u", start); } const token_info_t *info = token_for_string(arg(start)); if (info->tok != test_unknown) { return error(L"Unexpected argument type at index %u", start); } /* This is hackish; a nicer way to implement this would be with a "just a string" expression type */ return new unary_primary(test_string_n, range_t(start, start + 1), arg(start)); } #if 0 expression *test_parser::parse_unary_primary(unsigned int start, unsigned int end) { /* We need either one or two arguments */ if (start >= end) { return error(L"Missing argument at index %u", start); } /* The index of the argument to the unary primary */ unsigned int arg_idx; /* All our unary primaries are prefix, so any operator is at start. But it also may just be a string, with no operator. */ const token_info_t *info = token_for_string(arg(start)); if (info->flags & UNARY_PRIMARY) { /* We have an operator. Skip the operator argument */ arg_idx = start + 1; /* We have some freedom here...do we allow other tokens for the argument to operate on? For example, should 'test -n =' work? I say yes. So no typechecking on the next token. */ } else if (info->tok == test_unknown) { /* "Just a string. */ arg_idx = start; } else { /* Here we don't allow arbitrary tokens as "just a string." I.e. 'test = -a =' should have a parse error. We could relax this at some point. */ return error(L"Parse error at argument index %u", start); } /* Verify we have the argument we want, i.e. test -n should fail to parse */ if (arg_idx >= end) { return error(L"Missing argument at index %u", arg_idx); } return new unary_primary(info->tok, range_t(start, arg_idx + 1), arg(arg_idx)); } #endif expression *test_parser::parse_binary_primary(unsigned int start, unsigned int end) { /* We need three arguments */ for (unsigned int idx = start; idx < start + 3; idx++) { if (idx >= end) { return error(L"Missing argument at index %u", idx); } } /* All our binary primaries are infix, so the operator is at start + 1. */ const token_info_t *info = token_for_string(arg(start + 1)); if (!(info->flags & BINARY_PRIMARY)) return NULL; return new binary_primary(info->tok, range_t(start, start + 3), arg(start), arg(start + 2)); } expression *test_parser::parse_parenthentical(unsigned int start, unsigned int end) { /* We need at least three arguments: open paren, argument, close paren */ if (start + 3 >= end) return NULL; /* Must start with an open expression */ const token_info_t *open_paren = token_for_string(arg(start)); if (open_paren->tok != test_paren_open) return NULL; /* Parse a subexpression */ expression *subexr_ptr = parse_expression(start + 1, end); if (! subexr_ptr) return NULL; expr_ref_t subexpr(subexr_ptr); /* Parse a close paren */ unsigned close_index = subexpr->range.end; assert(close_index <= end); if (close_index == end) { return error(L"Missing close paren at index %u", close_index); } const token_info_t *close_paren = token_for_string(arg(close_index)); if (close_paren->tok != test_paren_close) { return error(L"Expected close paren at index %u", close_index); } /* Success */ return new parenthetical_expression(test_paren_open, range_t(start, close_index+1), subexpr); } expression *test_parser::parse_primary(unsigned int start, unsigned int end) { if (start >= end) { return error(L"Missing argument at index %u", start); } expression *expr = NULL; if (! expr) expr = parse_parenthentical(start, end); if (! expr) expr = parse_unary_primary(start, end); if (! expr) expr = parse_binary_primary(start, end); if (! expr) expr = parse_just_a_string(start, end); return expr; } // See IEEE 1003.1 breakdown of the behavior for different parameter counts expression *test_parser::parse_3_arg_expression(unsigned int start, unsigned int end) { assert(end - start == 3); expression *result = NULL; const token_info_t *center_token = token_for_string(arg(start + 1)); if (center_token->flags & BINARY_PRIMARY) { result = parse_binary_primary(start, end); } else if (center_token->tok == test_combine_and || center_token->tok == test_combine_or) { expr_ref_t left(parse_unary_expression(start, start + 1)); expr_ref_t right(parse_unary_expression(start + 2, start + 3)); if (left.get() && right.get()) { // Transfer ownership to the vector of subjects std::vector combiners(1, center_token->tok); std::vector subjects; subjects.push_back(left.release()); subjects.push_back(right.release()); result = new combining_expression(center_token->tok, range_t(start, end), subjects, combiners); } } else { result = parse_unary_expression(start, end); } return result; } expression *test_parser::parse_4_arg_expression(unsigned int start, unsigned int end) { assert(end - start == 4); expression *result = NULL; token_t first_token = token_for_string(arg(start))->tok; if (first_token == test_bang) { expr_ref_t subject(parse_3_arg_expression(start + 1, end)); if (subject.get()) { result = new unary_operator(first_token, range_t(start, subject->range.end), subject); } } else if (first_token == test_paren_open) { result = parse_parenthentical(start, end); } else { result = parse_combining_expression(start, end); } return result; } expression *test_parser::parse_expression(unsigned int start, unsigned int end) { if (start >= end) { return error(L"Missing argument at index %u", start); } unsigned int argc = end - start; switch (argc) { case 0: assert(0); //should have been caught by the above test return NULL; case 1: { return error(L"Missing argument at index %u", start + 1); } case 2: { return parse_unary_expression(start, end); } case 3: { return parse_3_arg_expression(start, end); } case 4: { return parse_4_arg_expression(start, end); } default: { return parse_combining_expression(start, end); } } } expression *test_parser::parse_args(const wcstring_list_t &args, wcstring &err) { /* Empty list and one-arg list should be handled by caller */ assert(args.size() > 1); test_parser parser(args); expression *result = parser.parse_expression(0, (unsigned int)args.size()); /* Handle errors */ bool errored = false; for (size_t i = 0; i < parser.errors.size(); i++) { err.append(L"test: "); err.append(parser.errors.at(i)); err.push_back(L'\n'); errored = true; // For now we only show the first error break; } if (result) { /* It's also an error if there are any unused arguments. This is not detected by parse_expression() */ assert(result->range.end <= args.size()); if (result->range.end < args.size()) { if (err.empty()) { append_format(err, L"test: unexpected argument at index %lu: '%ls'\n", (unsigned long)result->range.end, args.at(result->range.end).c_str()); } errored = true; delete result; result = NULL; } } return result; } bool unary_primary::evaluate(wcstring_list_t &errors) { return unary_primary_evaluate(token, arg, errors); } bool binary_primary::evaluate(wcstring_list_t &errors) { return binary_primary_evaluate(token, arg_left, arg_right, errors); } bool unary_operator::evaluate(wcstring_list_t &errors) { switch (token) { case test_bang: assert(subject.get()); return ! subject->evaluate(errors); default: errors.push_back(format_string(L"Unknown token type in %s", __func__)); return false; } } bool combining_expression::evaluate(wcstring_list_t &errors) { switch (token) { case test_combine_and: case test_combine_or: { /* One-element case */ if (subjects.size() == 1) return subjects.at(0)->evaluate(errors); /* Evaluate our lists, remembering that AND has higher precedence than OR. We can visualize this as a sequence of OR expressions of AND expressions. */ assert(combiners.size() + 1 == subjects.size()); assert(! subjects.empty()); size_t idx = 0, max = subjects.size(); bool or_result = false; while (idx < max) { if (or_result) { /* Short circuit */ break; } /* Evaluate a stream of AND starting at given subject index. It may only have one element. */ bool and_result = true; for (; idx < max; idx++) { /* Evaluate it, short-circuiting */ and_result = and_result && subjects.at(idx)->evaluate(errors); /* If the combiner at this index (which corresponding to how we combine with the next subject) is not AND, then exit the loop */ if (idx + 1 < max && combiners.at(idx) != test_combine_and) { idx++; break; } } /* OR it in */ or_result = or_result || and_result; } return or_result; } default: errors.push_back(format_string(L"Unknown token type in %s", __func__)); return BUILTIN_TEST_FAIL; } } bool parenthetical_expression::evaluate(wcstring_list_t &errors) { return contents->evaluate(errors); } /* IEEE 1003.1 says nothing about what it means for two strings to be "algebraically equal". For example, should we interpret 0x10 as 0, 10, or 16? Here we use only base 10 and use wcstoll, which allows for leading + and -, and leading whitespace. This matches bash. */ static bool parse_number(const wcstring &arg, long long *out) { const wchar_t *str = arg.c_str(); wchar_t *endptr = NULL; *out = wcstoll(str, &endptr, 10); return endptr && *endptr == L'\0'; } static bool binary_primary_evaluate(test_expressions::token_t token, const wcstring &left, const wcstring &right, wcstring_list_t &errors) { using namespace test_expressions; long long left_num, right_num; switch (token) { case test_string_equal: return left == right; case test_string_not_equal: return left != right; case test_number_equal: return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num == right_num; case test_number_not_equal: return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num != right_num; case test_number_greater: return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num > right_num; case test_number_greater_equal: return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num >= right_num; case test_number_lesser: return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num < right_num; case test_number_lesser_equal: return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num <= right_num; default: errors.push_back(format_string(L"Unknown token type in %s", __func__)); return false; } } static bool unary_primary_evaluate(test_expressions::token_t token, const wcstring &arg, wcstring_list_t &errors) { using namespace test_expressions; struct stat buf; long long num; switch (token) { case test_filetype_b: // "-b", for block special files return !wstat(arg, &buf) && S_ISBLK(buf.st_mode); case test_filetype_c: // "-c" for character special files return !wstat(arg, &buf) && S_ISCHR(buf.st_mode); case test_filetype_d: // "-d" for directories return !wstat(arg, &buf) && S_ISDIR(buf.st_mode); case test_filetype_e: // "-e" for files that exist return !wstat(arg, &buf); case test_filetype_f: // "-f" for for regular files return !wstat(arg, &buf) && S_ISREG(buf.st_mode); case test_filetype_g: // "-g" for set-group-id return !wstat(arg, &buf) && (S_ISGID & buf.st_mode); case test_filetype_h: // "-h" for symbolic links case test_filetype_L: // "-L", same as -h return !lwstat(arg, &buf) && S_ISLNK(buf.st_mode); case test_filetype_p: // "-p", for FIFO return !wstat(arg, &buf) && S_ISFIFO(buf.st_mode); case test_filetype_S: // "-S", socket return !wstat(arg, &buf) && S_ISSOCK(buf.st_mode); case test_filesize_s: // "-s", size greater than zero return !wstat(arg, &buf) && buf.st_size > 0; case test_filedesc_t: // "-t", whether the fd is associated with a terminal return parse_number(arg, &num) && num == (int)num && isatty((int)num); case test_fileperm_r: // "-r", read permission return !waccess(arg, R_OK); case test_fileperm_u: // "-u", whether file is setuid return !wstat(arg, &buf) && (S_ISUID & buf.st_mode); case test_fileperm_w: // "-w", whether file write permission is allowed return !waccess(arg, W_OK); case test_fileperm_x: // "-x", whether file execute/search is allowed return !waccess(arg, X_OK); case test_string_n: // "-n", non-empty string return ! arg.empty(); case test_string_z: // "-z", true if length of string is 0 return arg.empty(); default: errors.push_back(format_string(L"Unknown token type in %s", __func__)); return false; } } }; /* * Evaluate a conditional expression given the arguments. * If fromtest is set, the caller is the test or [ builtin; * with the pointer giving the name of the command. * for POSIX conformance this supports a more limited range * of functionality. * * Return status is the final shell status, i.e. 0 for true, * 1 for false and 2 for error. */ int builtin_test(parser_t &parser, wchar_t **argv) { using namespace test_expressions; /* The first argument should be the name of the command ('test') */ if (! argv[0]) return BUILTIN_TEST_FAIL; /* Whether we are invoked with bracket '[' or not */ const bool is_bracket = ! wcscmp(argv[0], L"["); size_t argc = 0; while (argv[argc + 1]) argc++; /* If we're bracket, the last argument ought to be ]; we ignore it. Note that argc is the number of arguments after the command name; thus argv[argc] is the last argument. */ if (is_bracket) { if (! wcscmp(argv[argc], L"]")) { /* Ignore the closing bracketp */ argc--; } else { builtin_show_error(L"[: the last argument must be ']'\n"); return BUILTIN_TEST_FAIL; } } /* Collect the arguments into a list */ const wcstring_list_t args(argv + 1, argv + 1 + argc); switch (argc) { case 0: { // Per 1003.1, exit false return BUILTIN_TEST_FAIL; } case 1: { // Per 1003.1, exit true if the arg is non-empty return args.at(0).empty() ? BUILTIN_TEST_FAIL : BUILTIN_TEST_SUCCESS; } default: { // Try parsing. If expr is not nil, we are responsible for deleting it. wcstring err; expression *expr = test_parser::parse_args(args, err); if (! expr) { #if 0 printf("Oops! test was given args:\n"); for (size_t i=0; i < argc; i++) { printf("\t%ls\n", args.at(i).c_str()); } printf("and returned parse error: %ls\n", err.c_str()); #endif builtin_show_error(err); return BUILTIN_TEST_FAIL; } else { wcstring_list_t eval_errors; bool result = expr->evaluate(eval_errors); if (! eval_errors.empty()) { printf("test returned eval errors:\n"); for (size_t i=0; i < eval_errors.size(); i++) { printf("\t%ls\n", eval_errors.at(i).c_str()); } } delete expr; return result ? BUILTIN_TEST_SUCCESS : BUILTIN_TEST_FAIL; } } } return 1; } fish/builtin_ulimit.cpp000066400000000000000000000261221214535744100155550ustar00rootroot00000000000000/** \file builtin_ulimit.c Functions defining the ulimit builtin Functions used for implementing the ulimit builtin. */ #include "config.h" #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "builtin.h" #include "common.h" #include "wgetopt.h" /** Struct describing a resource limit */ struct resource_t { /** Resource id */ int resource; /** Description of resource */ const wchar_t *desc; /** Switch used on commandline to specify resource */ wchar_t switch_char; /** The implicit multiplier used when setting getting values */ int multiplier; } ; /** Array of resource_t structs, describing all known resource types. */ static const struct resource_t resource_arr[] = { { RLIMIT_CORE, L"Maximum size of core files created", L'c', 1024 } , { RLIMIT_DATA, L"Maximum size of a process’s data segment", L'd', 1024 } , { RLIMIT_FSIZE, L"Maximum size of files created by the shell", L'f', 1024 } , #ifdef RLIMIT_MEMLOCK { RLIMIT_MEMLOCK, L"Maximum size that may be locked into memory", L'l', 1024 } , #endif #ifdef RLIMIT_RSS { RLIMIT_RSS, L"Maximum resident set size", L'm', 1024 } , #endif { RLIMIT_NOFILE, L"Maximum number of open file descriptors", L'n', 1 } , { RLIMIT_STACK, L"Maximum stack size", L's', 1024 } , { RLIMIT_CPU, L"Maximum amount of cpu time in seconds", L't', 1 } , #ifdef RLIMIT_NPROC { RLIMIT_NPROC, L"Maximum number of processes available to a single user", L'u', 1 } , #endif #ifdef RLIMIT_AS { RLIMIT_AS, L"Maximum amount of virtual memory available to the shell", L'v', 1024 } , #endif { 0, 0, 0, 0 } } ; /** Get the implicit multiplication factor for the specified resource limit */ static int get_multiplier(int what) { int i; for (i=0; resource_arr[i].desc; i++) { if (resource_arr[i].resource == what) { return resource_arr[i].multiplier; } } return -1; } /** Return the value for the specified resource limit. This function does _not_ multiply the limit value by the multiplier constant used by the commandline ulimit. */ static rlim_t get(int resource, int hard) { struct rlimit ls; getrlimit(resource, &ls); return hard ? ls.rlim_max:ls.rlim_cur; } /** Print the value of the specified resource limit */ static void print(int resource, int hard) { rlim_t l = get(resource, hard); if (l == RLIM_INFINITY) stdout_buffer.append(L"unlimited\n"); else append_format(stdout_buffer, L"%d\n", l / get_multiplier(resource)); } /** Print values of all resource limits */ static void print_all(int hard) { int i; int w=0; for (i=0; resource_arr[i].desc; i++) { w=maxi(w, my_wcswidth(resource_arr[i].desc)); } for (i=0; resource_arr[i].desc; i++) { struct rlimit ls; rlim_t l; getrlimit(resource_arr[i].resource, &ls); l = hard ? ls.rlim_max:ls.rlim_cur; const wchar_t *unit = ((resource_arr[i].resource==RLIMIT_CPU)?L"(seconds, ":(get_multiplier(resource_arr[i].resource)==1?L"(":L"(kB, ")); append_format(stdout_buffer, L"%-*ls %10ls-%lc) ", w, resource_arr[i].desc, unit, resource_arr[i].switch_char); if (l == RLIM_INFINITY) { stdout_buffer.append(L"unlimited\n"); } else { append_format(stdout_buffer, L"%d\n", l/get_multiplier(resource_arr[i].resource)); } } } /** Returns the description for the specified resource limit */ static const wchar_t *get_desc(int what) { int i; for (i=0; resource_arr[i].desc; i++) { if (resource_arr[i].resource == what) { return resource_arr[i].desc; } } return L"Not a resource"; } /** Set the new value of the specified resource limit. This function does _not_ multiply the limit value by the multiplier constant used by the commandline ulimit. */ static int set(int resource, int hard, int soft, rlim_t value) { struct rlimit ls; getrlimit(resource, &ls); if (hard) { ls.rlim_max = value; } if (soft) { ls.rlim_cur = value; /* Do not attempt to set the soft limit higher than the hard limit */ if ((value == RLIM_INFINITY && ls.rlim_max != RLIM_INFINITY) || (value != RLIM_INFINITY && ls.rlim_max != RLIM_INFINITY && value > ls.rlim_max)) { ls.rlim_cur = ls.rlim_max; } } if (setrlimit(resource, &ls)) { if (errno == EPERM) append_format(stderr_buffer, L"ulimit: Permission denied when changing resource of type '%ls'\n", get_desc(resource)); else builtin_wperror(L"ulimit"); return 1; } return 0; } /** The ulimit builtin, used for setting resource limits. Defined in builtin_ulimit.c. */ static int builtin_ulimit(parser_t &parser, wchar_t ** argv) { int hard=0; int soft=0; int what = RLIMIT_FSIZE; int report_all = 0; int argc = builtin_count_args(argv); woptind=0; while (1) { static const struct woption long_options[] = { { L"all", no_argument, 0, 'a' } , { L"hard", no_argument, 0, 'H' } , { L"soft", no_argument, 0, 'S' } , { L"core-size", no_argument, 0, 'c' } , { L"data-size", no_argument, 0, 'd' } , { L"file-size", no_argument, 0, 'f' } , { L"lock-size", no_argument, 0, 'l' } , { L"resident-set-size", no_argument, 0, 'm' } , { L"file-descriptor-count", no_argument, 0, 'n' } , { L"stack-size", no_argument, 0, 's' } , { L"cpu-time", no_argument, 0, 't' } , { L"process-count", no_argument, 0, 'u' } , { L"virtual-memory-size", no_argument, 0, 'v' } , { L"help", no_argument, 0, 'h' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = wgetopt_long(argc, argv, L"aHScdflmnstuvh", long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: if (long_options[opt_index].flag != 0) break; append_format(stderr_buffer, BUILTIN_ERR_UNKNOWN, argv[0], long_options[opt_index].name); builtin_print_help(parser, argv[0], stderr_buffer); return 1; case L'a': report_all=1; break; case L'H': hard=1; break; case L'S': soft=1; break; case L'c': what=RLIMIT_CORE; break; case L'd': what=RLIMIT_DATA; break; case L'f': what=RLIMIT_FSIZE; break; #ifdef RLIMIT_MEMLOCK case L'l': what=RLIMIT_MEMLOCK; break; #endif #ifdef RLIMIT_RSS case L'm': what=RLIMIT_RSS; break; #endif case L'n': what=RLIMIT_NOFILE; break; case L's': what=RLIMIT_STACK; break; case L't': what=RLIMIT_CPU; break; #ifdef RLIMIT_NPROC case L'u': what=RLIMIT_NPROC; break; #endif #ifdef RLIMIT_AS case L'v': what=RLIMIT_AS; break; #endif case L'h': builtin_print_help(parser, argv[0], stdout_buffer); return 0; case L'?': builtin_unknown_option(parser, argv[0], argv[woptind-1]); return 1; } } if (report_all) { if (argc - woptind == 0) { print_all(hard); } else { stderr_buffer.append(argv[0]); stderr_buffer.append(L": Too many arguments\n"); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } return 0; } switch (argc - woptind) { case 0: { /* Show current limit value */ print(what, hard); break; } case 1: { /* Change current limit value */ rlim_t new_limit; wchar_t *end; /* Set both hard and soft limits if nothing else was specified */ if (!(hard+soft)) { hard=soft=1; } if (wcscasecmp(argv[woptind], L"unlimited")==0) { new_limit = RLIM_INFINITY; } else if (wcscasecmp(argv[woptind], L"hard")==0) { new_limit = get(what, 1); } else if (wcscasecmp(argv[woptind], L"soft")==0) { new_limit = get(what, soft); } else { errno=0; new_limit = wcstol(argv[woptind], &end, 10); if (errno || *end) { append_format(stderr_buffer, L"%ls: Invalid limit '%ls'\n", argv[0], argv[woptind]); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } new_limit *= get_multiplier(what); } return set(what, hard, soft, new_limit); } default: { stderr_buffer.append(argv[0]); stderr_buffer.append(L": Too many arguments\n"); builtin_print_help(parser, argv[0], stderr_buffer); return 1; } } return 0; } fish/color.cpp000066400000000000000000000243201214535744100136400ustar00rootroot00000000000000/** \file color.cpp Color class implementation */ #include "color.h" #include "fallback.h" bool rgb_color_t::try_parse_special(const wcstring &special) { bzero(&data, sizeof data); const wchar_t *name = special.c_str(); if (! wcscasecmp(name, L"normal")) { this->type = type_normal; } else if (! wcscasecmp(name, L"reset")) { this->type = type_reset; } else if (! wcscasecmp(name, L"ignore")) { this->type = type_ignore; } else { this->type = type_none; } return this->type != type_none; } static int parse_hex_digit(wchar_t x) { switch (x) { case L'0': return 0x0; case L'1': return 0x1; case L'2': return 0x2; case L'3': return 0x3; case L'4': return 0x4; case L'5': return 0x5; case L'6': return 0x6; case L'7': return 0x7; case L'8': return 0x8; case L'9': return 0x9; case L'a': case L'A': return 0xA; case L'b': case L'B': return 0xB; case L'c': case L'C': return 0xC; case L'd': case L'D': return 0xD; case L'e': case L'E': return 0xE; case L'f': case L'F': return 0xF; default: return -1; } } static unsigned long squared_difference(long p1, long p2) { unsigned long diff = (unsigned long)labs(p1 - p2); return diff * diff; } static unsigned char convert_color(const unsigned char rgb[3], const uint32_t *colors, size_t color_count) { long r = rgb[0], g = rgb[1], b = rgb[2]; unsigned long best_distance = (unsigned long)(-1); unsigned char best_index = (unsigned char)(-1); for (unsigned char idx = 0; idx < color_count; idx++) { uint32_t color = colors[idx]; long test_r = (color >> 16) & 0xFF, test_g = (color >> 8) & 0xFF, test_b = (color >> 0) & 0xFF; unsigned long distance = squared_difference(r, test_r) + squared_difference(g, test_g) + squared_difference(b, test_b); if (distance <= best_distance) { best_index = idx; best_distance = distance; } } return best_index; } bool rgb_color_t::try_parse_rgb(const wcstring &name) { bzero(&data, sizeof data); /* We support the following style of rgb formats (case insensitive): #FA3 #F3A035 FA3 F3A035 */ size_t digit_idx = 0, len = name.size(); /* Skip any leading # */ if (len > 0 && name.at(0) == L'#') digit_idx++; bool success = false; size_t i; if (len - digit_idx == 3) { // type FA3 for (i=0; i < 3; i++) { int val = parse_hex_digit(name.at(digit_idx++)); if (val < 0) break; data.rgb[i] = val*16+val; } success = (i == 3); } else if (len - digit_idx == 6) { // type F3A035 for (i=0; i < 3; i++) { int hi = parse_hex_digit(name.at(digit_idx++)); int lo = parse_hex_digit(name.at(digit_idx++)); if (lo < 0 || hi < 0) break; data.rgb[i] = hi*16+lo; } success = (i == 3); } if (success) { this->type = type_rgb; } return success; } struct named_color_t { const wchar_t * name; unsigned char idx; unsigned char rgb[3]; }; static const named_color_t named_colors[11] = { {L"black", 0, {0, 0, 0}}, {L"red", 1, {0xFF, 0, 0}}, {L"green", 2, {0, 0xFF, 0}}, {L"brown", 3, {0x72, 0x50, 0}}, {L"yellow", 3, {0xFF, 0xFF, 0}}, {L"blue", 4, {0, 0, 0xFF}}, {L"magenta", 5, {0xFF, 0, 0xFF}}, {L"purple", 5, {0xFF, 0, 0xFF}}, {L"cyan", 6, {0, 0xFF, 0xFF}}, {L"white", 7, {0xFF, 0xFF, 0xFF}}, {L"normal", 8, {0xFF, 0xFF, 0XFF}} }; wcstring_list_t rgb_color_t::named_color_names(void) { size_t count = sizeof named_colors / sizeof *named_colors; wcstring_list_t result; result.reserve(count); for (size_t i=0; i < count; i++) { result.push_back(named_colors[i].name); } return result; } bool rgb_color_t::try_parse_named(const wcstring &str) { bzero(&data, sizeof data); size_t max = sizeof named_colors / sizeof *named_colors; for (size_t idx=0; idx < max; idx++) { if (0 == wcscasecmp(str.c_str(), named_colors[idx].name)) { data.name_idx = named_colors[idx].idx; this->type = type_named; return true; } } return false; } static const wchar_t *name_for_color_idx(unsigned char idx) { size_t max = sizeof named_colors / sizeof *named_colors; for (size_t i=0; i < max; i++) { if (named_colors[i].idx == idx) { return named_colors[i].name; } } return L"unknown"; } rgb_color_t::rgb_color_t(unsigned char t, unsigned char i) : type(t), flags(), data() { data.name_idx = i; } rgb_color_t rgb_color_t::normal() { return rgb_color_t(type_normal); } rgb_color_t rgb_color_t::reset() { return rgb_color_t(type_reset); } rgb_color_t rgb_color_t::ignore() { return rgb_color_t(type_ignore); } rgb_color_t rgb_color_t::none() { return rgb_color_t(type_none); } rgb_color_t rgb_color_t::white() { return rgb_color_t(type_named, 7); } rgb_color_t rgb_color_t::black() { return rgb_color_t(type_named, 0); } static unsigned char term8_color_for_rgb(const unsigned char rgb[3]) { const uint32_t kColors[] = { 0x000000, //Black 0xFF0000, //Red 0x00FF00, //Green 0xFFFF00, //Yellow 0x0000FF, //Blue 0xFF00FF, //Magenta 0x00FFFF, //Cyan 0xFFFFFF, //White }; return convert_color(rgb, kColors, sizeof kColors / sizeof *kColors); } static unsigned char term256_color_for_rgb(const unsigned char rgb[3]) { const uint32_t kColors[240] = { 0x000000, 0x00005f, 0x000087, 0x0000af, 0x0000d7, 0x0000ff, 0x005f00, 0x005f5f, 0x005f87, 0x005faf, 0x005fd7, 0x005fff, 0x008700, 0x00875f, 0x008787, 0x0087af, 0x0087d7, 0x0087ff, 0x00af00, 0x00af5f, 0x00af87, 0x00afaf, 0x00afd7, 0x00afff, 0x00d700, 0x00d75f, 0x00d787, 0x00d7af, 0x00d7d7, 0x00d7ff, 0x00ff00, 0x00ff5f, 0x00ff87, 0x00ffaf, 0x00ffd7, 0x00ffff, 0x5f0000, 0x5f005f, 0x5f0087, 0x5f00af, 0x5f00d7, 0x5f00ff, 0x5f5f00, 0x5f5f5f, 0x5f5f87, 0x5f5faf, 0x5f5fd7, 0x5f5fff, 0x5f8700, 0x5f875f, 0x5f8787, 0x5f87af, 0x5f87d7, 0x5f87ff, 0x5faf00, 0x5faf5f, 0x5faf87, 0x5fafaf, 0x5fafd7, 0x5fafff, 0x5fd700, 0x5fd75f, 0x5fd787, 0x5fd7af, 0x5fd7d7, 0x5fd7ff, 0x5fff00, 0x5fff5f, 0x5fff87, 0x5fffaf, 0x5fffd7, 0x5fffff, 0x870000, 0x87005f, 0x870087, 0x8700af, 0x8700d7, 0x8700ff, 0x875f00, 0x875f5f, 0x875f87, 0x875faf, 0x875fd7, 0x875fff, 0x878700, 0x87875f, 0x878787, 0x8787af, 0x8787d7, 0x8787ff, 0x87af00, 0x87af5f, 0x87af87, 0x87afaf, 0x87afd7, 0x87afff, 0x87d700, 0x87d75f, 0x87d787, 0x87d7af, 0x87d7d7, 0x87d7ff, 0x87ff00, 0x87ff5f, 0x87ff87, 0x87ffaf, 0x87ffd7, 0x87ffff, 0xaf0000, 0xaf005f, 0xaf0087, 0xaf00af, 0xaf00d7, 0xaf00ff, 0xaf5f00, 0xaf5f5f, 0xaf5f87, 0xaf5faf, 0xaf5fd7, 0xaf5fff, 0xaf8700, 0xaf875f, 0xaf8787, 0xaf87af, 0xaf87d7, 0xaf87ff, 0xafaf00, 0xafaf5f, 0xafaf87, 0xafafaf, 0xafafd7, 0xafafff, 0xafd700, 0xafd75f, 0xafd787, 0xafd7af, 0xafd7d7, 0xafd7ff, 0xafff00, 0xafff5f, 0xafff87, 0xafffaf, 0xafffd7, 0xafffff, 0xd70000, 0xd7005f, 0xd70087, 0xd700af, 0xd700d7, 0xd700ff, 0xd75f00, 0xd75f5f, 0xd75f87, 0xd75faf, 0xd75fd7, 0xd75fff, 0xd78700, 0xd7875f, 0xd78787, 0xd787af, 0xd787d7, 0xd787ff, 0xd7af00, 0xd7af5f, 0xd7af87, 0xd7afaf, 0xd7afd7, 0xd7afff, 0xd7d700, 0xd7d75f, 0xd7d787, 0xd7d7af, 0xd7d7d7, 0xd7d7ff, 0xd7ff00, 0xd7ff5f, 0xd7ff87, 0xd7ffaf, 0xd7ffd7, 0xd7ffff, 0xff0000, 0xff005f, 0xff0087, 0xff00af, 0xff00d7, 0xff00ff, 0xff5f00, 0xff5f5f, 0xff5f87, 0xff5faf, 0xff5fd7, 0xff5fff, 0xff8700, 0xff875f, 0xff8787, 0xff87af, 0xff87d7, 0xff87ff, 0xffaf00, 0xffaf5f, 0xffaf87, 0xffafaf, 0xffafd7, 0xffafff, 0xffd700, 0xffd75f, 0xffd787, 0xffd7af, 0xffd7d7, 0xffd7ff, 0xffff00, 0xffff5f, 0xffff87, 0xffffaf, 0xffffd7, 0xffffff, 0x080808, 0x121212, 0x1c1c1c, 0x262626, 0x303030, 0x3a3a3a, 0x444444, 0x4e4e4e, 0x585858, 0x626262, 0x6c6c6c, 0x767676, 0x808080, 0x8a8a8a, 0x949494, 0x9e9e9e, 0xa8a8a8, 0xb2b2b2, 0xbcbcbc, 0xc6c6c6, 0xd0d0d0, 0xdadada, 0xe4e4e4, 0xeeeeee }; return 16 + convert_color(rgb, kColors, sizeof kColors / sizeof *kColors); } unsigned char rgb_color_t::to_term256_index() const { assert(type == type_rgb); return term256_color_for_rgb(data.rgb); } unsigned char rgb_color_t::to_name_index() const { assert(type == type_named || type == type_rgb); if (type == type_named) { return data.name_idx; } else if (type == type_rgb) { return term8_color_for_rgb(data.rgb); } else { /* This is an error */ return (unsigned char)(-1); } } void rgb_color_t::parse(const wcstring &str) { bool success = false; if (! success) success = try_parse_special(str); if (! success) success = try_parse_named(str); if (! success) success = try_parse_rgb(str); if (! success) { bzero(this->data.rgb, sizeof this->data.rgb); this->type = type_none; } } rgb_color_t::rgb_color_t(const wcstring &str) { this->parse(str); } rgb_color_t::rgb_color_t(const std::string &str) { this->parse(str2wcstring(str)); } wcstring rgb_color_t::description() const { switch (type) { case type_none: return L"none"; case type_named: return format_string(L"named(%d: %ls)", (int)data.name_idx, name_for_color_idx(data.name_idx)); case type_rgb: return format_string(L"rgb(0x%02x%02x%02x)", data.rgb[0], data.rgb[1], data.rgb[2]); case type_reset: return L"reset"; case type_normal: return L"normal"; case type_ignore: return L"ignore"; default: abort(); return L""; } } fish/color.h000066400000000000000000000102301214535744100133000ustar00rootroot00000000000000/** \file color.h Color class. */ #ifndef FISH_COLOR_H #define FISH_COLOR_H #include #include #include "config.h" #include "common.h" /* A type that represents a color. We work hard to keep it at a size of 4 bytes. */ class rgb_color_t { /* Types */ enum { type_none, type_named, type_rgb, type_normal, type_reset, type_ignore }; unsigned char type:4; /* Flags */ enum { flag_bold = 1 << 0, flag_underline = 1 << 1 }; unsigned char flags:4; union { unsigned char name_idx; //0-10 unsigned char rgb[3]; } data; /** Try parsing a special color name like "normal" */ bool try_parse_special(const wcstring &str); /** Try parsing an rgb color like "#F0A030" */ bool try_parse_rgb(const wcstring &str); /** Try parsing an explicit color name like "magenta" */ bool try_parse_named(const wcstring &str); /* Parsing entry point */ void parse(const wcstring &str); /** Private constructor */ explicit rgb_color_t(unsigned char t, unsigned char i=0); public: /** Default constructor of type none */ explicit rgb_color_t() : type(type_none), flags(), data() {} /** Parse a color from a string */ explicit rgb_color_t(const wcstring &str); explicit rgb_color_t(const std::string &str); /** Returns white */ static rgb_color_t white(); /** Returns black */ static rgb_color_t black(); /** Returns the reset special color */ static rgb_color_t reset(); /** Returns the normal special color */ static rgb_color_t normal(); /** Returns the ignore special color */ static rgb_color_t ignore(); /** Returns the none special color */ static rgb_color_t none(); /** Returns whether the color is the ignore special color */ bool is_ignore(void) const { return type == type_ignore; } /** Returns whether the color is the normal special color */ bool is_normal(void) const { return type == type_normal; } /** Returns whether the color is the reset special color */ bool is_reset(void) const { return type == type_reset; } /** Returns whether the color is the none special color */ bool is_none(void) const { return type == type_none; } /** Returns whether the color is a named color (like "magenta") */ bool is_named(void) const { return type == type_named; } /** Returns whether the color is specified via RGB components */ bool is_rgb(void) const { return type == type_rgb; } /** Returns whether the color is special, that is, not rgb or named */ bool is_special(void) const { return type != type_named && type != type_rgb; } /** Returns a description of the color */ wcstring description() const; /** Returns the name index for the given color. Requires that the color be named or RGB. */ unsigned char to_name_index() const; /** Returns the term256 index for the given color. Requires that the color be named or RGB. */ unsigned char to_term256_index() const; /** Returns whether the color is bold */ bool is_bold() const { return !!(flags & flag_bold); } /** Set whether the color is bold */ void set_bold(bool x) { if (x) flags |= flag_bold; else flags &= ~flag_bold; } /** Returns whether the color is underlined */ bool is_underline() const { return !!(flags & flag_underline); } /** Set whether the color is underlined */ void set_underline(bool x) { if (x) flags |= flag_underline; else flags &= ~flag_underline; } /** Compare two colors for equality */ bool operator==(const rgb_color_t &other) const { return type == other.type && ! memcmp(&data, &other.data, sizeof data); } /** Compare two colors for inequality */ bool operator!=(const rgb_color_t &other) const { return !(*this == other); } /** Returns the names of all named colors */ static wcstring_list_t named_color_names(void); }; #endif fish/common.cpp000066400000000000000000001622701214535744100140210ustar00rootroot00000000000000/** \file common.c Various functions, mostly string utilities, that are used by most parts of fish. */ #include "config.h" #include #ifdef HAVE_STROPTS_H #include #endif #ifdef HAVE_SIGINFO_H #include #endif #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_EXECINFO_H #include #endif #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #include "fallback.h" #include "util.h" #include "wutil.h" #include "common.h" #include "expand.h" #include "proc.h" #include "wildcard.h" #include "parser.h" #include "complete.h" #include "util.cpp" #include "fallback.cpp" struct termios shell_modes; // Note we foolishly assume that pthread_t is just a primitive. But it might be a struct. static pthread_t main_thread_id = 0; static bool thread_assertions_configured_for_testing = false; wchar_t ellipsis_char; wchar_t omitted_newline_char; char *profile=0; const wchar_t *program_name; int debug_level=1; /** This struct should be continually updated by signals as the term resizes, and as such always contain the correct current size. */ static struct winsize termsize; static char *wcs2str_internal(const wchar_t *in, char *out); void show_stackframe() { ASSERT_IS_NOT_FORKED_CHILD(); /* Hack to avoid showing backtraces in the tester */ if (program_name && ! wcscmp(program_name, L"(ignore)")) return; void *trace[32]; int i, trace_size = 0; trace_size = backtrace(trace, 32); char **messages = backtrace_symbols(trace, trace_size); if (messages) { debug(0, L"Backtrace:"); for (i=0; ipush_back((wchar_t)c); break; } } } /** Converts the narrow character string \c in into its wide equivalent, and return it The string may contain embedded nulls. This function encodes illegal character sequences in a reversible way using the private use area. */ static wcstring str2wcs_internal(const char *in, const size_t in_len) { if (in_len == 0) return wcstring(); assert(in != NULL); wcstring result; result.reserve(in_len); mbstate_t state = {}; size_t in_pos = 0; while (in_pos < in_len) { wchar_t wc = 0; size_t ret = mbrtowc(&wc, &in[in_pos], in_len-in_pos, &state); /* Determine whether to encode this characters with our crazy scheme */ bool use_encode_direct = false; if (wc >= ENCODE_DIRECT_BASE && wc < ENCODE_DIRECT_BASE+256) { use_encode_direct = true; } else if (wc == INTERNAL_SEPARATOR) { use_encode_direct = true; } else if (ret == (size_t)(-2)) { /* Incomplete sequence */ use_encode_direct = true; } else if (ret == (size_t)(-1)) { /* Invalid data */ use_encode_direct = true; } else if (ret > in_len - in_pos) { /* Other error codes? Terrifying, should never happen */ use_encode_direct = true; } if (use_encode_direct) { wc = ENCODE_DIRECT_BASE + (unsigned char)in[in_pos]; result.push_back(wc); in_pos++; bzero(&state, sizeof state); } else if (ret == 0) { /* Embedded null byte! */ result.push_back(L'\0'); in_pos++; bzero(&state, sizeof state); } else { /* Normal case */ result.push_back(wc); in_pos += ret; } } return result; } wcstring str2wcstring(const char *in, size_t len) { return str2wcs_internal(in, len); } wcstring str2wcstring(const char *in) { return str2wcs_internal(in, strlen(in)); } wcstring str2wcstring(const std::string &in) { /* Handles embedded nulls! */ return str2wcs_internal(in.data(), in.size()); } char *wcs2str(const wchar_t *in) { if (! in) return NULL; char *out; size_t desired_size = MAX_UTF8_BYTES*wcslen(in)+1; char local_buff[512]; if (desired_size <= sizeof local_buff / sizeof *local_buff) { // convert into local buff, then use strdup() so we don't waste malloc'd space char *result = wcs2str_internal(in, local_buff); if (result) { // It converted into the local buffer, so copy it result = strdup(result); if (! result) { DIE_MEM(); } } return result; } else { // here we fall into the bad case of allocating a buffer probably much larger than necessary out = (char *)malloc(MAX_UTF8_BYTES*wcslen(in)+1); if (!out) { DIE_MEM(); } return wcs2str_internal(in, out); } return wcs2str_internal(in, out); } char *wcs2str(const wcstring &in) { return wcs2str(in.c_str()); } /* This function is distinguished from wcs2str_internal in that it allows embedded null bytes */ std::string wcs2string(const wcstring &input) { std::string result; result.reserve(input.size()); mbstate_t state; memset(&state, 0, sizeof(state)); char converted[MB_LEN_MAX + 1]; for (size_t i=0; i < input.size(); i++) { wchar_t wc = input[i]; if (wc == INTERNAL_SEPARATOR) { } else if ((wc >= ENCODE_DIRECT_BASE) && (wc < ENCODE_DIRECT_BASE+256)) { result.push_back(wc - ENCODE_DIRECT_BASE); } else { bzero(converted, sizeof converted); size_t len = wcrtomb(converted, wc, &state); if (len == (size_t)(-1)) { debug(1, L"Wide character %d has no narrow representation", wc); memset(&state, 0, sizeof(state)); } else { result.append(converted, len); } } } return result; } /** Converts the wide character string \c in into it's narrow equivalent, stored in \c out. \c out must have enough space to fit the entire string. This function decodes illegal character sequences in a reversible way using the private use area. */ static char *wcs2str_internal(const wchar_t *in, char *out) { size_t res=0; size_t in_pos=0; size_t out_pos = 0; mbstate_t state; CHECK(in, 0); CHECK(out, 0); memset(&state, 0, sizeof(state)); while (in[in_pos]) { if (in[in_pos] == INTERNAL_SEPARATOR) { } else if ((in[in_pos] >= ENCODE_DIRECT_BASE) && (in[in_pos] < ENCODE_DIRECT_BASE+256)) { out[out_pos++] = in[in_pos]- ENCODE_DIRECT_BASE; } else { res = wcrtomb(&out[out_pos], in[in_pos], &state); if (res == (size_t)(-1)) { debug(1, L"Wide character %d has no narrow representation", in[in_pos]); memset(&state, 0, sizeof(state)); } else { out_pos += res; } } in_pos++; } out[out_pos] = 0; return out; } char **wcsv2strv(const wchar_t * const *in) { size_t i, count = 0; while (in[count] != 0) count++; char **res = (char **)malloc(sizeof(char *)*(count+1)); if (res == 0) { DIE_MEM(); } for (i=0; i= max_size) { buff[0] = '\0'; break; } buff = (wchar_t *)realloc((buff == static_buff ? NULL : buff), size); if (buff == NULL) { DIE_MEM(); } } /* Try printing */ va_list va; va_copy(va, va_orig); status = vswprintf(buff, size / sizeof(wchar_t), format, va); va_end(va); } wcstring result = wcstring(buff); if (buff != static_buff) free(buff); errno = saved_err; return result; } void append_formatv(wcstring &str, const wchar_t *format, va_list ap) { /* Preserve errno across this call since it likes to stomp on it */ int err = errno; str.append(vformat_string(format, ap)); errno = err; } void append_format(wcstring &str, const wchar_t *format, ...) { va_list va; va_start(va, format); append_formatv(str, format, va); va_end(va); } wchar_t *wcsvarname(const wchar_t *str) { while (*str) { if ((!iswalnum(*str)) && (*str != L'_')) { return (wchar_t *)str; } str++; } return 0; } const wchar_t *wcsfuncname(const wchar_t *str) { return wcschr(str, L'/'); } int wcsvarchr(wchar_t chr) { return iswalnum(chr) || chr == L'_'; } /** The glibc version of wcswidth seems to hang on some strings. fish uses this replacement. */ int my_wcswidth(const wchar_t *c) { return fish_wcswidth(c, wcslen(c)); } wchar_t *quote_end(const wchar_t *pos) { wchar_t c = *pos; while (1) { pos++; if (!*pos) return 0; if (*pos == L'\\') { pos++; if (!*pos) return 0; } else { if (*pos == c) { return (wchar_t *)pos; } } } return 0; } wcstring wsetlocale(int category, const wchar_t *locale) { char *lang = locale ? wcs2str(locale) : NULL; char *res = setlocale(category, lang); free(lang); /* Use ellipsis if on known unicode system, otherwise use $ */ char *ctype = setlocale(LC_CTYPE, NULL); bool unicode = (strstr(ctype, ".UTF") || strstr(ctype, ".utf")); ellipsis_char = unicode ? L'\x2026' : L'$'; // U+23CE is the "return" character omitted_newline_char = unicode ? L'\x23CE' : L'~'; if (!res) return wcstring(); else return format_string(L"%s", res); } bool contains_internal(const wchar_t *a, ...) { const wchar_t *arg; va_list va; bool res = false; CHECK(a, 0); va_start(va, a); while ((arg=va_arg(va, const wchar_t *))!= 0) { if (wcscmp(a,arg) == 0) { res = true; break; } } va_end(va); return res; } /* wcstring variant of contains_internal. The first parameter is a wcstring, the rest are const wchar_t* */ __sentinel bool contains_internal(const wcstring &needle, ...) { const wchar_t *arg; va_list va; int res = 0; va_start(va, needle); while ((arg=va_arg(va, const wchar_t *))!= 0) { if (needle == arg) { res=1; break; } } va_end(va); return res; } long read_blocked(int fd, void *buf, size_t count) { ssize_t res; sigset_t chldset, oldset; sigemptyset(&chldset); sigaddset(&chldset, SIGCHLD); VOMIT_ON_FAILURE(pthread_sigmask(SIG_BLOCK, &chldset, &oldset)); res = read(fd, buf, count); VOMIT_ON_FAILURE(pthread_sigmask(SIG_SETMASK, &oldset, NULL)); return res; } ssize_t write_loop(int fd, const char *buff, size_t count) { size_t out_cum=0; while (out_cum < count) { ssize_t out = write(fd, &buff[out_cum], count - out_cum); if (out < 0) { if (errno != EAGAIN && errno != EINTR) { return -1; } } else { out_cum += (size_t)out; } } return (ssize_t)out_cum; } ssize_t read_loop(int fd, void *buff, size_t count) { ssize_t result; do { result = read(fd, buff, count); } while (result < 0 && (errno == EAGAIN || errno == EINTR)); return result; } static bool should_debug(int level) { if (level > debug_level) return false; /* Hack to not print error messages in the tests */ if (program_name && ! wcscmp(program_name, L"(ignore)")) return false; return true; } static void debug_shared(const wcstring &msg) { const wcstring sb = wcstring(program_name) + L": " + msg; wcstring sb2; write_screen(sb, sb2); fwprintf(stderr, L"%ls", sb2.c_str()); } void debug(int level, const wchar_t *msg, ...) { if (! should_debug(level)) return; int errno_old = errno; va_list va; va_start(va, msg); wcstring local_msg = vformat_string(msg, va); va_end(va); debug_shared(local_msg); errno = errno_old; } void debug(int level, const char *msg, ...) { if (! should_debug(level)) return; int errno_old = errno; char local_msg[512]; va_list va; va_start(va, msg); vsnprintf(local_msg, sizeof local_msg, msg, va); va_end(va); debug_shared(str2wcstring(local_msg)); errno = errno_old; } void debug_safe(int level, const char *msg, const char *param1, const char *param2, const char *param3, const char *param4, const char *param5, const char *param6, const char *param7, const char *param8, const char *param9, const char *param10, const char *param11, const char *param12) { const char * const params[] = {param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12}; if (! msg) return; /* Can't call printf, that may allocate memory Just call write() over and over. */ if (level > debug_level) return; int errno_old = errno; size_t param_idx = 0; const char *cursor = msg; while (*cursor != '\0') { const char *end = strchr(cursor, '%'); if (end == NULL) end = cursor + strlen(cursor); write(STDERR_FILENO, cursor, end - cursor); if (end[0] == '%' && end[1] == 's') { /* Handle a format string */ assert(param_idx < sizeof params / sizeof *params); const char *format = params[param_idx++]; if (! format) format = "(null)"; write(STDERR_FILENO, format, strlen(format)); cursor = end + 2; } else if (end[0] == '\0') { /* Must be at the end of the string */ cursor = end; } else { /* Some other format specifier, just skip it */ cursor = end + 1; } } // We always append a newline write(STDERR_FILENO, "\n", 1); errno = errno_old; } void format_long_safe(char buff[128], long val) { if (val == 0) { strcpy(buff, "0"); } else { /* Generate the string in reverse */ size_t idx = 0; bool negative = (val < 0); /* Note that we can't just negate val if it's negative, because it may be the most negative value. We do rely on round-towards-zero division though. */ while (val != 0) { long rem = val % 10; buff[idx++] = '0' + (rem < 0 ? -rem : rem); val /= 10; } if (negative) buff[idx++] = '-'; buff[idx] = 0; size_t left = 0, right = idx - 1; while (left < right) { char tmp = buff[left]; buff[left++] = buff[right]; buff[right--] = tmp; } } } void format_long_safe(wchar_t buff[128], long val) { if (val == 0) { wcscpy(buff, L"0"); } else { /* Generate the string in reverse */ size_t idx = 0; bool negative = (val < 0); while (val > 0) { long rem = val % 10; /* Here we're assuming that wide character digits are contiguous - is that a correct assumption? */ buff[idx++] = L'0' + (wchar_t)(rem < 0 ? -rem : rem); val /= 10; } if (negative) buff[idx++] = L'-'; buff[idx] = 0; size_t left = 0, right = idx - 1; while (left < right) { wchar_t tmp = buff[left]; buff[left++] = buff[right]; buff[right--] = tmp; } } } void write_screen(const wcstring &msg, wcstring &buff) { const wchar_t *start, *pos; int line_width = 0; int tok_width = 0; int screen_width = common_get_width(); if (screen_width) { start = pos = msg.c_str(); while (1) { int overflow = 0; tok_width=0; /* Tokenize on whitespace, and also calculate the width of the token */ while (*pos && (!wcschr(L" \n\r\t", *pos))) { /* Check is token is wider than one line. If so we mark it as an overflow and break the token. */ if ((tok_width + fish_wcwidth(*pos)) > (screen_width-1)) { overflow = 1; break; } tok_width += fish_wcwidth(*pos); pos++; } /* If token is zero character long, we don't do anything */ if (pos == start) { start = pos = pos+1; } else if (overflow) { /* In case of overflow, we print a newline, except if we already are at position 0 */ wchar_t *token = wcsndup(start, pos-start); if (line_width != 0) buff.push_back(L'\n'); buff.append(format_string(L"%ls-\n", token)); free(token); line_width=0; } else { /* Print the token */ wchar_t *token = wcsndup(start, pos-start); if ((line_width + (line_width!=0?1:0) + tok_width) > screen_width) { buff.push_back(L'\n'); line_width=0; } buff.append(format_string(L"%ls%ls", line_width?L" ":L"", token)); free(token); line_width += (line_width!=0?1:0) + tok_width; } /* Break on end of string */ if (!*pos) { break; } start=pos; } } else { buff.append(msg); } buff.push_back(L'\n'); } /** Perform string escaping of a strinng by only quoting it. Assumes the string has already been checked for characters that can not be escaped this way. */ static wchar_t *escape_simple(const wchar_t *in) { wchar_t *out; size_t len = wcslen(in); out = (wchar_t *)malloc(sizeof(wchar_t)*(len+3)); if (!out) DIE_MEM(); out[0] = L'\''; wcscpy(&out[1], in); out[len+1]=L'\''; out[len+2]=0; return out; } wchar_t *escape(const wchar_t *in_orig, escape_flags_t flags) { const wchar_t *in = in_orig; bool escape_all = !!(flags & ESCAPE_ALL); bool no_quoted = !!(flags & ESCAPE_NO_QUOTED); bool no_tilde = !!(flags & ESCAPE_NO_TILDE); wchar_t *out; wchar_t *pos; int need_escape=0; int need_complex_escape=0; if (!in) { debug(0, L"%s called with null input", __func__); FATAL_EXIT(); } if (!no_quoted && (wcslen(in) == 0)) { out = wcsdup(L"''"); if (!out) DIE_MEM(); return out; } out = (wchar_t *)malloc(sizeof(wchar_t)*(wcslen(in)*4 + 1)); pos = out; if (!out) DIE_MEM(); 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; need_escape=need_complex_escape=1; } else { wchar_t c = *in; switch (c) { case L'\t': *(pos++) = L'\\'; *(pos++) = L't'; need_escape=need_complex_escape=1; break; case L'\n': *(pos++) = L'\\'; *(pos++) = L'n'; need_escape=need_complex_escape=1; break; case L'\b': *(pos++) = L'\\'; *(pos++) = L'b'; need_escape=need_complex_escape=1; break; case L'\r': *(pos++) = L'\\'; *(pos++) = L'r'; need_escape=need_complex_escape=1; break; case L'\x1b': *(pos++) = L'\\'; *(pos++) = L'e'; need_escape=need_complex_escape=1; break; case L'\\': case L'\'': { need_escape=need_complex_escape=1; if (escape_all) *pos++ = L'\\'; *pos++ = *in; break; } 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 (! no_tilde || c != L'~') { need_escape=1; if (escape_all) *pos++ = L'\\'; } *pos++ = *in; break; } default: { if (*in < 32) { if (*in <27 && *in > 0) { *(pos++) = L'\\'; *(pos++) = L'c'; *(pos++) = L'a' + *in -1; need_escape=need_complex_escape=1; break; } int tmp = (*in)%16; *pos++ = L'\\'; *pos++ = L'x'; *pos++ = ((*in>15)? L'1' : L'0'); *pos++ = tmp > 9? L'a'+(tmp-10):L'0'+tmp; need_escape=need_complex_escape=1; } else { *pos++ = *in; } break; } } } in++; } *pos = 0; /* Use quoted escaping if possible, since most people find it easier to read. */ if (!no_quoted && need_escape && !need_complex_escape && escape_all) { free(out); out = escape_simple(in_orig); } return out; } wcstring escape_string(const wcstring &in, escape_flags_t flags) { wchar_t *tmp = escape(in.c_str(), flags); wcstring result(tmp); free(tmp); return result; } wchar_t *unescape(const wchar_t * orig, int flags) { int out_pos; size_t in_pos; size_t len; int c; int bracket_count=0; wchar_t prev=0; wchar_t *in; bool unescape_special = !!(flags & UNESCAPE_SPECIAL); bool allow_incomplete = !!(flags & UNESCAPE_INCOMPLETE); CHECK(orig, 0); len = wcslen(orig); in = wcsdup(orig); if (!in) DIE_MEM(); enum { mode_unquoted, mode_single_quotes, mode_double_quotes } mode = mode_unquoted; for (in_pos=0, out_pos=0; in_pos=0)?in[out_pos]:0), out_pos++, in_pos++) { c = in[in_pos]; switch (mode) { /* Mode 0 means unquoted string */ case mode_unquoted: { if (c == L'\\') { switch (in[++in_pos]) { /* A null character after a backslash is an error, return null */ case L'\0': { if (!allow_incomplete) { free(in); return 0; } } /* Numeric escape sequences. No prefix means octal escape, otherwise hexadecimal. */ case L'0': case L'1': case L'2': case L'3': case L'4': case L'5': case L'6': case L'7': case L'u': case L'U': case L'x': case L'X': { int i; long long res=0; int chars=2; int base=16; int byte = 0; wchar_t max_val = ASCII_MAX; switch (in[in_pos]) { case L'u': { chars=4; max_val = UCS2_MAX; break; } case L'U': { chars=8; max_val = WCHAR_MAX; break; } case L'x': { break; } case L'X': { byte=1; max_val = BYTE_MAX; break; } default: { base=8; chars=3; // note in_pod must be larger than 0 since we incremented it above assert(in_pos > 0); in_pos--; break; } } for (i=0; i= L'a' && in[in_pos] <= (L'a'+32)) { in[out_pos]=in[in_pos]-L'a'+1; } else if (in[in_pos] >= L'A' && in[in_pos] <= (L'A'+32)) { in[out_pos]=in[in_pos]-L'A'+1; } else { free(in); return 0; } break; } /* \x1b means escape */ case L'e': { in[out_pos]=L'\x1b'; break; } /* \f means form feed */ case L'f': { in[out_pos]=L'\f'; break; } /* \n means newline */ case L'n': { in[out_pos]=L'\n'; break; } /* \r means carriage return */ case L'r': { in[out_pos]=L'\r'; break; } /* \t means tab */ case L't': { in[out_pos]=L'\t'; break; } /* \v means vertical tab */ case L'v': { in[out_pos]=L'\v'; break; } /* If a backslash is followed by an actual newline, swallow them both */ case L'\n': out_pos--; break; default: { if (unescape_special) in[out_pos++] = INTERNAL_SEPARATOR; in[out_pos]=in[in_pos]; break; } } } else { switch (in[in_pos]) { case L'~': { if (unescape_special && (in_pos == 0)) { in[out_pos]=HOME_DIRECTORY; } else { in[out_pos] = L'~'; } break; } case L'%': { if (unescape_special && (in_pos == 0)) { in[out_pos]=PROCESS_EXPAND; } else { in[out_pos]=in[in_pos]; } break; } case L'*': { if (unescape_special) { if (out_pos > 0 && in[out_pos-1]==ANY_STRING) { out_pos--; in[out_pos] = ANY_STRING_RECURSIVE; } else in[out_pos]=ANY_STRING; } else { in[out_pos]=in[in_pos]; } break; } case L'?': { if (unescape_special) { in[out_pos]=ANY_CHAR; } else { in[out_pos]=in[in_pos]; } break; } case L'$': { if (unescape_special) { in[out_pos]=VARIABLE_EXPAND; } else { in[out_pos]=in[in_pos]; } break; } case L'{': { if (unescape_special) { bracket_count++; in[out_pos]=BRACKET_BEGIN; } else { in[out_pos]=in[in_pos]; } break; } case L'}': { if (unescape_special) { bracket_count--; in[out_pos]=BRACKET_END; } else { in[out_pos]=in[in_pos]; } break; } case L',': { if (unescape_special && bracket_count && prev!=BRACKET_SEP) { in[out_pos]=BRACKET_SEP; } else { in[out_pos]=in[in_pos]; } break; } case L'\'': { mode = mode_single_quotes; if (unescape_special) in[out_pos] = INTERNAL_SEPARATOR; else out_pos--; break; } case L'\"': { mode = mode_double_quotes; if (unescape_special) in[out_pos] = INTERNAL_SEPARATOR; else out_pos--; break; } default: { in[out_pos] = in[in_pos]; break; } } } break; } /* Mode 1 means single quoted string, i.e 'foo'. A backslash at the end of a line in a single quoted string does not swallow the backslash or newline. */ case mode_single_quotes: { if (c == L'\\') { switch (in[++in_pos]) { case '\\': case L'\'': { in[out_pos]=in[in_pos]; break; } case L'\0': { if (!allow_incomplete) { free(in); return 0; } else { //We may ever escape a NULL character, but still appending a \ in case I am wrong. in[out_pos] = L'\\'; } } break; default: { in[out_pos++] = L'\\'; in[out_pos]= in[in_pos]; } } } if (c == L'\'') { if (unescape_special) in[out_pos] = INTERNAL_SEPARATOR; else out_pos--; mode = mode_unquoted; } else { in[out_pos] = in[in_pos]; } break; } /* Mode 2 means double quoted string, i.e. "foo" */ case mode_double_quotes: { switch (c) { case '"': { mode = mode_unquoted; if (unescape_special) in[out_pos] = INTERNAL_SEPARATOR; else out_pos--; break; } case '\\': { switch (in[++in_pos]) { case L'\0': { if (!allow_incomplete) { free(in); return 0; } else { //We probably don't need it since NULL character is always appended before ending this function. in[out_pos]=in[in_pos]; } } break; case '\\': case L'$': case '"': { in[out_pos]=in[in_pos]; break; } case '\n': { out_pos--; break; } default: { in[out_pos++] = L'\\'; in[out_pos] = in[in_pos]; break; } } break; } case '$': { if (unescape_special) { in[out_pos]=VARIABLE_EXPAND_SINGLE; } else { in[out_pos]=in[in_pos]; } break; } default: { in[out_pos] = in[in_pos]; break; } } break; } } } if (!allow_incomplete && mode) { free(in); return 0; } in[out_pos]=L'\0'; return in; } bool unescape_string(wcstring &str, int escape_special) { bool success = false; wchar_t *result = unescape(str.c_str(), escape_special); if (result) { str.replace(str.begin(), str.end(), result); free(result); success = true; } return success; } void common_handle_winch(int signal) { #ifdef HAVE_WINSIZE if (ioctl(1,TIOCGWINSZ,&termsize)!=0) { return; } #else termsize.ws_col = 80; termsize.ws_row = 24; #endif } int common_get_width() { return termsize.ws_col; } int common_get_height() { return termsize.ws_row; } void tokenize_variable_array(const wcstring &val, std::vector &out) { size_t pos = 0, end = val.size(); while (pos < end) { size_t next_pos = val.find(ARRAY_SEP, pos); if (next_pos == wcstring::npos) break; out.push_back(val.substr(pos, next_pos - pos)); pos = next_pos + 1; //skip the separator } out.push_back(val.substr(pos, end - pos)); } bool string_prefixes_string(const wchar_t *proposed_prefix, const wcstring &value) { size_t prefix_size = wcslen(proposed_prefix); return prefix_size <= value.size() && value.compare(0, prefix_size, proposed_prefix) == 0; } bool string_prefixes_string(const wcstring &proposed_prefix, const wcstring &value) { size_t prefix_size = proposed_prefix.size(); return prefix_size <= value.size() && value.compare(0, prefix_size, proposed_prefix) == 0; } bool string_prefixes_string_case_insensitive(const wcstring &proposed_prefix, const wcstring &value) { size_t prefix_size = proposed_prefix.size(); return prefix_size <= value.size() && wcsncasecmp(proposed_prefix.c_str(), value.c_str(), prefix_size) == 0; } bool string_suffixes_string(const wcstring &proposed_suffix, const wcstring &value) { size_t suffix_size = proposed_suffix.size(); return suffix_size <= value.size() && value.compare(value.size() - suffix_size, suffix_size, proposed_suffix) == 0; } bool string_suffixes_string(const wchar_t *proposed_suffix, const wcstring &value) { size_t suffix_size = wcslen(proposed_suffix); return suffix_size <= value.size() && value.compare(value.size() - suffix_size, suffix_size, proposed_suffix) == 0; } bool list_contains_string(const wcstring_list_t &list, const wcstring &str) { return std::find(list.begin(), list.end(), str) != list.end(); } int create_directory(const wcstring &d) { int ok = 0; struct stat buf; int stat_res = 0; while ((stat_res = wstat(d, &buf)) != 0) { if (errno != EAGAIN) break; } if (stat_res == 0) { if (S_ISDIR(buf.st_mode)) { ok = 1; } } else { if (errno == ENOENT) { wcstring dir = wdirname(d); if (!create_directory(dir)) { if (!wmkdir(d, 0700)) { ok = 1; } } } } return ok?0:-1; } __attribute__((noinline)) void bugreport() { debug(1, _(L"This is a bug. Break on bugreport to debug." L"If you can reproduce it, please send a bug report to %s."), PACKAGE_BUGREPORT); } wcstring format_size(long long sz) { wcstring result; const wchar_t *sz_name[]= { L"kB", L"MB", L"GB", L"TB", L"PB", L"EB", L"ZB", L"YB", 0 }; if (sz < 0) { result.append(L"unknown"); } else if (sz < 1) { result.append(_(L"empty")); } else if (sz < 1024) { result.append(format_string(L"%lldB", sz)); } else { int i; for (i=0; sz_name[i]; i++) { if (sz < (1024*1024) || !sz_name[i+1]) { long isz = ((long)sz)/1024; if (isz > 9) result.append(format_string(L"%d%ls", isz, sz_name[i])); else result.append(format_string(L"%.1f%ls", (double)sz/1024, sz_name[i])); break; } sz /= 1024; } } return result; } /* Crappy function to extract the most significant digit of an unsigned long long value */ static char extract_most_significant_digit(unsigned long long *xp) { unsigned long long place_value = 1; unsigned long long x = *xp; while (x >= 10) { x /= 10; place_value *= 10; } *xp -= (place_value * x); return x + '0'; } void append_ull(char *buff, unsigned long long val, size_t *inout_idx, size_t max_len) { size_t idx = *inout_idx; while (val > 0 && idx < max_len) buff[idx++] = extract_most_significant_digit(&val); *inout_idx = idx; } void append_str(char *buff, const char *str, size_t *inout_idx, size_t max_len) { size_t idx = *inout_idx; while (*str && idx < max_len) buff[idx++] = *str++; *inout_idx = idx; } void format_size_safe(char buff[128], unsigned long long sz) { const size_t buff_size = 128; const size_t max_len = buff_size - 1; //need to leave room for a null terminator bzero(buff, buff_size); size_t idx = 0; const char * const sz_name[]= { "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", NULL }; if (sz < 1) { strncpy(buff, "empty", buff_size); } else if (sz < 1024) { append_ull(buff, sz, &idx, max_len); append_str(buff, "B", &idx, max_len); } else { for (size_t i=0; sz_name[i]; i++) { if (sz < (1024*1024) || !sz_name[i+1]) { unsigned long long isz = sz/1024; if (isz > 9) { append_ull(buff, isz, &idx, max_len); } else { if (isz == 0) { append_str(buff, "0", &idx, max_len); } else { append_ull(buff, isz, &idx, max_len); } // Maybe append a single fraction digit unsigned long long remainder = sz % 1024; if (remainder > 0) { char tmp[3] = {'.', extract_most_significant_digit(&remainder), 0}; append_str(buff, tmp, &idx, max_len); } } append_str(buff, sz_name[i], &idx, max_len); break; } sz /= 1024; } } } double timef() { int time_res; struct timeval tv; time_res = gettimeofday(&tv, 0); if (time_res) { /* Fixme: What on earth is the correct parameter value for NaN? The man pages and the standard helpfully state that this parameter is implementation defined. Gcc gives a warning if a null pointer is used. But not even all mighty Google gives a hint to what value should actually be returned. */ return nan(""); } return (double)tv.tv_sec + 0.000001*tv.tv_usec; } void exit_without_destructors(int code) { _exit(code); } /* Helper function to convert from a null_terminated_array_t to a null_terminated_array_t */ void convert_wide_array_to_narrow(const null_terminated_array_t &wide_arr, null_terminated_array_t *output) { const wchar_t *const *arr = wide_arr.get(); if (! arr) { output->clear(); return; } std::vector list; for (size_t i=0; arr[i]; i++) { list.push_back(wcs2string(arr[i])); } output->set(list); } void append_path_component(wcstring &path, const wcstring &component) { if (path.empty() || component.empty()) { path.append(component); } else { size_t path_len = path.size(); bool path_slash = path.at(path_len-1) == L'/'; bool comp_slash = component.at(0) == L'/'; if (! path_slash && ! comp_slash) { // Need a slash path.push_back(L'/'); } else if (path_slash && comp_slash) { // Too many slashes path.erase(path_len - 1, 1); } path.append(component); } } extern "C" { __attribute__((noinline)) void debug_thread_error(void) { while (1) sleep(9999999); } } void set_main_thread() { main_thread_id = pthread_self(); } void configure_thread_assertions_for_testing(void) { thread_assertions_configured_for_testing = true; } /* Notice when we've forked */ static pid_t initial_pid = 0; /* Be able to restore the term's foreground process group */ static pid_t initial_foreground_process_group = -1; bool is_forked_child(void) { /* Just bail if nobody's called setup_fork_guards - e.g. fishd */ if (! initial_pid) return false; bool is_child_of_fork = (getpid() != initial_pid); if (is_child_of_fork) { printf("Uh-oh: %d\n", getpid()); while (1) sleep(10000); } return is_child_of_fork; } void setup_fork_guards(void) { /* Notice when we fork by stashing our pid. This seems simpler than pthread_atfork(). */ initial_pid = getpid(); } void save_term_foreground_process_group(void) { initial_foreground_process_group = tcgetpgrp(STDIN_FILENO); } void restore_term_foreground_process_group(void) { if (initial_foreground_process_group != -1) { tcsetpgrp(STDIN_FILENO, initial_foreground_process_group); } } bool is_main_thread() { assert(main_thread_id != 0); return main_thread_id == pthread_self(); } void assert_is_main_thread(const char *who) { if (! is_main_thread() && ! thread_assertions_configured_for_testing) { fprintf(stderr, "Warning: %s called off of main thread. Break on debug_thread_error to debug.\n", who); debug_thread_error(); } } void assert_is_not_forked_child(const char *who) { if (is_forked_child()) { fprintf(stderr, "Warning: %s called in a forked child. Break on debug_thread_error to debug.\n", who); debug_thread_error(); } } void assert_is_background_thread(const char *who) { if (is_main_thread() && ! thread_assertions_configured_for_testing) { fprintf(stderr, "Warning: %s called on the main thread (may block!). Break on debug_thread_error to debug.\n", who); debug_thread_error(); } } void assert_is_locked(void *vmutex, const char *who, const char *caller) { pthread_mutex_t *mutex = static_cast(vmutex); if (0 == pthread_mutex_trylock(mutex)) { fprintf(stderr, "Warning: %s is not locked when it should be in '%s'. Break on debug_thread_error to debug.\n", who, caller); debug_thread_error(); pthread_mutex_unlock(mutex); } } void scoped_lock::lock(void) { assert(! locked); assert(! is_forked_child()); VOMIT_ON_FAILURE(pthread_mutex_lock(lock_obj)); locked = true; } void scoped_lock::unlock(void) { assert(locked); assert(! is_forked_child()); VOMIT_ON_FAILURE(pthread_mutex_unlock(lock_obj)); locked = false; } scoped_lock::scoped_lock(pthread_mutex_t &mutex) : lock_obj(&mutex), locked(false) { this->lock(); } scoped_lock::~scoped_lock() { if (locked) this->unlock(); } wcstokenizer::wcstokenizer(const wcstring &s, const wcstring &separator) : buffer(), str(), state(), sep(separator) { buffer = wcsdup(s.c_str()); str = buffer; state = NULL; } bool wcstokenizer::next(wcstring &result) { wchar_t *tmp = wcstok(str, sep.c_str(), &state); str = NULL; if (tmp) result = tmp; return tmp != NULL; } wcstokenizer::~wcstokenizer() { free(buffer); } template static CharType_t **make_null_terminated_array_helper(const std::vector > &argv) { size_t count = argv.size(); /* We allocate everything in one giant block. First compute how much space we need. */ /* N + 1 pointers */ size_t pointers_allocation_len = (count + 1) * sizeof(CharType_t *); /* In the very unlikely event that CharType_t has stricter alignment requirements than does a pointer, round us up to the size of a CharType_t */ pointers_allocation_len += sizeof(CharType_t) - 1; pointers_allocation_len -= pointers_allocation_len % sizeof(CharType_t); /* N null terminated strings */ size_t strings_allocation_len = 0; for (size_t i=0; i < count; i++) { /* The size of the string, plus a null terminator */ strings_allocation_len += (argv.at(i).size() + 1) * sizeof(CharType_t); } /* Now allocate their sum */ unsigned char *base = static_cast(malloc(pointers_allocation_len + strings_allocation_len)); if (! base) return NULL; /* Divvy it up into the pointers and strings */ CharType_t **pointers = reinterpret_cast(base); CharType_t *strings = reinterpret_cast(base + pointers_allocation_len); /* Start copying */ for (size_t i=0; i < count; i++) { const std::basic_string &str = argv.at(i); // store the current string pointer into self *pointers++ = strings; // copy the string into strings strings = std::copy(str.begin(), str.end(), strings); // each string needs a null terminator *strings++ = (CharType_t)(0); } // array of pointers needs a null terminator *pointers++ = NULL; // Make sure we know what we're doing assert((unsigned char *)pointers - base == (std::ptrdiff_t)pointers_allocation_len); assert((unsigned char *)strings - (unsigned char *)pointers == (std::ptrdiff_t)strings_allocation_len); assert((unsigned char *)strings - base == (std::ptrdiff_t)(pointers_allocation_len + strings_allocation_len)); // Return what we did return reinterpret_cast(base); } wchar_t **make_null_terminated_array(const wcstring_list_t &lst) { return make_null_terminated_array_helper(lst); } char **make_null_terminated_array(const std::vector &lst) { return make_null_terminated_array_helper(lst); } fish/common.h000066400000000000000000000510031214535744100134550ustar00rootroot00000000000000/** \file common.h Prototypes for various functions, mostly string utilities, that are used by most parts of fish. */ #ifndef FISH_COMMON_H /** Header guard */ #define FISH_COMMON_H #include #include #include #include #include #include #include #include #include #include #include #include "util.h" /** Avoid writing the type name twice in a common "static_cast-initialization". Caveat: This doesn't work with type names containing commas! */ #define CAST_INIT(type, dst, src) type dst = static_cast(src) class completion_t; /* Common string type */ typedef std::wstring wcstring; typedef std::vector wcstring_list_t; /** Maximum number of bytes used by a single utf-8 character */ #define MAX_UTF8_BYTES 6 /** This is in the unicode private use area. */ #define ENCODE_DIRECT_BASE 0xf100 /** Highest legal ascii value */ #define ASCII_MAX 127u /** Highest legal 16-bit unicode value */ #define UCS2_MAX 0xffffu /** Highest legal byte value */ #define BYTE_MAX 0xffu /** Escape special fish syntax characters like the semicolon */ #define UNESCAPE_SPECIAL 1 /** Allow incomplete escape sequences */ #define UNESCAPE_INCOMPLETE 2 /* Flags for the escape() and escape_string() functions */ enum { /** Escape all characters, including magic characters like the semicolon */ ESCAPE_ALL = 1 << 0, /** Do not try to use 'simplified' quoted escapes, and do not use empty quotes as the empty string */ ESCAPE_NO_QUOTED = 1 << 1, /** Do not escape tildes */ ESCAPE_NO_TILDE = 1 << 2 }; typedef unsigned int escape_flags_t; /** Helper macro for errors */ #define VOMIT_ON_FAILURE(a) do { if (0 != (a)) { int err = errno; fprintf(stderr, "%s failed on line %d in file %s: %d (%s)\n", #a, __LINE__, __FILE__, err, strerror(err)); abort(); }} while (0) /** Exits without invoking destructors (via _exit), useful for code after fork. */ void exit_without_destructors(int code) __attribute__((noreturn)); /** Save the shell mode on startup so we can restore them on exit */ extern struct termios shell_modes; /** The character to use where the text has been truncated. Is an ellipsis on unicode system and a $ on other systems. */ extern wchar_t ellipsis_char; /* Character representing an omitted newline at the end of text */ extern wchar_t omitted_newline_char; /** The verbosity level of fish. If a call to debug has a severity level higher than \c debug_level, it will not be printed. */ extern int debug_level; /** Profiling flag. True if commands should be profiled. */ extern char *profile; /** Name of the current program. Should be set at startup. Used by the debug function. */ extern const wchar_t *program_name; /** This macro is used to check that an input argument is not null. It is a bit lika a non-fatal form of assert. Instead of exit-ing on failure, the current function is ended at once. The second parameter is the return value of the current function on failure. */ #define CHECK( arg, retval ) \ if (!(arg)) \ { \ debug( 0, \ "function %s called with null value for argument %s. ", \ __func__, \ #arg ); \ bugreport(); \ show_stackframe(); \ return retval; \ } /** Pause for input, then exit the program. If supported, print a backtrace first. */ #define FATAL_EXIT() \ { \ char exit_read_buff; \ show_stackframe(); \ read( 0, &exit_read_buff, 1 ); \ exit_without_destructors( 1 ); \ } \ /** Exit program at once, leaving an error message about running out of memory. */ #define DIE_MEM() \ { \ fwprintf( stderr, \ L"fish: Out of memory on line %ld of file %s, shutting down fish\n", \ (long)__LINE__, \ __FILE__ ); \ FATAL_EXIT(); \ } /** Check if signals are blocked. If so, print an error message and return from the function performing this check. */ #define CHECK_BLOCK(retval) \ if (signal_is_blocked()) \ { \ debug( 0, \ "function %s called while blocking signals. ", \ __func__); \ bugreport(); \ show_stackframe(); \ return retval; \ } /** Shorthand for wgettext call */ #define _(wstr) wgettext(wstr) /** Noop, used to tell xgettext that a string should be translated, even though it is not directly sent to wgettext. */ #define N_(wstr) wstr /** Check if the specified string element is a part of the specified string list */ #define contains( str,... ) contains_internal( str, __VA_ARGS__, NULL ) /** Print a stack trace to stderr */ void show_stackframe(); /** Read a line from the stream f into the string. Returns the number of bytes read or -1 on failure. If the carriage return character is encountered, it is ignored. fgetws() considers the line to end if reading the file results in either a newline (L'\n') character, the null (L'\\0') character or the end of file (WEOF) character. */ int fgetws2(wcstring *s, FILE *f); /** Returns a wide character string equivalent of the specified multibyte character string This function encodes illegal character sequences in a reversible way using the private use area. */ wcstring str2wcstring(const char *in); wcstring str2wcstring(const char *in, size_t len); wcstring str2wcstring(const std::string &in); /** Returns a newly allocated multibyte character string equivalent of the specified wide character string This function decodes illegal character sequences in a reversible way using the private use area. */ char *wcs2str(const wchar_t *in); char *wcs2str(const wcstring &in); std::string wcs2string(const wcstring &input); /** Test if a string prefixes another. Returns true if a is a prefix of b */ bool string_prefixes_string(const wcstring &proposed_prefix, const wcstring &value); bool string_prefixes_string(const wchar_t *proposed_prefix, const wcstring &value); /** Test if a string is a suffix of another */ bool string_suffixes_string(const wcstring &proposed_suffix, const wcstring &value); bool string_suffixes_string(const wchar_t *proposed_suffix, const wcstring &value); /** Test if a string prefixes another without regard to case. Returns true if a is a prefix of b */ bool string_prefixes_string_case_insensitive(const wcstring &proposed_prefix, const wcstring &value); /** Test if a list contains a string using a linear search. */ bool list_contains_string(const wcstring_list_t &list, const wcstring &str); void assert_is_main_thread(const char *who); #define ASSERT_IS_MAIN_THREAD_TRAMPOLINE(x) assert_is_main_thread(x) #define ASSERT_IS_MAIN_THREAD() ASSERT_IS_MAIN_THREAD_TRAMPOLINE(__FUNCTION__) void assert_is_background_thread(const char *who); #define ASSERT_IS_BACKGROUND_THREAD_TRAMPOLINE(x) assert_is_background_thread(x) #define ASSERT_IS_BACKGROUND_THREAD() ASSERT_IS_BACKGROUND_THREAD_TRAMPOLINE(__FUNCTION__) /* Useful macro for asserting that a lock is locked. This doesn't check whether this thread locked it, which it would be nice if it did, but here it is anyways. */ void assert_is_locked(void *mutex, const char *who, const char *caller); #define ASSERT_IS_LOCKED(x) assert_is_locked((void *)(&x), #x, __FUNCTION__) /** Format the specified size (in bytes, kilobytes, etc.) into the specified stringbuffer. */ wcstring format_size(long long sz); /** Version of format_size that does not allocate memory. */ void format_size_safe(char buff[128], unsigned long long sz); /** Our crappier versions of debug which is guaranteed to not allocate any memory, or do anything other than call write(). This is useful after a call to fork() with threads. */ void debug_safe(int level, const char *msg, const char *param1 = NULL, const char *param2 = NULL, const char *param3 = NULL, const char *param4 = NULL, const char *param5 = NULL, const char *param6 = NULL, const char *param7 = NULL, const char *param8 = NULL, const char *param9 = NULL, const char *param10 = NULL, const char *param11 = NULL, const char *param12 = NULL); /** Writes out a long safely */ void format_long_safe(char buff[128], long val); void format_long_safe(wchar_t buff[128], long val); template T from_string(const wcstring &x) { T result; std::wstringstream stream(x); stream >> result; return result; } template T from_string(const std::string &x) { T result = T(); std::stringstream stream(x); stream >> result; return result; } template wcstring to_string(const T &x) { std::wstringstream stream; stream << x; return stream.str(); } /* wstringstream is a huge memory pig. Let's provide some specializations where we can. */ template<> inline wcstring to_string(const long &x) { wchar_t buff[128]; format_long_safe(buff, x); return wcstring(buff); } template<> inline bool from_string(const std::string &x) { return ! x.empty() && strchr("YTyt1", x.at(0)); } template<> inline bool from_string(const wcstring &x) { return ! x.empty() && wcschr(L"YTyt1", x.at(0)); } template<> inline wcstring to_string(const int &x) { return to_string(static_cast(x)); } wchar_t **make_null_terminated_array(const wcstring_list_t &lst); char **make_null_terminated_array(const std::vector &lst); /* Helper class for managing a null-terminated array of null-terminated strings (of some char type) */ template class null_terminated_array_t { CharType_t **array; /* No assignment or copying */ void operator=(null_terminated_array_t rhs); null_terminated_array_t(const null_terminated_array_t &); typedef std::vector > string_list_t; size_t size() const { size_t len = 0; if (array != NULL) { while (array[len] != NULL) { len++; } } return len; } void free(void) { ::free((void *)array); array = NULL; } public: null_terminated_array_t() : array(NULL) { } null_terminated_array_t(const string_list_t &argv) : array(make_null_terminated_array(argv)) { } ~null_terminated_array_t() { this->free(); } void set(const string_list_t &argv) { this->free(); this->array = make_null_terminated_array(argv); } const CharType_t * const *get() const { return array; } void clear() { this->free(); } }; /* Helper function to convert from a null_terminated_array_t to a null_terminated_array_t */ void convert_wide_array_to_narrow(const null_terminated_array_t &arr, null_terminated_array_t *output); /* Helper class to cache a narrow version of a wcstring in a malloc'd buffer, so that we can read it after fork() */ class narrow_string_rep_t { private: const char *str; /* No copying */ narrow_string_rep_t &operator=(const narrow_string_rep_t &); narrow_string_rep_t(const narrow_string_rep_t &x); public: ~narrow_string_rep_t() { free((void *)str); } narrow_string_rep_t() : str(NULL) {} void set(const wcstring &s) { free((void *)str); str = wcs2str(s.c_str()); } const char *get() const { return str; } }; bool is_forked_child(); /* Basic scoped lock class */ class scoped_lock { pthread_mutex_t *lock_obj; bool locked; /* No copying */ scoped_lock &operator=(const scoped_lock &); scoped_lock(const scoped_lock &); public: void lock(void); void unlock(void); scoped_lock(pthread_mutex_t &mutex); ~scoped_lock(); }; /** A scoped manager to save the current value of some variable, and optionally set it to a new value. On destruction it restores the variable to its old value. This can be handy when there are multiple code paths to exit a block. */ template class scoped_push { T * const ref; T saved_value; bool restored; public: scoped_push(T *r): ref(r), saved_value(*r), restored(false) { } scoped_push(T *r, const T &new_value) : ref(r), saved_value(*r), restored(false) { *r = new_value; } ~scoped_push() { restore(); } void restore() { if (!restored) { std::swap(*ref, saved_value); restored = true; } } }; /* Wrapper around wcstok */ class wcstokenizer { wchar_t *buffer, *str, *state; const wcstring sep; /* No copying */ wcstokenizer &operator=(const wcstokenizer &); wcstokenizer(const wcstokenizer &); public: wcstokenizer(const wcstring &s, const wcstring &separator); bool next(wcstring &result); ~wcstokenizer(); }; /** Appends a path component, with a / if necessary */ void append_path_component(wcstring &path, const wcstring &component); wcstring format_string(const wchar_t *format, ...); wcstring vformat_string(const wchar_t *format, va_list va_orig); void append_format(wcstring &str, const wchar_t *format, ...); void append_formatv(wcstring &str, const wchar_t *format, va_list ap); /** Returns a newly allocated wide character string array equivalent of the specified multibyte character string array */ char **wcsv2strv(const wchar_t * const *in); /** Test if the given string is a valid variable name. \return null if this is a valid name, and a pointer to the first invalid character otherwise */ wchar_t *wcsvarname(const wchar_t *str); /** Test if the given string is a valid function name. \return null if this is a valid name, and a pointer to the first invalid character otherwise */ const wchar_t *wcsfuncname(const wchar_t *str); /** Test if the given string is valid in a variable name \return 1 if this is a valid name, 0 otherwise */ int wcsvarchr(wchar_t chr); /** A wcswidth workalike. Fish uses this since the regular wcswidth seems flaky. */ int my_wcswidth(const wchar_t *c); /** This functions returns the end of the quoted substring beginning at \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 */ wchar_t *quote_end(const wchar_t *in); /** A call to this function will reset the error counter. Some functions print out non-critical error messages. These should check the error_count before, and skip printing the message if MAX_ERROR_COUNT messages have been printed. The error_reset() should be called after each interactive command executes, to allow new messages to be printed. */ void error_reset(); /** This function behaves exactly like a wide character equivalent of the C function setlocale, except that it will also try to detect if the user is using a Unicode character set, and if so, use the unicode ellipsis character as ellipsis, instead of '$'. */ wcstring wsetlocale(int category, const wchar_t *locale); /** Checks if \c needle is included in the list of strings specified. A warning is printed if needle is zero. \param needle the string to search for in the list \return zero if needle is not found, of if needle is null, non-zero otherwise */ __sentinel bool contains_internal(const wchar_t *needle, ...); __sentinel bool contains_internal(const wcstring &needle, ...); /** Call read while blocking the SIGCHLD signal. Should only be called if you _know_ there is data available for reading, or the program will hang until there is data. */ long read_blocked(int fd, void *buf, size_t count); /** Loop a write request while failure is non-critical. Return -1 and set errno in case of critical error. */ ssize_t write_loop(int fd, const char *buff, size_t count); /** Loop a read request while failure is non-critical. Return -1 and set errno in case of critical error. */ ssize_t read_loop(int fd, void *buff, size_t count); /** Issue a debug message with printf-style string formating and automatic line breaking. The string will begin with the string \c program_name, followed by a colon and a whitespace. Because debug is often called to tell the user about an error, before using wperror to give a specific error message, debug will never ever modify the value of errno. \param level the priority of the message. Lower number means higher priority. Messages with a priority_number higher than \c debug_level will be ignored.. \param msg the message format string. Example: debug( 1, L"Pi = %.3f", M_PI ); will print the string 'fish: Pi = 3.141', given that debug_level is 1 or higher, and that program_name is 'fish'. */ void debug(int level, const char *msg, ...); void debug(int level, const wchar_t *msg, ...); /** Replace special characters with backslash escape sequences. Newline is replaced with \n, etc. \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, or 0 if there is not enough memory */ wchar_t *escape(const wchar_t *in, escape_flags_t flags); wcstring escape_string(const wcstring &in, escape_flags_t flags); /** 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 set. The result must be free()d. The original string is not modified. If an invalid sequence is specified, 0 is returned. */ wchar_t *unescape(const wchar_t * in, int escape_special); bool unescape_string(wcstring &str, int escape_special); /** Returns the width of the terminal window, so that not all functions that use these values continually have to keep track of it separately. Only works if common_handle_winch is registered to handle winch signals. */ int common_get_width(); /** Returns the height of the terminal window, so that not all functions that use these values continually have to keep track of it separatly. Only works if common_handle_winch is registered to handle winch signals. */ int common_get_height(); /** Handle a window change event by looking up the new window size and saving it in an internal variable used by common_get_wisth and common_get_height(). */ void common_handle_winch(int signal); /** Write paragraph of output to the specified stringbuffer, and redo the linebreaks to fit the current screen. */ void write_screen(const wcstring &msg, wcstring &buff); /** Tokenize the specified string into the specified wcstring_list_t. \param val the input string. The contents of this string is not changed. \param out the list in which to place the elements. */ void tokenize_variable_array(const wcstring &val, wcstring_list_t &out); /** Make sure the specified direcotry exists. If needed, try to create it and any currently not existing parent directories.. \return 0 if, at the time of function return the directory exists, -1 otherwise. */ int create_directory(const wcstring &d); /** Print a short message about how to file a bug report to stderr */ void bugreport(); /** Return the number of seconds from the UNIX epoch, with subsecond precision. This function uses the gettimeofday function, and will have the same precision as that function. If an error occurs, NAN is returned. */ double timef(); /** Call the following function early in main to set the main thread. This is our replacement for pthread_main_np(). */ void set_main_thread(); bool is_main_thread(); /** Configures thread assertions for testing */ void configure_thread_assertions_for_testing(); /** Set up a guard to complain if we try to do certain things (like take a lock) after calling fork */ void setup_fork_guards(void); /** Save the value of tcgetpgrp so we can restore it on exit */ void save_term_foreground_process_group(void); void restore_term_foreground_process_group(void); /** Return whether we are the child of a fork */ bool is_forked_child(void); void assert_is_not_forked_child(const char *who); #define ASSERT_IS_NOT_FORKED_CHILD_TRAMPOLINE(x) assert_is_not_forked_child(x) #define ASSERT_IS_NOT_FORKED_CHILD() ASSERT_IS_NOT_FORKED_CHILD_TRAMPOLINE(__FUNCTION__) extern "C" { __attribute__((noinline)) void debug_thread_error(void); } #endif fish/complete.cpp000066400000000000000000001735771214535744100143550ustar00rootroot00000000000000/** \file complete.c Functions related to tab-completion. These functions are used for storing and retrieving tab-completion data, as well as for performing tab-completion. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "tokenizer.h" #include "wildcard.h" #include "proc.h" #include "parser.h" #include "function.h" #include "complete.h" #include "builtin.h" #include "env.h" #include "exec.h" #include "expand.h" #include "common.h" #include "reader.h" #include "history.h" #include "intern.h" #include "parse_util.h" #include "parser_keywords.h" #include "wutil.h" #include "path.h" /* Completion description strings, mostly for different types of files, such as sockets, block devices, etc. There are a few more completion description strings defined in expand.c. Maybe all completion description strings should be defined in the same file? */ /** Description for ~USER completion */ #define COMPLETE_USER_DESC _( L"Home for %ls" ) /** Description for short variables. The value is concatenated to this description */ #define COMPLETE_VAR_DESC_VAL _( L"Variable: %ls" ) /** The maximum number of commands on which to perform description lookup. The lookup process is quite time consuming, so this should be set to a pretty low number. */ #define MAX_CMD_DESC_LOOKUP 10 /** Condition cache value returned from hashtable when this condition has not yet been tested. This value is NULL, so that when the hash table returns NULL, this wil be seen as an untested condition. */ #define CC_NOT_TESTED 0 /** Condition cache value returned from hashtable when the condition is met. This can be any value, that is a valid pointer, and that is different from CC_NOT_TESTED and CC_FALSE. */ #define CC_TRUE L"true" /** Condition cache value returned from hashtable when the condition is not met. This can be any value, that is a valid pointer, and that is different from CC_NOT_TESTED and CC_TRUE. */ #define CC_FALSE L"false" /** The special cased translation macro for completions. The empty string needs to be special cased, since it can occur, and should not be translated. (Gettext returns the version information as the response) */ #ifdef USE_GETTEXT #define C_(wstr) ((wcscmp(wstr, L"")==0)?L"":wgettext(wstr)) #else #define C_(string) (string) #endif /* Testing apparatus */ const wcstring_list_t *s_override_variable_names = NULL; void complete_set_variable_names(const wcstring_list_t *names) { s_override_variable_names = names; } static inline wcstring_list_t complete_get_variable_names(void) { if (s_override_variable_names != NULL) { return *s_override_variable_names; } else { return env_get_names(0); } } /** Struct describing a completion option entry. If short_opt and long_opt are both zero, the comp field must not be empty and contains a list of arguments to the command. If either short_opt or long_opt are non-zero, they specify a switch for the command. If \c comp is also not empty, it contains a list of non-switch arguments that may only follow directly after the specified switch. */ typedef struct complete_entry_opt { /** Short style option */ wchar_t short_opt; /** Long style option */ wcstring long_opt; /** Arguments to the option */ wcstring comp; /** Description of the completion */ wcstring desc; /** Condition under which to use the option */ wcstring condition; /** Must be one of the values SHARED, NO_FILES, NO_COMMON, EXCLUSIVE, and determines how completions should be performed on the argument after the switch. */ int result_mode; /** True if old style long options are used */ int old_mode; /** Completion flags */ complete_flags_t flags; const wchar_t *localized_desc() const { const wchar_t *tmp = desc.c_str(); return C_(tmp); } } complete_entry_opt_t; /* Last value used in the order field of completion_entry_t */ static unsigned int kCompleteOrder = 0; /** Struct describing a command completion */ typedef std::list option_list_t; class completion_entry_t { public: /** List of all options */ option_list_t options; /** String containing all short option characters */ wcstring short_opt_str; public: /** Command string */ const wcstring cmd; /** True if command is a path */ const bool cmd_is_path; /** True if no other options than the ones supplied are possible */ bool authoritative; /** Order for when this completion was created. This aids in outputting completions sorted by time. */ const unsigned int order; /** Getters for option list. */ const option_list_t &get_options() const; /** Adds or removes an option. */ void add_option(const complete_entry_opt_t &opt); bool remove_option(wchar_t short_opt, const wchar_t *long_opt); /** Getter for short_opt_str. */ wcstring &get_short_opt_str(); const wcstring &get_short_opt_str() const; completion_entry_t(const wcstring &c, bool type, const wcstring &options, bool author) : short_opt_str(options), cmd(c), cmd_is_path(type), authoritative(author), order(++kCompleteOrder) { } }; /** Set of all completion entries */ struct completion_entry_set_comparer { /** Comparison for std::set */ bool operator()(completion_entry_t *p1, completion_entry_t *p2) const { /* Paths always come last for no particular reason */ if (p1->cmd_is_path != p2->cmd_is_path) { return p1->cmd_is_path < p2->cmd_is_path; } else { return p1->cmd < p2->cmd; } } }; typedef std::set completion_entry_set_t; static completion_entry_set_t completion_set; // Comparison function to sort completions by their order field static bool compare_completions_by_order(const completion_entry_t *p1, const completion_entry_t *p2) { return p1->order < p2->order; } /** The lock that guards the list of completion entries */ static pthread_mutex_t completion_lock = PTHREAD_MUTEX_INITIALIZER; /** * The lock that guards the options list of individual completion entries. * If both completion_lock and completion_entry_lock are to be taken, * completion_lock must be taken first. */ static pthread_mutex_t completion_entry_lock = PTHREAD_MUTEX_INITIALIZER; void completion_entry_t::add_option(const complete_entry_opt_t &opt) { ASSERT_IS_LOCKED(completion_entry_lock); options.push_front(opt); } const option_list_t &completion_entry_t::get_options() const { ASSERT_IS_LOCKED(completion_entry_lock); return options; } wcstring &completion_entry_t::get_short_opt_str() { ASSERT_IS_LOCKED(completion_entry_lock); return short_opt_str; } const wcstring &completion_entry_t::get_short_opt_str() const { ASSERT_IS_LOCKED(completion_entry_lock); return short_opt_str; } completion_t::~completion_t() { } /* completion_t functions */ completion_t::completion_t(const wcstring &comp, const wcstring &desc, int flags_val) : completion(comp), description(desc), flags(flags_val) { if (flags & COMPLETE_AUTO_SPACE) { flags = flags & ~COMPLETE_AUTO_SPACE; size_t len = completion.size(); if (len > 0 && (wcschr(L"/=@:", comp.at(len-1)) != 0)) flags |= COMPLETE_NO_SPACE; } } completion_t::completion_t(const completion_t &him) : completion(him.completion), description(him.description), flags(him.flags) { } completion_t &completion_t::operator=(const completion_t &him) { if (this != &him) { this->completion = him.completion; this->description = him.description; this->flags = him.flags; } return *this; } bool completion_t::operator < (const completion_t& rhs) const { return this->completion < rhs.completion; } bool completion_t::operator == (const completion_t& rhs) const { return this->completion == rhs.completion; } bool completion_t::operator != (const completion_t& rhs) const { return !(*this == rhs); } wcstring_list_t completions_to_wcstring_list(const std::vector &list) { wcstring_list_t strings; strings.reserve(list.size()); for (std::vector::const_iterator iter = list.begin(); iter != list.end(); ++iter) { strings.push_back(iter->completion); } return strings; } void sort_completions(std::vector &completions) { std::sort(completions.begin(), completions.end()); } /** Class representing an attempt to compute completions */ class completer_t { const completion_request_flags_t flags; const wcstring initial_cmd; std::vector completions; wcstring_list_t commands_to_load; /** Table of completions conditions that have already been tested and the corresponding test results */ typedef std::map condition_cache_t; condition_cache_t condition_cache; enum complete_type_t { COMPLETE_DEFAULT, COMPLETE_AUTOSUGGEST }; complete_type_t type() const { return (flags & COMPLETION_REQUEST_AUTOSUGGESTION) ? COMPLETE_AUTOSUGGEST : COMPLETE_DEFAULT; } bool wants_descriptions() const { return !!(flags & COMPLETION_REQUEST_DESCRIPTIONS); } bool fuzzy() const { return !!(flags & COMPLETION_REQUEST_FUZZY_MATCH); } public: completer_t(const wcstring &c, completion_request_flags_t f) : flags(f), initial_cmd(c) { } bool empty() const { return completions.empty(); } const std::vector &get_completions(void) { return completions; } bool try_complete_variable(const wcstring &str); bool try_complete_user(const wcstring &str); bool complete_param(const wcstring &cmd_orig, const wcstring &popt, const wcstring &str, bool use_switches); void complete_param_expand(const wcstring &str, bool do_file); void debug_print_completions(); void complete_cmd(const wcstring &str, bool use_function, bool use_builtin, bool use_command); void complete_from_args(const wcstring &str, const wcstring &args, const wcstring &desc, complete_flags_t flags); void complete_cmd_desc(const wcstring &str); bool complete_variable(const wcstring &str, size_t start_offset); bool condition_test(const wcstring &condition); void complete_strings(const wcstring &wc_escaped, const wchar_t *desc, wcstring(*desc_func)(const wcstring &), std::vector &possible_comp, complete_flags_t flags); expand_flags_t expand_flags() const { /* Never do command substitution in autosuggestions. Sadly, we also can't yet do job expansion because it's not thread safe. */ expand_flags_t result = 0; if (this->type() == COMPLETE_AUTOSUGGEST) result |= EXPAND_SKIP_CMDSUBST | EXPAND_SKIP_JOBS; return result; } void get_commands_to_load(wcstring_list_t *lst) { if (lst) lst->insert(lst->end(), commands_to_load.begin(), commands_to_load.end()); } bool has_commands_to_load() const { return ! commands_to_load.empty(); } }; /* Autoloader for completions */ class completion_autoload_t : public autoload_t { public: completion_autoload_t(); virtual void command_removed(const wcstring &cmd); }; static completion_autoload_t completion_autoloader; /** Constructor */ completion_autoload_t::completion_autoload_t() : autoload_t(L"fish_complete_path", NULL, 0) { } /** Callback when an autoloaded completion is removed */ void completion_autoload_t::command_removed(const wcstring &cmd) { complete_remove(cmd.c_str(), COMMAND, 0, 0); } /** Create a new completion entry */ void append_completion(std::vector &completions, const wcstring &comp, const wcstring &desc, complete_flags_t flags) { completions.push_back(completion_t(comp, desc, flags)); } /** Test if the specified script returns zero. The result is cached, so that if multiple completions use the same condition, it needs only be evaluated once. condition_cache_clear must be called after a completion run to make sure that there are no stale completions. */ bool completer_t::condition_test(const wcstring &condition) { if (condition.empty()) { // fwprintf( stderr, L"No condition specified\n" ); return 1; } if (this->type() == COMPLETE_AUTOSUGGEST) { /* Autosuggestion can't support conditions */ return 0; } ASSERT_IS_MAIN_THREAD(); bool test_res; condition_cache_t::iterator cached_entry = condition_cache.find(condition); if (cached_entry == condition_cache.end()) { /* Compute new value and reinsert it */ test_res = (0 == exec_subshell(condition, false /* don't apply exit status */)); condition_cache[condition] = test_res; } else { /* Use the old value */ test_res = cached_entry->second; } return test_res; } /** Search for an exactly matching completion entry. Must be called while locked. */ static completion_entry_t *complete_find_exact_entry(const wcstring &cmd, const bool cmd_is_path) { ASSERT_IS_LOCKED(completion_lock); completion_entry_t *result = NULL; completion_entry_t tmp_entry(cmd, cmd_is_path, L"", false); completion_entry_set_t::iterator iter = completion_set.find(&tmp_entry); if (iter != completion_set.end()) { result = *iter; } return result; } /** Locate the specified entry. Create it if it doesn't exist. Must be called while locked. */ static completion_entry_t *complete_get_exact_entry(const wcstring &cmd, bool cmd_is_path) { ASSERT_IS_LOCKED(completion_lock); completion_entry_t *c; c = complete_find_exact_entry(cmd, cmd_is_path); if (c == NULL) { c = new completion_entry_t(cmd, cmd_is_path, L"", false); completion_set.insert(c); } return c; } void complete_set_authoritative(const wchar_t *cmd, bool cmd_is_path, bool authoritative) { completion_entry_t *c; CHECK(cmd,); scoped_lock lock(completion_lock); c = complete_get_exact_entry(cmd, cmd_is_path); c->authoritative = authoritative; } void complete_add(const wchar_t *cmd, bool cmd_is_path, wchar_t short_opt, const wchar_t *long_opt, int old_mode, int result_mode, const wchar_t *condition, const wchar_t *comp, const wchar_t *desc, complete_flags_t flags) { CHECK(cmd,); /* Lock the lock that allows us to edit the completion entry list */ scoped_lock lock(completion_lock); /* Lock the lock that allows us to edit individual completion entries */ scoped_lock lock2(completion_entry_lock); completion_entry_t *c; c = complete_get_exact_entry(cmd, cmd_is_path); /* Create our new option */ complete_entry_opt_t opt; if (short_opt != L'\0') { int len = 1 + ((result_mode & NO_COMMON) != 0); c->get_short_opt_str().push_back(short_opt); if (len == 2) { c->get_short_opt_str().push_back(L':'); } } opt.short_opt = short_opt; opt.result_mode = result_mode; opt.old_mode=old_mode; if (comp) opt.comp = comp; if (condition) opt.condition = condition; if (long_opt) opt.long_opt = long_opt; if (desc) opt.desc = desc; opt.flags = flags; c->add_option(opt); } /** Remove all completion options in the specified entry that match the specified short / long option strings. Returns true if it is now empty and should be deleted, false if it's not empty. Must be called while locked. */ bool completion_entry_t::remove_option(wchar_t short_opt, const wchar_t *long_opt) { ASSERT_IS_LOCKED(completion_lock); ASSERT_IS_LOCKED(completion_entry_lock); if ((short_opt == 0) && (long_opt == 0)) { this->options.clear(); } else { for (option_list_t::iterator iter = this->options.begin(); iter != this->options.end();) { complete_entry_opt_t &o = *iter; if (short_opt==o.short_opt || long_opt == o.long_opt) { /* fwprintf( stderr, L"remove option -%lc --%ls\n", o->short_opt?o->short_opt:L' ', o->long_opt ); */ if (o.short_opt) { wcstring &short_opt_str = this->get_short_opt_str(); size_t idx = short_opt_str.find(o.short_opt); if (idx != wcstring::npos) { /* Consume all colons */ size_t first_non_colon = idx + 1; while (first_non_colon < short_opt_str.size() && short_opt_str.at(first_non_colon) == L':') first_non_colon++; short_opt_str.erase(idx, first_non_colon - idx); } } /* Destroy this option and go to the next one */ iter = this->options.erase(iter); } else { /* Just go to the next one */ ++iter; } } } return this->options.empty(); } void complete_remove(const wchar_t *cmd, bool cmd_is_path, wchar_t short_opt, const wchar_t *long_opt) { CHECK(cmd,); scoped_lock lock(completion_lock); scoped_lock lock2(completion_entry_lock); completion_entry_t tmp_entry(cmd, cmd_is_path, L"", false); completion_entry_set_t::iterator iter = completion_set.find(&tmp_entry); if (iter != completion_set.end()) { completion_entry_t *entry = *iter; bool delete_it = entry->remove_option(short_opt, long_opt); if (delete_it) { /* Delete this entry */ completion_set.erase(iter); delete entry; } } } /* Formats an error string by prepending the prefix and then appending the str in single quotes */ static wcstring format_error(const wchar_t *prefix, const wcstring &str) { wcstring result = prefix; result.push_back(L'\''); result.append(str); result.push_back(L'\''); return result; } /** Find the full path and commandname from a command string 'str'. */ static void parse_cmd_string(const wcstring &str, wcstring &path, wcstring &cmd) { if (! path_get_path(str, &path)) { /** Use the empty string as the 'path' for commands that can not be found. */ path = L""; } /* Make sure the path is not included in the command */ size_t last_slash = str.find_last_of(L'/'); if (last_slash != wcstring::npos) { cmd = str.substr(last_slash + 1); } else { cmd = str; } } int complete_is_valid_option(const wcstring &str, const wcstring &opt, wcstring_list_t *errors, bool allow_autoload) { wcstring cmd, path; bool found_match = false; bool authoritative = true; int opt_found=0; std::set gnu_match_set; bool is_gnu_opt=false; bool is_old_opt=false; bool is_short_opt=false; bool is_gnu_exact=false; size_t gnu_opt_len=0; if (opt.empty()) return false; std::vector short_validated; /* Check some generic things like -- and - options. */ switch (opt.size()) { case 0: case 1: { return true; } case 2: { if (opt == L"--") { return true; } break; } } if (opt.at(0) != L'-') { if (errors) errors->push_back(L"Option does not begin with a '-'"); return false; } short_validated.resize(opt.size(), 0); is_gnu_opt = opt.at(1) == L'-'; if (is_gnu_opt) { size_t opt_end = opt.find(L'='); if (opt_end != wcstring::npos) { gnu_opt_len = opt_end-2; } else { gnu_opt_len = opt.size() - 2; } } parse_cmd_string(str, path, cmd); /* Make sure completions are loaded for the specified command */ if (allow_autoload) { complete_load(cmd, false); } scoped_lock lock(completion_lock); scoped_lock lock2(completion_entry_lock); for (completion_entry_set_t::const_iterator iter = completion_set.begin(); iter != completion_set.end(); ++iter) { const completion_entry_t *i = *iter; const wcstring &match = i->cmd_is_path ? path : cmd; if (!wildcard_match(match, i->cmd)) { continue; } found_match = true; if (! i->authoritative) { authoritative = false; break; } const option_list_t &options = i->get_options(); if (is_gnu_opt) { for (option_list_t::const_iterator iter = options.begin(); iter != options.end(); ++iter) { const complete_entry_opt_t &o = *iter; if (o.old_mode) { continue; } if (opt.compare(2, gnu_opt_len, o.long_opt) == 0) { gnu_match_set.insert(o.long_opt); if (opt.compare(2, o.long_opt.size(), o.long_opt)) { is_gnu_exact = true; } } } } else { /* Check for old style options */ for (option_list_t::const_iterator iter = options.begin(); iter != options.end(); ++iter) { const complete_entry_opt_t &o = *iter; if (!o.old_mode) continue; if (opt.compare(1, wcstring::npos, o.long_opt)==0) { opt_found = true; is_old_opt = true; break; } } if (is_old_opt) break; for (size_t opt_idx = 1; opt_idx < opt.size(); opt_idx++) { const wcstring &short_opt_str = i->get_short_opt_str(); size_t str_idx = short_opt_str.find(opt.at(opt_idx)); if (str_idx != wcstring::npos) { if (str_idx + 1 < short_opt_str.size() && short_opt_str.at(str_idx + 1) == L':') { /* This is a short option with an embedded argument, call complete_is_valid_argument on the argument. */ const wcstring nopt = L"-" + opt.substr(1, 1); short_validated.at(opt_idx) = complete_is_valid_argument(str, nopt, opt.substr(2)); } else { short_validated.at(opt_idx) = true; } } } } } if (authoritative) { if (!is_gnu_opt && !is_old_opt) is_short_opt = 1; if (is_short_opt) { opt_found=1; for (size_t j=1; jpush_back(format_error(_(L"Unknown option: "), str)); } opt_found = 0; break; } } } if (is_gnu_opt) { opt_found = is_gnu_exact || (gnu_match_set.size() == 1); if (errors && !opt_found) { const wchar_t *prefix; if (gnu_match_set.empty()) { prefix = _(L"Unknown option: "); } else { prefix = _(L"Multiple matches for option: "); } errors->push_back(format_error(prefix, opt)); } } } return (authoritative && found_match)?opt_found:true; } bool complete_is_valid_argument(const wcstring &str, const wcstring &opt, const wcstring &arg) { return true; } /** Copy any strings in possible_comp which have the specified prefix to the completer's completion array. The prefix may contain wildcards. The output will consist of completion_t structs. There are three ways to specify descriptions for each completion. Firstly, if a description has already been added to the completion, it is _not_ replaced. Secondly, if the desc_func function is specified, use it to determine a dynamic completion. Thirdly, if none of the above are available, the desc string is used as a description. \param wc_escaped the prefix, possibly containing wildcards. The wildcard should not have been unescaped, i.e. '*' should be used for any string, not the ANY_STRING character. \param desc the default description, used for completions with no embedded description. The description _may_ contain a COMPLETE_SEP character, if not, one will be prefixed to it \param desc_func the function that generates a description for those completions witout an embedded description \param possible_comp the list of possible completions to iterate over */ void completer_t::complete_strings(const wcstring &wc_escaped, const wchar_t *desc, wcstring(*desc_func)(const wcstring &), std::vector &possible_comp, complete_flags_t flags) { wcstring tmp = wc_escaped; if (! expand_one(tmp, EXPAND_SKIP_CMDSUBST | EXPAND_SKIP_WILDCARDS | this->expand_flags())) return; const wchar_t *wc = parse_util_unescape_wildcards(tmp.c_str()); for (size_t i=0; i< possible_comp.size(); i++) { wcstring temp = possible_comp.at(i).completion; const wchar_t *next_str = temp.empty()?NULL:temp.c_str(); if (next_str) { wildcard_complete(next_str, wc, desc, desc_func, this->completions, flags); } } free((void *)wc); } /** If command to complete is short enough, substitute the description with the whatis information for the executable. */ void completer_t::complete_cmd_desc(const wcstring &str) { ASSERT_IS_MAIN_THREAD(); const wchar_t *cmd_start; int skip; const wchar_t * const cmd = str.c_str(); cmd_start=wcsrchr(cmd, L'/'); if (cmd_start) cmd_start++; else cmd_start = cmd; /* Using apropos with a single-character search term produces far to many results - require at least two characters if we don't know the location of the whatis-database. */ if (wcslen(cmd_start) < 2) return; if (wildcard_has(cmd_start, 0)) { return; } skip = 1; for (size_t i=0; i< this->completions.size(); i++) { const completion_t &c = this->completions.at(i); if (c.completion.empty() || (c.completion[c.completion.size()-1] != L'/')) { skip = 0; break; } } if (skip) { return; } wcstring lookup_cmd(L"__fish_describe_command "); lookup_cmd.append(escape_string(cmd_start, 1)); std::map lookup; /* First locate a list of possible descriptions using a single call to apropos or a direct search if we know the location of the whatis database. This can take some time on slower systems with a large set of manuals, but it should be ok since apropos is only called once. */ wcstring_list_t list; if (exec_subshell(lookup_cmd, list, false /* don't apply exit status */) != -1) { /* Then discard anything that is not a possible completion and put the result into a hashtable with the completion as key and the description as value. Should be reasonably fast, since no memory allocations are needed. */ for (size_t i=0; i < list.size(); i++) { const wcstring &elstr = list.at(i); const wcstring fullkey(elstr, wcslen(cmd_start)); size_t tab_idx = fullkey.find(L'\t'); if (tab_idx == wcstring::npos) continue; const wcstring key(fullkey, 0, tab_idx); wcstring val(fullkey, tab_idx + 1); /* And once again I make sure the first character is uppercased because I like it that way, and I get to decide these things. */ if (! val.empty()) val[0]=towupper(val[0]); lookup[key] = val; } /* Then do a lookup on every completion and if a match is found, change to the new description. This needs to do a reallocation for every description added, but there shouldn't be that many completions, so it should be ok. */ for (size_t i=0; icompletions.size(); i++) { completion_t &completion = this->completions.at(i); const wcstring &el = completion.completion; if (el.empty()) continue; std::map::iterator new_desc_iter = lookup.find(el); if (new_desc_iter != lookup.end()) completion.description = new_desc_iter->second; } } } /** Returns a description for the specified function, or an empty string if none */ static wcstring complete_function_desc(const wcstring &fn) { wcstring result; bool has_description = function_get_desc(fn, &result); if (! has_description) { function_get_definition(fn, &result); } return result; } /** Complete the specified command name. Search for executables in the path, executables defined using an absolute path, functions, builtins and directories for implicit cd commands. \param cmd the command string to find completions for \param comp the list to add all completions to */ void completer_t::complete_cmd(const wcstring &str_cmd, bool use_function, bool use_builtin, bool use_command) { /* Paranoia */ if (str_cmd.empty()) return; std::vector possible_comp; env_var_t cdpath = env_get_string(L"CDPATH"); if (cdpath.missing_or_empty()) cdpath = L"."; if (str_cmd.find(L'/') != wcstring::npos || str_cmd.at(0) == L'~') { if (use_command) { if (expand_string(str_cmd, this->completions, ACCEPT_INCOMPLETE | EXECUTABLES_ONLY | this->expand_flags()) != EXPAND_ERROR) { if (this->wants_descriptions()) { this->complete_cmd_desc(str_cmd); } } } } else { if (use_command) { const env_var_t path = env_get_string(L"PATH"); if (!path.missing()) { wcstring base_path; wcstokenizer tokenizer(path, ARRAY_SEP_STR); while (tokenizer.next(base_path)) { if (base_path.empty()) continue; /* Make sure the base path ends with a slash */ if (base_path.at(base_path.size() - 1) != L'/') base_path.push_back(L'/'); wcstring nxt_completion = base_path; nxt_completion.append(str_cmd); size_t prev_count = this->completions.size(); if (expand_string(nxt_completion, this->completions, ACCEPT_INCOMPLETE | EXECUTABLES_ONLY | this->expand_flags()) != EXPAND_ERROR) { /* For all new completions, if COMPLETE_NO_CASE is set, then use only the last path component */ for (size_t i=prev_count; i< this->completions.size(); i++) { completion_t &c = this->completions.at(i); if (c.flags & COMPLETE_REPLACES_TOKEN) { c.completion.erase(0, base_path.size()); } } } } if (this->wants_descriptions()) this->complete_cmd_desc(str_cmd); } } /* These return the original strings - don't free them */ if (use_function) { //function_get_names( &possible_comp, cmd[0] == L'_' ); wcstring_list_t names = function_get_names(str_cmd.at(0) == L'_'); for (size_t i=0; i < names.size(); i++) { possible_comp.push_back(completion_t(names.at(i))); } this->complete_strings(str_cmd, 0, &complete_function_desc, possible_comp, 0); } possible_comp.clear(); if (use_builtin) { builtin_get_names(possible_comp); this->complete_strings(str_cmd, 0, &builtin_get_desc, possible_comp, 0); } } } /** Evaluate the argument list (as supplied by complete -a) and insert any return matching completions. Matching is done using \c copy_strings_with_prefix, meaning the completion may contain wildcards. Logically, this is not always the right thing to do, but I have yet to come up with a case where this matters. \param str The string to complete. \param args The list of option arguments to be evaluated. \param desc Description of the completion \param comp_out The list into which the results will be inserted */ void completer_t::complete_from_args(const wcstring &str, const wcstring &args, const wcstring &desc, complete_flags_t flags) { std::vector possible_comp; bool is_autosuggest = (this->type() == COMPLETE_AUTOSUGGEST); parser_t parser(is_autosuggest ? PARSER_TYPE_COMPLETIONS_ONLY : PARSER_TYPE_GENERAL, false); /* If type is COMPLETE_AUTOSUGGEST, it means we're on a background thread, so don't call proc_push_interactive */ if (! is_autosuggest) proc_push_interactive(0); parser.eval_args(args.c_str(), possible_comp); if (! is_autosuggest) proc_pop_interactive(); this->complete_strings(str, desc.c_str(), 0, possible_comp, flags); } /** Match against an old style long option */ static int param_match_old(const complete_entry_opt_t *e, const wchar_t *optstr) { return (optstr[0] == L'-') && (e->long_opt == &optstr[1]); } /** Match a parameter */ static int param_match(const complete_entry_opt_t *e, const wchar_t *optstr) { if (e->short_opt != L'\0' && e->short_opt == optstr[1]) return 1; if (!e->old_mode && (wcsncmp(L"--", optstr, 2) == 0)) { if (e->long_opt == &optstr[2]) { return 1; } } return 0; } /** Test if a string is an option with an argument, like --color=auto or -I/usr/include */ static wchar_t *param_match2(const complete_entry_opt_t *e, const wchar_t *optstr) { if (e->short_opt != L'\0' && e->short_opt == optstr[1]) return (wchar_t *)&optstr[2]; if (!e->old_mode && (wcsncmp(L"--", optstr, 2) == 0)) { size_t len = e->long_opt.size(); if (wcsncmp(e->long_opt.c_str(), &optstr[2],len) == 0) { if (optstr[len+2] == L'=') return (wchar_t *)&optstr[len+3]; } } return 0; } /** Tests whether a short option is a viable completion */ static int short_ok(const wcstring &arg_str, wchar_t nextopt, const wcstring &allopt_str) { const wchar_t *arg = arg_str.c_str(); const wchar_t *allopt = allopt_str.c_str(); const wchar_t *ptr; if (arg[0] != L'-') return arg[0] == L'\0'; if (arg[1] == L'-') return 0; if (wcschr(arg, nextopt) != 0) return 0; for (ptr = arg+1; *ptr; ptr++) { const wchar_t *tmp = wcschr(allopt, *ptr); /* Unknown option */ if (tmp == 0) { /*fwprintf( stderr, L"Unknown option %lc", *ptr );*/ return 0; } if (*(tmp+1) == L':') { /* fwprintf( stderr, L"Woot %ls", allopt );*/ return 0; } } return 1; } void complete_load(const wcstring &name, bool reload) { completion_autoloader.load(name, reload); } /** Find completion for the argument str of command cmd_orig with previous option popt. Insert results into comp_out. Return 0 if file completion should be disabled, 1 otherwise. */ struct local_options_t { wcstring short_opt_str; option_list_t options; }; bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spopt, const wcstring &sstr, bool use_switches) { const wchar_t * const cmd_orig = scmd_orig.c_str(), * const popt = spopt.c_str(), * const str = sstr.c_str(); bool use_common=1, use_files=1; wcstring cmd, path; parse_cmd_string(cmd_orig, path, cmd); if (this->type() == COMPLETE_DEFAULT) { complete_load(cmd, true); } else if (this->type() == COMPLETE_AUTOSUGGEST) { /* Maybe indicate we should try loading this on the main thread */ if (! list_contains_string(this->commands_to_load, cmd) && ! completion_autoloader.has_tried_loading(cmd)) { this->commands_to_load.push_back(cmd); } } /* Make a list of lists of all options that we care about */ std::vector all_options; { scoped_lock lock(completion_lock); scoped_lock lock2(completion_entry_lock); for (completion_entry_set_t::const_iterator iter = completion_set.begin(); iter != completion_set.end(); ++iter) { const completion_entry_t *i = *iter; const wcstring &match = i->cmd_is_path ? path : cmd; if (! wildcard_match(match, i->cmd)) { continue; } /* Copy all of their options into our list */ all_options.push_back(local_options_t()); all_options.back().short_opt_str = i->get_short_opt_str(); all_options.back().options = i->get_options(); //Oof, this is a lot of copying } } /* Now release the lock and test each option that we captured above. We have to do this outside the lock because callouts (like the condition) may add or remove completions. See https://github.com/ridiculousfish/fishfish/issues/2 */ for (std::vector::const_iterator iter = all_options.begin(); iter != all_options.end(); ++iter) { const option_list_t &options = iter->options; use_common=1; if (use_switches) { if (str[0] == L'-') { /* Check if we are entering a combined option and argument (like --color=auto or -I/usr/include) */ for (option_list_t::const_iterator oiter = options.begin(); oiter != options.end(); ++oiter) { const complete_entry_opt_t *o = &*oiter; wchar_t *arg; if ((arg=param_match2(o, str))!=0 && this->condition_test(o->condition)) { if (o->result_mode & NO_COMMON) use_common = false; if (o->result_mode & NO_FILES) use_files = false; complete_from_args(arg, o->comp, o->localized_desc(), o->flags); } } } else if (popt[0] == L'-') { /* Set to true if we found a matching old-style switch */ int old_style_match = 0; /* If we are using old style long options, check for them first */ for (option_list_t::const_iterator oiter = options.begin(); oiter != options.end(); ++oiter) { const complete_entry_opt_t *o = &*oiter; if (o->old_mode) { if (param_match_old(o, popt) && this->condition_test(o->condition)) { old_style_match = 1; if (o->result_mode & NO_COMMON) use_common = false; if (o->result_mode & NO_FILES) use_files = false; complete_from_args(str, o->comp, o->localized_desc(), o->flags); } } } /* No old style option matched, or we are not using old style options. We check if any short (or gnu style options do. */ if (!old_style_match) { for (option_list_t::const_iterator oiter = options.begin(); oiter != options.end(); ++oiter) { const complete_entry_opt_t *o = &*oiter; /* Gnu-style options with _optional_ arguments must be specified as a single token, so that it can be differed from a regular argument. */ if (!o->old_mode && ! o->long_opt.empty() && !(o->result_mode & NO_COMMON)) continue; if (param_match(o, popt) && this->condition_test(o->condition)) { if (o->result_mode & NO_COMMON) use_common = false; if (o->result_mode & NO_FILES) use_files = false; complete_from_args(str, o->comp.c_str(), o->localized_desc(), o->flags); } } } } } if (use_common) { for (option_list_t::const_iterator oiter = options.begin(); oiter != options.end(); ++oiter) { const complete_entry_opt_t *o = &*oiter; /* If this entry is for the base command, check if any of the arguments match */ if (!this->condition_test(o->condition)) continue; if ((o->short_opt == L'\0') && (o->long_opt[0]==L'\0')) { use_files &= ((o->result_mode & NO_FILES)==0); complete_from_args(str, o->comp, o->localized_desc(), o->flags); } if (wcslen(str) > 0 && use_switches) { /* Check if the short style option matches */ if (o->short_opt != L'\0' && short_ok(str, o->short_opt, iter->short_opt_str)) { const wchar_t *desc = o->localized_desc(); wchar_t completion[2]; completion[0] = o->short_opt; completion[1] = 0; append_completion(this->completions, completion, desc, 0); } /* Check if the long style option matches */ if (o->long_opt[0] != L'\0') { int match=0, match_no_case=0; wcstring whole_opt; whole_opt.append(o->old_mode?L"-":L"--"); whole_opt.append(o->long_opt); match = string_prefixes_string(str, whole_opt); if (!match) { match_no_case = wcsncasecmp(str, whole_opt.c_str(), wcslen(str))==0; } if (match || match_no_case) { int has_arg=0; /* Does this switch have any known arguments */ int req_arg=0; /* Does this switch _require_ an argument */ size_t offset = 0; complete_flags_t flags = 0; if (match) { offset = wcslen(str); } else { flags = COMPLETE_REPLACES_TOKEN | COMPLETE_CASE_INSENSITIVE; } has_arg = ! o->comp.empty(); req_arg = (o->result_mode & NO_COMMON); if (!o->old_mode && (has_arg && !req_arg)) { /* Optional arguments to a switch can only be handled using the '=', so we add it as a completion. By default we avoid using '=' and instead rely on '--switch switch-arg', since it is more commonly supported by homebrew getopt-like functions. */ wcstring completion = format_string(L"%ls=", whole_opt.c_str()+offset); append_completion(this->completions, completion, C_(o->desc.c_str()), flags); } append_completion(this->completions, whole_opt.c_str() + offset, C_(o->desc.c_str()), flags); } } } } } } return use_files; } /** Perform file completion on the specified string */ void completer_t::complete_param_expand(const wcstring &sstr, bool do_file) { const wchar_t * const str = sstr.c_str(); const wchar_t *comp_str; if (string_prefixes_string(L"--", sstr) && (comp_str = wcschr(str, L'='))) { comp_str++; } else { comp_str = str; } expand_flags_t flags = EXPAND_SKIP_CMDSUBST | ACCEPT_INCOMPLETE; if (! do_file) flags |= EXPAND_SKIP_WILDCARDS; /* Squelch file descriptions per issue 254 */ if (this->type() == COMPLETE_AUTOSUGGEST || do_file) flags |= EXPAND_NO_DESCRIPTIONS; if (expand_string(comp_str, this->completions, flags | this->expand_flags()) == EXPAND_ERROR) { debug(3, L"Error while expanding string '%ls'", comp_str); } } void completer_t::debug_print_completions() { for (size_t i=0; i < completions.size(); i++) { printf("- Completion: %ls\n", completions.at(i).completion.c_str()); } } /** Complete the specified string as an environment variable */ bool completer_t::complete_variable(const wcstring &str, size_t start_offset) { const wchar_t * const whole_var = str.c_str(); const wchar_t *var = &whole_var[start_offset]; size_t varlen = wcslen(var); int res = 0; const wcstring_list_t names = complete_get_variable_names(); for (size_t i=0; i namelen) continue; match = string_prefixes_string(var, env_name); if (!match) { match_no_case = (wcsncasecmp(var, env_name.c_str(), varlen) == 0); } if (match || match_no_case) { wcstring comp; int flags = 0; if (match) { comp.append(env_name.c_str() + varlen); } else { comp.append(whole_var, start_offset); comp.append(env_name); flags = COMPLETE_CASE_INSENSITIVE | COMPLETE_REPLACES_TOKEN | COMPLETE_DONT_ESCAPE; } wcstring desc; if (this->wants_descriptions()) { env_var_t value_unescaped = env_get_string(env_name); if (value_unescaped.missing()) continue; wcstring value = expand_escape_variable(value_unescaped); if (this->type() != COMPLETE_AUTOSUGGEST) desc = format_string(COMPLETE_VAR_DESC_VAL, value.c_str()); } append_completion(this->completions, comp.c_str(), desc.c_str(), flags); res =1; } } return res; } /** Search the specified string for the \$ sign. If found, try to complete as an environment variable. \return 0 if unable to complete, 1 otherwise */ bool completer_t::try_complete_variable(const wcstring &str) { size_t i = str.size(); while (i--) { wchar_t c = str.at(i); if (c == L'$') { /* wprintf( L"Var prefix \'%ls\'\n", &cmd[i+1] );*/ return this->complete_variable(str, i+1); } if (!isalnum(c) && c != L'_') { return false; } } return false; } /** Try to complete the specified string as a username. This is used by ~USER type expansion. \return 0 if unable to complete, 1 otherwise */ bool completer_t::try_complete_user(const wcstring &str) { const wchar_t *cmd = str.c_str(); const wchar_t *first_char=cmd; int res=0; double start_time = timef(); if (*first_char ==L'~' && !wcschr(first_char, L'/')) { const wchar_t *user_name = first_char+1; const wchar_t *name_end = wcschr(user_name, L'~'); if (name_end == 0) { struct passwd *pw; size_t name_len = wcslen(user_name); setpwent(); while ((pw=getpwent()) != 0) { double current_time = timef(); if (current_time - start_time > 0.2) { return 1; } if (pw->pw_name) { const wcstring pw_name_str = str2wcstring(pw->pw_name); const wchar_t *pw_name = pw_name_str.c_str(); if (wcsncmp(user_name, pw_name, name_len)==0) { wcstring desc = format_string(COMPLETE_USER_DESC, pw_name); append_completion(this->completions, &pw_name[name_len], desc, COMPLETE_NO_SPACE); res=1; } else if (wcsncasecmp(user_name, pw_name, name_len)==0) { wcstring name = format_string(L"~%ls", pw_name); wcstring desc = format_string(COMPLETE_USER_DESC, pw_name); append_completion(this->completions, name, desc, COMPLETE_CASE_INSENSITIVE | COMPLETE_REPLACES_TOKEN | COMPLETE_DONT_ESCAPE | COMPLETE_NO_SPACE); res=1; } } } endpwent(); } } return res; } void complete(const wcstring &cmd, std::vector &comps, completion_request_flags_t flags, wcstring_list_t *commands_to_load) { /* Make our completer */ completer_t completer(cmd, flags); const wchar_t *tok_begin, *tok_end, *cmdsubst_begin, *cmdsubst_end, *prev_begin, *prev_end; wcstring current_token, prev_token; wcstring current_command; int on_command=0; size_t pos; bool done=false; int use_command = 1; int use_function = 1; int use_builtin = 1; int had_ddash = 0; // debug( 1, L"Complete '%ls'", cmd ); size_t cursor_pos = cmd.size(); const wchar_t *cmd_cstr = cmd.c_str(); parse_util_cmdsubst_extent(cmd_cstr, cursor_pos, &cmdsubst_begin, &cmdsubst_end); parse_util_token_extent(cmd_cstr, cursor_pos, &tok_begin, &tok_end, &prev_begin, &prev_end); if (!cmdsubst_begin) done=1; /** If we are completing a variable name or a tilde expansion user name, we do that and return. No need for any other completions. */ if (!done) { wcstring tmp = tok_begin; done = completer.try_complete_variable(tmp) || completer.try_complete_user(tmp); } if (!done) { pos = cursor_pos-(cmdsubst_begin-cmd_cstr); wcstring buff = wcstring(cmdsubst_begin, cmdsubst_end-cmdsubst_begin); int had_cmd=0; int end_loop=0; tokenizer_t tok(buff.c_str(), TOK_ACCEPT_UNFINISHED | TOK_SQUASH_ERRORS); while (tok_has_next(&tok) && !end_loop) { switch (tok_last_type(&tok)) { case TOK_STRING: { const wcstring ncmd = tok_last(&tok); int is_ddash = (ncmd == L"--") && ((tok_get_pos(&tok)+2) < (long)pos); if (!had_cmd) { if (parser_keywords_is_subcommand(ncmd)) { if (ncmd == L"builtin") { use_function = 0; use_command = 0; use_builtin = 1; } else if (ncmd == L"command") { use_command = 1; use_function = 0; use_builtin = 0; } break; } if (!is_ddash || ((use_command && use_function && use_builtin))) { current_command = ncmd; size_t token_end = tok_get_pos(&tok) + ncmd.size(); on_command = (pos <= token_end); had_cmd=1; } } else { if (is_ddash) { had_ddash = 1; } } break; } case TOK_END: case TOK_PIPE: case TOK_BACKGROUND: { had_cmd=0; had_ddash = 0; use_command = 1; use_function = 1; use_builtin = 1; break; } case TOK_ERROR: { end_loop=1; break; } } if (tok_get_pos(&tok) >= (long)pos) { end_loop=1; } tok_next(&tok); } /* Get the string to complete */ current_token.assign(tok_begin, cursor_pos-(tok_begin-cmd_cstr)); if (prev_begin) { prev_token.assign(prev_begin, prev_end - prev_begin); } else { prev_token.clear(); } // debug( 0, L"on_command: %d, %ls %ls\n", on_command, current_command, current_token ); /* Check if we are using the 'command' or 'builtin' builtins _and_ we are writing a switch instead of a command. In that case, complete using the builtins completions, not using a subcommand. */ if ((on_command || current_token == L"--") && string_prefixes_string(L"-", current_token) && !(use_command && use_function && use_builtin)) { if (use_command == 0) current_command = L"builtin"; else current_command = L"command"; had_cmd = 1; on_command = 0; } /* Use command completions if in between commands */ if (!had_cmd) { on_command=1; } if (on_command) { /* Complete command filename */ completer.complete_cmd(current_token, use_function, use_builtin, use_command); } else { bool do_file = false; wcstring current_command_unescape = current_command; wcstring prev_token_unescape = prev_token; wcstring current_token_unescape = current_token; if (unescape_string(current_command_unescape, 0) && unescape_string(prev_token_unescape, 0) && unescape_string(current_token_unescape, UNESCAPE_INCOMPLETE)) { do_file = completer.complete_param(current_command_unescape, prev_token_unescape, current_token_unescape, !had_ddash); } /* If we have found no command specific completions at all, fall back to using file completions. */ if (completer.empty()) do_file = true; /* But if we are planning on loading commands, don't do file completions. See https://github.com/fish-shell/fish-shell/issues/378 */ if (commands_to_load != NULL && completer.has_commands_to_load()) do_file = false; /* And if we're autosuggesting, and the token is empty, don't do file suggestions */ if ((flags & COMPLETION_REQUEST_AUTOSUGGESTION) && current_token_unescape.empty()) do_file = false; /* This function wants the unescaped string */ completer.complete_param_expand(current_token, do_file); } } comps = completer.get_completions(); completer.get_commands_to_load(commands_to_load); } /** Print the GNU longopt style switch \c opt, and the argument \c argument to the specified stringbuffer, but only if arguemnt is non-null and longer than 0 characters. */ static void append_switch(wcstring &out, const wcstring &opt, const wcstring &argument) { if (argument.empty()) return; wcstring esc = escape_string(argument, 1); append_format(out, L" --%ls %ls", opt.c_str(), esc.c_str()); } void complete_print(wcstring &out) { scoped_lock locker(completion_lock); scoped_lock locker2(completion_entry_lock); // Get a list of all completions in a vector, then sort it by order std::vector all_completions(completion_set.begin(), completion_set.end()); sort(all_completions.begin(), all_completions.end(), compare_completions_by_order); for (std::vector::const_iterator iter = all_completions.begin(); iter != all_completions.end(); ++iter) { const completion_entry_t *e = *iter; const option_list_t options = e->get_options(); for (option_list_t::const_iterator oiter = options.begin(); oiter != options.end(); ++oiter) { const complete_entry_opt_t *o = &*oiter; const wchar_t *modestr[] = { L"", L" --no-files", L" --require-parameter", L" --exclusive" } ; append_format(out, L"complete%ls", modestr[o->result_mode]); append_switch(out, e->cmd_is_path ? L"path" : L"command", e->cmd); if (o->short_opt != 0) { append_format(out, L" --short-option '%lc'", o->short_opt); } append_switch(out, o->old_mode?L"old-option":L"long-option", o->long_opt); append_switch(out, L"description", C_(o->desc.c_str())); append_switch(out, L"arguments", o->comp); append_switch(out, L"condition", o->condition); out.append(L"\n"); } } } fish/complete.h000066400000000000000000000213121214535744100137750ustar00rootroot00000000000000/** \file complete.h Prototypes for functions related to tab-completion. These functions are used for storing and retrieving tab-completion data, as well as for performing tab-completion. */ #ifndef FISH_COMPLETE_H /** Header guard */ #define FISH_COMPLETE_H #include #include "util.h" #include "common.h" /** * Use all completions */ #define SHARED 0 /** * Do not use file completion */ #define NO_FILES 1 /** * Require a parameter after completion */ #define NO_COMMON 2 /** * Only use the argument list specifies with completion after * option. This is the same as (NO_FILES & NO_COMMON) */ #define EXCLUSIVE 3 /** * Command is a path */ #define PATH 1 /** * Command is not a path */ #define COMMAND 0 /** * Separator between completion and description */ #define COMPLETE_SEP L'\004' /** * Separator between completion and description */ #define COMPLETE_SEP_STR L"\004" /** * Separator between completion items in fish_pager. This is used for * completion grouping, e.g. when putting completions with the same * descriptions on the same line. */ #define COMPLETE_ITEM_SEP L'\uf500' /** * Character that separates the completion and description on * programmable completions */ #define PROG_COMPLETE_SEP L'\t' enum { /** Do not insert space afterwards if this is the only completion. (The default is to try insert a space) */ COMPLETE_NO_SPACE = 1 << 0, /** This completion is case insensitive. */ COMPLETE_CASE_INSENSITIVE = 1 << 1, /** This is not the suffix of a token, but replaces it entirely */ COMPLETE_REPLACES_TOKEN = 1 << 2, /** This completion may or may not want a space at the end - guess by checking the last character of the completion. */ COMPLETE_AUTO_SPACE = 1 << 3, /** This completion should be inserted as-is, without escaping. */ COMPLETE_DONT_ESCAPE = 1 << 4, /** If you do escape, don't escape tildes */ COMPLETE_DONT_ESCAPE_TILDES = 1 << 5 }; typedef int complete_flags_t; class completion_t { private: /* No public default constructor */ completion_t(); public: /* Destructor. Not inlining it saves code size. */ ~completion_t(); /** The completion string */ wcstring completion; /** The description for this completion */ wcstring description; /** Flags determining the completion behaviour. Determines whether a space should be inserted after this completion if it is the only possible completion using the COMPLETE_NO_SPACE flag. The COMPLETE_NO_CASE can be used to signal that this completion is case insensitive. */ int flags; bool is_case_insensitive() const { return !!(flags & COMPLETE_CASE_INSENSITIVE); } /* Construction. Note: defining these so that they are not inlined reduces the executable size. */ completion_t(const wcstring &comp, const wcstring &desc = L"", int flags_val = 0); completion_t(const completion_t &); completion_t &operator=(const completion_t &); /* The following are needed for sorting and uniquing completions */ bool operator < (const completion_t& rhs) const; bool operator == (const completion_t& rhs) const; bool operator != (const completion_t& rhs) const; }; enum { COMPLETION_REQUEST_DEFAULT = 0, COMPLETION_REQUEST_AUTOSUGGESTION = 1 << 0, // indicates the completion is for an autosuggestion COMPLETION_REQUEST_DESCRIPTIONS = 1 << 1, // indicates that we want descriptions COMPLETION_REQUEST_FUZZY_MATCH = 1 << 2 // indicates that we don't require a prefix match }; typedef uint32_t completion_request_flags_t; /** Given a list of completions, returns a list of their completion fields */ wcstring_list_t completions_to_wcstring_list(const std::vector &completions); /** Sorts a list of completions */ void sort_completions(std::vector &completions); /** Add a completion. All supplied values are copied, they should be freed by or otherwise disposed by the caller. Examples: The command 'gcc -o' requires that a file follows it, so the NO_COMMON option is suitable. This can be done using the following line: complete -c gcc -s o -r The command 'grep -d' required that one of the strings 'read', 'skip' or 'recurse' is used. As such, it is suitable to specify that a completion requires one of them. This can be done using the following line: complete -c grep -s d -x -a "read skip recurse" \param cmd Command to complete. \param cmd_type If cmd_type is PATH, cmd will be interpreted as the absolute path of the program (optionally containing wildcards), otherwise it will be interpreted as the command name. \param short_opt The single character name of an option. (-a is a short option, --all and -funroll are long options) \param long_opt The multi character name of an option. (-a is a short option, --all and -funroll are long options) \param long_mode Whether to use old style, single dash long options. \param result_mode Whether to search further completions when this completion has been succesfully matched. If result_mode is SHARED, any other completions may also be used. If result_mode is NO_FILES, file completion should not be used, but other completions may be used. If result_mode is NO_COMMON, on option may follow it - only a parameter. If result_mode is EXCLUSIVE, no option may follow it, and file completion is not performed. \param comp A space separated list of completions which may contain subshells. \param desc A description of the completion. \param condition a command to be run to check it this completion should be used. If \c condition is empty, the completion is always used. \param flags A set of completion flags */ void complete_add(const wchar_t *cmd, bool cmd_is_path, wchar_t short_opt, const wchar_t *long_opt, int long_mode, int result_mode, const wchar_t *condition, const wchar_t *comp, const wchar_t *desc, int flags); /** Sets whether the completion list for this command is complete. If true, any options not matching one of the provided options will be flagged as an error by syntax highlighting. */ void complete_set_authoritative(const wchar_t *cmd, bool cmd_type, bool authoritative); /** Remove a previously defined completion */ void complete_remove(const wchar_t *cmd, bool cmd_is_path, wchar_t short_opt, const wchar_t *long_opt); /** Find all completions of the command cmd, insert them into out. If to_load is * not NULL, append all commands that we would autoload, but did not (presumably * because this is not the main thread) */ void complete(const wcstring &cmd, std::vector &comp, completion_request_flags_t flags, wcstring_list_t *to_load = NULL); /** Print a list of all current completions into the string. \param out The string to write completions to */ void complete_print(wcstring &out); /** Tests if the specified option is defined for the specified command */ int complete_is_valid_option(const wcstring &str, const wcstring &opt, wcstring_list_t *inErrorsOrNull, bool allow_autoload); /** Tests if the specified argument is valid for the specified option and command */ bool complete_is_valid_argument(const wcstring &str, const wcstring &opt, const wcstring &arg); /** Load command-specific completions for the specified command. This is done automatically whenever completing any given command, so there is no need to call this except in the case of completions with internal dependencies. \param cmd the command for which to load command-specific completions \param reload should the commands completions be reloaded, even if they where previously loaded. (This is set to true on actual completions, so that changed completion are updated in running shells) */ void complete_load(const wcstring &cmd, bool reload); /** Create a new completion entry \param completions The array of completions to append to \param comp The completion string \param desc The description of the completion \param flags completion flags */ void append_completion(std::vector &completions, const wcstring &comp, const wcstring &desc = L"", int flags = 0); /* Function used for testing */ void complete_set_variable_names(const wcstring_list_t *names); #endif fish/config.guess000077500000000000000000001260631214535744100143450ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-02-27' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS_NT-*:*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[345]*) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T:Interix*:[345]*) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fish/config.sub000077500000000000000000000772351214535744100140160ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-02-27' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m32c) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; m32c-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fish/configure.ac000066400000000000000000000522171214535744100143120ustar00rootroot00000000000000 # # This file is the main build configuration file for fish. It is used # to determine your systems capabilities, and tries to adapt fish to # take maximum advantage of the services your system offers. # # Process this file using the 'autoconf' command to produce a working # configure script, which should in turn be executed in order to # configure the build process. # AC_INIT(fish,2.0.0,fish-users@lists.sf.net) conf_arg=$@ # # List of output variables produced by this configure script # AC_SUBST(docdir) AC_SUBST(HAVE_GETTEXT) AC_SUBST(LDFLAGS_FISH) AC_SUBST(LIBS_FISH) AC_SUBST(LIBS_FISH_INDENT) AC_SUBST(LIBS_FISH_PAGER) AC_SUBST(LIBS_FISHD) AC_SUBST(LIBS_MIMEDB) AC_SUBST(localedir) AC_SUBST(optbindirs) AC_SUBST(prefix) # # If needed, run autoconf to regenerate the configure file # # This makes sure that after running autoconf once to create the first # version of configure, we never again need to worry about manually # running autoconf to handle an updates configure.ac. # AC_MSG_CHECKING([if autoconf needs to be run]) if test configure -ot configure.ac; then AC_MSG_RESULT([yes]) if which autoconf >/dev/null; then # No need to provide any error messages if autoconf fails, the # shell and autconf should take care of that themselves AC_MSG_NOTICE([running autoconf]) if autoconf; then ./configure "$@" exit fi exit 1 else AC_MSG_ERROR( [cannot find the autoconf program in your path. This program needs to be run whenever the configure.ac file is modified. Please install it and try again.] ) fi else AC_MSG_RESULT([no]) fi # # If needed, run autoheader to regenerate config.h.in # # This makes sure we never ever have to run autoheader manually. It # will be run whenever needed automatically. # AC_MSG_CHECKING([if autoheader needs to be run]) if test ! -f ./config.h.in -o config.h.in -ot configure.ac; then AC_MSG_RESULT([yes]) if which autoheader >/dev/null; then AC_MSG_NOTICE([running autoheader]) autoheader || exit 1 else AC_MSG_ERROR( [cannot find the autoheader program in your path. This program needs to be run whenever the configure.ac file is modified. Please install it and try again.] ) fi else AC_MSG_RESULT([no]) fi # # Set up various programs needed for install # Note AC_PROG_CXX sets CXXFLAGS if not set, which we want # So ensure this happens before we modify CXXFLAGS below # AC_PROG_CXX([g++ c++]) AC_PROG_CPP AC_PROG_INSTALL echo "CXXFLAGS: $CXXFLAGS" # # Detect directories which may contain additional headers, libraries # and commands. This needs to be done early - before Autoconf starts # to mess with CFLAGS and all the other environemnt variables. # # This mostly helps OS X users, since fink usually installs out of # tree and doesn't update CFLAGS. # # It also helps FreeBSD which puts libiconv in /usr/local/lib for i in /usr/pkg /sw /opt /opt/local /usr/local; do AC_MSG_CHECKING([for $i/include include directory]) if test -d $i/include; then AC_MSG_RESULT(yes) CXXFLAGS="$CXXFLAGS -I$i/include/" CFLAGS="$CFLAGS -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/ -Wl,-rpath,$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 # # Tell autoconf to create config.h header # AC_CONFIG_HEADERS(config.h) # # This adds markup to the code that results in a few extra compile # time checks on recent GCC versions. It helps stop a few common bugs. # AH_BOTTOM([#if __GNUC__ >= 3 #define __warn_unused __attribute__ ((warn_unused_result)) #define __sentinel __attribute__ ((sentinel)) #else #define __warn_unused #define __sentinel #endif]) # # Optionally drop gettext support # AC_ARG_WITH( gettext, AS_HELP_STRING( [--without-gettext], [do not translate messages, even if gettext is available] ), [local_gettext=$withval], [local_gettext=check] ) AS_IF([test x$local_gettext != xno], [ AC_CHECK_PROGS( [found_msgfmt], [msgfmt], [no] ) if test x$found_msgfmt != xno; then AC_DEFINE([USE_GETTEXT],[1],[Perform string translations with gettext]) elif test "x$local_gettext" != "xcheck" ; then AC_MSG_FAILURE([--with-gettext was given, but the msgfmt program could not be found]) else local_gettext=no fi ], ) # # Try to enable large file support. This will make sure that on systems # where off_t can be either 32 or 64 bit, the latter size is used. On # other systems, this should do nothing. (Hopefully) # CXXFLAGS="$CXXFLAGS -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64" # # If we are using gcc, set some flags that increase the odds of the # compiler producing a working binary... # if test "$GCC" = yes; then # # -fno-optimize-sibling-calls seems to work around a bug where # sending a SIGWINCH to fish on NetBSD 3.0 causes fish to exit when # compiled with GCC 3.3.3. This is probably either a compiler bug # or a libc bug, but adding this flag seems to fix things for # now. Long term, the real problem should be tracked down and # truly fixed, at which point we can remove this silly flag. This # bug has been verified to not exist on Linux using GCC 3.3.3. # GCC_VERSION=$($CC -dumpversion) GCC_VERSION_MAJOR=$(echo $GCC_VERSION | cut -d'.' -f1) GCC_VERSION_MINOR=$(echo $GCC_VERSION | cut -d'.' -f2) GCC_VERSION_PATCH=$(echo $GCC_VERSION | cut -d'.' -f3) if test "$GCC_VERSION_MAJOR" -le 3; then if test 0"$GCC_VERSION_MINOR" -le 3; then if test 0"$GCC_VERSION_PATCH" -le 3; then CXXFLAGS="$CXXFLAGS -fno-optimize-sibling-calls" fi fi fi # fish does not use exceptions # Disabling exceptions saves about 20% (!) of the compiled code size CXXFLAGS="$CXXFLAGS -fno-exceptions" # # -Wall is there to keep me on my toes # # Some day... CXXFLAGS="$CXXFLAGS -Wall" # # This is needed in order to get the really cool backtraces on Linux # if test `uname` != "Darwin"; then LDFLAGS_FISH="$LDFLAGS_FISH -rdynamic" fi fi # # If we are compiling against glibc, set some flags to work around # some rather stupid attempts to hide prototypes for *wprintf # functions, as well as prototypes of various gnu extensions. # AC_MSG_CHECKING([if we are compiling against glibc]) AC_RUN_IFELSE( [ AC_LANG_PROGRAM( [ #include #ifdef __GLIBC__ #define STATUS 0 #else #define STATUS 1 #endif ], [ return STATUS; ] ) ], [glibc=yes], [glibc=no] ) if test "$glibc" = yes; then AC_MSG_RESULT(yes) # # This gives us access to prototypes for gnu extensions and C99 # functions if we are compiling agains glibc. All GNU extensions # that are used must have a fallback implementation available in # fallback.h, in order to keep fish working on non-gnu platforms. # CFLAGS="$CFLAGS -D_GNU_SOURCE=1 -D_ISO99_SOURCE=1" else AC_MSG_RESULT(no) fi # # Test cpu for special handling of ppc # # This is used to skip use of tputs on ppc systems, since it seemed to # be broken, at least on older debin-based systems. This is obviously # not the right way to to detect whether this workaround should be # used, since it catches far to many systems, but I do not have the # hardware available to narrow this problem down, and in practice, it # seems that tputs is never really needed. # AC_CANONICAL_TARGET if test $target_cpu = powerpc; then AC_DEFINE([TPUTS_KLUDGE],[1],[Evil kludge to get Power based machines to work]) fi # # Solaris-specific flags go here # AC_MSG_CHECKING([if we are under Solaris]) case $target_os in solaris*) AC_DEFINE( __EXTENSIONS__, 1, [Macro to enable additional prototypes under Solaris]) AC_MSG_RESULT(yes) ;; *) AC_MSG_RESULT(no) ;; esac # Check for Solaris curses tputs having fixed length parameter list. AC_MSG_CHECKING([if we are using non varargs tparm.]) AC_COMPILE_IFELSE( [ AC_LANG_PROGRAM( [ #include #include ], [ tparm( "" ); ] ) ], [tparm_solaris_kludge=no], [tparm_solaris_kludge=yes] ) if test "x$tparm_solaris_kludge" = "xyes"; then AC_MSG_RESULT(yes) AC_DEFINE( [TPARM_SOLARIS_KLUDGE], [1], [Define to 1 if tparm accepts a fixed amount of paramters.] ) else AC_MSG_RESULT(no) fi # # BSD-specific flags go here # AC_MSG_CHECKING([if we are under BSD]) case $target_os in *bsd*) AC_DEFINE( __BSD_VISIBLE, 1, [Macro to enable additional prototypes under BSD]) AC_DEFINE( _NETBSD_SOURCE, 1, [Macro to enable additional prototypes under BSD]) AC_MSG_RESULT(yes) ;; *) AC_MSG_RESULT(no) ;; esac # # Set up PREFIX and related preprocessor symbols. Fish needs to know # where it will be installed. One of the reasons for this is so that # it can make sure the fish installation directory is in the path # during startup. # if [[ "$prefix" = NONE ]]; then prefix=/usr/local fi # # Set up the directory where the documentation files should be # installed # AC_ARG_VAR( [docdir], [Documentation direcotry] ) if test -z $docdir; then docdir=$datadir/doc/fish else docdir=$docdir fi # # Set up locale directory. This is where the .po files will be # installed. # localedir=$datadir/locale # # See if Linux procfs is present. This is used to get extra # information about running processes. # AC_CHECK_FILES([/proc/self/stat]) # # This is ued to tell the wgetopt library to translate strings. This # way wgetopt can be dropped into any project without requiring i18n. # AC_DEFINE( [HAVE_TRANSLATE_H], [1], [Define to 1 if the wgettext function should be used for translating strings.] ) # # Check presense of various libraries. This is done on a per-binary # level, since including various extra libraries in all binaries only # because thay are used by some of them can cause extra bloat and # slower compiles when developing fish. # # Check for os dependant libraries for all binaries. LIBS_COMMON=$LIBS LIBS="" AC_SEARCH_LIBS( connect, socket, , [AC_MSG_ERROR([Cannot find the socket library, needed to build this package.] )] ) AC_SEARCH_LIBS( nanosleep, rt, , [AC_MSG_ERROR([Cannot find the rt library, needed to build this package.] )] ) AC_SEARCH_LIBS( pthread_create, pthread, , [AC_MSG_ERROR([Cannot find the pthread library, needed to build this package.] )] ) AC_SEARCH_LIBS( setupterm, [ncurses curses], , [AC_MSG_ERROR([Could not find a curses implementation, needed to build fish])] ) AC_SEARCH_LIBS( [nan], [m], [AC_DEFINE( [HAVE_NAN], [1], [Define to 1 if you have the nan function])] ) LIBS_SHARED=$LIBS LIBS=$LIBS_COMMON # # Check for libraries needed by fish. # LIBS_COMMON=$LIBS LIBS="$LIBS_SHARED" if test x$local_gettext != xno; then AC_SEARCH_LIBS( gettext, intl,,) fi # Check for libiconv_open if we can't find iconv_open. Silly OS X does # weird macro magic for the sole purpose of amusing me. AC_SEARCH_LIBS( iconv_open, iconv, , [AC_SEARCH_LIBS( libiconv_open, iconv, , [AC_MSG_ERROR([Could not find an iconv implementation, needed to build fish])] )] ) LIBS_FISH=$LIBS LIBS=$LIBS_COMMON # # Check for libraries needed by fish_indent. # LIBS_COMMON=$LIBS LIBS="$LIBS_SHARED" if test x$local_gettext != xno; then AC_SEARCH_LIBS( gettext, intl,,) fi LIBS_FISH_INDENT=$LIBS LIBS=$LIBS_COMMON # # Check for libraries needed by fish_pager. # LIBS_COMMON=$LIBS LIBS="$LIBS_SHARED" if test x$local_gettext != xno; then AC_SEARCH_LIBS( gettext, intl,,) fi AC_SEARCH_LIBS( iconv_open, iconv, , [AC_SEARCH_LIBS( libiconv_open, iconv, , [AC_MSG_ERROR([Could not find an iconv implementation, needed to build fish])] )] ) LIBS_FISH_PAGER=$LIBS LIBS=$LIBS_COMMON # # Check for libraries needed by fishd. # LIBS_COMMON=$LIBS LIBS="$LIBS_SHARED" if test x$local_gettext != xno; then AC_SEARCH_LIBS( gettext, intl,,) fi AC_SEARCH_LIBS( iconv_open, iconv, , [AC_SEARCH_LIBS( libiconv_open, iconv, , [AC_MSG_ERROR([Could not find an iconv implementation, needed to build fish])] )] ) LIBS_FISHD=$LIBS LIBS=$LIBS_COMMON # # Check for libraries needed by mimedb. # LIBS_COMMON=$LIBS LIBS="$LIBS_SHARED" if test x$local_gettext != xno; then AC_SEARCH_LIBS( gettext, intl,,) fi LIBS_MIMEDB=$LIBS LIBS=$LIBS_COMMON # # Check presense of various header files # AC_CHECK_HEADERS([getopt.h termios.h sys/resource.h term.h ncurses/term.h ncurses.h curses.h stropts.h siginfo.h sys/select.h sys/ioctl.h execinfo.h spawn.h]) if test x$local_gettext != xno; then AC_CHECK_HEADERS([libintl.h]) fi AC_CHECK_HEADER( [regex.h], [ AC_DEFINE( [HAVE_REGEX_H], [1], [Define to 1 if you have the header file.] ) ], [AC_MSG_ERROR([Could not find the header regex.h, needed to build fish])] ) # # On some platforms (Solaris 10) adding -std=c99 in turn requires that # _POSIX_C_SOURCE be defined to 200112L otherwise several # POSIX-specific, non-ISO-C99 types/prototypes are made unavailable # e.g. siginfo_t. Defining _XOPEN_SOURCE to 600 is compatible with # the _POSIX_C_SOURCE value and provides a little assurance that # extension functions' prototypes are available, e.g. killpg(). # # Some other platforms (OS X), will remove types/prototypes/macros # e.g. SIGWINCH if either _POSIX_C_SOURCE or _XOPEN_SOURCE is defined. # # This test adds these macros only if they enable a program that uses # both Posix and non-standard features to compile, and that program # does not compile without these macros. # # We try to make everyone happy. # # The ordering of the various autoconf tests is very critical as well: # # * This test needs to be run _after_ header detection tests, so that # the proper headers are included. # # * This test needs to be run _before_ testing for the presense of any # prototypes or other language functinality. # # * This test should be (but does not need to be) run after the # conditional definition of __EXTENSIONS__, to avoid redundant tests. # XCFLAGS="$CXXFLAGS" echo checking how to use -D_XOPEN_SOURCE=600 and -D_POSIX_C_SOURCE=200112L... local_found_posix_switch=no for i in "" "-D_POSIX_C_SOURCE=200112L" "-D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112L"; do AC_MSG_CHECKING( if switches \"$i\" works) CFLAGS="$XCFLAGS $i" # # Try to run this program, which should test various extensions # and Posix functionality. If this program works, then everything # should work. Hopefully. # AC_TRY_LINK( [ #include #include #include /* POSIX, C89 and C99: POSIX extends this header. * For: kill(), killpg(), siginfo_t, sigset_t, * struct sigaction, sigemptyset(), sigaction(), * SIGIO and SIGWINCH. */ #include #ifdef HAVE_SIGINFO_H /* Neither POSIX, C89 nor C99: Solaris-specific (others?). * For: siginfo_t (also defined by signal.h when in * POSIX/extensions mode). */ #include #endif #ifdef HAVE_SYS_IOCTL_H /* As above (under at least Linux and FreeBSD). */ #include #endif ], [ /* Avert high-level optimisation, by making the program's * return value depend on all tested identifiers. */ long ret = 0; /* POSIX only: might be unhidden by _POSIX_C_SOURCE. */ struct sigaction sa; sigset_t ss; siginfo_t info; ret += (long)(void *)&info + kill( 0, 0 ) + sigaction( 0, &sa, 0 ) + sigemptyset( &ss ); /* Extended-POSIX: might be unhidden by _XOPEN_SOURCE. */ ret += killpg( 0, 0 ); /* Non-standard: might be hidden by the macros. */ { struct winsize termsize; ret += (long)(void *)&termsize; ret += SIGWINCH + TIOCGWINSZ + SIGIO; } return ret; ], local_cv_use__posix_c_source=yes, local_cv_use__posix_c_source=no, ) if test x$local_cv_use__posix_c_source = xyes; then AC_MSG_RESULT( yes ) local_found_posix_switch=yes break; else AC_MSG_RESULT( no ) fi done # # We didn't find any combination of switches that worked - revert to # no switches and hope that the fallbacks work. A warning will be # printed at the end of the configure script. # if test ! x$local_found_posix_switch = xyes; then CFLAGS="$XCFLAGS" fi # # Check for presense of various functions used by fish # AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp fwprintf ) AC_CHECK_FUNCS( futimes wcwidth wcswidth wcstok fputwc fgetwc ) AC_CHECK_FUNCS( wcstol wcslcat wcslcpy lrand48_r killpg ) AC_CHECK_FUNCS( backtrace backtrace_symbols sysconf getifaddrs ) if test x$local_gettext != xno; then AC_CHECK_FUNCS( gettext dcgettext ) # # The Makefile also needs to know if we have gettext, so it knows if # the translations should be installed. # AC_CHECK_FUNC( gettext, HAVE_GETTEXT=1, HAVE_GETTEXT=0 ) fi # # Here follows a list of small programs used to test for various # features that Autoconf doesn't tell us about # # # Check if realpath accepts null for its second argument # AC_MSG_CHECKING([if realpath accepts null for its second argument]) AC_RUN_IFELSE( [ AC_LANG_PROGRAM( [ #include #include #include ], [ 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 if struct winsize and TIOCGWINSZ exist # AC_MSG_CHECKING([if struct winsize and TIOCGWINSZ exist]) AC_LINK_IFELSE( [ AC_LANG_PROGRAM( [ #ifdef HAVE_TERMIOS_H #include #endif #ifdef HAVE_SYS_IOCTL_H #include #endif ], [ struct winsize termsize = {0}; TIOCGWINSZ; ] ) ], [ AC_MSG_RESULT(yes); AC_DEFINE([HAVE_WINSIZE], [1], [Define to 1 if the winsize struct and TIOCGWINSZ macro exist]) ], [ AC_MSG_RESULT(no) ] ) # # If we have a fwprintf in libc, test that it actually works. As of # March 2006, it is broken under Dragonfly BSD. # if test "$ac_cv_func_fwprintf" = yes; then AC_MSG_CHECKING([if fwprintf is broken]) AC_RUN_IFELSE( [ AC_LANG_PROGRAM( [ #include #include #include #include ], [ setlocale( LC_ALL, "" ); fwprintf( stderr, L"%ls%ls", L"", L"fish:" ); ] ) ], [ AC_MSG_RESULT(no) ], [ AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_BROKEN_FWPRINTF], [1], [Define to 1 one if the implemented fwprintf is broken]) ] ) fi # Check for _nl_msg_cat_cntr symbol AC_MSG_CHECKING([for _nl_msg_cat_cntr symbol]) AC_TRY_LINK( [ #if HAVE_LIBINTL_H #include #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 for __environ symbol AC_MSG_CHECKING([for __environ symbol]) AC_TRY_LINK( [ #include ], [ extern char **__environ; char **tmp = __environ; exit(tmp!=0); ], have___environ=yes, have___environ=no ) if test "$have___environ" = yes; then AC_MSG_RESULT(yes) AC_DEFINE( [HAVE___ENVIRON], [1], [Define to 1 if the __environ symbol is exported.] ) else AC_MSG_RESULT(no) fi # Check if getopt_long exists and works AC_MSG_CHECKING([if getopt_long exists and works]) AC_TRY_LINK( [ #if HAVE_GETOPT_H #include #endif ], [ static struct option long_options[] = { 0, 0, 0, 0 } ; int opt = getopt_long( 0, 0, 0, long_options, 0 ); ], have_working_getopt_long=yes, have_working_getopt_long=no ) if test "$have_working_getopt_long" = yes; then AC_MSG_RESULT(yes) AC_DEFINE( [HAVE_WORKING_GETOPT_LONG], [1], [Define to 1 if getopt_long exists and works.] ) else AC_MSG_RESULT(no) fi # Check if del_curterm is broken - in that case we redefine # del_curterm as a no-op, to avoid a double-free AC_MSG_CHECKING([If del_curterm is broken]) case $target_os in *bsd*) AC_MSG_RESULT(yes) AC_DEFINE( [HAVE_BROKEN_DEL_CURTERM], [1], [del_curterm is broken, redefine it to a no-op to avoid a double-free bug] ) ;; *) AC_MSG_RESULT(no) ;; esac # Tell the world what we know AC_CONFIG_FILES([Makefile fish.spec]) AC_OUTPUT if test ! x$local_found_posix_switch = xyes; then echo "Can't find a combination of switches to enable common extensions like detecting window size." echo "Some fish features may be disabled." fi echo "fish is now configured." echo "Use 'make' and 'make install' to build and install fish." fish/create_wajig_completions.py000077500000000000000000000062451214535744100174410ustar00rootroot00000000000000#!/usr/bin/env python # -*- python -*- # Program to generate fish completion function for wajig. # It runs 'wajig command' and analyzes the output to build a # completion file which it writes to stdout. # To use the result, direct stdout to # ~/.fish.d/completions/wajig.fish. # Author Reuben Thomas, from Don Rozenberg's bash_completion.py and # fish's apt-get.fish. import os import re import pprint pp = pprint.PrettyPrinter() def escape_quotes(s): return re.sub('\'', '\\\'', s) # Run wajig command f = os.popen('wajig commands', 'r') lines = f.readlines() option_patt = r'^-([a-z]*)\|--([a-z]*) +([^ ].*)' option_patt_r = re.compile(option_patt) command_patt = r'^([a-z-]*) +([^ ].*)' command_patt_r = re.compile(command_patt) os_str = [] os_str.append('') ol_str = [] ol_str.append('') oh_str = [] oh_str.append('') o_i = 0 c_str = [] c_str.append('') ch_str = [] ch_str.append('') c_i = 0 for l in lines: l = l.strip() if l == '' or l.find(':') > -1 or l.find('Run') == 0: continue if l.find('-') == 0: mo = option_patt_r.search(l) if mo == None: continue os_str[o_i] = mo.group(1) os_str.append('') ol_str[o_i] = mo.group(2) ol_str.append('') oh_str[o_i] = escape_quotes(mo.group(3)) oh_str.append('') o_i += 1 else: mo = command_patt_r.search(l) if mo == None: continue c_str[c_i] = mo.group(1) c_str.append('') ch_str[c_i] = escape_quotes(mo.group(2)) ch_str.append('') c_i += 1 # For debugging, print the commands and options. #print #pp.pprint(c_str) #print #pp.pprint(os_str) #print #pp.pprint(ol_str) part1 = '''function __fish_wajig_no_subcommand -d (N_ 'Test if wajig has yet to be given the subcommand') for i in (commandline -opc) if contains -- $i''' part2 = ''' return 1 end end return 0 end function __fish_wajig_use_package -d (N_ 'Test if wajig command should have packages as potential completion') for i in (commandline -opc) if contains -- $i contains bug build build-depend changelog dependents describe detail hold install installr installrs installs list list-files news package purge purge-depend readme recursive recommended reconfigure reinstall remove remove-depend repackage show showinstall showremove showupgrade size sizes source suggested unhold upgrade versions whatis return 0 end end return 1 end complete -c wajig -n '__fish_wajig_use_package' -a '(__fish_print_packages)' -d (N_ 'Package')''' wajig = part1 #add the commands. for i in range(0, len(c_str) - 1): wajig = "%s %s" % (wajig, c_str[i]) #add part2 wajig = "%s%s" % (wajig, part2) #add the options. wajig = "%s%s" % (wajig, os_str[0].lstrip()) for i in range(1, len(os_str) - 1): wajig = "%s\ncomplete -c apt-get -s %s -l %s -d (N_ '%s')" % (wajig, os_str[i], ol_str[i], oh_str[i]) #add the commands. for i in range(0, len(c_str) - 1): wajig = "%s\ncomplete -f -n '__fish_wajig_no_subcommand' -c wajig -a '%s' -d(N_ '%s')" % (wajig, c_str[i], ch_str[i]) #print it all print wajig fish/doc_src/000077500000000000000000000000001214535744100134315ustar00rootroot00000000000000fish/doc_src/alias.txt000066400000000000000000000017001214535744100152610ustar00rootroot00000000000000\section alias alias - create a function \subsection alias-synopsis Synopsis
alias NAME DEFINITION
alias NAME=DEFINITION
\subsection alias-description Description \c alias is a simple wrapper for the \c function builtin. It exists for backwards compatibility with Posix shells. For other uses, it is recommended to define a function. \c fish does not keep track of which functions have been defined using \c alias. They must be erased using functions -e. - NAME is the name of the alias - DEFINITION is the actual command to execute. The string " $argv" will be appended. You cannot create an alias to a function with the same name. \subsection alias-example Example The following code will create \c rmi, which runs \c rm with additional arguments on every invocation. alias rmi "rm -i" This is equivalent to entering the following function:
function rmi
    rm -i $argv
end
fish/doc_src/and.txt000066400000000000000000000015061214535744100147360ustar00rootroot00000000000000\section and and - conditionally execute a command \subsection and-synopsis Synopsis COMMAND1; and COMMAND2 \subsection and-description Description \c and is used to execute a command if the current exit status (as set by the last previous command) is 0. \c and does not change the current exit status. The exit status of the last foreground command to exit can always be accessed using the $status variable. \subsection and-example Example The following code runs the \c make command to build a program. If the build succeeds, make's exit status is 0, and the program is installed. If either step fails, the exit status is 1, and make clean is run, which removes the files created by the. build process.
make; and make install; or make clean
fish/doc_src/begin.txt000066400000000000000000000022741214535744100152630ustar00rootroot00000000000000\section begin begin - start a new block of code \subsection begin-synopsis Synopsis begin; [COMMANDS...;] end \subsection begin-description Description \c begin is used to create a new block of code. The block is unconditionally executed. begin; ...; end is equivalent to if true; ...; end. \c begin is used to group a number of commands into a block. This allows the introduction of a new variable scope, redirection of the input or output of a set of commands as a group, or to specify precedence when using the conditional commands like \c and. \c begin does not change the current exit status. \subsection begin-example Example The following code sets a number of variables inside of a block scope. Since the variables are set inside the block and have local scope, they will be automatically deleted when the block ends.
begin
	set -l PIRATE Yarrr
	...
end
# This will not output anything, since the PIRATE variable went out
# of scope at the end of the block
echo $PIRATE
In the following code, all output is redirected to the file out.html.
begin
	echo $xml_header
	echo $html_header
	if test -e $file
		...
	end
	...

end > out.html
fish/doc_src/bg.txt000066400000000000000000000013361214535744100145650ustar00rootroot00000000000000\section bg bg - send jobs to background \subsection bg-synopsis Synopsis bg [PID...] \subsection bg-description Description \c bg sends jobs to the background, resuming them if they are stopped. A background job is executed simultaneously with fish, and does not have access to the keyboard. If no job is specified, the last job to be used is put in the background. If PID is specified, the jobs with the specified process group IDs are put in the background. The PID of the desired process is usually found by using process expansion. \subsection bg-example Example bg \%1 will put the job with job ID 1 in the background. fish/doc_src/bind.txt000066400000000000000000000056671214535744100151240ustar00rootroot00000000000000\section bind bind - handle fish key bindings \subsection bind-synopsis Synopsis bind [OPTIONS] SEQUENCE COMMAND \subsection bind-description Description bind adds a binding for the specified key sequence to the specified command. SEQUENCE is the character sequence to bind to. These should be written as fish escape sequences. For example, because pressing the Alt key and another character sends that character prefixed with an escape character, Alt-based key bindings can be written using the \c \\e escape. For example, Alt-w can be written as \\ew. The control character can be written in much the same way using the \c \\c escape, for example Control-x (^X) can be written as \\cx. Note that Alt-based key bindings are case sensitive and Control-based key bindings are not. This is a constraint of text-based termainls, not \c fish. The default key binding can be set by specifying a SEQUENCE of the empty string (that is, ''). It will be used whenever no other binding matches. For most key bindings, it makes sense to use the \c self-insert function (i.e. bind '' self-insert as the default keybinding. This will insert any keystrokes not specifically bound to into the editor. Non-printable characters are ignored by the editor, so this will not result in control sequences being printable. If the -k switch is used, the name of the key (such as down, up or backspace) is used instead of a sequence. The names used are the same as the corresponding curses variables, but without the 'key_' prefix. (See \c terminfo(5) for more information, or use bind --key-names for a list of all available named keys.) COMMAND can be any fish command, but it can also be one of a set of special input functions. These include functions for moving the cursor, operating on the kill-ring, performing tab completion, etc. Use 'bind --function-names' for a complete list of these input functions. When COMMAND is a shellscript command, it is a good practice to put the actual code into a function and simply bind to the function name. This way it becomes significantly easier to test the function while editing, and the result is usually more readable as well. Key bindings are not saved between sessions by default. To save custom keybindings, edit the \c fish_user_key_bindings function and insert the appropirate \c bind statements. The following parameters are available: - -k or --key Specify a key name, such as 'left' or 'backspace' instead of a character sequence - -K or --key-names Display a list of available key names - -f or --function-names Display a list of available input functions \subsection bind-example Examples bind \\cd 'exit' causes \c fish to exit when Control-d is pressed. bind -k ppage history-search-backward performs a history search when the Page Up key is pressed. fish/doc_src/block.txt000066400000000000000000000023631214535744100152700ustar00rootroot00000000000000\section block block - temporarily block delivery of events \subsection block-synopsis Synopsis block [OPTIONS...] \subsection block-description Description \c block prevents events triggered by \c fish or the emit command from being delivered and acted upon while the block is in place. In functions, \c block can be useful while performing work that should not be interrupted by the shell. The block can be removed. Any events which triggered while the block was in place will then be delivered. Event blocks should not be confused with code blocks, which are created with begin, if, while or for The following parameters are available: - -l or --local Release the block automatically at the end of the current innermost code block scope - -g or --global Never automatically release the lock - -e or --erase Release global block \subsection block-example Example
# Create a function that listens for events
function --on-event foo foo; echo 'foo fired'; end
# Block the delivery of events
block -g
emit foo
# No output will be produced
block -e
# 'foo fired' will now be printed
fish/doc_src/break.txt000066400000000000000000000013401214535744100152540ustar00rootroot00000000000000\section break break - stop the current inner loop \subsection break-synopsis Synopsis LOOP_CONSTRUCT; [COMMANDS...] break; [COMMANDS...] end \subsection break-description Description \c break halts a currently running loop, such as a for loop or a while loop. It is usually added inside of a conditional block such as an if statement or a switch statement. There are no parameters for break. \subsection break-example Example The following code searches all .c files for "smurf", and halts at the first occurrence.
for i in *.c
    if grep smurf $i
        echo Smurfs are present in $i
        break
    end
end
fish/doc_src/breakpoint.txt000066400000000000000000000006341214535744100163330ustar00rootroot00000000000000\section breakpoint breakpoint - Launch debug mode \subsection breakpoint-synopsis Synopsis breakpoint \subsection breakpoint-description Description \c breakpoint is used to halt a running script and launch an interactive debugging prompt. For more details, see Debugging fish scripts in the \c fish manual. There are no parameters for breakpoint. fish/doc_src/builtin.txt000066400000000000000000000007721214535744100156460ustar00rootroot00000000000000\section builtin builtin - run a builtin command \subsection builtin-synopsis Synopsis builtin BUILTINNAME [OPTIONS...] \subsection builtin-description Description \c builtin forces the shell to use a builtin command, rather than a function or program. The following parameters are available: - -n or --names List the names of all defined builtins \subsection builtin-example Example builtin jobs executes the jobs builtin, even if a function named jobs exists. fish/doc_src/case.txt000066400000000000000000000032061214535744100151060ustar00rootroot00000000000000\section case case - conditionally execute a block of commands \subsection case-synopsis Synopsis switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end \subsection case-description Description \c switch performs one of several blocks of commands, depending on whether a specified value equals one of several wildcarded values. \c case is used together with the \c switch statement in order to determine which block should be executed. Each \c case command is given one or more parameters. The first \c case command with a parameter that matches the string specified in the switch command will be evaluated. \c case parameters may contain wildcards. These need to be escaped or quoted in order to avoid regular wildcard expansion using filenames. Note that fish does not fall through on case statements. Only the first matching case is executed. Note that command substitutions in a case statement will be evaluated even if its body is not taken. All substitutions, including command substitutions, must be performed before the value can be compared against the parameter. \subsection case-example Example If the variable \$animal contains the name of an animal, the following code would attempt to classify it:
switch $animal
    case cat
        echo evil
    case wolf dog human moose dolphin whale
        echo mammal
    case duck goose albatross
        echo bird
    case shark trout stingray
        echo fish
    # Note that the next case has a wildcard which is quoted
    case '*'
        echo I have no idea what a $animal is
end
If the above code was run with \c \$animal set to \c whale, the output would be \c mammal. fish/doc_src/cd.txt000066400000000000000000000014711214535744100145630ustar00rootroot00000000000000\section cd cd - change directory \subsection cd-synopsis Synopsis cd [DIRECTORY] \subsection cd-description Description \c cd changes the current working directory. If \c DIRECTORY is supplied, it will become the new directory. If no parameter is given, the contents of the \c HOME environment variable will be used. If \c DIRECTORY is a relative path, the paths found in the \c CDPATH environment variable array will be tried as prefixes for the specified path. Note that the shell will attempt to change directory without requiring \c cd if the name of a directory is provided (starting with '.', '/' or '~'). \subsection cd-example Examples \c cd changes the working directory to your home directory. cd /usr/src/fish-shell changes the working directory to /usr/src/fish-shell. fish/doc_src/command.txt000066400000000000000000000006501214535744100156110ustar00rootroot00000000000000\section command command - run a program \subsection command-synopsis Synopsis command COMMANDNAME [OPTIONS...] \subsection command-description Description \c command forces the shell to execute the program \c COMMANDNAME and ignore any functions or builtins with the same name. \subsection command-example Example command ls causes fish to execute the \c ls program, even if an 'ls' function exists. fish/doc_src/commandline.txt000066400000000000000000000047021214535744100164630ustar00rootroot00000000000000\section commandline commandline - set or get the current command line buffer \subsection commandline-synopsis Synopsis commandline [OPTIONS] [CMD] \subsection commandline-description Description \c commandline can be used to set or get the current contents of the command line buffer. With no parameters, \c commandline returns the current value of the command line. With \c CMD specified, the command line buffer is erased and replaced with the contents of \c CMD. The following options are available: - \c -C or \c --cursor set or get the current cursor position, not the contents of the buffer. If no argument is given, the current cursor position is printed, otherwise the argument is interpreted as the new cursor position. - \c -f or \c --function inject readline functions into the reader. This option cannot be combined with any other option. It will cause any additional arguments to be interpreted as readline functions, and these functions will be injected into the reader, so that they will be returned to the reader before any additional actual key presses are read. The following options change the way \c commandline updates the command line buffer: - \c -a or \c --append do not remove the current commandline, append the specified string at the end of it - \c -i or \c --insert do not remove the current commandline, insert the specified string at the current cursor position - \c -r or \c --replace remove the current commandline and replace it with the specified string (default) The following options change what part of the commandline is printed 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. The following options change the way \c commandline prints the current commandline buffer: - \c -c or \c --cut-at-cursor only print selection up until the current cursor position - \c -o or \c --tokenize tokenize the selection and print one string-type token per line If \c commandline is called during a call to complete a given string using complete -C STRING, \c commandline will consider the specified string to be the current contents of the command line. \subsection commandline-example Example commandline -j $history[3] replaces the job under the cursor with the third item from the command line history. fish/doc_src/commands.hdr.in000066400000000000000000000003321214535744100163340ustar00rootroot00000000000000/** \page commands Commands, functions and builtins bundled with fish Fish ships with a large number of builtin commands, shellscript functions and external commands. These are all described below. @command_list@ */ fish/doc_src/complete.txt000066400000000000000000000123151214535744100160040ustar00rootroot00000000000000\section complete complete - edit command specific tab-completions \subsection complete-synopsis Synopsis 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] \subsection complete-description Description For an introduction to specifying completions, see Writing your own completions in the fish manual. - COMMAND is the name of the command for which to add a completion - SHORT_OPTION is a one character option for the command - LONG_OPTION is a multi character option for the command - OPTION_ARGUMENTS is parameter containing a space-separated list of possible option-arguments, which may contain subshells - DESCRIPTION is a description of what the option and/or option arguments do - -C STRING or --do-complete=STRING makes complete try to find all possible completions for the specified string - -e or --erase implies that the specified completion should be deleted - -f or --no-files specifies that the option specified by this completion may not be followed by a filename - -n or --condition 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. - -o or --old-option implies that the command uses old long style options with only one dash - -p or --path implies that the string COMMAND is the full path of the command - -r or --require-parameter specifies that the option specified by this completion always must have an option argument, i.e. may not be followed by another option - -u or --unauthoritative implies that there may be more options than the ones specified, and that fish should not assume that options not listed are spelling errors - -A or --authoritative implies that there may be no more options than the ones specified, and that fish should assume that options not listed are spelling errors - -x or --exclusive implies both -r and -f Command specific tab-completions in \c fish are based on the notion of options and arguments. An option is a parameter which begins with a hyphen, such as '-h', '-help' or '--help'. Arguments are parameters 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 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'). 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 complete -e -c COMMAND, or by specifying a specific completion option to delete by specifying either a long, short or old style option. \subsection complete-example Example The short style option -o for the \c gcc command requires that a file follows it. This can be done using writing complete -c gcc -s o -r. The short style option -d for the \c grep command requires that one of the strings 'read', 'skip' or 'recurse' is used. This can be specified writing complete -c grep -s d -x -a "read skip recurse". The \c su command takes any username as an argument. Usernames are given as the first colon-separated field in the file /etc/passwd. This can be specified as: complete -x -c su -d "Username" -a "(cat /etc/passwd|cut -d : -f 1)" . The \c rpm command has several different modes. If the \c -e or \c --erase flag has been specified, \c rpm should delete one or more packages, in which case several switches related to deleting packages are valid, like the \c nodeps switch. This can be written as: complete -c rpm -n "__fish_contains_opt -s e erase" -l nodeps -d "Don't check dependencies" where \c __fish_contains_opt is a function that checks the commandline buffer for the presence of a specified set of options. fish/doc_src/contains.txt000066400000000000000000000013101214535744100160030ustar00rootroot00000000000000\section contains contains - test if a word is present in a list \subsection contains-synopsis Synopsis contains [OPTIONS] KEY [VALUES...] \subsection contains-description Description \c contains tests whether the set \c VALUES contains the string KEY. If so, \c contains exits with status 0; if not, it exits with status 1. The following options are available: - \c -i or \c --index print the word index - \c -h or \c --help display this message \subsection contains-example Example
for i in ~/bin /usr/local/bin
	if not contains \$i \$PATH
		set PATH \$PATH \$i
	end
end
The above code tests if \c ~/bin and \c /usr/local/bin are in the path and adds them if not. fish/doc_src/continue.txt000066400000000000000000000013631214535744100160210ustar00rootroot00000000000000\section continue continue - skip the remainder of the current iteration of the current inner loop \subsection continue-synopsis Synopsis LOOP_CONSTRUCT; [COMMANDS...;] continue; [COMMANDS...;] end \subsection continue-description Description \c continue skips the remainder of the current iteration of the current inner loop, such as a for loop or a while loop. It is usually added inside of a conditional block such as an if statement or a switch statement. \subsection continue-example Example The following code removes all tmp files that do not contain the word smurf.
for i in *.tmp
    if grep smurf $i
        continue
    end
    rm $i
end
fish/doc_src/count.txt000066400000000000000000000013701214535744100153230ustar00rootroot00000000000000\section count count - count the number of elements of an array \subsection count-synopsis Synopsis count $VARIABLE \subsection count-description Description count prints the number of arguments that were passed to it. This is usually used to find out how many elements an environment variable array contains. \c count does not accept any options, including '-h'. \c count exits with a non-zero exit status if no arguments were passed to it, and with zero if at least one argument was passed. \subsection count-example Example
count $PATH
returns the number of directories in the users PATH variable.
count *.txt
returns the number of files in the current working directory ending with the suffix '.txt'. fish/doc_src/design.hdr000066400000000000000000000160371214535744100154100ustar00rootroot00000000000000/** \page design Design document \section design-overview Overview This is a description of the design principles that have been used to design fish. The fish design has three high level goals. These are: -# Everything that can be done in other shell languages should be possible to do in fish, though fish may rely on external commands in doing so. -# Fish should be user friendly, but not at the expense of expressiveness. Most tradeoffs between power and ease of use can be avoided with careful design. -# Whenever possible without breaking the above goals, fish should follow the Posix syntax. To achieve these high-level goals, the fish design relies on a number of more specific design principles. These are presented below, together with a rationale and a few examples for each. \section ortho The law of orthogonality The shell language should have a small set of orthogonal features. Any situation where two features are related but not identical, one of them should be removed, and the other should be made powerful and general enough to handle all common use cases of either feature. Rationale: Related features make the language larger, which makes it harder to learn. It also increases the size of the sourcecode, making the program harder to maintain and update. Examples: - Here documents are too similar to using echo inside of a pipeline. - Subshells, command substitution and process substitution are strongly related. \c fish only supports command substitution, the others can be achieved either using a block or the psub shellscript function. - Having both aliases and functions is confusing, especially since both of them have limitations and problems. \c fish functions have none of the drawbacks of either syntax. - The many Posix quoting styles are silly, especially \$''. \section sep The law of responsiveness The shell should attempt to remain responsive to the user at all times, even in the face of contended or unresponsive filesystems. It is only acceptable to block in response to a user initiated action, such as running a command. Rationale: Bad performance increases user-facing complexity, because it trains users to recognize and route around slow use cases. It is also incredibly frustrating. Examples: - Features like syntax highlighting and autosuggestions must perform all of their disk I/O asynchronously. - Startup should minimize forks and disk I/O, so that fish can be started even if the system is under load. \section conf Configurability is the root of all evil Every configuration option in a program is a place where the program is too stupid to figure out for itself what the user really wants, and should be considered a failiure of both the program and the programmer who implemented it. Rationale: Different configuration options are a nightmare to maintain, since the number of potential bugs caused by specific configuration combinations quickly becomes an issue. Configuration options often imply assumptions about the code which change when reimplementing the code, causing issues with backwards compatibility. But mostly, configuration options should be avoided since they simply should not exist, as the program should be smart enough to do what is best, or at least a good enough approximation of it. Examples: - Fish allows the user to set various syntax highlighting colors. This is needed because fish does not know what colors the terminal uses by default, which might make some things unreadable. The proper solution would be for text color preferences to be defined centrally by the user for all programs, and for the terminal emulator to send these color properties to fish. - Fish does not allow you to set the history filename, the number of history entries, different language substyles or any number of other common shell configuration options. A special note on the evils of configurability is the long list of very useful features found in some shells, that are not turned on by default. Both zsh and bash support command specific completions, but no such completions are shipped with bash by default, and they are turned off by default in zsh. Other features that zsh support that are disabled by default include tab-completion of strings containing wildcards, a sane completion pager and a history file. \section user The law of user focus When designing a program, one should first think about how to make a intuitive and powerful program. Implementation issues should only be considered once a user interface has been designed. Rationale: This design rule is different than the others, since it describes how one should go about designing new features, not what the features should be. The problem with focusing on what can be done, and what is easy to do, is that to much of the implementation is exposed. This means that the user must know a great deal about the underlying system to be able to guess how the shell works, it also means that the language will often be rather low-level. Examples: - There should only be one type of input to the shell, lists of commands. Loops, conditionals and variable assignments are all performed through regular commands. - The differences between builtin commands, shellscript functions and builtin commands should be made as small as possible. Builtins and shellscript functions should have exactly the same types of argument expansion as other commands, should be possible to use in any position in a pipeline, and should support any io redirection. - Instead of forking when performing command substitution to provide a fake variable scope, all fish commands are performed from the same process, and fish instead supports true scoping. - All blocks end with the \c end builtin. \section disc The law of discoverability A program should be designed to make its features as easy as possible to discover for the user. Rationale: A program whose features are discoverable turns a new user into an expert in a shorter span of time, since the user will become an expert on the program simply by using it. The main benefit of a graphical program over a command line-based program is discoverability. In a graphical program, one can discover all the common features by simply looking at the user interface and guessing what the different buttons, menus and other widgets do. The traditional way to discover features in commandline programs is through manual pages. This requires both that the user starts to use a different program, and the she/he then remembers the new information until the next time she/he uses the same program. Examples: - Everything should be tab-completable, and every tab completion should have a description. - Every syntax error and error in a builtin command should contain an error message describing what went wrong and a relevant help page. Whenever possible, errors should be flagged red by the syntax highlighter. - The help manual should be easy to read, easily available from the shell, complete and contain many examples - The language should be uniform, so that once the user understands the command/argument syntax, he will know the whole language, and be able to use tab-completion to discover new featues. */ fish/doc_src/dirh.txt000066400000000000000000000005631214535744100151240ustar00rootroot00000000000000\section dirh dirh - print directory history \subsection dirh-synopsis Synopsis dirh \subsection dirh-description Description dirh prints the current directory history. The current position in the history is highlighted using the color defined in the fish_color_history_current environment variable. \c dirh does not accept any parameters. fish/doc_src/dirs.txt000066400000000000000000000004451214535744100151360ustar00rootroot00000000000000\section dirs dirs - print directory stack \subsection dirs-synopsis Synopsis dirs \subsection dirs-description Description dirs prints the current directory stack, as created by the pushd command. \c dirs does not accept any parameters. fish/doc_src/echo.txt000066400000000000000000000020421214535744100151060ustar00rootroot00000000000000\section echo echo - display a line of text \subsection echo-synopsis Synopsis echo [STRING] \subsection echo-description Description \c echo displays a string of text. The following options are available: - \c -n, \c Do not output a newline - \c -s, \c Do not separate arguments with spaces - \c -E, \c Disable interpretation of backslash escapes (default) - \c -e, \c Enable interpretation of backslash escapes - \c -h, \c --help Display this help \subsection echo-escapes Escape Sequences If \c -e is used, the following sequences are recognized: - \c \\\\ \c backslash - \\a alert (BEL) - \\b backspace - \\c produce no further output - \\e escape - \\f form feed - \\n new line - \\r carriage return - \\t horizontal tab - \\v vertical tab - \\0NNN byte with octal value NNN (1 to 3 digits) - \\xHH byte with hexadecimal value HH (1 to 2 digits) \subsection echo-example Example echo 'Hello World' Print hello world to stdout echo -e 'Top\\nBottom' Print Top and Bottom on separate lines, using an escape sequence fish/doc_src/else.txt000066400000000000000000000011721214535744100151230ustar00rootroot00000000000000\section else else - execute command if a condition is not met \subsection else-synopsis Synopsis if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end \subsection else-description Description if will execute the command \c CONDITION. If the condition's exit status is 0, the commands \c COMMANDS_TRUE will execute. If it is not 0 and else is given, \c COMMANDS_FALSE will be executed. \subsection else-example Example The following code tests whether a file \c foo.txt exists as a regular file.
if test -f foo.txt
    echo foo.txt exists
else
    echo foo.txt does not exist
end
fish/doc_src/emit.txt000066400000000000000000000011621214535744100151300ustar00rootroot00000000000000\section emit emit - Emit a generic event \subsection block-synopsis Synopsis emit EVENT_NAME [ARGUMENTS...] \subsection emit-description Description \c emit emits, or fires, an event. Events are delivered to, or caught by, special functions called event handlers. The arguments are passed to the event handlers as function arguments. \subsection emit-example Example The following code first defines an event handler for the generic event named 'test_event', and then emits an event of that type.
function event_test --on-event test_event
    echo event test: $argv
end

emit test_event something
fish/doc_src/end.txt000066400000000000000000000010671214535744100147440ustar00rootroot00000000000000\section end end - end a block of commands. \subsection end-synopsis Synopsis
begin; [COMMANDS...] end
if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end
while CONDITION; COMMANDS...; end
for VARNAME in [VALUES...]; COMMANDS...; end
switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end
\subsection end-description Description end ends a block of commands. For more information, read the documentation for the block constructs, such as \c if, \c for and \c while. The \c end command does not change the current exit status. fish/doc_src/eval.txt000066400000000000000000000011011214535744100151120ustar00rootroot00000000000000\section eval eval - evaluate the specified commands \subsection eval-synopsis Synopsis eval [COMMANDS...] \subsection eval-description Description eval evaluates the specified parameters as a command. If more than one parameter is specified, all parameters will be joined using a space character as a separator. \subsection eval-example Example The folloing code will call the ls command. Note that \c fish does not support the use of environment variables as direct commands; \c eval can be used to work around this.
set cmd ls
eval $cmd
fish/doc_src/exec.txt000066400000000000000000000007401214535744100151170ustar00rootroot00000000000000\section exec exec - execute command in current process \subsection exec-synopsis Synopsis exec COMMAND [OPTIONS...] \subsection exec-description Description \c exec replaces the currently running shell with a new command. On successful completion, \c exec never returns. \c exec cannot be used inside a pipeline. \subsection exec-example Example exec emacs starts up the emacs text editor, and exits \c fish. When emacs exits, the session will terminate. fish/doc_src/exit.txt000066400000000000000000000007501214535744100151450ustar00rootroot00000000000000\section exit exit - exit the shell \subsection exit-synopsis Synopsis exit [STATUS] \subsection exit-description Description \c exit causes fish to exit. If STATUS is supplied, it will be converted to an integer and used as the exit code. Otherwise, the exit code will be that of the last command executed. If exit is called while sourcing a file (using the . builtin) the rest of the file will be skipped, but the shell itself will not exit. fish/doc_src/faq.hdr000066400000000000000000000160411214535744100147010ustar00rootroot00000000000000/** \page faq Frequently asked questions - Why does cd, pwd and other fish commands always resolve symlinked directories to their canonical path? - I accidentally entered a directory path and fish changed directory. What happened? - The open command doesn't work. - How do I make fish my default shell? - I'm seeing weird output before each prompt when using screen. What's wrong? - How do I change the greeting message? - Why doesn't history substitution ("!$" etc.) work? - How do I uninstall fish?
\section faq-cwd-symlink Why does cd, $PWD and and various fish commands always resolve symlinked directories to their canonical path? For example if ~/images is a symlink to ~/Documents/Images, if I write 'cd images', my prompt will say ~/D/Images, not ~/images. Because it is impossible to consistently keep symlinked directories unresolved. It is indeed possible to do this partially, and many other shells do so. But it was felt there are enough serious corner cases that this is a bad idea. Most such issues have to do with how '..' is handled, and are varitations of the following example: Writing cd images; ls .. given the above directory structure would list the contents of ~/Documents, not of ~, even though using cd .. changes the current directory to ~, and the prompt, the pwd builtin and many other directory information sources suggest that the current directory is ~/images and its parent is ~. This issue is not possible to fix without either making every single command into a builtin, breaking Unix semantics or implementing kludges in every single command. This issue can also be seen when doing IO redirection. Another related issue is that many programs that operate on recursive directory trees, like the find command, silently ignore symlinked directories. For example, find $PWD -name '*.txt' silently fails in shells that don't resolve symlinked paths.
\section faq-cd-implicit I accidentally entered a directory path and fish changed directory. What happened? If fish is unable to locate a command with a given name, and it starts with '.', '/' or '~', fish will test if a directory of that name exists. If it does, it is implicitly assumed that you want to change working directory. For example, the fastest way to switch to your home directory is to simply press ~ and enter.
\section faq-open The open command doesn't work. The \c open command uses the MIME type database and the .desktop files used by Gnome and KDE to identify filetypes and default actions. If at least one of these environments is installed, but the open command is not working, this probably means that the relevant files are installed in a non-standard location. Consider asking for more help.
\section faq-default How do I make fish my default shell? If you installed fish manually (e.g. by compiling it, not by using a package manager), you first need to add fish to the list of shells by executing the following command (assuming you installed fish in /usr/local) as root: echo /usr/local/bin/fish >>/etc/shells If you installed a prepackaged version of fish, the package manager should have already done this for you. In order to change your default shell, type: chsh -s /usr/local/bin/fish You may need to adjust the above path to e.g. \c /usr/bin/fish. Use the command which fish if you are unsure of where fish is installed. Unfortunately, there is no way to make the changes take effect at once. You will need to log out and back in again.
\section faq-titlebar I'm seeing weird output before each prompt when using screen. What's wrong? Quick answer: Run the following command in fish:
echo 'function fish_title;end' > ~/.config/fish/config.fish
Problem solved! The long answer: Fish is trying to set the titlebar message of your terminal. While screen itself supports this feature, your terminal does not. Unfortunately, when the underlying terminal doesn't support setting the titlebar, screen simply passes through the escape codes and text to the underlying terminal instead of ignoring them. It is impossible detect and resolve this problem from inside fish since fish has no way of knowing what the underlying terminal type is. For now, the only way to fix this is to unset the titlebar message, as suggested above. Note that fish has a default titlebar message, which will be used if the fish_title function is undefined. So simply unsetting the fish_title function will not work.
\section faq-greeting How do I change the greeting message? Change the value of the variable fish_greeting. For example, to remove the greeting use:
set fish_greeting

\section faq-history Why doesn't history substitution ("!$" etc.) work? Because history substitution is an awkward interface that was invented before interactive line editing was even possible. Fish drops it in favor of perfecting the interactive history recall interface. Switching requires a small change of habits: if you want to modify an old line/word, first recall it, then edit. E.g. don't type "sudo !!" - first press Up, then Home, then type "sudo ". Fish history recall is very simple yet effective: - As in any modern shell, the Up arrow recalls whole lines, starting from the last line executed. A single press replaces "!!", later presses replace "!-3" and the like. - If the line you want is far back in the history, type any part of the line and then press Up one or more times. This will constrain the recall to lines that include this text, and you will get to the line you want much faster. This replaces "!vi", "!?bar.c" and the like. - Alt+Up recalls individual arguments, starting from the last argument in the last line executed. A single press replaces "!$", later presses replace "!!:4" and the like. - If the argument you want is far back in history (e.g. 2 lines back - that's a lot of words!), type any part of it and then press Alt+Up. This will show only arguments containing that part and you will get what you want much faster. Try it out, this is very convenient! - If you want to reuse several arguments from the same line ("!!:3*" and the like), consider recalling the whole line and removing what you don't need (Alt+D and Alt+Backspace are your friends). See documentation for more details about line editing in fish.
\section faq-uninstalling Uninstalling fish Should you wish to uninstall fish, first ensure fish is not set as your shell. Run chsh -s /bin/bash if you are not sure. Next, do the following (assuming fish was installed to /usr/local):
rm -Rf /usr/local/etc/fish /usr/local/share/fish ~/.config/fish
rm /usr/local/share/man/man1/fish*.1
cd /usr/local/bin
rm -f fish mimedb fish_pager fishd fish_indent
*/ fish/doc_src/fg.txt000066400000000000000000000012551214535744100145710ustar00rootroot00000000000000\section fg fg - bring job to foreground \subsection fg-synopsis Synopsis fg [PID] \subsection fg-description Description \c fg brings the specified job to the foreground, resuming it if it is stopped. While a foreground job is executed, fish is suspended. If no job is specified, the last job to be used is put in the foreground. If PID is specified, the job with the specified group ID is put in the foreground. The PID of the desired process is usually found by using process expansion. \subsection fg-example Example fg \%1 will put the job with job ID 1 in the foreground. fish/doc_src/fish.txt000066400000000000000000000026241214535744100151270ustar00rootroot00000000000000\section fish fish - the friendly interactive shell \subsection fish-synopsis Synopsis fish [-h] [-v] [-c command] [FILE [ARGUMENTS...]] \subsection fish-description Description \c fish is a command-line shell written mainly with interactive use in mind. The full manual is available in HTML by using the help command from inside fish. The following options are available: - -c or --command=COMMANDS evaluate the specified commands instead of reading from the commandline - -d or --debug-level=DEBUG_LEVEL specify the verbosity level of fish. A higher number means higher verbosity. The default level is 1. - -h or --help display help and exit - -i or --interactive specify that fish is to run in interactive mode - -l or --login specify that fish is to run as a login shell - -n or --no-execute do not execute any commands, only perform syntax checking - -p or --profile=PROFILE_FILE when fish exits, output timing information on all executed commands to the specified file - -v or --version display version and exit The fish exit status is generally the exit status of the last foreground command. If fish is exiting because of a parse error, the exit status is 127. fish/doc_src/fish_config.txt000066400000000000000000000015241214535744100164520ustar00rootroot00000000000000\section fish_config fish_config - start the web-based configuration interface \subsection fish_config-description Description \c fish_config starts the web-based configuration interface. The web interface allows you to view your functions, variables and history, and to make changes to your prompt and color configuration. \c fish_config starts a local web server and then opens a web browser window; when you have finished, close the browser window and then press the Enter key to terminate the configuration session. There are no parameters for fish_config. If the \c BROWSER environment variable is set, it will be used as the name of the web browser to open instead of the system default. \subsection fish_config-example Example \c fish_config opens a new web browser window and allows you to configure certain fish settings. fish/doc_src/fish_indent.txt000066400000000000000000000011131214535744100164600ustar00rootroot00000000000000\section fish_indent fish_indent - indenter and prettifier \subsection fish_indent-synopsis Synopsis fish_indent [options] \subsection fish_indent-description Description \c fish_indent is used to indent a piece of fish code. \c fish_indent reads commands from standard input and outputs them to standard output. The following options are available: - -h or --help displays this help message and then exits - -i or --no-indent do not indent commands - -v or --version displays the current fish version and then exits fish/doc_src/fish_pager.txt000066400000000000000000000003701214535744100163010ustar00rootroot00000000000000\section fish_pager fish_pager - internal command used by fish \subsection fish_pager-description Description \c fish_pager is used internally by fish. It should not be used by other commands, as its interface is liable to change in the future. fish/doc_src/fish_prompt.txt000066400000000000000000000016371214535744100165330ustar00rootroot00000000000000\section fish_prompt fish_prompt - define the appearance of the command line prompt \subsection fish_prompt-synopsis Synopsis
function fish_prompt
    ...
end
\subsection fish_prompt-description Description By defining the \c fish_prompt function, the user can choose a custom prompt. The \c fish_prompt function is executed when the prompt is to be shown, and the output is used as a prompt. The exit status of commands within \c fish_prompt will not modify the value of $status outside of the \c fish_prompt function. \c fish ships with a number of example prompts that can be chosen with the \c fish_config command. \subsection fish_prompt-example Example A simple prompt:
function fish_prompt -d "Write out the prompt"
	printf '\%s\@\%s\%s\%s\%s> ' (whoami) (hostname|cut -d . -f 1) (set_color \$fish_color_cwd) (prompt_pwd) (set_color normal)
end
fish/doc_src/fish_right_prompt.txt000066400000000000000000000011311214535744100177150ustar00rootroot00000000000000\section fish_right_prompt fish_right_prompt - define the appearance of the right-side command line prompt \subsection fish_right_prompt-synopsis Synopsis
function fish_right_prompt
    ...
end
\subsection fish_right_prompt-description Description \c fish_right_prompt is similar to \c fish_prompt, except that it appears on the right side of the terminal window. Multiple lines are not supported in \c fish_right_prompt. \subsection fish_prompt-example Example A simple right prompt:
function fish_right_prompt -d "Write out the right prompt"
    date "+%m/%d/%y"
end
fish/doc_src/fish_update_completions.txt000066400000000000000000000006471214535744100211100ustar00rootroot00000000000000\section fish_update_completions fish_update_completions - Update completions using manual pages \subsection fish_update_completions-description Description \c fish_update_completions parses manual pages installed on the system, and attempts to create completion files in the \c fish configuration directory. This does not overwrite custom completions. There are no parameters for fish_update_completions. fish/doc_src/fishd.txt000066400000000000000000000023521214535744100152710ustar00rootroot00000000000000\section fishd fishd - universal variable daemon \subsection fishd-synopsis Synopsis fishd [(-h|--help|-v|--version)] \subsection fishd-description Description The \c fishd daemon is used to load, save and distribute universal variable information. \c fish automatically connects to \c fishd via a socket on startup. \c fishd is started and stopped automatically. The following options are available if starting \c fishd manually: - -h or --help displays this help message and then exits - -v or --version displays the current fish version and then exits \subsection fishd-files Files - \c ~/.config/fish/fishd.MACHINE_ID - permanent storage location for universal variable data. \c MACHINE_ID is generally based on the machine's MAC address. The data is stored as a set of \c set and \c set_export commands such as would be parsed by fishd. The file must always be stored in YAML format. If an instance of fishd is running (which is generally the case), manual modifications to \c ~/.fishd.MACHINE_ID will be lost. Do NOT edit this file manually! - \c /tmp/fishd.socket.USERNAME - the socket which fishd uses to communicate with all clients. - /tmp/fishd.log.USERNAME - the fishd log file fish/doc_src/for.txt000066400000000000000000000011301214535744100147530ustar00rootroot00000000000000\section for for - perform a set of commands multiple times. \subsection for-synopsis Synopsis for VARNAME in [VALUES...]; COMMANDS...; end \subsection for-description Description for is a loop construct. It will perform the commands specified by \c COMMANDS multiple times. On each iteration, the environment variable specified by \c VARNAME is assigned a new value from \c VALUES. If \c VALUES is empty, \c COMMANDS will not be executed at all. \subsection for-example Example The command for i in foo bar baz; echo $i; end would output:
foo
bar
baz
fish/doc_src/funced.txt000066400000000000000000000014351214535744100154410ustar00rootroot00000000000000\section funced funced - edit a function interactively \subsection funced-synopsis Synopsis funced [OPTIONS] NAME \subsection funced-description Description \c funced provides an interface to edit the definition of the function NAME. If the \c $EDITOR environment variable is set, it will be used as the program to edit the function. Otherwise, a built-in editor will be used. If there is no function called \c NAME a new function will be created with the specified name - -e command or --editor command Open the function body inside the text editor given by the command (for example, "vi"). The command 'fish' will use the built-in editor. - -i or --interactive Open function body in the built-in editor. fish/doc_src/funcsave.txt000066400000000000000000000007651214535744100160140ustar00rootroot00000000000000\section funcsave funcsave - save the definition of a function to the user's autoload directory \subsection funcsave-synopsis Synopsis funcsave FUNCTION_NAME \subsection funcsave-description Description \c funcsave saves the current definition of a function to a file in the fish configuration directory. This function will be automatically loaded by current and future fish sessions. This can be useful if you have interactively created a new function and wish to save it for later use. fish/doc_src/function.txt000066400000000000000000000052121214535744100160170ustar00rootroot00000000000000\section function function - create a function \subsection function-synopsis Synopsis function [OPTIONS] NAME; BODY; end \subsection function-description Description \c function creates a new function \c NAME with the body BODY. A function is a list of commands that will be executed when the name of the function is given as a command. The following options are available: - -d DESCRIPTION or \c --description=DESCRIPTION is a description of what the function does, suitable as a completion description. - -e or --on-event EVENT_NAME tells fish to run this function when the specified named event is emitted. Fish internally generates named events e.g. when showing the prompt. - -j PID or --on-job-exit PID tells fish to run this function when the job with group ID PID exits. Instead of PID, the string 'caller' can be specified. This is only legal when in a command substitution, and will result in the handler being triggered by the exit of the job which created this command substitution. - -p PID or --on-process-exit PID tells fish to run this function when the fish child process with process ID PID exits. - -s or --on-signal SIGSPEC 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). - -v or --on-variable VARIABLE_NAME tells fish to run this function when the variable VARIABLE_NAME changes value. If the user enters any additional arguments after the function, they are inserted into the environment variable array $argv. By using one of the event handler switches, a function can be made to run automatically at specific events. The user may generate new events using the emit builtin. Fish generates the following named events: - \c fish_prompt, which is emitted whenever a new fish prompt is about to be displayed. - \c fish_command_not_found, which is emitted whenever a command lookup failed. \subsection function-example Example
function ll
	ls -l $argv
end
will run the \c ls command, using the \c -l option, while passing on any additional files and switches to \c ls.
function mkdir -d "Create a directory and set CWD"
	command mkdir $argv
	if test $status = 0
		switch $argv[(count $argv)]
			case '-*'

			case '*'
				cd $argv[(count $argv)]
				return
		end
	end
end
will run the mkdir command, and if it is successful, change the current working directory to the one just created. fish/doc_src/functions.txt000066400000000000000000000043321214535744100162040ustar00rootroot00000000000000\section functions functions - print or erase functions \subsection function-synopsis Synopsis
functions [-n]
functions -c OLDNAME NEWNAME
functions -d DESCRIPTION FUNCTION
functions [-eq] FUNCTIONS...
\subsection functions-description Description \c functions prints or erases functions. The following options are available: - -a or --all lists all functions, even those whose name start with an underscore. - -c OLDNAME NEWNAME or --copy OLDNAME NEWNAME creates a new function named NEWNAME, using the definition of the OLDNAME function. - -d DESCRIPTION or --description=DESCRIPTION changes the description of this function. - -e or --erase causes the specified functions to be erased. - -h or --help displays a help message and exits. - -n or --names lists the names of all defined functions. - -q or --query tests if the specified functions exist. The default behavior of functions, when called with no arguments, is to print the names of all defined functions. Unless the \c -a option is given, no functions starting with underscores are not included in the output. If any non-option parameters are given, the definition of the specified functions are printed. Automatically loaded functions cannot be removed using functions -e. Either remove the definition file or change the $fish_function_path variable to remove autoloaded functions. Copying a function using \c -c copies only the body of the function, and does not attach any event notifications from the original function. Only one function's description can be changed in a single invocation of functions -d. The exit status of \c functions is the number of functions specified in the argument list that do not exist, which can be used in concert with the \c -q option. \subsection functions-example Examples functions -n displays a list of currently-defined functions. functions -c foo bar copies the \c foo function to a new function called bar. functions -e bar erases the function bar. fish/doc_src/help.txt000066400000000000000000000011461214535744100151240ustar00rootroot00000000000000\section help help - display fish documentation \subsection help-synopsis Synopsis help [SECTION] \subsection help-description Description \c help displays the fish help documentation. If a \c SECTION is specified, the help for that command is shown. If the BROWSER environment variable is set, it will be used to display the documentation. Otherwise, fish will search for a suitable browser. Note that most builtin commands display their help in the terminal when given the --help option. \subsection help-example Example help fg shows the documentation for the \c fg builtin. fish/doc_src/history.txt000066400000000000000000000032371214535744100157000ustar00rootroot00000000000000\section history history - Show and manipulate command history \subsection history-synopsis Synopsis
history (--save | --clear)
history (--search | --delete ) (--prefix "prefix string" | --contains "search string")
\subsection history-description Description \c history is used to list, search and delete the history of commands used. The following options are available: - \c --save saves all changes in the history file. The shell automatically saves the history file; this option is provided for internal use. - \c --clear clears the history file. A prompt is displayed before the history is erased. - \c --search returns history items in keeping with the \c --prefix or \c --contains options. - \c --delete deletes history items. - \c --prefix searches or deletes items in the history that begin with the specified text string. - \c --contains searches or deletes items in the history that contain the specified text string. If \c --search is specified without \c --contains or --prefix, \c --contains will be assumed. If \c --delete is specified without \c --contains or --prefix, only a history item which exactly matches the parameter will be erased. No prompt will be given. If \c --delete is specified with either of these parameters, an interactive prompt will be displayed before any items are deleted. \subsection history-examples Example history --clear deletes all history items history --search --contains "foo" outputs a list of all previous commands containing the string "foo". history --delete --prefix "foo" interactively deletes the record of previous commands which start with "foo". fish/doc_src/if.txt000066400000000000000000000024241214535744100145720ustar00rootroot00000000000000\section if if - conditionally execute a command \subsection if-synopsis Synopsis if CONDITION; COMMANDS_TRUE...; [else if CONDITION2; COMMANDS_TRUE2...;] [else; COMMANDS_FALSE...;] end \subsection if-description Description if will execute the command \c CONDITION. If the condition's exit status is 0, the commands \c COMMANDS_TRUE will execute. If the exit status is not 0 and else is given, \c COMMANDS_FALSE will be executed. In order to use the exit status of multiple commands as the condition of an if block, use begin; ...; end and the short circuit commands and and or. The exit status of the last foreground command to exit can always be accessed using the $status variable. \subsection if-example Example
if test -f foo.txt
	echo foo.txt exists
else if test -f bar.txt
	echo bar.txt exists
else
	echo foo.txt and bar.txt do not exist
end
will print foo.txt exists if the file foo.txt exists and is a regular file, otherwise it will print bar.txt exists if the file bar.txt exists and is a regular file, otherwise it will print foo.txt and bar.txt do not exist. fish/doc_src/index.hdr.in000066400000000000000000002014271214535744100156520ustar00rootroot00000000000000/** \mainpage Fish user documentation \section toc Table of contents - Fish user documentation @toc@ \section introduction Introduction 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 fish homepage. \section syntax Syntax overview Shells like fish are used by giving them commands. Every \c fish command follows the same simple syntax. A command is executed by writing the name of the command followed by any arguments. Example: echo hello world 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 'hello world'. Everything in fish is done with commands. There are commands for performing a set of commands multiple times, commands for assigning variables, commands for treating a group of commands as a single command, etc.. And every single command follows the same simple syntax. If you want to find out more about the echo command used above, read the manual page for the echo command by writing: man echo \c man is a command for displaying a manual page on a given topic. The man command takes the name of the manual page to display as an argument. There are manual pages for almost every command on most computers. There are also manual pages for many other things, such as system libraries and important files. Every program on your computer can be used as a command in \c fish. If the program file is located in one of the directories in the PATH, it is sufficient to type the name of the program to use it. Otherwise the whole filename, including the directory (like \c /home/me/code/checkers/checkers or ../checkers) has to be used. Here is a list of some useful commands: - \c cd, change the current directory - \c ls, list files and directories - \c man, display a manual page on the screen - \c mv, move (rename) files - \c cp, copy files - \c open, open files with the default application associated with each filetype - \c less, list the contents of files Commands and parameters are separated by the space character ( ). Every command ends with either a newline (i.e. by pressing the return key) or a semicolon (;). More than one command can be written on the same line by separating them with semicolons. A switch is a very common special type of argument. Switches almost always start with one or more hyphens (-) and alter the way a command operates. For example, the \c ls command usually lists all the files and directories in the current working directory, but by using the \c -l switch, the behavior of ls is changed to not only display the filename, but also the size, permissions, owner and modification time of each file. Switches differ between commands and are documented in the manual page for each command. Some switches are common to most command though, for example '--help' will usually display a help text, '-i' will often turn on interactive prompting before taking action, while '-f' will turn it off. \subsection quotes Quotes Sometimes features such as parameter expansion and character escapes get in the way. When that happens, the user can write a parameter within quotes, either ' (single quote) or " (double quote). There is one important difference between single quoted and double quoted strings: When using double quoted string, variable expansion still takes place. Other than that, a quoted parameter will not be parameter expanded, may contain spaces, and escape sequences are ignored. The only backslash escape accepted within single quotes is \\', which escapes a single quote and \\\\, which escapes the backslash symbol. The only backslash escapes accepted within double quotes are \\", which escapes a double quote, \\$, which escapes a dollar character, \\ followed by a newline, which deletes the backslash and the newline, and lastly \\\\, which escapes the backslash symbol. Single quotes have no special meaning within double quotes and vice versa. Example: rm "cumbersome filename.txt" Will remove the file 'cumbersome filename.txt', while rm cumbersome filename.txt would remove the two files 'cumbersome' and 'filename.txt'. \subsection escapes Escaping characters Some characters can not be written directly on the command line. For these characters, so called escape sequences are provided. These are: - '\\a' escapes the alert character - '\\b' escapes the backspace character - '\\e' escapes the escape character - '\\f' escapes the form feed character - '\\n' escapes a newline character - '\\r' escapes the carriage return character - '\\t' escapes the tab character - '\\v' escapes the vertical tab character - '\\ ' escapes the space character - '\\$' escapes the dollar character - '\\\\' escapes the backslash character - '\\*' escapes the star character - '\\?' escapes the question mark character - '\\~' escapes the tilde character - '\\%%' escapes the percent character - '\\#' escapes the hash character - '\\(' escapes the left parenthesis character - '\\)' escapes the right parenthesis character - '\\{' escapes the left curly bracket character - '\\}' escapes the right curly bracket character - '\\[' escapes the left bracket character - '\\]' escapes the right bracket character - '\\\<' escapes the less than character - '\\\>' escapes the more than character - '\\^' escapes the circumflex character - '\\&' escapes the ampersand character - '\\;' escapes the semicolon character - '\\"' escapes the quote character - '\\'' escapes the apostrophe character - '\\xxx', where xx is a hexadecimal number, escapes the ascii character with the specified value. For example, \\x9 is the tab character. - '\\Xxx', where xx 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. - '\\ooo', where ooo is an octal number, escapes the ascii character with the specified value. For example, \\011 is the tab character. - '\\uxxxx', where xxxx is a hexadecimal number, escapes the 16-bit Unicode character with the specified value. For example, \\u9 is the tab character. - '\\Uxxxxxxxx', where xxxxxxxx is a hexadecimal number, escapes the 32-bit Unicode character with the specified value. For example, \\U9 is the tab character. - '\\cx', where x is a letter of the alphabet, escapes the control sequence generated by pressing the control key and the specified letter. For example, \\ci is the tab character \subsection redirects Input/Output (IO) redirection Most programs use three input/output (IO) streams, each represented by a number called a file descriptor (FD). These are: - Standard input, FD 0, for reading, defaults to reading from the keyboard. - 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 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 its default through a simple mechanism called a redirection. An example of a file redirection is echo hello \>output.txt, which directs the output of the echo command to the file output.txt. - To redirect standard input, write \ - To redirect standard output, write \>DESTINATION - To redirect standard error, write ^DESTINATION - To redirect standard output to a file which will be appended, write \>\>DESTINATION_FILE - To redirect standard error to a file which will be appended, write ^^DESTINATION_FILE DESTINATION 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. - 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 echo Hello \>all_output.txt ^\&1. 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 N\ - To redirect output of FD number N, write N\>DESTINATION - To redirect output of FD number N to a file which will be appended, write N\>\>DESTINATION_FILE Example: echo Hello 2\>- and echo Hello ^- are equivalent. \subsection piping Piping The user can string together multiple commands into a so called 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 cat foo.txt | head 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 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 man cat. Pipes usually connect file descriptor 1 (standard output) of the first process to file descriptor 0 (standard input) of the second 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: make fish 2>|less will attempt to build the fish program, and any errors will be shown using the less pager. \subsection syntax-background Background jobs When you start a job in \c fish, \c fish itself will pause, and give control of the terminal to the program just started. Sometimes, you want to continue using the commandline, and have the job run in the background. To create a background job, append an \& (ampersand) to your command. This will tell fish to run the job in the background. Background jobs are very useful when running programs that have a graphical user interface. Example: emacs \& will start the emacs text editor in the background. \subsection syntax-job-control Job control Most programs allow you to suspend the program's 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 programs and do anything you want. If you then want you can go back to the suspended command by using the fg (foreground) command. If you instead want to put a suspended job into the background, use the bg command. To get a listing of all currently started jobs, use the jobs command. \subsection syntax-function Functions Functions are programs written in the fish syntax. They group together one or more commands and their arguments using a single name. It can also be used to start a specific command with additional arguments. For example, the following is a function definition that calls the command \c ls with the argument '-l' to print a detailed listing of the contents of the current directory:
function ll
	ls -l $argv
end
The first line tells fish that a function by the name of \c ll is to be defined. To use it, simply write ll on the commandline. The second line tells fish that the command ls -l $argv should be called when ll is invoked. $argv is an array variable, which always contains all arguments sent to the function. In the example above, these are simply passed on to the ls command. For more information on functions, see the documentation for the function builtin. \subsubsection syntax-function-wrappers Defining aliases One of the most common uses for functions is to slightly alter the behavior of an already existing command. For example, one might want to redefine the \c ls command to display colors. The switch for turning on colors on GNU systems is \c '--color=auto'. An alias, or wrapper, around \c ls might look like this:
function ls
	command ls --color=auto $argv
end
There are a few important things that need to be noted about aliases: - Always take care to add the \c $argv variable to the list of parameters to the wrapped command. This makes sure that if the user specifies any additional parameters to the function, they are passed on to the underlying command. - If the alias has the same name as the aliased command, it is necessary to prefix the call to the program with \c command in order to tell fish that the function should not call itself, but rather a command with the same name. Failing to do so will cause infinite recursion bugs. To easily create a function of this form, you can use the alias command. \subsubsection syntax-function-autoloading Autoloading functions Functions can be defined on the commandline or in a configuration file, but they can also be automatically loaded. This method of defining functions has several advantages. An autoloaded function becomes available automatically to all running shells. If the function definition is changed, all running shells will automatically reload the altered version. Startup time and memory usage is improved, etc. Fish automatically searches through any directories in the array variable \c $fish_function_path, and any functions defined are automatically loaded when needed. A function definition file must have a filename consisting of the name of the function plus the suffix '.fish'. The default value for \c $fish_function_path is ~/.config/fish/functions /etc/fish/functions /usr/share/fish/functions. The exact path to the last two of these may be slightly different depending on what install path prefix was chosen at configuration time. The rationale behind having three different directories is that the first one is for user specific functions, the second one is for system-wide additional functions and the last one is for default fish functions. The path list is searched in order, meaning that by default, the system administrator can override default fish functions, and the user can override functions defined by the system administrator. It is very important that function definition files only contain the definition for the specified function and nothing else. Otherwise, it is possible that autoloading a function files requires that the function already be loaded, which creates a circular dependency. \subsection syntax-conditional Conditional execution of code and flow control There are four fish builtins that let you execute commands only if a specific criterion is met. These builtins are if, switch, and and or. The \c switch command is used to execute one of possibly many blocks of commands depending on the value of a string. See the documentation for switch for more information. The other conditionals use the exit status of a command to decide if a command or a block of commands should be executed. See the documentation for if, and and or for more information. \subsection syntax-words Some common words 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 in the shell. Builtins are commands that are so closely tied to the shell that it is impossible to implement them as external commands. - command, a program that the shell can run. - function, a block of commands that can be called as if they where 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 - pipeline, a set of commands stringed together so that the output of one command is the input of the next command - redirection, a operation that changes one of the input/output streams associated with a job - switch, a special flag sent as an argument to a command that will alter the behavior of the command. A switch almost always begins with one or two hyphens. \section help Help \c fish has an extensive help system. Use the help command to obtain help on a specific subject or command. For instance, writing help syntax displays the syntax section of this documentation. fish also has man pages for its commands. For example, man set will show the documentation for \c set as a man page. Help on a specific builtin can also be obtained with the -h parameter. For instance, to obtain help on the \c fg builtin, either type fg -h or help fg. \section completion Tab completion Tab completion is one of the most time saving features of any modern shell. By tapping the tab key, the user asks \c fish to guess the rest of the command or parameter that the user is currently typing. If \c fish can only find one possible completion, \c fish will write it out. If there is more than one completion, \c fish will write out the longest prefix that all completions have in common. If the completions differ on the first character, a list of all possible completions is printed. The list features descriptions of the completions and if the list doesn't fit the screen, it is scrollable by using the arrow keys, the page up/page down keys, the tab key or the space bar. Pressing any other key will exit the list and insert the pressed key into the command line. These are the general purpose tab completions that \c fish provides: - Completion of commands (builtins, functions and regular programs). - Completion of environment variable names. - Completion of usernames for tilde expansion. - Completion of filenames, even on strings with wildcards such as '*', '**' and '?'. - Completion of job ID, job name and process names for process expansion. \c fish provides a large number of program specific completions. Most of these completions are simple options like the \c -l option for \c ls, but some are more advanced. The latter include: - The programs \c man and \c whatis show all installed manual pages as completions. - The \c make program uses all targets in the Makefile in the current directory as completions. - The \c mount command uses all mount points specified in fstab as completions. - The \c ssh command uses all hosts that are stored in the known_hosts file as completions. (See the ssh documentation for more information) - The \c su command uses all users on the system as completions. - The \c apt-get, \c rpm and \c yum commands use all installed packages as completions. \subsection completion-own Writing your own completions Specifying your own completions is not difficult. 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 complete -c myprog .... 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 complete -c myprog -a 'start stop'. 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. Fish has a special syntax to support specifying switches accepted by a command. The switches \c -s, \c -l and \c -o are used to specify a short switch (single character, such as -l), a gnu style long switch (such as --color) and an old-style long switch (like -shuffle), 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: complete -c myprog -s o -l output -a "yes no" There are also special switches for specifying that a switch requires an argument, to disable filename completion, to create completions that are only available in some combinations, etc.. For a complete description of the various switches accepted by the \c complete command, see the documentation for the complete builtin, or write 'complete --help' inside the \c fish shell. For examples of how to write your own complex completions, study the completions in \c /usr/share/fish/completions. (The exact path depends on your chosen installation prefix and may be slightly different) \subsection completion-func Useful functions for writing completions Fish ships with several functions that are very useful when writing command specific completions. Most of these functions name begins with the string '__fish_'. Such functions are internal to fish and their name and interface may change in future fish versions. Still, some of them may be very useful when writing completions. A few of these functions are described here. Be aware that they may be removed or changed in future versions of fish. Functions beginning with the string '__fish_print_' print a newline-separated list of strings. For example, __fish_print_filesystems prints a list of all known file systems. Functions beginning with '__fish_complete_' print out a newline separated list of completions with descriptions. The description is separated from the completion by a tab character.
__fish_complete_directories STRING DESCRIPTION
performs path completion on STRING, allowing only directories, and giving them the description DESCRIPTION.
__fish_complete_groups
prints a list of all user groups with the groups members as description.
__fish_complete_pids
prints a list of all processes IDs with the command name as description.
__fish_complete_suffix SUFFIX
performs file completion allowing only files ending in SUFFIX. The mimetype database is used to find a suitable description.
__fish_complete_users
prints a list of all users with their full name as description.
__fish_print_filesystems
prints a list of all known file systems. Currently, this is a static list, and not dependent on what file systems the host operating system actually understands.
__fish_print_hostnames
prints a list of all known hostnames. This functions searches the fstab for nfs servers, ssh for known hosts and checks the /etc/hosts file.
__fish_print_interfaces
prints a list of all known network interfaces.
__fish_print_packages
prints a list of all installed packages. This function currently handles Debian, rpm and Gentoo packages. \subsection completion-path Where to put completions Completions can be defined on the commandline or in a configuration file, but they can also be automatically loaded. Fish automatically searches through any directories in the array variable \c $fish_complete_path, and any completions defined are automatically loaded when needed. A completion file must have a filename consisting of the name of the command to complete and the suffix '.fish'. The default value for \c $fish_complete_path is ~/.config/fish/completions /etc/fish/completions /usr/share/fish/completions. The exact path to the last two of these may be slightly different depending on what install path prefix was chosen at configuration time. If a suitable file is found in one of these directories, it will be automatically loaded and the search will be stopped. The rationale behind having three different directories is that the first one is for user specific completions, the second one is for system-wide completions and the last one is for default fish completions. If you have written new completions for a common Unix command, please consider sharing your work by submitting it via the instructions in Further help and development. \section expand Parameter expansion (Globbing) When an argument for a program is given on the commandline, it undergoes the process of parameter expansion before it is sent on to the command. Parameter expansion is a powerful mechanism that allows you to expand the parameter in various ways, including performing wildcard matching on files, inserting the value of environment variables into the parameter or even using the output of another command as a parameter list. \subsection expand-wildcard Wildcards If a star (*) or a question mark (?) is present in the parameter, \c fish attempts to match the given parameter to any files in such a way that: - '?' can match any single character except '/'. - '*' can match any string of characters not containing '/'. This includes matching an empty string. - '**' matches any string of characters. This includes matching an empty string. The string may include the '/' character but does not need to. Wildcard matches are sorted case insensitively. When sorting matches containing numbers, consecutive digits are considered to be one element, so that the strings '1' '5' and '12' would be sorted in the order given. File names beginning with a dot are not considered when wildcarding unless a dot is specifically given as the first character of the file name. Examples: a* matches any files beginning with an 'a' in the current directory. ??? matches any file in the current directory whose name is exactly three characters long. ** matches any files and directories in the current directory and all of its subdirectories. Note that if no matches are found for a specific wildcard, it will expand into zero arguments, i.e. to nothing. If none of the wildcarded arguments sent to a command result in any matches, the command will not be executed. If this happens when using the shell interactively, a warning will also be printed. \subsection expand-command-substitution Command substitution The output of a series of commands can be used as the parameters to another command. If a parameter contains a set of parenthesis, the text enclosed by the parenthesis will be interpreted as a list of commands. On expansion, this list is executed, and substituted by the output. If the output is more than one line long, each line will be expanded to a new parameter. The exit status of the last run command substitution is available in the status variable. Only part of the output can be used, see index range expansion for details. Examples: The command echo (basename image.jpg .jpg).png will output 'image.png'. The command for i in *.jpg; convert $i (basename $i .jpg).png; end will convert all JPEG files in the current directory to the PNG format using the \c convert program. \subsection expand-brace Brace expansion A comma separated list of characters enclosed in curly braces will be expanded so each element of the list becomes a new parameter. Example: echo input.{c,h,txt} outputs 'input.c input.h input.txt' The command mv *.{c,h} src/ moves all files with the suffix '.c' or '.h' to the subdirectory src. \subsection expand-variable Variable expansion A dollar sign followed by a string of characters is expanded into the value of the environment variable with the same name. For an introduction to the concept of environment variables, read the Environment variables section. Undefined and empty variables expand to nothing. To separate a variable name from text it should immediately be followed by, encase the variable within braces. Examples: echo $HOME prints the home directory of the current user. echo $nonexistentvariable prints no output. echo The plural of $WORD is {$WORD}s prints "The plural of cat is cats" when \c $WORD is set to cat. Note that without the braces, fish will try to expand a variable called $WORDs, which may not exist. The latter syntax works by exploiting brace expansion; care should be taken with array variables and undefined variables, as these behave very differently to POSIX shells. Variable expansion is the only type of expansion performed on double quoted strings. There is, however, an important difference in how variables are expanded when quoted and when unquoted. An unquoted variable expansion will result in a variable number of arguments. For example, if the variable $foo has zero elements or is undefined, the argument $foo will expand to zero elements. If the variable $foo is an array of five elements, the argument $foo will expand to five elements. When quoted, like "$foo", a variable expansion will always result in exactly one argument. Undefined variables will expand to the empty string, and array variables will be concatenated using the space character. The dangers noted in the third example above can therefore be avoided by wrapping the variable in double quotes (echo {"$WORD"}s). There is one further notable feature of fish variable expansion. Consider the following code snippet:
set foo a b c
set a 10; set b 20; set c 30
for i in (seq (count $$foo))
	echo $$foo[$i]
end
# Output is:
# 10
# 20
# 30
The above code demonstrates how to use multiple '$' symbols to expand the value of a variable as a variable name. One can think of the $ symbol as a variable dereference operator. When using this feature together with array brackets, the brackets will always match the innermost $ dereference. Thus, $$foo[5] will always mean the fifth element of the \c foo variable should be dereferenced, not the fifth element of the doubly dereferenced variable \c foo. The latter can instead be expressed as $$foo[1][5]. \subsection expand-index-range Index range expansion Both command substitution and environment variables support accessing only specific items by providing a set of indices in square brackets. It's often needed to access a sequence of elements. To do this, use the range operator '..' for this. A range 'a..b', where range limits 'a' and 'b' are integer numbers, is expanded into a sequence of indices 'a a+1 a+2 ... b' or 'a a-1 a-2 ... b' depending on which of 'a' or 'b' is higher. The negative range limits are calculated from the end of the array or command substitution. Some examples:
# Limit the command substitution output
echo (seq 10)[2..5] # will use elements from 2 to 5
# Output is:
# 2 3 4 5

# Use overlapping ranges:
echo (seq 10)[2..5 1..3] # will take elements from 2 to 5 and then elements from 1 to 3 
# Output is:
# 2 3 4 5 1 2 3

# Reverse output
echo (seq 10)[-1..1] # will use elements from the last output line to the first one in reverse direction
# Output is:
# 10 9 8 7 6 5 4 3 2 1
The same works when setting or expanding variables:
# Reverse path variable
set PATH $PATH[-1..1]
# or 
set PATH[-1..1] $PATH

# Use only n last items of the PATH
set n -3
echo $PATH[$n..-1]
Note that variables can be used as indices for expansion of variables, but not command substitution. \subsection expand-home Home directory expansion The ~ (tilde) character at the beginning of a parameter, followed by a username, is expanded into the home directory of the specified user. A lone ~, or a ~ followed by a slash, is expanded into the home directory of the process owner. \subsection expand-process Process expansion The \% (percent) character at the beginning of a parameter followed by a string is expanded into a process ID (PID). The following expansions are performed: - If the string is the entire word \c self, the shell's PID is the result. - Otherwise, if the string is the ID of a job, the result is the process group ID of the job. - Otherwise, if any child processes match the specified string, their PIDs are the result of the expansion. - Otherwise, if any processes owned by the user match the specified string, their PIDs are the result of the expansion. - If none of these matches apply, an error is produced. This form of expansion is useful for commands like kill and fg, which take process IDs as arguments. Example: fg \%ema will search for a process whose command line begins with the letters 'ema', such as emacs, and if found, put it in the foreground. kill -s SIGINT \%3 will send the SIGINT signal to the job with job ID 3. \subsection combine Combining different expansions All of the above expansions can be combined. If several expansions result in more than one parameter, all possible combinations are created. When combining multiple parameter expansions, expansions are performed in the following order: - Command substitutions - Variable expansions - Bracket expansion - Pid expansion - Wildcard expansion Expansions are performed from right to left, nested bracket expansions are performed from the inside and out. Example: If the current directory contains the files 'foo' and 'bar', the command echo a(ls){1,2,3} will output 'abar1 abar2 abar3 afoo1 afoo2 afoo3'. \section variables Environment variables Environment variables are named pieces of data, which can be created, deleted and their values changed and used by the user. To set a variable value, use the \c set command. Example: To set the variable \c smurf_color to the value \c blue, use the command set smurf_color blue. After a variable has been set, you can use the value of a variable in the shell through variable expansion. Example: To use the value of the variable \c smurf, write $ (dollar symbol) followed by the name of the variable, like echo Smurfs are usually $smurf_color, which would print the result 'Smurfs are usually blue'. \subsection variables-scope Variable scope There are three kinds of variables in fish: universal, global and 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 set -e. 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 begins with one of the commands \c for, \c while , \c if, \c function, \c begin or \c switch, and ends with the command \c end. The user can specify that a variable should have either global or local scope using the \c -g/--global or \c -l/--local switches. Variables can be explicitly set to be universal with the \c -U or \c --universal switch, global with the \c -g or \c --global switch, or local with the \c -l or \c --local switch. The scoping rules when creating or updating a variable are: -# If a variable is explicitly set to either universal, global or local, that setting will be honored. If a variable of the same name exists in a different scope, that variable will not be changed. -# If a variable is not explicitly set to be either universal, global or local, but has been previously defined, the variable scope is not changed. -# If a variable is not explicitly set to be either universal, global or local and has never before been defined, the variable will be local to the currently executing function. Note that this is different from using the \c -l or \c --local flag. If one of those flags is used, the variable will be local to the most inner currently executing block, while without these the variable will be local to the function. If no function is executing, the variable will be global. There may be many variables with the same name, but different scopes. When using a variable, the variable scope will be searched from the inside out, i.e. a local variable will be used rather than a global variable with the same name, a global variable will be used rather than a universal variable with the same name. Example: The following code will not output anything:
begin
	# This is a nice local scope where all variables will die
	set -l pirate 'There be treasure in them thar hills'
end

# This will not output anything, since the pirate was local
echo $pirate
\subsection variables-universal More on universal variables Universal variables are variables that are shared between all the users fish sessions on the computer. Fish stores many of its configuration options as universal variables. This means that in order to change fish settings, all you have to do is change the variable 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 set fish_color_cwd blue. 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. \subsection variables-functions Variable scope for functions When calling a function, all current local variables temporarily disappear. This shadowing of the local scope is needed since the variable namespace would become cluttered, making it very easy to accidentally overwrite variables from another function. For example, the following code will output 'Avast, mateys':
function shiver
	set phrase 'Shiver me timbers'
end

function avast
	set phrase 'Avast, mateys'

	# Calling the shiver function here can not change any variables
	# in the local scope
	shiver

	echo $phrase
end

avast
\subsection variables-export Exporting variables Variables in fish can be exported. This means the variable will be inherited by any commands started by fish. It is convention that exported variables are in uppercase and unexported variables are in lowercase. Variables can be explicitly set to be exported with the \c -x or \c --export switch, or not exported with the \c -u or \c --unexport switch. The exporting rules when creating or updating a variable are identical to the scoping rules for variables: -# If a variable is explicitly set to either be exported or not exported, that setting will be honored. -# If a variable is not explicitly set to be exported or not exported, but has been previously defined, the previous exporting rule for the variable is kept. -# If a variable is not explicitly set to be either exported or not exported and has never before been defined, the variable will not be exported. \subsection variables-arrays Arrays \c fish can store a list of multiple strings inside of a variable. To access one element of an array, use the index of the element inside of square brackets, like this:
echo $PATH[3]
Note that array indices start at 1 in fish, not 0, as is more common in other languages. This is because many common Unix tools like \c seq are more suited to such use. If you do not use any brackets, all the elements of the array will be written as separate items. This means you can easily iterate over an array using this syntax:
for i in $PATH; echo $i is in the path; end
To create a variable \c smurf, containing the items \c blue and \c small, simply write:
set smurf blue small
It is also possible to set or erase individual elements of an array:
\#Set smurf to be an array with the elements 'blue' and 'small'
set smurf blue small

\#Change the second element of smurf to 'evil'
set smurf[2] evil

\#Erase the first element
set -e smurf[1]

\#Output 'evil'
echo $smurf
If you specify a negative index when expanding or assigning to an array variable, the index will be calculated from the end of the array. For example, the index -1 means the last index of an array. A range of indices can be specified, see index range expansion for details. All arrays are one-dimensional and cannot contain other arrays, although it is possible to fake nested arrays using the dereferencing rules of variable expansion. \subsection variables-special Special variables The user can change the settings of \c fish by changing the values of certain environment variables. - \c BROWSER, the user's preferred web browser. If this variable is set, fish will use the specified browser instead of the system default browser to display the fish documentation. - \c CDPATH, an array of directories in which to search for the new directory for the \c cd builtin. By default, the fish configuration defines \c CDPATH to be a universal variable with the values \c . and \c ~. - A large number of variable starting with the prefixes \c fish_color and \c fish_pager_color. See Variables for changing highlighting colors for more information. - \c fish_greeting, the greeting message printed on startup. - \c LANG, \c LC_ALL, \c LC_COLLATE, \c LC_CTYPE, \c LC_MESSAGES, \c LC_MONETARY, \c LC_NUMERIC and \c LC_TIME set the language option for the shell and subprograms. See the section Locale variables for more information. - \c fish_user_paths, an array of directories that are appended to PATH. This can be a universal variable. - \c PATH, an array of directories in which to search for commands - \c umask, the current file creation mask. The preferred way to change the umask variable is through the umask function. An attempt to set umask to an invalid value will always fail. \c fish also sends additional information to the user through the values of certain environment variables. The user cannot change the values of most of these variables. - \c _, the name of the currently running command. - \c argv, an array of arguments to the shell or function. \c argv is only defined when inside a function call, or if fish was invoked with a list of arguments, like 'fish myscript.fish foo bar'. This variable can be changed by the user. - \c history, an array containing the last commands that were entered. - \c HOME, the user's home directory. This variable can only be changed by the root user. - \c PWD, the current working directory. - \c status, the exit status of the last foreground job to exit. If the job was terminated through a signal, the exit status will be 128 plus the signal number. - \c USER, the current username. This variable can only be changed by the root user. The names of these variables are mostly derived from the csh family of shells and differ from the ones used by Bourne style shells such as bash. Variables whose name are in uppercase are exported to the commands started by fish, while those in lowercase are not exported. This rule is not enforced by fish, but it is good coding practice to use casing to distinguish between exported and unexported variables. \c fish also uses several variables internally. Such variables are prefixed with the string \c __FISH or \c __fish. These should never be used by the user. Changing their value may break fish. \subsection variables-status The status variable Whenever a process exits, an exit status is returned to the program that started it (usually the shell). This exit status is an integer number, which tells the calling application how the execution of the command went. In general, a zero exit status means that the command executed without problem, but a non-zero exit status means there was some form of problem. Fish stores the exit status of the last process in the last job to exit in the \c status variable. If \c fish encounters a problem while executing a command, the status variable may also be set to a specific value: - 1 is the generally the exit status from fish builtin commands if they were supplied with invalid arguments - 124 means that the command was not executed because none of the wildcards in the command produced any matches - 125 means that while an executable with the specified name was located, the operating system could not actually execute the command - 126 means that while a file with the specified name was located, it was not executable - 127 means that no function, builtin or command with the given name could be located If a process exits through a signal, the exit status will be 128 plus the number of the signal. \subsection variables-color Variables for changing highlighting colors The colors used by fish for syntax highlighting can be configured by changing the values of a various variables. The value of these variables can be one of the colors accepted by the set_color command. The \c --bold or \c -b switches accepted by \c set_color are also accepted. The following variables are available to change the highlighting colors in fish: - \c fish_color_normal, the default color - \c fish_color_command, the color for commands - \c fish_color_quote, the color for quoted blocks of text - \c fish_color_redirection, the color for IO redirections - \c fish_color_end, the color for process separators like ';' and '&' - \c fish_color_error, the color used to highlight potential errors - \c fish_color_param, the color for regular command parameters - \c fish_color_comment, the color used for code comments - \c fish_color_match, the color used to highlight matching parenthesis - \c fish_color_search_match, the color used to highlight history search matches - \c fish_color_operator, the color for parameter expansion operators like '*' and '~' - \c fish_color_escape, the color used to highlight character escapes like '\\n' and '\\x70' - \c fish_color_cwd, the color used for the current working directory in the default prompt Additionally, the following variables are available to change the highlighting in the completion pager: - \c fish_pager_color_prefix, the color of the prefix string, i.e. the string that is to be completed - \c fish_pager_color_completion, the color of the completion itself - \c fish_pager_color_description, the color of the completion description - \c fish_pager_color_progress, the color of the progress bar at the bottom left corner - \c fish_pager_color_secondary, the background color of the every second completion Example: To make errors highlighted and red, use: set fish_color_error red --bold \subsection variables-locale Locale variables The most common way to set the locale to use a command like 'set -x LANG en_GB.utf8', which sets the current locale to be the English language, as used in Great Britain, using the UTF-8 character set. For a list of available locales, use 'locale -a'. \c LANG, \c LC_ALL, \c LC_COLLATE, \c LC_CTYPE, \c LC_MESSAGES, \c LC_MONETARY, \c LC_NUMERIC and LC_TIME set the language option for the shell and subprograms. These variables work as follows: \c LC_ALL forces all the aspects of the locale to the specified value. If LC_ALL is set, all other locale variables will be ignored. The other LC_ variables set the specified aspect of the locale information. LANG is a fallback value, it will be used if none of the LC_ variables are specified. \section builtin-overview Builtin commands Many other shells have a large library of builtin commands. Most of these commands are also available as standalone commands, but have been implemented in the shell anyway. To avoid code duplication, and to avoid the confusion of subtly differing versions of the same command, \c fish generally only implements builtins for actions which cannot be performed by a regular command. For a list of all builtins, functions and commands shipped with fish, see the table of contents. The documentation is also available by using the --help switch of the command. \section editor Command line editor The \c fish editor features copy and paste, a searchable history and many editor functions that can be bound to special keyboard shortcuts. Here are some of the commands available in the editor: - Tab completes the current token - Home or Ctrl-A moves to the beginning of the line - End or Ctrl-E moves to the end of line - Left and Right moves one character left or right - Alt-Left and Alt-Right moves one word left or right, or moves forward/backward in the directory history if the commandline is empty - Up and Down search the command history for the previous/next command containing the string that was specified on the commandline before the search was started. If the commandline was empty when the search started, all commands match. See the history section for more information on history searching. - Alt-Up and Alt-Down search the command history for the previous/next token containing the token under the cursor before the search was started. If the commandline was not on a token when the search started, all tokens match. See the history section for more information on history searching. - Delete and Backspace removes one character forwards or backwards respectively - Ctrl-C deletes entire line - Ctrl-D delete one character to the right of the cursor, unless the buffer is empty, in which case the shell will exit - Ctrl-K moves contents from the cursor to the end of line to the killring - Ctrl-U moves contents from the beginning of line to the cursor to the killring - Ctrl-L clears and repaints the screen - Ctrl-W moves the previous word to the killring - Alt-D moves the next word to the killring - Alt-W prints a short description of the command under the cursor - Alt-L lists the contents of the current directory, unless the cursor is over a directory argument, in which case the contents of that directory will be listed - Alt-P adds the string '| less;' to the end of the job under the cursor. The result is that the output of the command will be paged. You can change these key bindings using the bind builtin command. - \c backward-char, moves one character to the left - \c backward-delete-char, deletes one character of input to the left of the cursor - \c backward-kill-line, move everything from the beginning of the line to the cursor to the killring - \c backward-kill-word, move the word to the left of the cursor to the killring - \c backward-word, move one word to the left - \c beginning-of-history, move to the beginning of the history - \c beginning-of-line, move to the beginning of the line - \c complete, guess the remainder of the current token - \c delete-char, delete one character to the right of the cursor - \c delete-line, delete the entire line - \c dump-functions, print a list of all key-bindings - \c end-of-history, move to the end of the history - \c end-of-line, move to the end of the line - \c explain, print a description of possible problems with the current command - \c forward-char, move one character to the right - \c forward-word, move one word to the right - \c history-search-backward, search the history for the previous match - \c history-search-forward, search the history for the next match - \c kill-line, move everything from the cursor to the end of the line to the killring - \c kill-whole-line, move the line to the killring - \c kill-word, move the next word to the killring - \c yank, insert the latest entry of the killring into the buffer - \c yank-pop, rotate to the previous entry of the killring If such a script produces output, the script needs to finish by calling 'commandline -f repaint' in order to tell fish that a repaint is in order. \subsection killring Copy and paste (Kill Ring) \c fish uses an Emacs style kill ring for copy and paste functionality. Use Ctrl-K to cut from the current cursor position to the end of the line. The string that is cut (a.k.a. killed) is inserted into a linked list of kills, called the kill ring. To paste the latest value from the kill ring use Ctrl-Y. After pasting, use Meta-Y to rotate to the previous kill. If the environment variable DISPLAY is set and the \c xsel program is installed, \c fish will try to connect to the X Windows server specified by this variable, and use the clipboard on the X server for copying and pasting. \subsection history Searchable history After a command has been entered, it is inserted at the end of a history list. Any duplicate history items are automatically removed. By pressing the up and down keys, the user can search forwards and backwards in the history. If the current command line is not empty when starting a history search, only the commands containing the string entered into the command line are shown. By pressing Alt-Up and Alt-Down, a history search is also performed, but instead of searching for a complete commandline, each commandline is broken into separate elements just like it would be before execution, and the history is searched for an element matching that under the cursor. History searches can be aborted by pressing the escape key. Prefixing the commandline with a space will prevent the entire line from being stored in the history. The history is stored in the file ~/.config/fish/fish_history. Examples: To search for previous entries containing the word \c 'make', type \c 'make' in the console and press the up key. If the commandline reads 'cd m', place the cursor over the \c m character and press Alt-Up to search for previously typed words containing 'm'. \subsection multiline Multiline editing The fish commandline editor can be used to work on commands that are several lines long. There are three ways to make a command span more than a single line: - Pressing the Enter key while a block of commands is unclosed, such as when one or more block commands such as \c 'for', \c 'begin' or \c 'if' do not have a corresponding \c 'end' command. - Pressing Alt-Enter instead of pressing the Enter key. - By inserting a backslash (\\) character before pressing the Enter key, escaping the newline. The fish commandline editor works exactly the same in single line mode and in multiline mode. To move between lines use the left and right arrow keys and other such keyboard shortcuts. \section job-control Running multiple programs Normally when \c fish starts a program, this program will be put in the foreground, meaning it will take control of the terminal and \c 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 fish's behavior. -# 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. -# By using the fg and bg builtin commands, the user can send any currently running job into the foreground or background. Note that functions cannot be started in the background. Functions that are stopped and then restarted in the background using the \c bg command will not execute correctly. \section initialization Initialization files On startup, \c fish evaluates the files /usr/share/fish/config.fish (Or /usr/local/fish... if you installed fish in /usr/local), /etc/fish/config.fish (Or ~/etc/fish/... if you installed fish in your home directory) and ~/.config/fish/config.fish (Or any other directory specified by the \$XDG_CONFIG_HOME variable), in that order. The first file should not be directly edited, the second one is meant for systemwide configuration and the last one is meant for user configuration. 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 when using a login shell, use 'status --is-login' instead. Examples: If you want to add the directory ~/linux/bin to your PATH variable when using a login shell, add the following to your ~/.config/fish/config.fish file:
if status --is-login
	set PATH $PATH ~/linux/bin
end
If you want to run a set of commands when \c fish exits, use an event handler that is triggered by the exit of the shell:
function on_exit --on-process \%self
	echo fish is now exiting
end
Universal variables are stored in the file .config/fish/fishd.MACHINE_ID, where MACHINE_ID is typically your MAC address. Do not edit this file directly, as your edits may be overwritten. Edit them through fish scripts or by using fish interactively instead. \section other Other features \subsection color Syntax highlighting \c fish interprets the command line as it is typed and uses syntax highlighting to provide feedback to the user. The most important feedback is the detection of potential errors. By default, errors are marked red. Detected errors include: - Non existing commands. - Reading from or appending to a non existing file. - Incorrect use of output redirects - Mismatched parenthesis When the cursor is over a parenthesis or a quote, \c fish also highlights its matching quote or parenthesis. To customize the syntax highlighting, you can set the environment variables \c fish_color_normal, \c fish_color_command, \c 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, \c fish_pager_color_progress and \c fish_pager_color_secondary. 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 set fish_color_error black --background=red --bold will make all commandline errors be written in a black, bold font, with a red background. \subsection title Programmable title When using most virtual terminals, it is possible to set the message displayed in the titlebar of the terminal window. This can be done automatically in fish by defining the \c fish_title function. The \c fish_title function is executed before and after a new command is executed or put into the foreground and the output is used as a titlebar message. The $_ environment variable will always contain the name of the job to be put into the foreground (Or 'fish' if control is returning to the shell) when the \c fish_prompt function is called. Example:

The default \c fish title is

function fish_title
	echo $_ ' '
	pwd
end

\subsection greeting Configurable greeting If a function named fish_greeting exists after initialization, it will be run when entering interactive mode. Otherwise,if an environment variable named fish_greeting exists, it will be printed. \subsection event Event handlers When defining a new function in fish, it is possible to make it into an event handler, i.e. a function that is automatically run when a specific event takes place. Events that can trigger a handler currently are: - When a signal is delivered - When a process or job exits - When the value of a variable is updated - When the prompt is about to be shown - When a command lookup fails Example: To specify a signal handler for the WINCH signal, write:
function --on-signal WINCH my_signal_handler
	echo Got WINCH signal!
end
For more information on how to define new event handlers, see the documentation for the function command. \subsection debugging Debugging fish scripts Fish includes a built in debugger. The debugger allows you to stop execution of a script at an arbitrary point and launch a prompt. This prompt can then be used to check or change the value of any variables or perform any shellscript command. To resume normal execution of the script, simply exit the prompt. To start the debugger, simply call the builtin command 'breakpoint'. The default action of the TRAP signal is to call this builtin, so a running script can be debugged by sending it the TRAP signal. Once in the debugger, it is easy to insert new breakpoints by using the funced function to edit the definition of a function. \section issues Common issues with fish If you install fish in your home directory, fish will not work correctly for any other user than yourself. This is because fish needs its initialization files to function properly. To solve this problem, either copy the initialization files to each fish users home directory, or install them in /etc. \section i18n Translating fish to other languages Fish uses the GNU gettext library to implement translation to multiple languages. If fish is not available in your language, please consider making a translation. Currently, only the shell itself can be translated, a future version of fish should also include translated manuals. To make a translation of fish, you will first need the source code, available from the fish homepage. Download the latest version, and then extract it using a command like tar -zxf fish-VERSION.tar.gz. Next, cd into the newly created fish directory using cd fish-VERSION. You will now need to configure the source code using the command ./configure. This step might take a while. Before you continue, you will need to know the ISO 639 language code of the language you are translating to. These codes can be found here. For example, the language code for Uighur is ug. Now you have the source code and it is properly configured. Lets start translating. To do this, first create an empty translation table for the language you wish to translate to by writing make po/[LANGUAGE CODE].po in the fish terminal. For example, if you are translating to Uighur, you should write make po/ug.po. This should create the file po/ug.po, a template translation table containing all the strings that need to be translated. Now you are all set up to translate fish to a new language. Open the newly created .po file in your editor of choice, and start translating. The .po file format is rather simple. It contains pairs of string in a format like:
msgid "%ls: No suitable job\n"
msgstr ""
The first line is the English string to translate, the second line should contain your translation. For example, in Swedish the above might become:
msgid "%ls: No suitable job\n"
msgstr "%ls: Inget passande jobb\n"
\%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 are ways to avoid this, but they are too complicated for this short introduction. See the full manual for the printf C function for more information.) Once you have provided a translation for fish, please submit it via the instructions in Further help and development. \section more-help Further help and development If you have a question not answered by this documentation, there are several avenues for help: -# The official mailing list at fish-users@lists.sf.net -# The Internet Relay Chat channel, \c #fish on \c irc.oftc.net -# The project GitHub page If you have an improvement for fish, you can submit it via the mailing list or the GitHub page. */ fish/doc_src/isatty.txt000066400000000000000000000007601214535744100155120ustar00rootroot00000000000000\section isatty isatty - test if the specified file descriptor is a tty \subsection isatty-synopsis Synopsis isatty [FILE DESCRIPTOR] \subsection isatty-description Description isatty tests if a file descriptor is a tty. FILE DESCRIPTOR may be either the number of a file descriptor, or one of the strings stdin, \c stdout and stderr. If the specified file descriptor is a tty, the exit status of the command is zero. Otherwise, it is non-zero. fish/doc_src/jobs.txt000066400000000000000000000021201214535744100151220ustar00rootroot00000000000000\section jobs jobs - print currently running jobs \subsection jobs-synopsis Synopsis jobs [OPTIONS] [PID] \subsection jobs-description Description jobs prints a list of the currently running jobs and their status. jobs accepts the following switches: - -c or --command prints the command name for each process in jobs. - -g or --group only prints the group ID of each job. - -h or --help displays a help message and exits. - -l or --last prints only the last job to be started. - -p or --pid prints 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 expressed as a percentage of full CPU activity. Note that on multiprocessor systems, the total activity may be more than 100\%. \subsection jobs-example Example jobs outputs a summary of the current jobs. fish/doc_src/license.hdr000066400000000000000000001645341214535744100155670ustar00rootroot00000000000000/** \page license Licenses

License for fish

Fish Copyright (C) 2005-2009 Axel Liljencrantz. Fish is released under the GNU General Public License, version 2. The license agreement is included below.

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.


License for wcslcat and wcslcpy

\c fish also contains small amounts of code under the BSD license, namely versions of the two functions strlcat and strlcpy, modified for use with wide character strings. This code is copyrighted by Todd C. Miller. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

License for XSel

The XSel command, written and copyrighted by Conrad Parker, is distributed together with \c fish. It is Copyright (C) 2001 Conrad Parker Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

License for xdgmime and glibc

The xdgmime library, written and copyrighted by Red Hat, Inc, is used by the mimedb command, which is a part of fish. It is released under the LGPL, version 2 or later, or under the Academic Free License, version 2. Version 2 of the LGPL license agreement is included below. Fish contains code from the glibc library, namely the wcstok function. This code is licensed under the LGPL, version 2 or later. Version 2 of the LPGL license agreement is included below.

GNU LESSER GENERAL PUBLIC LICENSE

Version 2.1, February 1999

Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.

This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.

When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.

To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.

We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.

To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.

Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.

Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.

When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.

We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.

For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.

In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.

Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.

The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".

A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.

The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)

"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.

1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

  • a) The modified work must itself be a software library.
  • b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
  • c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
  • d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.

    (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.

    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.

Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.

This option is useful when you wish to copy part of the code of the Library into a program that is not a library.

4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.

If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.

5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.

However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.

When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.

If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)

Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.

6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.

You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:

  • a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
  • b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
  • c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
  • d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
  • e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.

For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.

7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:

  • a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
  • b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.

8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.

10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.

11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.

14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

License for printf

Copyright (C) 1990-2007 Free Software Foundation, Inc. Printf (from GNU Coreutils 6.9) is released under the GNU General Public License, version 2. The license agreement is included below.

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

*/ fish/doc_src/math.txt000066400000000000000000000016241214535744100151260ustar00rootroot00000000000000 \section math math - Perform mathematics calculations \subsection math-synopsis Synopsis math EXPRESSION \subsection math-description Description \c math is used to perform mathematical calculations. It is a very thin wrapper for the bc program, which makes it possible to specify an expression from the command line without using non-standard extensions or a pipeline. For a description of the syntax supported by math, see the manual for the bc program. Keep in mind that parameter expansion takes place on any expressions before they are evaluated. This can be very useful in order to perform calculations involving environment variables or the output of command substitutions, but it also means that parenthesis have to be escaped. \subsection math-example Examples math 1+1 outputs 2. math $status-128 outputs the numerical exit status of the last command minus 128. fish/doc_src/mimedb.txt000066400000000000000000000024621214535744100154330ustar00rootroot00000000000000\section mimedb mimedb - lookup file information via the mime database \subsection mimedb-synopsis Synopsis mimedb [OPTIONS] FILES... \subsection mimedb-description Description \c mimedb queries the MIME type database and the \c .desktop files installed on the system in order to find information on the files listed in FILES. The information that \c mimedb can retrieve includes the MIME type for a file, a description of the type, and the default action that can be performed on the file. \c mimedb can also be used to launch the default action for this file. The following options are available: - \c -t, \c --input-file-data determines the files' type both by their filename and by their contents (default behaviour). - \c -f, \c --input-filename determines the files' type by their filename. - \c -i, \c --input-mime specifies that the arguments are not files, but MIME types. - \c -m, \c --output-mime outputs the MIME type of each file (default behaviour). - \c -f, \c --output-description outputs the description of each MIME type. - \c -a, \c --output-action outputs the default action of each MIME type. - \c -l, \c --launch launches the default action for the specified files. - \c -h, \c --help displays a help message and exit. - \c -v, \c --version displays the version number and exits. fish/doc_src/nextd.txt000066400000000000000000000013031214535744100153110ustar00rootroot00000000000000\section nextd nextd - move forward through directory history \subsection nextd-synopsis Synopsis nextd [-l | --list] [POS] \subsection nextd-description Description nextd moves forwards POS positions in the history of visited directories; if the end of the history has been hit, a warning is printed. If the -l> or --list flag is specified, the current directory history is also displayed. \subsection nextd-example Example

cd /usr/src
# Working directory is now /usr/src
cd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
prevd
# Working directory is now /usr/src
nextd
# Working directory is now /usr/src/fish-shell
fish/doc_src/not.txt000066400000000000000000000007351214535744100147770ustar00rootroot00000000000000\section not not - negate the exit status of a job \subsection not-synopsis Synopsis not COMMAND [OPTIONS...] \subsection not-description Description \c not negates the exit status of another command. If the exit status is zero, \c not returns 1. Otherwise, \c not returns 0. \subsection not-example Example The following code reports an error and exits if no file named spoon can be found.
if not test -f spoon
	echo There is no spoon
	exit 1
end
fish/doc_src/open.txt000066400000000000000000000007171214535744100151400ustar00rootroot00000000000000\section open open - open file in its default application \subsection open-synopsis Synopsis open FILES... \subsection open-description Description \c open opens a file in its default application, using the \c xdg-open command if it exists, or else the mimedb command. \subsection open-example Example open *.txt opens all the text files in the current directory using your system's default text editor. fish/doc_src/or.txt000066400000000000000000000013761214535744100146210ustar00rootroot00000000000000\section or or - conditionally execute a command \subsection or-synopsis Synopsis COMMAND1; or COMMAND2 \subsection or-description Description \c or is used to execute a command if the current exit status (as set by the last previous command) is not 0. \c or does not change the current exit status. The exit status of the last foreground command to exit can always be accessed using the $status variable. \subsection or-example Example The following code runs the \c make command to build a program. If the build succeeds, the program is installed. If either step fails, make clean is run, which removes the files created by the build process.
make; and make install; or make clean
fish/doc_src/popd.txt000066400000000000000000000012521214535744100151340ustar00rootroot00000000000000\section popd popd - move through directory stack \subsection popd-synopsis Synopsis popd \subsection popd-description Description popd removes the top directory from the directory stack and changes the working directory to the new top directory. Use pushd to add directories to the stack. \subsection popd-example Example
pushd /usr/src
# Working directory is now /usr/src
# Directory stack contains /usr/src
pushd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
# Directory stack contains /usr/src /usr/src/fish-shell
popd
# Working directory is now /usr/src
# Directory stack contains /usr/src
fish/doc_src/prevd.txt000066400000000000000000000013011214535744100153050ustar00rootroot00000000000000\section prevd prevd - move backward through directory history \subsection prevd-synopsis Synopsis prevd [-l | --list] [POS] \subsection prevd-description Description prevd moves backwards POS positions in the history of visited directories; if the beginning of the history has been hit, a warning is printed. If the -l or --list flag is specified, the current history is also displayed. \subsection prevd-example Example
cd /usr/src
# Working directory is now /usr/src
cd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
prevd
# Working directory is now /usr/src
nextd
# Working directory is now /usr/src/fish-shell
fish/doc_src/psub.txt000066400000000000000000000021641214535744100151460ustar00rootroot00000000000000\section psub psub - perform process substitution \subsection psub-synopsis Synopsis COMMAND1 (COMMAND2|psub [-f]) \subsection psub-description Description Posix shells feature a syntax that is a mix between command substitution and piping, called process substitution. It is used to send the output of a command into the calling command, much like command substitution, but with the difference that the output is not sent through commandline arguments but through a named pipe, with the filename of the named pipe sent as an argument to the calling program. \c psub combined with a regular command substitution provides the same functionality. If the \c -f or \c --file switch is given to psub, \c psub will use a regular file instead of a named pipe to communicate with the calling process. This will cause \c psub to be significantly slower when large amounts of data are involved, but has the advantage that the reading process can seek in the stream. \subsection psub-example Example diff (sort a.txt|psub) (sort b.txt|psub) shows the difference between the sorted versions of files a.txt and b.txt. fish/doc_src/pushd.txt000066400000000000000000000013161214535744100153160ustar00rootroot00000000000000\section pushd pushd - push directory to directory stack \subsection pushd-synopsis Synopsis pushd [DIRECTORY] \subsection pushd-description Description The pushd function adds \c DIRECTORY to the top of the directory stack and makes it the current working directory. popd will pop it off and return to the original directory. \subsection pushd-example Example
pushd /usr/src
# Working directory is now /usr/src
# Directory stack contains /usr/src
pushd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
# Directory stack contains /usr/src /usr/src/fish-shell
popd
# Working directory is now /usr/src
# Directory stack contains /usr/src
fish/doc_src/pwd.txt000066400000000000000000000004331214535744100147640ustar00rootroot00000000000000\section pwd pwd - output the current working directory \subsection pwd-synopsis Synopsis pwd \subsection pwd-description Description \c pwd outputs (prints) the current working directory. Note that \c fish always resolves symbolic links in the current directory path. fish/doc_src/random.txt000066400000000000000000000013261214535744100154540ustar00rootroot00000000000000\section random random - generate random number \subsection random-synopsis Synopsis random [SEED] \subsection random-description Description \c random outputs a random number from 0 to 32766, inclusive. If a \c SEED value is provided, it is used to seed the random number generator, and no output will be produced. This can be useful for debugging purposes, where it can be desirable to get the same random number sequence multiple times. If the random number generator is called without first seeding it, the current time will be used as the seed. \subsection random-example Example The following code will count down from a random number to 1:
for i in (seq (random) -1 1)
	echo $i
	sleep
end
fish/doc_src/read.txt000066400000000000000000000036521214535744100151130ustar00rootroot00000000000000\section read read - read line of input into variables \subsection read-synopsis Synopsis read [OPTIONS] [VARIABLES...] \subsection read-description Description read reads one line from standard input and stores the result in one or more environment variables. The following options are available: - -c CMD or --command=CMD sets the initial string in the interactive mode command buffer to CMD. - -g or --global makes the variables global (default behaviour). - -l or --local makes the variables local. - -m NAME or --mode-name=NAME specifies that the name NAME should be used to save/load the history file. If NAME is fish, the regular fish history will be available. - -p PROMPT_CMD or --prompt=PROMPT_CMD uses the output of the shell command \c PROMPT_CMD as the prompt for the interactive mode. The default prompt command is set_color green; echo read; set_color normal; echo "> ". - -s or --shell enables syntax highlighting, tab completions and command termination suitable for entering shellscript code in the interactive mode. - -u or --unexport prevents the variables from being exported to child processes (default behaviour). - -U or --universal causes the specified environment variable to be made universal. - -x or --export exports the variables to child processes. \c read reads a single line of input from stdin, breaks it into tokens based on the IFS environment variable, and then assigns one token to each variable specified in VARIABLES. If there are more tokens than variables, the complete remainder is assigned to the last variable. \subsection read-example Example The following code stores the value 'hello' in the environment variable $foo. echo hello|read foo fish/doc_src/return.txt000066400000000000000000000013541214535744100155140ustar00rootroot00000000000000\section return return - stop the current inner function \subsection return-synopsis Synopsis function NAME; [COMMANDS...;] return [STATUS]; [COMMANDS...;] end \subsection return-description Description \c return halts a currently running function. The exit status is set to \c STATUS if it is given. It is usually added inside of a conditional block such as an if statement or a switch statement to conditionally stop the executing function and return to the caller, but it can also be used to specify the exit status of a function. \subsection return-example Example The following code is an implementation of the false command as a fish function
function false
	return 1
end
fish/doc_src/set.txt000066400000000000000000000141031214535744100147640ustar00rootroot00000000000000\section set set - display and change environment variables. \subsection set-synopsis Synopsis
set [SCOPE_OPTIONS]
set [OPTIONS] VARIABLE_NAME VALUES...
set [OPTIONS] VARIABLE_NAME[INDICES]... VALUES...
set (-q | --query) [SCOPE_OPTIONS] VARIABLE_NAMES...
set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME
set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME[INDICES]...
\subsection set-description Description set manipulates environment variables. 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. With both variable names and values provided, \c set assigns the variable VARIABLE_NAME the values VALUES.... The following options control variable scope: - -l or --local forces the specified environment variable to be given a scope that is local to the current block, even if a variable with the given name exists and is non-local - -g or --global causes the specified environment variable to be given a global scope. Non-global variables disappear when the block they belong to ends - -U or --universal causes the specified environment variable to be given a universal scope. If this option is supplied, the variable will be shared between all the current users fish instances on the current computer, and will be preserved across restarts of the shell. - -n or --names List only the names of all defined variables, not their value - -u or --unexport causes the specified environment not to be exported to child processes - -x or --export causes the specified environment variable to be exported to child processes The following options are available: - -e or --erase causes the specified environment variable to be erased - -q or --query 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. - -L or --long do not abbreviate long values when printing set variables 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 PATH[1 3 7], only those array elements specified will be changed. When array indices are specified to \c set, multiple arguments may be used to specify additional indexes, e.g. set PATH[1] PATH[4] /bin /sbin. If you specify a negative index when expanding or assigning to an array variable, the index will be calculated from the end of the array. For example, the index -1 means the last index of an array. The scoping rules when creating or updating a variable are: -# If a variable is explicitly set to either universal, global or local, that setting will be honored. If a variable of the same name exists in a different scope, that variable will not be changed. -# If a variable is not explicitly set to be either universal, global or local, but has been previously defined, the previous variable scope is used. -# If a variable is not explicitly set to be either universal, global or local and has never before been defined, the variable will be local to the currently executing function. Note that this is different from using the \c -l or \c --local flag. If one of those flags is used, the variable will be local to the most inner currently executing block, while without these the variable will be local to the function. If no function is executing, the variable will be global. The exporting rules when creating or updating a variable are identical to the scoping rules for variables: -# If a variable is explicitly set to either be exported or not exported, that setting will be honored. -# If a variable is not explicitly set to be exported or not exported, but has been previously defined, the previous exporting rule for the variable is kept. -# If a variable is not explicitly set to be either exported or unexported and has never before been defined, the variable will not be exported. In query mode, the scope to be examined can be specified. In erase mode, if variable indices are specified, only the specified slices of the array variable will be erased. When erasing an entire variable (i.e. no slicing), the scope of the variable to be erased can be specified. That way, a global variable can be erased even if a local variable with the same name exists. Scope can not be specified when erasing a slice of an array. The innermost scope is always used. \c set requires all options to come before any other arguments. For example, set flags -l will have the effect of setting the value of the variable flags to '-l', not making the variable local. In assignment mode, \c set exits with a non-zero exit status if variable assignments could not be successfully performed. If the variable assignments were performed, the exit status is unchanged. This allows simultaneous capture of the output and exit status of a subcommand, e.g. if set output (command). In query mode, the exit status is the number of variables that were not found. In erase mode, \c set exits with a zero exit status in case of success, with a non-zero exit status if the commandline was invalid, if the variable was write-protected or if the variable did not exist. \subsection set-example Example set -xg will print all global, exported variables. set foo hi sets the value of the variable foo to be hi. set -e smurf removes the variable \c smurf. set PATH[4] ~/bin changes the fourth element of the \c PATH array to \c ~/bin
if set python_path (which python)
    echo "Python is at $python_path"
end
The above outputs the path to Python if \c which returns true. fish/doc_src/set_color.txt000066400000000000000000000033261214535744100161670ustar00rootroot00000000000000\section set_color set_color - set the terminal color \subsection set_color-synopsis Synopsis set_color [-h --help] [-b --background COLOR] [COLOR] \subsection set_color-description Description \c set_color changes the foreground and/or background color of the terminal. \c COLOR is one of black, red, green, brown, yellow, blue, magenta, purple, cyan, white and normal. If your terminal supports term256 (modern xterms and OS X Lion), you can specify an RGB value with three or six hex digits, such as A0FF33 or f2f. \c fish will choose the closest supported color. The following options are available: - \c -b, \c --background \c COLOR sets the background color. - \c -c, \c --print-colors prints a list of all valid color names. - \c -h, \c --help displays a help message and exit. - \c -o, \c --bold sets bold or extra bright mode. - \c -u, \c --underline sets underlined mode. Calling set_color normal will set the terminal color to the default color of the terminal. Some terminals use the --bold escape sequence to switch to a brighter color set. On such terminals, set_color white will result in a grey font color, while set_color --bold white will result in a white font color. Not all terminal emulators support all these features. \c set_color uses the terminfo database to look up how to change terminal colors on whatever terminal is in use. Some systems have old and incomplete terminfo databases, and may lack color information for terminals that support it. \subsection set_color-example Examples
set_color red; echo "Roses are red"
set_color blue; echo "Violets are blue"
set_color 62A ; echo "Eggplants are dark purple"
set_color normal; echo "Normal is nice too"
fish/doc_src/source.txt000066400000000000000000000017021214535744100154720ustar00rootroot00000000000000\section source . - evaluate contents of file. \subsection source-synopsis Synopsis . FILENAME [ARGUMENTS...] \subsection source-description Description \c . (source) evaluates the commands of the specified file in the current shell. This is different from starting a new process to perform the commands (i.e. fish < FILENAME) since the commands will be evaluated by the current shell, which means that changes in environment variables affect the current shell. If additional arguments are specified after the file name, they will be inserted into the $argv variable. If no file is specified, or if the file name '-' is used, stdin will be read. The return status of \c . is the return status of the last job to execute. If something goes wrong while opening or reading the file, \c . exits with a non-zero status. \subsection source-example Example . ~/.config/fish/config.fish causes fish to re-read its initialization file. fish/doc_src/status.txt000066400000000000000000000030241214535744100155140ustar00rootroot00000000000000\section status status - query fish runtime information \subsection status-synopsis Synopsis status [OPTION] \subsection status-description Description With no arguments, status displays a summary of the current login and job control status of the shell. The following options are available: - -c or --is-command-substitution returns 0 if fish is currently executing a command substitution. - -b or --is-block returns 0 if fish is currently executing a block of code. - -i or --is-interactive returns 0 if fish is interactive - that is, connected to a keyboard. - -l or --is-login returns 0 if fish is a login shell - that is, if fish should perform login tasks such as setting up the PATH. - --is-full-job-control returns 0 if full job control is enabled. - --is-interactive-job-control returns 0 if interactive job control is enabled. - --is-no-job-control returns 0 if no job control is enabled. - -f or --current-filename prints the filename of the currently running script. - -n or --current-line-number prints the line number of the currently running script. - -j CONTROLTYPE or --job-control=CONTROLTYPE sets the job control type, which can be none, full, or interactive. - -t or --print-stack-trace prints a stack trace of all function calls on the call stack. - -h or --help displays a help message and exit. fish/doc_src/switch.txt000066400000000000000000000031231214535744100154720ustar00rootroot00000000000000\section switch switch - conditionally execute a block of commands \subsection switch-synopsis Synopsis switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end \subsection switch-description Description \c switch performs one of several blocks of commands, depending on whether a specified value equals one of several wildcarded values. \c case is used together with the \c switch statement in order to determine which block should be executed. Each \c case command is given one or more parameters. The first \c case command with a parameter that matches the string specified in the switch command will be evaluated. \c case parameters may contain wildcards. These need to be escaped or quoted in order to avoid regular wildcard expansion using filenames. Note that fish does not fall through on case statements. Only the first matching case is executed. Note that command substitutions in a case statement will be evaluated even if its body is not taken. All substitutions, including command substitutions, must be performed before the value can be compared against the parameter. \subsection switch-example Example If the variable \$animal contains the name of an animal, the following code would attempt to classify it:
switch $animal
    case cat
        echo evil
    case wolf dog human moose dolphin whale
        echo mammal
    case duck goose albatross
        echo bird
    case shark trout stingray
        echo fish
    case '*'
        echo I have no idea what a $animal is
end
If the above code was run with \c \$animal set to \c whale, the output would be \c mammal. fish/doc_src/test.txt000066400000000000000000000032601214535744100151520ustar00rootroot00000000000000\section test test - perform tests on files and text \subsection test-synopsis Synopsis test [EXPRESSION] \subsection test-description Description Tests the expression given and sets the exit status to 0 if true, and 1 if false. The following options are available: - \c -h displays a help message and then exits. - -L FILE returns true if \c FILE is a symbolic link. - -S FILE returns true if \c FILE is a socket. - COND1 -a COND2 combines two conditions with a logical and. - -b FILE returns true if \c FILE is a block device. - -c FILE returns true if \c FILE is a character device. - -d FILE returns true if \c FILE is a directory. - -e FILE returns true if \c FILE exists. - -f FILE returns true if \c FILE is a regular file. - -f FILE returns true if \c FILE has set-group-ID bit set. - -n STRING returns true if the length of \c STRING is non-zero. - COND1 -o COND2 combines two conditions with a logical or. - -p FILE returns true if \c FILE is a named pipe. - -r FILE returns true if \c FILE is readable. - -s FILE returns true if the size of \c FILE is non-zero. - -t FD returns true if \c FD is a terminal (TTY). - -u FILE returns true if \c FILE has set-user-ID bit set. - -w FILE returns true if \c FILE is writable. - -x FILE returns true if \c FILE is executable. - -z STRING returns true if \c STRING length is zero. \subsection test-example Example
if test -d "/"
    echo "Fish is cool"
end
Because "/" is a directory, the expression will evaluate to true, and "Fish is cool" will be output. fish/doc_src/trap.txt000066400000000000000000000032571214535744100151470ustar00rootroot00000000000000\section trap trap - perform an action when the shell receives a signal \subsection trap-synopsis Synopsis trap [OPTIONS] [[ARG] SIGSPEC ... ] \subsection trap-description Description \c trap is a wrapper around the fish event delivery framework. It exists for backwards compatibility with POSIX shells. For other uses, it is recommended to define an event handler. The following parameters are available: - \c ARG is the command to be executed on signal delivery. - \c SIGSPEC is the name of the signal to trap. - \c -h or \c --help displays help and exits. - \c -l or \c --list-signals prints a list of signal names. - \c -p or \c --print prints all defined signal handlers. If \c ARG and \c SIGSPEC are both specified, \c ARG is the command to be executed when the signal specified by \c SIGSPEC is delivered. If \c ARG is absent (and there is a single SIGSPEC) or -, each specified signal is reset to its original disposition (the value it had upon entrance to the shell). If \c ARG is the null string the signal specified by each \c SIGSPEC is ignored by the shell and by the commands it invokes. If \c ARG is not present and \c -p has been supplied, then the trap commands associated with each \c SIGSPEC are displayed. If no arguments are supplied or if only \c -p is given, \c trap prints the list of commands associated with each signal. Signal names are case insensitive and the \c SIG prefix is optional. The return status is 1 if any \c SIGSPEC is invalid; otherwise trap returns 0. \subsection trap-example Example trap "status --print-stack-trace" SIGUSR1 prints a stack trace each time the \c SIGUSR1 signal is sent to the shell. fish/doc_src/type.txt000066400000000000000000000022651214535744100151600ustar00rootroot00000000000000\section type type - indicate how a command would be interpreted \subsection type-synopsis Synopsis type [OPTIONS] NAME [NAME ...] \subsection type-description Description With no options, \c type indicates how each \c NAME would be interpreted if used as a command name. The following options are available: - \c -h or \c --help prints help and then exits. - \c -a or \c --all prints all of possible definitions of the specified names. - \c -f or \c --no-functions suppresses function and builtin lookup. - \c -t or \c --type prints keyword, function, builtin, or file if \c NAME is a shell reserved word, function, builtin, or disk file, respectively. - \c -p or \c --path returns the name of the disk file that would be executed, or nothing if 'type -t name' would not return 'file'. - \c -P or \c --force-path returns the name of the disk file that would be executed, or nothing no file with the specified name could be found in the $PATH. \c type sets the exit status to 0 if the specified command was found, and 1 if it could not be found. \subsection type-example Example type fg outputs the string 'fg is a shell builtin'. fish/doc_src/ulimit.txt000066400000000000000000000073601214535744100155030ustar00rootroot00000000000000\section ulimit ulimit - set or get resource usage limits \subsection ulimit-synopsis Synopsis ulimit [OPTIONS] [LIMIT] \subsection ulimit-description Description \c ulimit builtin sets or outputs the resource usage limits of the shell and any processes spawned by it. If a new limit value is omitted, the current value of the limit of the resource is printed; otherwise, the specified limit is set to the new value. Use one of the following switches to specify which resource limit to set or report: - -c or --core-size: the maximum size of core files created. By setting this limit to zero, core dumps can be disabled. - -d or --data-size: the maximum size of a process' data segment. - -f or --file-size: the maximum size of files created by the shell. - -l or --lock-size: the maximum size that may be locked into memory. - -m or --resident-set-size: the maximum resident set size. - -n or --file-descriptor-count: the maximum number of open file descriptors (most systems do not allow this value to be set). - -s or --stack-size: the maximum stack size. - -t or --cpu-time: the maximum amount of CPU time in seconds. - -u or --process-count: the maximum number of processes available to a single user. - -v or --virtual-memory-size The maximum amount of virtual memory available to the shell. Note that not all these limits are available in all operating systems. The value of limit can be a number in the unit specified for the resource or one of the special values hard, soft, or unlimited, which stand for the current hard limit, the current soft limit, and no limit, respectively. If limit is given, it is the new value of the specified resource. If no option is given, then \c -f is assumed. Values are in kilobytes, except for \c -t, which is in seconds and \c -n and \c -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. \c ulimit also accepts the following switches that determine what type of limit to set: - -H or --hard sets hard resource limit - -S or --soft sets soft resource limit A hard limit can only be decreased. Once it is set it cannot be increased; a soft limit may be increased up to the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are updated when assigning a new limit value, and the soft limit is used when reporting the current value. The following additional options are also understood by ulimit: - -a or --all prints all current limits - -h or --help displays help and exits. The \c fish implementation of \c ulimit should behave identically to the implementation in bash, except for these differences: - Fish \c ulimit supports GNU-style long options for all switches - Fish \c ulimit does not support the \c -p option for getting the pipe size. The bash implementation consists of a compile-time check that empirically guesses this number by writing to a pipe and waiting for SIGPIPE. Fish does not do this because it this method of determining pipe size is unreliable. Depending on bash version, there may also be further additional limits to set in bash that do not exist in fish. - Fish \c ulimit does not support getting or setting multiple limits in one command, except reporting all values using the -a switch \subsection ulimit-example Example ulimit -Hs 64 sets the hard stack size limit to 64 kB. fish/doc_src/umask.txt000066400000000000000000000050371214535744100153170ustar00rootroot00000000000000\section umask umask - set or get the file creation mode mask \subsection umask-synopsis Synopsis umask [OPTIONS] [MASK] \subsection umask-description Description \c umask displays and manipulates the "umask", or file creation mode mask, which is used to restrict the default access to files. The umask may be expressed either as an octal number, which represents the rights that will be removed by default, or symbolically, which represents the only rights that will be granted by default. Access rights are explained in the manual page for the \c chmod(1) program. With no parameters, the current file creation mode mask is printed as an octal number. - -h or --help prints this message. - -S or --symbolic prints the umask in symbolic form instead of octal form. - -p or --as-command outputs the umask in a form that may be reused as input If a numeric mask is specified as a parameter, the current shell's umask will be set to that value, and the rights specified by that mask will be removed from new files and directories by default. If a symbolic mask is specified, the desired permission bits, and not the inverse, should be specified. A symbolic mask is a comma 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 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 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 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 and \c =, respectively. As an example, r,u+w means all users should have read access and the file owner should also have write access. Note that symbolic masks currently do not work as intended. \subsection umask-example Example umask 177 or umask u=rw sets the file creation mask to read and write for the owner and no permissions at all for any other users. fish/doc_src/vared.txt000066400000000000000000000007241214535744100152760ustar00rootroot00000000000000\section vared vared - interactively edit the value of an environment variable \subsection vared-synopsis Synopsis vared VARIABLE_NAME \subsection vared-description Description \c vared is used to interactively edit the value of an environment variable. Array variables as a whole can not be edited using \c vared, but individual array elements can. \subsection vared-example Example vared PATH[3] edits the third element of the PATH array fish/doc_src/while.txt000066400000000000000000000014001214535744100152750ustar00rootroot00000000000000\section while while - perform a command multiple times \subsection while-synopsis Synopsis while CONDITION; COMMANDS...; end \subsection while-description Description while repeatedly executes CONDITION, and if the exit status is 0, then executes COMMANDS. If the exit status of \c CONDITION is non-zero on the first iteration, \c COMMANDS will not be executed at all. Use begin; ...; end for complex conditions; more complex control can be achieved with while true containing a break. \subsection while-example Example while test -f foo.txt; echo file exists; sleep 10; end outputs 'file exists' at 10 second intervals as long as the file foo.txt exists. fish/env.cpp000066400000000000000000001100401214535744100133050ustar00rootroot00000000000000/** \file env.c Functions for setting and getting environment variables. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #if HAVE_LIBINTL_H #include #endif #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "proc.h" #include "common.h" #include "env.h" #include "sanity.h" #include "expand.h" #include "history.h" #include "reader.h" #include "parser.h" #include "env_universal.h" #include "input.h" #include "event.h" #include "path.h" #include "complete.h" /** Command used to start fishd */ #define FISHD_CMD L"fishd ^ /tmp/fishd.log.%s" // Version for easier debugging //#define FISHD_CMD L"fishd" /** Value denoting a null string */ #define ENV_NULL L"\x1d" /** Some configuration path environment variables */ #define FISH_DATADIR_VAR L"__fish_datadir" #define FISH_SYSCONFDIR_VAR L"__fish_sysconfdir" #define FISH_HELPDIR_VAR L"__fish_help_dir" #define FISH_BIN_DIR L"__fish_bin_dir" /** At init, we read all the environment variables from this array. */ extern char **environ; /** This should be the same thing as \c environ, but it is possible only one of the two work... */ extern char **__environ; /** A variable entry. Stores the value of a variable and whether it should be exported. Obviously, it needs to be allocated large enough to fit the value string. */ struct var_entry_t { wcstring val; /**< The value of the variable */ bool exportv; /**< Whether the variable should be exported */ var_entry_t() : exportv(false) { } }; typedef std::map var_table_t; bool g_log_forks = false; bool g_use_posix_spawn = false; //will usually be set to true /** Struct representing one level in the function variable stack */ struct env_node_t { /** Variable table */ var_table_t env; /** Does this node imply a new variable scope? If yes, all non-global variables below this one in the stack are invisible. If new_scope is set for the global variable node, the universe will explode. */ bool new_scope; /** Does this node contain any variables which are exported to subshells */ bool exportv; /** Pointer to next level */ struct env_node_t *next; env_node_t() : new_scope(false), exportv(false), next(NULL) { } /* Returns a pointer to the given entry if present, or NULL. */ const var_entry_t *find_entry(const wcstring &key); /* Returns the next scope to search in order, respecting the new_scope flag, or NULL if we're done. */ env_node_t *next_scope_to_search(void); }; class variable_entry_t { bool exportv; /**< Whether the variable should be exported */ wcstring value; /**< Value of the variable */ }; static pthread_mutex_t env_lock = PTHREAD_MUTEX_INITIALIZER; /** Top node on the function stack */ static env_node_t *top = NULL; /** Bottom node on the function stack */ static env_node_t *global_env = NULL; /** Table for global variables */ static var_table_t *global; /* Helper class for storing constant strings, without needing to wrap them in a wcstring */ /* Comparer for const string set */ struct const_string_set_comparer { bool operator()(const wchar_t *a, const wchar_t *b) { return wcscmp(a, b) < 0; } }; typedef std::set const_string_set_t; /** Table of variables that may not be set using the set command. */ static const_string_set_t env_read_only; static bool is_read_only(const wcstring &key) { return env_read_only.find(key.c_str()) != env_read_only.end(); } /** Table of variables whose value is dynamically calculated, such as umask, status, etc */ static const_string_set_t env_electric; static bool is_electric(const wcstring &key) { return env_electric.find(key.c_str()) != env_electric.end(); } /** Exported variable array used by execv */ static null_terminated_array_t export_array; /** Flag for checking if we need to regenerate the exported variable array */ static bool has_changed_exported = true; static void mark_changed_exported() { has_changed_exported = true; } /** List of all locale variable names */ static const wchar_t * const 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", NULL }; const var_entry_t *env_node_t::find_entry(const wcstring &key) { const var_entry_t *result = NULL; var_table_t::const_iterator where = env.find(key); if (where != env.end()) { result = &where->second; } return result; } env_node_t *env_node_t::next_scope_to_search(void) { return this->new_scope ? global_env : this->next; } /** When fishd isn't started, this function is provided to env_universal as a callback, it tries to start up fishd. It's implementation is a bit of a hack, since it evaluates a bit of shellscript, and it might be used at times when that might not be the best idea. */ static void start_fishd() { struct passwd *pw = getpwuid(getuid()); debug(3, L"Spawning new copy of fishd"); if (!pw) { debug(0, _(L"Could not get user information")); return; } wcstring cmd = format_string(FISHD_CMD, pw->pw_name); /* Prefer the fishd in __fish_bin_dir, if exists */ const env_var_t bin_dir = env_get_string(L"__fish_bin_dir"); if (! bin_dir.missing_or_empty()) { wcstring path = bin_dir + L"/fishd"; if (waccess(path, X_OK) == 0) { /* The path command just looks like 'fishd', so insert the bin path to make it absolute */ cmd.insert(0, bin_dir + L"/"); } } parser_t &parser = parser_t::principal_parser(); parser.eval(cmd, io_chain_t(), TOP); } /** Return the current umask value. */ static mode_t get_umask() { mode_t res; res = umask(0); umask(res); return res; } /** Checks if the specified variable is a locale variable */ static bool var_is_locale(const wcstring &key) { for (size_t i=0; locale_variable[i]; i++) { if (key == locale_variable[i]) { return true; } } return false; } /** Properly sets all locale information */ static void handle_locale() { const env_var_t lc_all = env_get_string(L"LC_ALL"); int i; const wcstring old_locale = wsetlocale(LC_MESSAGES, NULL); /* Array of locale constants corresponding to the local variable names defined in locale_variable */ static const int cat[] = { 0, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME } ; if (!lc_all.missing()) { wsetlocale(LC_ALL, lc_all.c_str()); } else { const env_var_t lang = env_get_string(L"LANG"); if (!lang.missing()) { wsetlocale(LC_ALL, lang.c_str()); } for (i=2; locale_variable[i]; i++) { const env_var_t val = env_get_string(locale_variable[i]); if (!val.missing()) { wsetlocale(cat[i], val.c_str()); } } } const wcstring new_locale = wsetlocale(LC_MESSAGES, NULL); if (old_locale != new_locale) { /* Try to make change known to gettext. Both changing _nl_msg_cat_cntr and calling dcgettext might potentially tell some gettext implementation that the translation strings should be reloaded. We do both and hope for the best. */ extern int _nl_msg_cat_cntr; _nl_msg_cat_cntr++; fish_dcgettext("fish", "Changing language to English", LC_MESSAGES); if (get_is_interactive()) { debug(0, _(L"Changing language to English")); } } } /** React to modifying hte given variable */ static void react_to_variable_change(const wcstring &key) { if (var_is_locale(key)) { handle_locale(); } else if (key == L"fish_term256") { update_fish_term256(); reader_react_to_color_change(); } else if (string_prefixes_string(L"fish_color_", key)) { reader_react_to_color_change(); } } /** Universal variable callback function. This function makes sure the proper events are triggered when an event occurs. */ static void universal_callback(fish_message_type_t type, const wchar_t *name, const wchar_t *val) { const wchar_t *str = NULL; switch (type) { case SET: case SET_EXPORT: { str=L"SET"; break; } case ERASE: { str=L"ERASE"; break; } default: break; } if (str) { mark_changed_exported(); event_t ev = event_t::variable_event(name); ev.arguments.push_back(L"VARIABLE"); ev.arguments.push_back(str); ev.arguments.push_back(name); event_fire(&ev); } if (name) react_to_variable_change(name); } /** Make sure the PATH variable contains the essential directories */ static void setup_path() { const wchar_t *path_el[] = { L"/bin", L"/usr/bin", NULL }; env_var_t path = env_get_string(L"PATH"); wcstring_list_t lst; if (! path.missing()) { tokenize_variable_array(path, lst); } for (size_t j=0; path_el[j] != NULL; j++) { bool has_el = false; for (size_t i=0; i 0) && (el.at(len-1)==L'/')) { len--; } if ((wcslen(path_el[j]) == len) && (wcsncmp(el.c_str(), path_el[j], len)==0)) { has_el = true; break; } } if (! has_el) { wcstring buffer; debug(3, L"directory %ls was missing", path_el[j]); if (!path.missing()) { buffer += path; } buffer.append(ARRAY_SEP_STR); buffer.append(path_el[j]); env_set(L"PATH", buffer.empty()?NULL:buffer.c_str(), ENV_GLOBAL | ENV_EXPORT); path = env_get_string(L"PATH"); lst.resize(0); tokenize_variable_array(path, lst); } } } int env_set_pwd() { wchar_t dir_path[4096]; wchar_t *res = wgetcwd(dir_path, 4096); if (!res) { return 0; } env_set(L"PWD", dir_path, ENV_EXPORT | ENV_GLOBAL); return 1; } wcstring env_get_pwd_slash(void) { env_var_t pwd = env_get_string(L"PWD"); if (pwd.missing_or_empty()) { return L""; } if (! string_suffixes_string(L"/", pwd)) { pwd.push_back(L'/'); } return pwd; } /** Set up default values for various variables if not defined. */ static void env_set_defaults() { if (env_get_string(L"USER").missing()) { struct passwd *pw = getpwuid(getuid()); if (pw->pw_name != NULL) { const wcstring wide_name = str2wcstring(pw->pw_name); env_set(L"USER", NULL, ENV_GLOBAL); } } if (env_get_string(L"HOME").missing()) { const env_var_t unam = env_get_string(L"USER"); char *unam_narrow = wcs2str(unam.c_str()); struct passwd *pw = getpwnam(unam_narrow); if (pw->pw_dir != NULL) { const wcstring dir = str2wcstring(pw->pw_dir); env_set(L"HOME", dir.c_str(), ENV_GLOBAL); } free(unam_narrow); } env_set_pwd(); } // Some variables should not be arrays. This used to be handled by a startup script, but we'd like to get down to 0 forks for startup, so handle it here. static bool variable_can_be_array(const wcstring &key) { if (key == L"DISPLAY") { return false; } else { return true; } } void env_init(const struct config_paths_t *paths /* or NULL */) { /* env_read_only variables can not be altered directly by the user */ const wchar_t * const ro_keys[] = { L"status", L"history", L"version", L"_", L"LINES", L"COLUMNS", L"PWD", L"SHLVL", L"FISH_VERSION", }; for (size_t i=0; i < sizeof ro_keys / sizeof *ro_keys; i++) { env_read_only.insert(ro_keys[i]); } /* HOME and USER should be writeable by root, since this can be a convenient way to install software. */ if (getuid() != 0) { env_read_only.insert(L"HOME"); env_read_only.insert(L"USER"); } /* Names of all dynamically calculated variables */ env_electric.insert(L"history"); env_electric.insert(L"status"); env_electric.insert(L"umask"); top = new env_node_t; 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 */ for (char **p = (environ ? environ : __environ); p && *p; p++) { const wcstring key_and_val = str2wcstring(*p); //like foo=bar size_t eql = key_and_val.find(L'='); if (eql == wcstring::npos) { // no equals found env_set(key_and_val, L"", ENV_EXPORT); } else { wcstring key = key_and_val.substr(0, eql); wcstring val = key_and_val.substr(eql + 1); if (variable_can_be_array(val)) { std::replace(val.begin(), val.end(), L':', ARRAY_SEP); } env_set(key, val.c_str(), ENV_EXPORT | ENV_GLOBAL); } } /* Set the given paths in the environment, if we have any */ if (paths != NULL) { env_set(FISH_DATADIR_VAR, paths->data.c_str(), ENV_GLOBAL | ENV_EXPORT); env_set(FISH_SYSCONFDIR_VAR, paths->sysconf.c_str(), ENV_GLOBAL | ENV_EXPORT); env_set(FISH_HELPDIR_VAR, paths->doc.c_str(), ENV_GLOBAL | ENV_EXPORT); env_set(FISH_BIN_DIR, paths->bin.c_str(), ENV_GLOBAL | ENV_EXPORT); } /* Set up the PATH variable */ setup_path(); /* Set up the USER variable */ const struct passwd *pw = getpwuid(getuid()); if (pw && pw->pw_name) { const wcstring uname = str2wcstring(pw->pw_name); env_set(L"USER", uname.c_str(), ENV_GLOBAL | ENV_EXPORT); } /* Set up the version variables */ wcstring version = str2wcstring(PACKAGE_VERSION); env_set(L"version", version.c_str(), ENV_GLOBAL); env_set(L"FISH_VERSION", version.c_str(), ENV_GLOBAL); const env_var_t fishd_dir_wstr = env_get_string(L"FISHD_SOCKET_DIR"); const env_var_t user_dir_wstr = env_get_string(L"USER"); wchar_t * fishd_dir = fishd_dir_wstr.missing()?NULL:const_cast(fishd_dir_wstr.c_str()); wchar_t * user_dir = user_dir_wstr.missing()?NULL:const_cast(user_dir_wstr.c_str()); env_universal_init(fishd_dir , user_dir , &start_fishd, &universal_callback); /* Set up SHLVL variable */ const env_var_t shlvl_str = env_get_string(L"SHLVL"); wcstring nshlvl_str = L"1"; if (! shlvl_str.missing()) { long shlvl_i = wcstol(shlvl_str.c_str(), NULL, 10); if (shlvl_i >= 0) { nshlvl_str = to_string(shlvl_i + 1); } } env_set(L"SHLVL", nshlvl_str.c_str(), ENV_GLOBAL | ENV_EXPORT); /* Set correct defaults for e.g. USER and HOME variables */ env_set_defaults(); /* Set g_log_forks */ env_var_t log_forks = env_get_string(L"fish_log_forks"); g_log_forks = ! log_forks.missing_or_empty() && from_string(log_forks); /* Set g_use_posix_spawn. Default to true. */ env_var_t use_posix_spawn = env_get_string(L"fish_use_posix_spawn"); g_use_posix_spawn = (use_posix_spawn.missing_or_empty() ? true : from_string(use_posix_spawn)); } void env_destroy() { env_universal_destroy(); while (&top->env != global) { env_pop(); } env_read_only.clear(); env_electric.clear(); var_table_t::iterator iter; for (iter = global->begin(); iter != global->end(); ++iter) { const var_entry_t &entry = iter->second; if (entry.exportv) { mark_changed_exported(); break; } } delete top; } /** Search all visible scopes in order for the specified key. Return the first scope in which it was found. */ static env_node_t *env_get_node(const wcstring &key) { env_node_t *env = top; while (env != NULL) { if (env->find_entry(key) != NULL) { break; } env = env->next_scope_to_search(); } return env; } int env_set(const wcstring &key, const wchar_t *val, int var_mode) { ASSERT_IS_MAIN_THREAD(); bool has_changed_old = has_changed_exported; bool has_changed_new = false; int done=0; int is_universal = 0; if (val && contains(key, L"PWD", L"HOME")) { /* Canoncalize our path; if it changes, recurse and try again. */ wcstring val_canonical = val; path_make_canonical(val_canonical); if (val != val_canonical) { return env_set(key, val_canonical.c_str(), var_mode); } } if ((var_mode & ENV_USER) && is_read_only(key)) { return ENV_PERM; } if (key == L"umask") { wchar_t *end; /* Set the new umask */ if (val && wcslen(val)) { errno=0; long mask = wcstol(val, &end, 8); if (!errno && (!*end) && (mask <= 0777) && (mask >= 0)) { umask(mask); } } /* Do not actually create a umask variable, on env_get, it will be calculated dynamically */ return 0; } /* Zero element arrays are internaly not coded as null but as this placeholder string */ if (!val) { val = ENV_NULL; } if (var_mode & ENV_UNIVERSAL) { bool exportv; if (var_mode & ENV_EXPORT) { // export exportv = true; } else if (var_mode & ENV_UNEXPORT) { // unexport exportv = false; } else { // not changing the export exportv = env_universal_get_export(key); } env_universal_set(key, val, exportv); is_universal = 1; } else { // Determine the node env_node_t *preexisting_node = env_get_node(key); bool preexisting_entry_exportv = false; if (preexisting_node != NULL) { var_table_t::const_iterator result = preexisting_node->env.find(key); assert(result != preexisting_node->env.end()); const var_entry_t &entry = result->second; if (entry.exportv) { preexisting_entry_exportv = true; has_changed_new = true; } } env_node_t *node = NULL; if (var_mode & ENV_GLOBAL) { node = global_env; } else if (var_mode & ENV_LOCAL) { node = top; } else if (preexisting_node != NULL) { node = preexisting_node; if ((var_mode & (ENV_EXPORT | ENV_UNEXPORT)) == 0) { // use existing entry's exportv var_mode = preexisting_entry_exportv ? ENV_EXPORT : 0; } } else { if (! get_proc_had_barrier()) { set_proc_had_barrier(true); env_universal_barrier(); } if (env_universal_get(key)) { bool exportv; if (var_mode & ENV_EXPORT) { exportv = true; } else if (var_mode & ENV_UNEXPORT) { exportv = false; } else { exportv = env_universal_get_export(key); } env_universal_set(key, val, exportv); is_universal = 1; done = 1; } else { /* New variable with unspecified scope. The default scope is the innermost scope that is shadowing, which will be either the current function or the global scope. */ node = top; while (node->next && !node->new_scope) { node = node->next; } } } if (!done) { // Set the entry in the node // Note that operator[] accesses the existing entry, or creates a new one var_entry_t &entry = node->env[key]; if (entry.exportv) { // this variable already existed, and was exported has_changed_new = true; } entry.val = val; if (var_mode & ENV_EXPORT) { // the new variable is exported entry.exportv = true; node->exportv = true; has_changed_new = true; } else { entry.exportv = false; } if (has_changed_old || has_changed_new) mark_changed_exported(); } } if (!is_universal) { event_t ev = event_t::variable_event(key); ev.arguments.push_back(L"VARIABLE"); ev.arguments.push_back(L"SET"); ev.arguments.push_back(key); // debug( 1, L"env_set: fire events on variable %ls", key ); event_fire(&ev); // debug( 1, L"env_set: return from event firing" ); } react_to_variable_change(key); return 0; } /** Attempt to remove/free the specified key/value pair from the specified map. \return zero if the variable was not found, non-zero otherwise */ static bool try_remove(env_node_t *n, const wchar_t *key, int var_mode) { if (n == NULL) { return false; } var_table_t::iterator result = n->env.find(key); if (result != n->env.end()) { if (result->second.exportv) { mark_changed_exported(); } n->env.erase(result); return true; } if (var_mode & ENV_LOCAL) { return false; } if (n->new_scope) { return try_remove(global_env, key, var_mode); } else { return try_remove(n->next, key, var_mode); } } int env_remove(const wcstring &key, int var_mode) { ASSERT_IS_MAIN_THREAD(); env_node_t *first_node; int erased = 0; if ((var_mode & ENV_USER) && is_read_only(key)) { return 2; } first_node = top; if (!(var_mode & ENV_UNIVERSAL)) { if (var_mode & ENV_GLOBAL) { first_node = global_env; } if (try_remove(first_node, key.c_str(), var_mode)) { event_t ev = event_t::variable_event(key); ev.arguments.push_back(L"VARIABLE"); ev.arguments.push_back(L"ERASE"); ev.arguments.push_back(key); event_fire(&ev); erased = 1; } } if (!erased && !(var_mode & ENV_GLOBAL) && !(var_mode & ENV_LOCAL)) { erased = ! env_universal_remove(key.c_str()); } react_to_variable_change(key); return !erased; } const wchar_t *env_var_t::c_str(void) const { assert(! is_missing); return wcstring::c_str(); } env_var_t env_get_string(const wcstring &key) { /* Big hack...we only allow getting the history on the main thread. Note that history_t may ask for an environment variable, so don't take the lock here (we don't need it) */ const bool is_main = is_main_thread(); if (key == L"history" && is_main) { env_var_t result; history_t *history = reader_get_history(); if (! history) { history = &history_t::history_with_name(L"fish"); } if (history) history->get_string_representation(result, ARRAY_SEP_STR); return result; } else if (key == L"COLUMNS") { return to_string(common_get_width()); } else if (key == L"LINES") { return to_string(common_get_width()); } else if (key == L"status") { return to_string(proc_get_last_status()); } else if (key == L"umask") { return format_string(L"0%0.3o", get_umask()); } else { { /* Lock around a local region */ scoped_lock lock(env_lock); env_node_t *env = top; wcstring result; while (env != NULL) { const var_entry_t *entry = env->find_entry(key); if (entry != NULL) { if (entry->val == ENV_NULL) { return env_var_t::missing_var(); } else { return entry->val; } } env = env->next_scope_to_search(); } } /* Another big hack - only do a universal barrier on the main thread (since it can change variable values) Make sure we do this outside the env_lock because it may itself call env_get_string */ if (is_main && ! get_proc_had_barrier()) { set_proc_had_barrier(true); env_universal_barrier(); } const wchar_t *item = env_universal_get(key); if (!item || (wcscmp(item, ENV_NULL)==0)) { return env_var_t::missing_var(); } else { return item; } } } bool env_exist(const wchar_t *key, int mode) { env_node_t *env; const wchar_t *item = NULL; CHECK(key, false); /* Read only variables all exist, and they are all global. A local version can not exist. */ if (!(mode & ENV_LOCAL) && !(mode & ENV_UNIVERSAL)) { if (is_read_only(key) || is_electric(key)) { //Such variables are never exported if (mode & ENV_EXPORT) { return false; } else if (mode & ENV_UNEXPORT) { return true; } return true; } } if (!(mode & ENV_UNIVERSAL)) { env = (mode & ENV_GLOBAL)?global_env:top; while (env != 0) { var_table_t::iterator result = env->env.find(key); if (result != env->env.end()) { const var_entry_t &res = result->second; if (mode & ENV_EXPORT) { return res.exportv; } else if (mode & ENV_UNEXPORT) { return ! res.exportv; } return true; } if (mode & ENV_LOCAL) break; env = env->next_scope_to_search(); } } if (!(mode & ENV_LOCAL) && !(mode & ENV_GLOBAL)) { if (! get_proc_had_barrier()) { set_proc_had_barrier(true); env_universal_barrier(); } item = env_universal_get(key); if (item != NULL) { if (mode & ENV_EXPORT) { return env_universal_get_export(key) == 1; } else if (mode & ENV_UNEXPORT) { return env_universal_get_export(key) == 0; } return 1; } } return 0; } /** Returns true if the specified scope or any non-shadowed non-global subscopes contain an exported variable. */ static int local_scope_exports(env_node_t *n) { if (n==global_env) return 0; if (n->exportv) return 1; if (n->new_scope) return 0; return local_scope_exports(n->next); } void env_push(bool new_scope) { env_node_t *node = new env_node_t; node->next = top; node->new_scope=new_scope; if (new_scope) { if (local_scope_exports(top)) mark_changed_exported(); } top = node; } void env_pop() { if (&top->env != global) { int i; int locale_changed = 0; env_node_t *killme = top; for (i=0; locale_variable[i]; i++) { var_table_t::iterator result = killme->env.find(locale_variable[i]); if (result != killme->env.end()) { locale_changed = 1; break; } } if (killme->new_scope) { if (killme->exportv || local_scope_exports(killme->next)) mark_changed_exported(); } top = top->next; var_table_t::iterator iter; for (iter = killme->env.begin(); iter != killme->env.end(); ++iter) { const var_entry_t &entry = iter->second; if (entry.exportv) { mark_changed_exported(); break; } } delete killme; if (locale_changed) handle_locale(); } else { debug(0, _(L"Tried to pop empty environment stack.")); sanity_lose(); } } /** Function used with to insert keys of one table into a set::set */ static void add_key_to_string_set(const var_table_t &envs, std::set *str_set, bool show_exported, bool show_unexported) { var_table_t::const_iterator iter; for (iter = envs.begin(); iter != envs.end(); ++iter) { const var_entry_t &e = iter->second; if ((e.exportv && show_exported) || (!e.exportv && show_unexported)) { /* Insert this key */ str_set->insert(iter->first); } } } wcstring_list_t env_get_names(int flags) { scoped_lock lock(env_lock); wcstring_list_t result; std::set names; int show_local = flags & ENV_LOCAL; int show_global = flags & ENV_GLOBAL; int show_universal = flags & ENV_UNIVERSAL; env_node_t *n=top; const bool show_exported = (flags & ENV_EXPORT) || !(flags & ENV_UNEXPORT); const bool show_unexported = (flags & ENV_UNEXPORT) || !(flags & ENV_EXPORT); if (!show_local && !show_global && !show_universal) { show_local =show_universal = show_global=1; } if (show_local) { while (n) { if (n == global_env) break; add_key_to_string_set(n->env, &names, show_exported, show_unexported); if (n->new_scope) break; else n = n->next; } } if (show_global) { add_key_to_string_set(global_env->env, &names, show_exported, show_unexported); if (show_unexported) { result.insert(result.end(), env_electric.begin(), env_electric.end()); } if (show_exported) { result.push_back(L"COLUMNS"); result.push_back(L"LINES"); } } if (show_universal) { wcstring_list_t uni_list; env_universal_get_names(uni_list, show_exported, show_unexported); names.insert(uni_list.begin(), uni_list.end()); } result.insert(result.end(), names.begin(), names.end()); return result; } /** Get list of all exported variables */ static void get_exported(const env_node_t *n, std::map &h) { if (!n) return; if (n->new_scope) get_exported(global_env, h); else get_exported(n->next, h); var_table_t::const_iterator iter; for (iter = n->env.begin(); iter != n->env.end(); ++iter) { const wcstring &key = iter->first; const var_entry_t &val_entry = iter->second; if (val_entry.exportv && (val_entry.val != ENV_NULL)) { // Don't use std::map::insert here, since we need to overwrite existing values from previous scopes h[key] = val_entry.val; } } } static void export_func(const std::map &envs, std::vector &out) { std::map::const_iterator iter; for (iter = envs.begin(); iter != envs.end(); ++iter) { const std::string ks = wcs2string(iter->first); std::string vs = wcs2string(iter->second); for (size_t i=0; i < vs.size(); i++) { char &vc = vs.at(i); if (vc == ARRAY_SEP) vc = ':'; } /* Put a string on the vector */ out.push_back(std::string()); std::string &str = out.back(); str.reserve(ks.size() + 1 + vs.size()); /* Append our environment variable data to it */ str.append(ks); str.append("="); str.append(vs); } } static void update_export_array_if_necessary(bool recalc) { ASSERT_IS_MAIN_THREAD(); if (recalc && ! get_proc_had_barrier()) { set_proc_had_barrier(true); env_universal_barrier(); } if (has_changed_exported) { std::map vals; size_t i; debug(4, L"env_export_arr() recalc"); get_exported(top, vals); wcstring_list_t uni; env_universal_get_names(uni, 1, 0); for (i=0; i(key, val)); } } std::vector local_export_buffer; export_func(vals, local_export_buffer); export_array.set(local_export_buffer); has_changed_exported=false; } } const char * const *env_export_arr(bool recalc) { ASSERT_IS_MAIN_THREAD(); update_export_array_if_necessary(recalc); return export_array.get(); } env_vars_snapshot_t::env_vars_snapshot_t(const wchar_t * const *keys) { ASSERT_IS_MAIN_THREAD(); wcstring key; for (size_t i=0; keys[i]; i++) { key.assign(keys[i]); const env_var_t val = env_get_string(key); if (! val.missing()) { vars[key] = val; } } } env_vars_snapshot_t::env_vars_snapshot_t() { } /* The "current" variables are not a snapshot at all, but instead trampoline to env_get_string, etc. We identify the current snapshot based on pointer values. */ static const env_vars_snapshot_t sCurrentSnapshot; const env_vars_snapshot_t &env_vars_snapshot_t::current() { return sCurrentSnapshot; } bool env_vars_snapshot_t::is_current() const { return this == &sCurrentSnapshot; } env_var_t env_vars_snapshot_t::get(const wcstring &key) const { /* If we represent the current state, bounce to env_get_string */ if (this->is_current()) { return env_get_string(key); } else { std::map::const_iterator iter = vars.find(key); return (iter == vars.end() ? env_var_t::missing_var() : env_var_t(iter->second)); } } const wchar_t * const env_vars_snapshot_t::highlighting_keys[] = {L"PATH", L"CDPATH", L"fish_function_path", NULL}; fish/env.h000066400000000000000000000140751214535744100127650ustar00rootroot00000000000000/** \file env.h Prototypes for functions for setting and getting environment variables. */ #ifndef FISH_ENV_H #define FISH_ENV_H #include #include #include "util.h" #include "common.h" /** Flag for local (to the current block) variable */ #define ENV_LOCAL 1 /** Flag for exported (to commands) variable */ #define ENV_EXPORT 2 /** Flag for unexported variable */ #define ENV_UNEXPORT 16 /** Flag for global variable */ #define ENV_GLOBAL 4 /** Flag for variable update request from the user. All variable changes that are made directly by the user, such as those from the 'set' builtin must have this flag set. */ #define ENV_USER 8 /** Flag for universal variable */ #define ENV_UNIVERSAL 32 /** Error code for trying to alter read-only variable */ enum { ENV_PERM = 1, ENV_INVALID } ; /* A struct of configuration directories, determined in main() that fish will optionally pass to env_init. */ struct config_paths_t { wcstring data; // e.g. /usr/local/share wcstring sysconf; // e.g. /usr/local/etc wcstring doc; // e.g. /usr/local/share/doc/fish wcstring bin; // e.g. /usr/local/bin }; /** Initialize environment variable data */ void env_init(const struct config_paths_t *paths = NULL); /** Destroy environment variable data */ void env_destroy(); /** Set the value of the environment variable whose name matches key to val. Memory policy: All keys and values are copied, the parameters can and should be freed by the caller afterwards \param key The key \param val The value \param mode The type of the variable. Can be any combination of ENV_GLOBAL, ENV_LOCAL, ENV_EXPORT and ENV_USER. If mode is zero, the current variable space is searched and the current mode is used. If no current variable with the same name is found, ENV_LOCAL is assumed. \returns 0 on suicess or an error code on failiure. The current error codes are: * ENV_PERM, can only be returned when setting as a user, e.g. ENV_USER is set. This means that the user tried to change a read-only variable. * ENV_INVALID, the variable name or mode was invalid */ int env_set(const wcstring &key, const wchar_t *val, int mode); /** Return the value of the variable with the specified name. Returns 0 if the key does not exist. The returned string should not be modified or freed. The returned string is only guaranteed to be valid until the next call to env_get(), env_set(), env_push() or env_pop() takes place. */ //const wchar_t *env_get( const wchar_t *key ); class env_var_t : public wcstring { private: bool is_missing; public: static env_var_t missing_var(void) { env_var_t result(L""); result.is_missing = true; return result; } env_var_t(const env_var_t &x) : wcstring(x), is_missing(x.is_missing) { } env_var_t(const wcstring & x) : wcstring(x), is_missing(false) { } env_var_t(const wchar_t *x) : wcstring(x), is_missing(false) { } env_var_t() : wcstring(L""), is_missing(false) { } bool missing(void) const { return is_missing; } bool missing_or_empty(void) const { return missing() || empty(); } const wchar_t *c_str(void) const; env_var_t &operator=(const env_var_t &s) { is_missing = s.is_missing; wcstring::operator=(s); return *this; } bool operator==(const env_var_t &s) const { return is_missing == s.is_missing && static_cast(*this) == static_cast(s); } bool operator==(const wcstring &s) const { return ! is_missing && static_cast(*this) == s; } bool operator!=(const env_var_t &s) const { return !(*this == s); } bool operator!=(const wcstring &s) const { return !(*this == s); } bool operator==(const wchar_t *s) const { return ! is_missing && static_cast(*this) == s; } bool operator!=(const wchar_t *s) const { return !(*this == s); } }; /** Gets the variable with the specified name, or env_var_t::missing_var if it does not exist. */ env_var_t env_get_string(const wcstring &key); /** Returns true if the specified key exists. This can't be reliably done using env_get, since env_get returns null for 0-element arrays \param key The name of the variable to remove \param mode the scope to search in. All scopes are searched if unset */ bool env_exist(const wchar_t *key, int mode); /** Remove environemnt variable \param key The name of the variable to remove \param mode should be ENV_USER if this is a remove request from the user, 0 otherwise. If this is a user request, read-only variables can not be removed. The mode may also specify the scope of the variable that should be erased. \return zero if the variable existed, and non-zero if the variable did not exist */ int env_remove(const wcstring &key, int mode); /** Push the variable stack. Used for implementing local variables for functions and for-loops. */ void env_push(bool new_scope); /** Pop the variable stack. Used for implementing local variables for functions and for-loops. */ void env_pop(); /** Returns an array containing all exported variables in a format suitable for execv. */ const char * const * env_export_arr(bool recalc); /** Returns all variable names. */ wcstring_list_t env_get_names(int flags); /** Update the PWD variable directory */ int env_set_pwd(); /* Returns the PWD with a terminating slash */ wcstring env_get_pwd_slash(); class env_vars_snapshot_t { std::map vars; bool is_current() const; public: env_vars_snapshot_t(const wchar_t * const * keys); env_vars_snapshot_t(void); env_var_t get(const wcstring &key) const; // Returns the fake snapshot representing the live variables array static const env_vars_snapshot_t ¤t(); // vars necessary for highlighting static const wchar_t * const highlighting_keys[]; }; extern bool g_log_forks; extern int g_fork_count; extern bool g_use_posix_spawn; #endif fish/env_universal.cpp000066400000000000000000000241331214535744100154040ustar00rootroot00000000000000#include "config.h" #include #include #include #include #include #include #include #include #include #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #ifdef HAVE_SYS_SELECT_H #include #endif #include #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" #include "env_universal_common.h" #include "env_universal.h" /** Maximum number of times to try to get a new fishd socket */ #define RECONNECT_COUNT 32 connection_t env_universal_server(-1); /** Set to true after initialization has been performed */ static bool s_env_univeral_inited = false; /** The number of attempts to start fishd */ static int get_socket_count = 0; #define DEFAULT_RETRY_COUNT 15 #define DEFAULT_RETRY_DELAY 0.2 static wchar_t * path; static wchar_t *user; static void (*start_fishd)(); static void (*external_callback)(fish_message_type_t type, const wchar_t *name, const wchar_t *val); /** Flag set to 1 when a barrier reply is recieved */ static int barrier_reply = 0; void env_universal_barrier(); static int is_dead() { return env_universal_server.fd < 0; } static int try_get_socket_once(void) { int s; wchar_t *wdir; wchar_t *wuname; char *dir = 0; wdir = path; wuname = user; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { wperror(L"socket"); return -1; } if (wdir) dir = wcs2str(wdir); else dir = strdup("/tmp"); std::string uname; if (wuname) { uname = wcs2string(wuname); } else { struct passwd *pw = getpwuid(getuid()); if (pw && pw->pw_name) { uname = pw->pw_name; } } std::string name; name.reserve(strlen(dir) + uname.size() + strlen(SOCK_FILENAME) + 2); name.append(dir); name.append("/"); name.append(SOCK_FILENAME); name.append(uname); free(dir); debug(3, L"Connect to socket %s at fd %2", name.c_str(), s); struct sockaddr_un local = {}; local.sun_family = AF_UNIX; strncpy(local.sun_path, name.c_str(), (sizeof local.sun_path) - 1); if (connect(s, (struct sockaddr *)&local, sizeof local) == -1) { close(s); return -1; } if ((make_fd_nonblocking(s) != 0) || (fcntl(s, F_SETFD, FD_CLOEXEC) != 0)) { wperror(L"fcntl"); close(s); return -1; } debug(3, L"Connected to fd %d", s); return s; } /** Get a socket for reading from the server */ static int get_socket(void) { get_socket_count++; int s = try_get_socket_once(); if (s < 0) { if (start_fishd) { debug(2, L"Could not connect to socket %d, starting fishd", s); start_fishd(); for (size_t i=0; s < 0 && i < DEFAULT_RETRY_COUNT; i++) { if (i > 0) { // Wait before next try usleep((useconds_t)(DEFAULT_RETRY_DELAY * 1E6)); } s = try_get_socket_once(); } } } if (s < 0) { debug(1, L"Could not connect to universal variable server, already tried manual restart (or no command supplied). You will not be able to share variable values between fish sessions. Is fish properly installed?"); return -1; } return s; } /** Callback function used whenever a new fishd message is recieved */ static void callback(fish_message_type_t type, const wchar_t *name, const wchar_t *val) { if (type == BARRIER_REPLY) { barrier_reply = 1; } else { if (external_callback) external_callback(type, name, val); } } /** Make sure the connection is healthy. If not, close it, and try to establish a new connection. */ static void check_connection(void) { if (! s_env_univeral_inited) return; if (env_universal_server.killme) { debug(3, L"Lost connection to universal variable server."); if (close(env_universal_server.fd)) { wperror(L"close"); } env_universal_server.fd = -1; env_universal_server.killme=0; env_universal_server.input.clear(); env_universal_read_all(); } } /** Remove all universal variables. */ static void env_universal_remove_all() { size_t i; wcstring_list_t lst; env_universal_common_get_names(lst, 1, 1); for (i=0; i= RECONNECT_COUNT) return; debug(3, L"Get new fishd connection"); s_env_univeral_inited = false; env_universal_server.buffer_consumed = 0; env_universal_server.read_buffer.clear(); env_universal_server.fd = get_socket(); s_env_univeral_inited = true; if (env_universal_server.fd >= 0) { env_universal_remove_all(); env_universal_barrier(); } } void env_universal_init(wchar_t * p, wchar_t *u, void (*sf)(), void (*cb)(fish_message_type_t type, const wchar_t *name, const wchar_t *val)) { path=p; user=u; start_fishd=sf; external_callback = cb; env_universal_server.fd = get_socket(); env_universal_common_init(&callback); env_universal_read_all(); s_env_univeral_inited = true; if (env_universal_server.fd >= 0) { env_universal_barrier(); } } void env_universal_destroy() { /* Go into blocking mode and send all data before exiting */ if (env_universal_server.fd >= 0) { if (fcntl(env_universal_server.fd, F_SETFL, 0) != 0) { wperror(L"fcntl"); } try_send_all(&env_universal_server); } connection_destroy(&env_universal_server); env_universal_server.fd =-1; s_env_univeral_inited = false; } /** Read all available messages from the server. */ int env_universal_read_all() { if (! s_env_univeral_inited) return 0; if (env_universal_server.fd == -1) { reconnect(); if (env_universal_server.fd == -1) return 0; } if (env_universal_server.fd != -1) { read_message(&env_universal_server); check_connection(); return 1; } else { debug(2, L"No connection to universal variable server"); return 0; } } const wchar_t *env_universal_get(const wcstring &name) { if (!s_env_univeral_inited) return NULL; return env_universal_common_get(name); } bool env_universal_get_export(const wcstring &name) { if (!s_env_univeral_inited) return false; return env_universal_common_get_export(name); } void env_universal_barrier() { ASSERT_IS_MAIN_THREAD(); message_t *msg; fd_set fds; if (!s_env_univeral_inited || is_dead()) return; barrier_reply = 0; /* Create barrier request */ msg= create_message(BARRIER, 0, 0); msg->count=1; env_universal_server.unsent.push(msg); /* Wait until barrier request has been sent */ debug(3, L"Create barrier"); while (1) { try_send_all(&env_universal_server); check_connection(); if (env_universal_server.unsent.empty()) break; if (env_universal_server.fd == -1) { reconnect(); debug(2, L"barrier interrupted, exiting"); return; } FD_ZERO(&fds); FD_SET(env_universal_server.fd, &fds); select(env_universal_server.fd+1, 0, &fds, 0, 0); } /* Wait for barrier reply */ debug(3, L"Sent barrier request"); while (!barrier_reply) { if (env_universal_server.fd == -1) { reconnect(); debug(2, L"barrier interrupted, exiting (2)"); return; } FD_ZERO(&fds); FD_SET(env_universal_server.fd, &fds); select(env_universal_server.fd+1, &fds, 0, 0, 0); env_universal_read_all(); } debug(3, L"End barrier"); } void env_universal_set(const wcstring &name, const wcstring &value, bool exportv) { message_t *msg; if (!s_env_univeral_inited) return; debug(3, L"env_universal_set( \"%ls\", \"%ls\" )", name.c_str(), value.c_str()); if (is_dead()) { env_universal_common_set(name.c_str(), value.c_str(), exportv); } else { msg = create_message(exportv?SET_EXPORT:SET, name.c_str(), value.c_str()); if (!msg) { debug(1, L"Could not create universal variable message"); return; } msg->count=1; env_universal_server.unsent.push(msg); env_universal_barrier(); } } int env_universal_remove(const wchar_t *name) { int res; message_t *msg; if (!s_env_univeral_inited) return 1; CHECK(name, 1); res = !env_universal_common_get(name); debug(3, L"env_universal_remove( \"%ls\" )", name); if (is_dead()) { env_universal_common_remove(wcstring(name)); } else { msg= create_message(ERASE, name, 0); msg->count=1; env_universal_server.unsent.push(msg); env_universal_barrier(); } return res; } void env_universal_get_names(wcstring_list_t &lst, bool show_exported, bool show_unexported) { if (!s_env_univeral_inited) return; env_universal_common_get_names(lst, show_exported, show_unexported); } fish/env_universal.h000066400000000000000000000032541214535744100150520ustar00rootroot00000000000000/** \file env_universal.h Universal variable client library. */ #ifndef ENV_UNIVERSAL_H #define ENV_UNIVERSAL_H #include #include "env_universal_common.h" /** Data about the universal variable server. */ extern connection_t env_universal_server; /** Initialize the envuni library */ void env_universal_init(wchar_t * p, wchar_t *u, void (*sf)(), void (*cb)(fish_message_type_t type, const wchar_t *name, const wchar_t *val)); /** Free memory used by envuni */ void env_universal_destroy(); /** Get the value of a universal variable */ const wchar_t *env_universal_get(const wcstring &name); /** Get the export flag of the variable with the specified name. Returns 0 if the variable doesn't exist. */ bool env_universal_get_export(const wcstring &name); /** Set the value of a universal variable */ void env_universal_set(const wcstring &name, const wcstring &val, bool exportv); /** Erase a universal variable \return zero if the variable existed, and non-zero if the variable did not exist */ int env_universal_remove(const wchar_t *name); /** Read all available messages from the server. */ int env_universal_read_all(); /** Get the names of all universal variables \param l the list to insert the names into \param show_exported whether exported variables should be shown \param show_unexported whether unexported variables should be shown */ void env_universal_get_names(wcstring_list_t &list, bool show_exported, bool show_unexported); /** Synchronize with fishd */ void env_universal_barrier(); #endif fish/env_universal_common.cpp000066400000000000000000000504151214535744100167560ustar00rootroot00000000000000/** \file env_universal_common.c The utility library for universal variables. Used both by the client library and by the daemon. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include #endif #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" #include "env_universal_common.h" /** Non-wide version of the set command */ #define SET_MBS "SET" /** Non-wide version of the set_export command */ #define SET_EXPORT_MBS "SET_EXPORT" /** Non-wide version of the erase command */ #define ERASE_MBS "ERASE" /** Non-wide version of the barrier command */ #define BARRIER_MBS "BARRIER" /** Non-wide version of the barrier_reply command */ #define BARRIER_REPLY_MBS "BARRIER_REPLY" /** Error message */ #define PARSE_ERR L"Unable to parse universal variable message: '%ls'" /** ERROR string for internal buffered reader */ #define ENV_UNIVERSAL_ERROR 0x100 /** EAGAIN string for internal buffered reader */ #define ENV_UNIVERSAL_AGAIN 0x101 /** EOF string for internal buffered reader */ #define ENV_UNIVERSAL_EOF 0x102 /** A variable entry. Stores the value of a variable and whether it should be exported. Obviously, it needs to be allocated large enough to fit the value string. */ typedef struct var_uni_entry { bool exportv; /**< Whether the variable should be exported */ wcstring val; /**< The value of the variable */ var_uni_entry():exportv(false), val() { } } var_uni_entry_t; static void parse_message(wchar_t *msg, connection_t *src); /** The table of all universal variables */ typedef std::map env_var_table_t; env_var_table_t env_universal_var; /** Callback function, should be called on all events */ static void (*callback)(fish_message_type_t type, const wchar_t *key, const wchar_t *val); /** List of names for the UTF-8 character set. */ static const char *iconv_utf8_names[]= { "utf-8", "UTF-8", "utf8", "UTF8", 0 } ; /** List of wide character names, undefined byte length. */ static const char *iconv_wide_names_unknown[]= { "wchar_t", "WCHAR_T", "wchar", "WCHAR", 0 } ; /** List of wide character names, 4 bytes long. */ static const char *iconv_wide_names_4[]= { "wchar_t", "WCHAR_T", "wchar", "WCHAR", "ucs-4", "UCS-4", "ucs4", "UCS4", "utf-32", "UTF-32", "utf32", "UTF32", 0 } ; /** List of wide character names, 2 bytes long. */ static const char *iconv_wide_names_2[]= { "wchar_t", "WCHAR_T", "wchar", "WCHAR", "ucs-2", "UCS-2", "ucs2", "UCS2", "utf-16", "UTF-16", "utf16", "UTF16", 0 } ; template class sloppy {}; static size_t hack_iconv(iconv_t cd, const char * const* inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { /* FreeBSD has this prototype: size_t iconv (iconv_t, const char **...) OS X and Linux this one: size_t iconv (iconv_t, char **...) AFAIK there's no single type that can be passed as both char ** and const char **. Therefore, we let C++ figure it out, by providing a struct with an implicit conversion to both char** and const char **. */ struct sloppy_char { const char * const * t; operator char** () const { return (char **)t; } operator const char** () const { return (const char**)t; } } slop_inbuf = {inbuf}; return iconv(cd, slop_inbuf, inbytesleft, outbuf, outbytesleft); } /** Convert utf-8 string to wide string */ static wchar_t *utf2wcs(const char *in) { iconv_t cd=(iconv_t) -1; int i,j; wchar_t *out; /* Try to convert to wchar_t. If that is not a valid character set, try various names for ucs-4. We can't be sure that ucs-4 is really the character set used by wchar_t, but it is the best assumption we can make. */ const char **to_name=0; switch (sizeof(wchar_t)) { case 2: to_name = iconv_wide_names_2; break; case 4: to_name = iconv_wide_names_4; break; default: to_name = iconv_wide_names_unknown; break; } /* The line protocol fish uses is always utf-8. */ const char **from_name = iconv_utf8_names; size_t in_len = strlen(in); size_t out_len = sizeof(wchar_t)*(in_len+2); size_t nconv; char *nout; out = (wchar_t *)malloc(out_len); nout = (char *)out; if (!out) return 0; for (i=0; to_name[i]; i++) { for (j=0; from_name[j]; j++) { cd = iconv_open(to_name[i], from_name[j]); if (cd != (iconv_t) -1) { goto start_conversion; } } } start_conversion: if (cd == (iconv_t) -1) { /* Something went wrong. */ debug(0, L"Could not perform utf-8 conversion"); if (errno != EINVAL) wperror(L"iconv_open"); /* Terminate the output string. */ free(out); return 0; } /* FreeBSD has this prototype: size_t iconv (iconv_t, const char **...) OS X and Linux this one: size_t iconv (iconv_t, char **...) AFAIK there's no single type that can be passed as both char ** and const char **. Hence this hack. */ nconv = hack_iconv(cd, &in, &in_len, &nout, &out_len); if (nconv == (size_t) -1) { debug(0, L"Error while converting from utf string"); return 0; } *((wchar_t *) nout) = L'\0'; /* Check for silly iconv behaviour inserting an bytemark in the output string. */ if (*out == L'\xfeff' || *out == L'\xffef' || *out == L'\xefbbbf') { wchar_t *out_old = out; out = wcsdup(out+1); if (! out) { debug(0, L"FNORD!!!!"); free(out_old); return 0; } free(out_old); } if (iconv_close(cd) != 0) wperror(L"iconv_close"); return out; } /** Convert wide string to utf-8 */ static char *wcs2utf(const wchar_t *in) { iconv_t cd=(iconv_t) -1; int i,j; char *char_in = (char *)in; char *out; /* Try to convert to wchar_t. If that is not a valid character set, try various names for ucs-4. We can't be sure that ucs-4 is really the character set used by wchar_t, but it is the best assumption we can make. */ const char **from_name=0; switch (sizeof(wchar_t)) { case 2: from_name = iconv_wide_names_2; break; case 4: from_name = iconv_wide_names_4; break; default: from_name = iconv_wide_names_unknown; break; } const char **to_name = iconv_utf8_names; size_t in_len = wcslen(in); size_t out_len = sizeof(char)*((MAX_UTF8_BYTES*in_len)+1); size_t nconv; char *nout; out = (char *)malloc(out_len); nout = (char *)out; in_len *= sizeof(wchar_t); if (!out) return 0; for (i=0; to_name[i]; i++) { for (j=0; from_name[j]; j++) { cd = iconv_open(to_name[i], from_name[j]); if (cd != (iconv_t) -1) { goto start_conversion; } } } start_conversion: if (cd == (iconv_t) -1) { /* Something went wrong. */ debug(0, L"Could not perform utf-8 conversion"); if (errno != EINVAL) wperror(L"iconv_open"); /* Terminate the output string. */ free(out); return 0; } nconv = hack_iconv(cd, &char_in, &in_len, &nout, &out_len); if (nconv == (size_t) -1) { debug(0, L"%d %d", in_len, out_len); debug(0, L"Error while converting from to string"); return 0; } *nout = '\0'; if (iconv_close(cd) != 0) wperror(L"iconv_close"); return out; } void env_universal_common_init(void (*cb)(fish_message_type_t type, const wchar_t *key, const wchar_t *val)) { callback = cb; } /** Read one byte of date form the specified connection */ static int read_byte(connection_t *src) { if (src->buffer_consumed >= src->read_buffer.size()) { char local[ENV_UNIVERSAL_BUFFER_SIZE]; ssize_t res = read(src->fd, local, sizeof local); // debug(4, L"Read chunk '%.*s'", res, src->buffer ); if (res < 0) { if (errno == EAGAIN || errno == EINTR) { return ENV_UNIVERSAL_AGAIN; } return ENV_UNIVERSAL_ERROR; } else if (res == 0) { return ENV_UNIVERSAL_EOF; } else { src->read_buffer.clear(); src->read_buffer.insert(src->read_buffer.begin(), local, local + res); src->buffer_consumed = 0; } } return src->read_buffer.at(src->buffer_consumed++); } void read_message(connection_t *src) { while (1) { int ib = read_byte(src); char b; switch (ib) { case ENV_UNIVERSAL_AGAIN: { return; } case ENV_UNIVERSAL_ERROR: { debug(2, L"Read error on fd %d, set killme flag", src->fd); if (debug_level > 2) wperror(L"read"); src->killme = 1; return; } case ENV_UNIVERSAL_EOF: { src->killme = 1; debug(3, L"Fd %d has reached eof, set killme flag", src->fd); if (! src->input.empty()) { char c = 0; src->input.push_back(c); debug(1, L"Universal variable connection closed while reading command. Partial command recieved: '%s'", &src->input.at(0)); } return; } } b = (char)ib; if (b == '\n') { wchar_t *msg; b = 0; src->input.push_back(b); msg = utf2wcs(&src->input.at(0)); /* Before calling parse_message, we must empty reset everything, since the callback function could potentially call read_message. */ src->input.clear(); if (msg) { parse_message(msg, src); } else { debug(0, _(L"Could not convert message '%s' to wide character string"), &src->input.at(0)); } free(msg); } else { src->input.push_back(b); } } } /** Remove variable with specified name */ void env_universal_common_remove(const wcstring &name) { env_universal_var.erase(name); } /** Test if the message msg contains the command cmd */ static bool match(const wchar_t *msg, const wchar_t *cmd) { size_t len = wcslen(cmd); if (wcsncasecmp(msg, cmd, len) != 0) return false; if (msg[len] && msg[len]!= L' ' && msg[len] != L'\t') return false; return true; } void env_universal_common_set(const wchar_t *key, const wchar_t *val, bool exportv) { CHECK(key,); CHECK(val,); var_uni_entry_t &entry = env_universal_var[key]; entry.exportv=exportv; entry.val = val; if (callback) { callback(exportv?SET_EXPORT:SET, key, val); } } /** Parse message msg */ static void parse_message(wchar_t *msg, connection_t *src) { // debug( 3, L"parse_message( %ls );", msg ); if (msg[0] == L'#') return; if (match(msg, SET_STR) || match(msg, SET_EXPORT_STR)) { wchar_t *name, *tmp; bool exportv = match(msg, SET_EXPORT_STR); name = msg+(exportv?wcslen(SET_EXPORT_STR):wcslen(SET_STR)); while (wcschr(L"\t ", *name)) name++; tmp = wcschr(name, L':'); if (tmp) { wchar_t *val; const wcstring key(name, tmp - name); val = tmp+1; val = unescape(val, 0); if (val != NULL) env_universal_common_set(key.c_str(), val, exportv); free(val); } else { debug(1, PARSE_ERR, msg); } } else if (match(msg, ERASE_STR)) { wchar_t *name, *tmp; name = msg+wcslen(ERASE_STR); while (wcschr(L"\t ", *name)) name++; tmp = name; while (iswalnum(*tmp) || *tmp == L'_') tmp++; *tmp = 0; if (!wcslen(name)) { debug(1, PARSE_ERR, msg); } env_universal_common_remove(name); if (callback) { callback(ERASE, name, 0); } } else if (match(msg, BARRIER_STR)) { message_t *msg = create_message(BARRIER_REPLY, 0, 0); msg->count = 1; src->unsent.push(msg); try_send_all(src); } else if (match(msg, BARRIER_REPLY_STR)) { if (callback) { callback(BARRIER_REPLY, 0, 0); } } else { debug(1, PARSE_ERR, msg); } } /** Attempt to send the specified message to the specified file descriptor \return 1 on sucess, 0 if the message could not be sent without blocking and -1 on error */ static int try_send(message_t *msg, int fd) { debug(3, L"before write of %d chars to fd %d", msg->body.size(), fd); ssize_t res = write(fd, msg->body.c_str(), msg->body.size()); if (res != -1) { debug(4, L"Wrote message '%s'", msg->body.c_str()); } else { debug(4, L"Failed to write message '%s'", msg->body.c_str()); } if (res == -1) { switch (errno) { case EAGAIN: return 0; default: debug(2, L"Error while sending universal variable message to fd %d. Closing connection", fd); if (debug_level > 2) wperror(L"write"); return -1; } } msg->count--; if (!msg->count) { delete msg; } return 1; } void try_send_all(connection_t *c) { /* debug( 3, L"Send all updates to connection on fd %d", c->fd );*/ while (!c->unsent.empty()) { switch (try_send(c->unsent.front(), c->fd)) { case 1: c->unsent.pop(); break; case 0: debug(4, L"Socket full, send rest later"); return; case -1: c->killme = 1; return; } } } /* The universal variable format has some funny escaping requirements; here we try to be safe */ static bool is_universal_safe_to_encode_directly(wchar_t c) { if (c < 32 || c > 128) return false; return iswalnum(c) || wcschr(L"/", c); } /** Escape specified string */ static wcstring full_escape(const wchar_t *in) { wcstring out; for (; *in; in++) { wchar_t c = *in; if (is_universal_safe_to_encode_directly(c)) { out.push_back(c); } else if (c < 256) { append_format(out, L"\\x%.2x", c); } else if (c < 65536) { append_format(out, L"\\u%.4x", c); } else { append_format(out, L"\\U%.8x", c); } } return out; } /* Sets the body of a message to the null-terminated list of null terminated const char *. */ void set_body(message_t *msg, ...) { /* Start by counting the length of all the strings */ size_t body_len = 0; const char *arg; va_list arg_list; va_start(arg_list, msg); while ((arg = va_arg(arg_list, const char *)) != NULL) body_len += strlen(arg); va_end(arg_list); /* Reserve that length in the string */ msg->body.reserve(body_len + 1); //+1 for trailing NULL? Do I need that? /* Set the string contents */ va_start(arg_list, msg); while ((arg = va_arg(arg_list, const char *)) != NULL) msg->body.append(arg); va_end(arg_list); } /* Returns an instance of message_t allocated via new */ message_t *create_message(fish_message_type_t type, const wchar_t *key_in, const wchar_t *val_in) { char *key = NULL; // debug( 4, L"Crete message of type %d", type ); if (key_in) { if (wcsvarname(key_in)) { debug(0, L"Illegal variable name: '%ls'", key_in); return NULL; } key = wcs2utf(key_in); if (!key) { debug(0, L"Could not convert %ls to narrow character string", key_in); return NULL; } } message_t *msg = new message_t; msg->count = 0; switch (type) { case SET: case SET_EXPORT: { if (!val_in) { val_in=L""; } wcstring esc = full_escape(val_in); char *val = wcs2utf(esc.c_str()); set_body(msg, (type==SET?SET_MBS:SET_EXPORT_MBS), " ", key, ":", val, "\n", NULL); free(val); break; } case ERASE: { set_body(msg, ERASE_MBS, " ", key, "\n", NULL); break; } case BARRIER: { set_body(msg, BARRIER_MBS, "\n", NULL); break; } case BARRIER_REPLY: { set_body(msg, BARRIER_REPLY_MBS, "\n", NULL); break; } default: { debug(0, L"create_message: Unknown message type"); } } free(key); // debug( 4, L"Message body is '%s'", msg->body ); return msg; } /** Put exported or unexported variables in a string list */ void env_universal_common_get_names(wcstring_list_t &lst, bool show_exported, bool show_unexported) { env_var_table_t::const_iterator iter; for (iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter) { const wcstring &key = iter->first; const var_uni_entry_t &e = iter->second; if ((e.exportv && show_exported) || (! e.exportv && show_unexported)) { lst.push_back(key); } } } const wchar_t *env_universal_common_get(const wcstring &name) { env_var_table_t::const_iterator result = env_universal_var.find(name); if (result != env_universal_var.end()) { const var_uni_entry_t &e = result->second; return const_cast(e.val.c_str()); } return NULL; } bool env_universal_common_get_export(const wcstring &name) { env_var_table_t::const_iterator result = env_universal_var.find(name); if (result != env_universal_var.end()) { const var_uni_entry_t &e = result->second; return e.exportv; } return false; } void enqueue_all(connection_t *c) { env_var_table_t::const_iterator iter; for (iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter) { const wcstring &key = iter->first; const var_uni_entry_t &entry = iter->second; message_t *msg = create_message(entry.exportv ? SET_EXPORT : SET, key.c_str(), entry.val.c_str()); msg->count=1; c->unsent.push(msg); } try_send_all(c); } connection_t::connection_t(int input_fd) : fd(input_fd), killme(false), buffer_consumed(0) { } void connection_destroy(connection_t *c) { /* A connection need not always be open - we only try to close it if it is open. */ if (c->fd >= 0) { if (close(c->fd)) { wperror(L"close"); } } } fish/env_universal_common.h000066400000000000000000000110251214535744100164150ustar00rootroot00000000000000#ifndef FISH_ENV_UNIVERSAL_COMMON_H #define FISH_ENV_UNIVERSAL_COMMON_H #include #include #include #include "util.h" /** The set command */ #define SET_STR L"SET" /** The set_export command */ #define SET_EXPORT_STR L"SET_EXPORT" /** The erase command */ #define ERASE_STR L"ERASE" /** The barrier command */ #define BARRIER_STR L"BARRIER" /** The barrier_reply command */ #define BARRIER_REPLY_STR L"BARRIER_REPLY" /** The filename to use for univeral variables. The username is appended */ #define SOCK_FILENAME "fishd.socket." /** The different types of commands that can be sent between client/server */ typedef enum { SET, SET_EXPORT, ERASE, BARRIER, BARRIER_REPLY, } fish_message_type_t; /** The size of the buffer used for reading from the socket */ #define ENV_UNIVERSAL_BUFFER_SIZE 1024 /** A struct representing a message to be sent between client and server */ typedef struct { /** Number of queues that contain this message. Once this reaches zero, the message should be deleted */ int count; /** Message body. The message must be allocated using enough memory to actually contain the message. */ std::string body; } message_t; typedef std::queue message_queue_t; /** This struct represents a connection between a universal variable server/client */ class connection_t { private: /* No assignment */ connection_t &operator=(const connection_t &); public: /** The file descriptor this socket lives on */ int fd; /** Queue of unsent messages */ std::queue unsent; /** Set to one when this connection should be killed */ bool killme; /** The input string. Input from the socket goes here. When a newline is encountered, the buffer is parsed and cleared. */ std::vector input; /** The read buffer. */ std::vector read_buffer; /** Number of bytes that have already been consumed. */ size_t buffer_consumed; /* Constructor */ connection_t(int input_fd); }; /** Read all available messages on this connection */ void read_message(connection_t *); /** Send as many messages as possible without blocking to the connection */ void try_send_all(connection_t *c); /** Create a messge with the specified properties */ message_t *create_message(fish_message_type_t type, const wchar_t *key, const wchar_t *val); /** Init the library */ void env_universal_common_init(void (*cb)(fish_message_type_t type, const wchar_t *key, const wchar_t *val)); /** Add all variable names to the specified list This function operate agains the local copy of all universal variables, it does not communicate with any other process. */ void env_universal_common_get_names(wcstring_list_t &lst, bool show_exported, bool show_unexported); /** Perform the specified variable assignment. This function operate agains the local copy of all universal variables, it does not communicate with any other process. Do not call this function. Create a message to do it. This function is only to be used when fishd is dead. */ void env_universal_common_set(const wchar_t *key, const wchar_t *val, bool exportv); /** Remove the specified variable. This function operate agains the local copy of all universal variables, it does not communicate with any other process. Do not call this function. Create a message to do it. This function is only to be used when fishd is dead. */ void env_universal_common_remove(const wcstring &key); /** Get the value of the variable with the specified name This function operate agains the local copy of all universal variables, it does not communicate with any other process. */ const wchar_t *env_universal_common_get(const wcstring &name); /** Get the export flag of the variable with the specified name. Returns false if the variable doesn't exist. This function operate agains the local copy of all universal variables, it does not communicate with any other process. */ bool env_universal_common_get_export(const wcstring &name); /** Add messages about all existing variables to the specified connection */ void enqueue_all(connection_t *c); /** Close and destroy the specified connection struct. This frees allstructures allocated by the connection, such as ques of unsent messages. */ void connection_destroy(connection_t *c); #endif fish/etc/000077500000000000000000000000001214535744100125705ustar00rootroot00000000000000fish/etc/config.fish000066400000000000000000000012041214535744100147050ustar00rootroot00000000000000# # Init file for fish # # # Some things should only be done for login terminals # if status --is-login # # Set some value for LANG if nothing was set before, and this is a # login shell. # if not set -q LANG >/dev/null set -gx LANG en_US.UTF-8 end # Check for i18n information in # /etc/sysconfig/i18n if test -f /etc/sysconfig/i18n eval (cat /etc/sysconfig/i18n |sed -ne 's/^\([a-zA-Z]*\)=\(.*\)$/set -gx \1 \2;/p') end # # Put linux consoles in unicode mode. # if test "$TERM" = linux if expr "$LANG" : ".*\.[Uu][Tt][Ff].*" >/dev/null if which unicode_start >/dev/null unicode_start end end end end fish/event.cpp000066400000000000000000000434271214535744100136540ustar00rootroot00000000000000/** \file event.c Functions for handling event triggers */ #include "config.h" #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "function.h" #include "input_common.h" #include "proc.h" #include "parser.h" #include "common.h" #include "event.h" #include "signal.h" /** Number of signals that can be queued before an overflow occurs */ #define SIG_UNHANDLED_MAX 64 /** This struct contains a list of generated signals waiting to be dispatched */ typedef struct { /** Number of delivered signals */ volatile int count; /** Whether signals have been skipped */ volatile int overflow; /** Array of signal events */ volatile int signal[SIG_UNHANDLED_MAX]; } signal_list_t; /** The signal event list. Actually two separate lists. One which is active, which is the one that new events is written to. The inactive one contains the events that are currently beeing performed. */ static signal_list_t sig_list[]= {{0,0},{0,0}}; /** The index of sig_list that is the list of signals currently written to */ static volatile int active_list=0; typedef std::vector event_list_t; /** List of event handlers. Note this is inspected by our signal handler, so we must block signals around manipulating it. */ static event_list_t events; /** List of event handlers that should be removed */ static event_list_t killme; /** List of events that have been sent but have not yet been delivered because they are blocked. */ static event_list_t blocked; /** Tests if one event instance matches the definition of a event class. If both the class and the instance name a function, they must name the same function. */ static int event_match(const event_t &classv, const event_t &instance) { /* If the function names are both non-empty and different, then it's not a match */ if (! classv.function_name.empty() && ! instance.function_name.empty() && classv.function_name != instance.function_name) { return 0; } if (classv.type == EVENT_ANY) return 1; if (classv.type != instance.type) return 0; switch (classv.type) { case EVENT_SIGNAL: if (classv.param1.signal == EVENT_ANY_SIGNAL) return 1; return classv.param1.signal == instance.param1.signal; case EVENT_VARIABLE: return instance.str_param1 == classv.str_param1; case EVENT_EXIT: if (classv.param1.pid == EVENT_ANY_PID) return 1; return classv.param1.pid == instance.param1.pid; case EVENT_JOB_ID: return classv.param1.job_id == instance.param1.job_id; case EVENT_GENERIC: return instance.str_param1 == classv.str_param1; } /** This should never be reached */ debug(0, "Warning: Unreachable code reached in event_match in event.cpp\n"); return 0; } /** Test if specified event is blocked */ static int event_is_blocked(const event_t &e) { block_t *block; parser_t &parser = parser_t::principal_parser(); for (block = parser.current_block; block; block = block->outer) { if (event_block_list_blocks_type(block->event_blocks, e.type)) return true; } return event_block_list_blocks_type(parser.global_event_blocks, e.type); } wcstring event_get_desc(const event_t &e) { wcstring result; switch (e.type) { case EVENT_SIGNAL: result = format_string(_(L"signal handler for %ls (%ls)"), sig2wcs(e.param1.signal), signal_get_desc(e.param1.signal)); break; case EVENT_VARIABLE: result = format_string(_(L"handler for variable '%ls'"), e.str_param1.c_str()); break; case EVENT_EXIT: if (e.param1.pid > 0) { result = format_string(_(L"exit handler for process %d"), e.param1.pid); } else { job_t *j = job_get_from_pid(-e.param1.pid); if (j) result = format_string(_(L"exit handler for job %d, '%ls'"), j->job_id, j->command_wcstr()); else result = format_string(_(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) result = format_string(_(L"exit handler for job %d, '%ls'"), j->job_id, j->command_wcstr()); else result = format_string(_(L"exit handler for job with job id %d"), e.param1.job_id); break; } case EVENT_GENERIC: result = format_string(_(L"handler for generic event '%ls'"), e.str_param1.c_str()); break; default: result = format_string(_(L"Unknown event type '0x%x'"), e.type); break; } return result; } #if 0 static void show_all_handlers(void) { puts("event handlers:"); for (event_list_t::const_iterator iter = events.begin(); iter != events.end(); ++iter) { const event_t *foo = *iter; wcstring tmp = event_get_desc(foo); printf(" handler now %ls\n", tmp.c_str()); } } #endif /* Give a more condensed description of \c event compared to \c event_get_desc. It includes what function will fire if the \c event is an event handler. */ static wcstring event_desc_compact(const event_t &event) { wcstring res; wchar_t const *temp; int sig; switch (event.type) { case EVENT_ANY: res = L"EVENT_ANY"; break; case EVENT_VARIABLE: if (event.str_param1.c_str()) { res = format_string(L"EVENT_VARIABLE($%ls)", event.str_param1.c_str()); } else { res = L"EVENT_VARIABLE([any])"; } break; case EVENT_SIGNAL: sig = event.param1.signal; if (sig == EVENT_ANY_SIGNAL) { temp = L"[all signals]"; } else if (sig == 0) { temp = L"not set"; } else { temp = sig2wcs(sig); } res = format_string(L"EVENT_SIGNAL(%ls)", temp); break; case EVENT_EXIT: if (event.param1.pid == EVENT_ANY_PID) { res = wcstring(L"EVENT_EXIT([all child processes])"); } else if (event.param1.pid > 0) { res = format_string(L"EVENT_EXIT(pid %d)", event.param1.pid); } else { job_t *j = job_get_from_pid(-event.param1.pid); if (j) res = format_string(L"EVENT_EXIT(jobid %d: \"%ls\")", j->job_id, j->command_wcstr()); else res = format_string(L"EVENT_EXIT(pgid %d)", -event.param1.pid); } break; case EVENT_JOB_ID: { job_t *j = job_get(event.param1.job_id); if (j) res = format_string(L"EVENT_JOB_ID(job %d: \"%ls\")", j->job_id, j->command_wcstr()); else res = format_string(L"EVENT_JOB_ID(jobid %d)", event.param1.job_id); break; } case EVENT_GENERIC: res = format_string(L"EVENT_GENERIC(%ls)", event.str_param1.c_str()); break; default: res = format_string(L"unknown/illegal event(%x)", event.type); } if (event.function_name.size()) { return format_string(L"%ls: \"%ls\"", res.c_str(), event.function_name.c_str()); } else { return res; } } void event_add_handler(const event_t &event) { event_t *e; if (debug_level >= 3) { wcstring desc = event_desc_compact(event); debug(3, "register: %ls\n", desc.c_str()); } e = new event_t(event); if (e->type == EVENT_SIGNAL) { signal_handle(e->param1.signal, 1); } // Block around updating the events vector signal_block(); events.push_back(e); signal_unblock(); } void event_remove(const event_t &criterion) { event_list_t new_list; if (debug_level >= 3) { wcstring desc = event_desc_compact(criterion); debug(3, "unregister: %ls\n", desc.c_str()); } /* Because of concurrency issues (env_remove could remove an event that is currently being executed), env_remove does not actually free any events - instead it simply moves all events that should be removed from the event list to the killme list, and the ones that shouldn't be killed to new_list, and then drops the empty events-list. */ if (events.empty()) return; for (size_t i=0; itype == EVENT_SIGNAL) { event_t e = event_t::signal_event(n->param1.signal); if (event_get(e, 0) == 1) { signal_handle(e.param1.signal, 0); } } } else { new_list.push_back(n); } } signal_block(); events.swap(new_list); signal_unblock(); } int event_get(const event_t &criterion, std::vector *out) { size_t i; int found = 0; if (events.empty()) return 0; for (i=0; ipush_back(n); } } return found; } bool event_is_signal_observed(int sig) { /* We are in a signal handler! Don't allocate memory, etc. This does what event_match does, except it doesn't require passing in an event_t. */ size_t i, max = events.size(); for (i=0; i < max; i++) { const event_t *event = events[i]; if (event->type == EVENT_ANY) { return true; } else if (event->type == EVENT_SIGNAL) { if (event->param1.signal == EVENT_ANY_SIGNAL || event->param1.signal == sig) return true; } } return false; } /** Free all events in the kill list */ static void event_free_kills() { for_each(killme.begin(), killme.end(), event_free); killme.resize(0); } /** Test if the specified event is waiting to be killed */ static int event_is_killed(const event_t &e) { return std::find(killme.begin(), killme.end(), &e) != killme.end(); } /* Callback for firing (and then deleting) an event */ static void fire_event_callback(void *arg) { ASSERT_IS_MAIN_THREAD(); assert(arg != NULL); event_t *event = static_cast(arg); event_fire(event); delete event; } /** Perform the specified event. Since almost all event firings will not be matched by even a single event handler, we make sure to optimize the 'no matches' path. This means that nothing is allocated/initialized unless needed. */ static void event_fire_internal(const event_t &event) { event_list_t fire; /* First we free all events that have been removed, but only if this invocation of event_fire_internal is not a recursive call. */ if (is_event <= 1) event_free_kills(); if (events.empty()) return; /* Then we iterate over all events, adding events that should be fired to a second list. We need to do this in a separate step since an event handler might call event_remove or event_add_handler, which will change the contents of the \c events list. */ for (size_t i=0; ifunction_name; for (size_t j=0; j < event.arguments.size(); j++) { wcstring arg_esc = escape_string(event.arguments.at(j), 1); buffer += L" "; buffer += arg_esc; } // debug( 1, L"Event handler fires command '%ls'", buffer.c_str() ); /* Event handlers are not part of the main flow of code, so they are marked as non-interactive */ proc_push_interactive(0); prev_status = proc_get_last_status(); parser_t &parser = parser_t::principal_parser(); block_t *block = new event_block_t(event); parser.push_block(block); parser.eval(buffer, io_chain_t(), TOP); parser.pop_block(); proc_pop_interactive(); proc_set_last_status(prev_status); } /* Free killed events */ if (is_event <= 1) event_free_kills(); } /** Handle all pending signal events */ static void event_fire_delayed() { size_t i; /* If is_event is one, we are running the event-handler non-recursively. When the event handler has called a piece of code that triggers another event, we do not want to fire delayed events because of concurrency problems. */ if (! blocked.empty() && is_event==1) { event_list_t new_blocked; for (i=0; i 0) { signal_list_t *lst; /* Switch signal lists */ sig_list[1-al].count=0; sig_list[1-al].overflow=0; al = 1-al; active_list=al; /* Set up */ lst = &sig_list[1-al]; event_t e = event_t::signal_event(0); e.arguments.resize(1); if (lst->overflow) { debug(0, _(L"Signal list overflow. Signals have been ignored.")); } /* Send all signals in our private list */ for (int i=0; i < lst->count; i++) { e.param1.signal = lst->signal[i]; e.arguments.at(0) = sig2wcs(e.param1.signal); if (event_is_blocked(e)) { blocked.push_back(new event_t(e)); } else { event_fire_internal(e); } } } } void event_fire_signal(int signal) { /* This means we are in a signal handler. We must be very careful not do do anything that could cause a memory allocation or something else that might be bad when in a signal handler. */ if (sig_list[active_list].count < SIG_UNHANDLED_MAX) sig_list[active_list].signal[sig_list[active_list].count++]=signal; else sig_list[active_list].overflow=1; } void event_fire(const event_t *event) { if (event && event->type == EVENT_SIGNAL) { event_fire_signal(event->param1.signal); } else { is_event++; /* Fire events triggered by signals */ event_fire_delayed(); if (event) { if (event_is_blocked(*event)) { blocked.push_back(new event_t(*event)); } else { event_fire_internal(*event); } } is_event--; } } void event_init() { } void event_destroy() { for_each(events.begin(), events.end(), event_free); events.clear(); for_each(killme.begin(), killme.end(), event_free); killme.clear(); } void event_free(event_t *e) { CHECK(e,); delete e; } void event_fire_generic(const wchar_t *name, wcstring_list_t *args) { CHECK(name,); event_t ev(EVENT_GENERIC); ev.str_param1 = name; if (args) ev.arguments = *args; event_fire(&ev); } event_t::event_t(int t) : type(t), param1(), str_param1(), function_name(), arguments() { } event_t::~event_t() { } event_t event_t::signal_event(int sig) { event_t event(EVENT_SIGNAL); event.param1.signal = sig; return event; } event_t event_t::variable_event(const wcstring &str) { event_t event(EVENT_VARIABLE); event.str_param1 = str; return event; } event_t event_t::generic_event(const wcstring &str) { event_t event(EVENT_GENERIC); event.str_param1 = str; return event; } fish/event.h000066400000000000000000000121221214535744100133050ustar00rootroot00000000000000/** \file event.h Functions for handling event triggers Because most of these functions can be called by signal handler, it is important to make it well defined when these functions produce output or perform memory allocations, since such functions may not be safely called by signal handlers. */ #ifndef FISH_EVENT_H #define FISH_EVENT_H #include #include "common.h" /** The signal number that is used to match any signal */ #define EVENT_ANY_SIGNAL -1 /** The process id that is used to match any process id */ #define EVENT_ANY_PID 0 /** Enumeration of event types */ enum { EVENT_ANY, /**< Matches any event type (Not always any event, as the function name may limit the choice as well */ EVENT_SIGNAL, /**< An event triggered by a signal */ EVENT_VARIABLE, /**< An event triggered by a variable update */ EVENT_EXIT, /**< An event triggered by a job or process exit */ EVENT_JOB_ID, /**< An event triggered by a job exit */ EVENT_GENERIC, /**< A generic event */ } ; /** The structure which represents an event. The event_t struct has several event-related use-cases: - When used as a parameter to event_add, it represents a class of events, and function_name is the name of the function which will be called whenever an event matching the specified class occurs. This is also how events are stored internally. - When used as a parameter to event_get, event_remove and event_fire, it represents a class of events, and if the function_name field is non-zero, only events which call the specified function will be returned. */ struct event_t { public: /** Type of event */ int type; /** The type-specific parameter. The int types are one of the following: signal: Signal number for signal-type events.Use EVENT_ANY_SIGNAL to match any signal pid: Process id for process-type events. Use EVENT_ANY_PID to match any pid. job_id: Job id for EVENT_JOB_ID type events */ union { int signal; int job_id; pid_t pid; } param1; /** The string types are one of the following: variable: Variable name for variable-type events. param: The parameter describing this generic event. */ wcstring str_param1; /** The name of the event handler function */ wcstring function_name; /** The argument list. Only used when sending a new event using event_fire. In all other situations, the value of this variable is ignored. */ wcstring_list_t arguments; event_t(int t); ~event_t(); static event_t signal_event(int sig); static event_t variable_event(const wcstring &str); static event_t generic_event(const wcstring &str); }; /** Add an event handler May not be called by a signal handler, since it may allocate new memory. */ void event_add_handler(const event_t &event); /** Remove all events matching the specified criterion. May not be called by a signal handler, since it may free allocated memory. */ void event_remove(const event_t &event); /** Return all events which match the specified event class This function is safe to call from a signal handler _ONLY_ if the out parameter is null. \param criterion Is the class of events to return. If the criterion has a non-null function_name, only events which trigger the specified function will return. \param out the list to add events to. May be 0, in which case no events will be added, but the result count will still be valid \return the number of found matches */ int event_get(const event_t &criterion, std::vector *out); /** Returns whether an event listener is registered for the given signal. This is safe to call from a signal handler. */ bool event_is_signal_observed(int signal); /** Fire the specified event. The function_name field of the event must be set to 0. If the event is of type EVENT_SIGNAL, no the event is queued, and will be dispatched the next time event_fire is called. If event is a null-pointer, all pending events are dispatched. This function is safe to call from a signal handler _ONLY_ if the event parameter is for a signal. Signal events not be fired, by the call to event_fire, instead they will be fired the next time event_fire is called with anull argument. This is needed to make sure that no code evaluation is ever performed by a signal handler. \param event the specific event whose handlers should fire. If null, then all delayed events will be fired. */ void event_fire(const event_t *event); /** Like event_fire, but takes a signal directly. */ void event_fire_signal(int signal); /** Initialize the event-handling library */ void event_init(); /** Destroy the event-handling library */ void event_destroy(); /** Free all memory used by the specified event */ void event_free(event_t *e); /** Returns a string describing the specified event. */ wcstring event_get_desc(const event_t &e); /** Fire a generic event with the specified name */ void event_fire_generic(const wchar_t *name, wcstring_list_t *args = NULL); #endif fish/exec.cpp000066400000000000000000001421031214535744100134460ustar00rootroot00000000000000/** \file exec.c Functions for executing a program. Some of the code in this file is based on code from the Glibc manual, though the changes performed have been massive. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SIGINFO_H #include #endif #include "fallback.h" #include "util.h" #include "iothread.h" #include "postfork.h" #include "common.h" #include "wutil.h" #include "proc.h" #include "exec.h" #include "parser.h" #include "builtin.h" #include "function.h" #include "env.h" #include "wildcard.h" #include "sanity.h" #include "expand.h" #include "signal.h" #include "parse_util.h" /** file descriptor redirection error message */ #define FD_ERROR _( L"An error occurred while redirecting file descriptor %d" ) /** file descriptor redirection error message */ #define WRITE_ERROR _( L"An error occurred while writing output" ) /** file redirection error message */ #define FILE_ERROR _( L"An error occurred while redirecting file '%s'" ) /** Base open mode to pass to calls to open */ #define OPEN_MASK 0666 /** List of all pipes used by internal pipes. These must be closed in many situations in order to make sure that stray fds aren't lying around. Note this is used after fork, so we must not do anything that may allocate memory. Hopefully methods like open_fds.at() don't. */ static std::vector open_fds; // Called in a forked child static void exec_write_and_exit(int fd, const char *buff, size_t count, int status) { if (write_loop(fd, buff, count) == -1) { debug(0, WRITE_ERROR); wperror(L"write"); exit_without_destructors(status); } exit_without_destructors(status); } void exec_close(int fd) { ASSERT_IS_MAIN_THREAD(); /* This may be called in a child of fork(), so don't allocate memory */ if (fd < 0) { debug(0, L"Called close on invalid file descriptor "); return; } while (close(fd) == -1) { if (errno != EINTR) { debug(1, FD_ERROR, fd); wperror(L"close"); break; } } /* Maybe remove this from our set of open fds */ if ((size_t)fd < open_fds.size()) { open_fds[fd] = false; } } int exec_pipe(int fd[2]) { ASSERT_IS_MAIN_THREAD(); int res; while ((res=pipe(fd))) { if (errno != EINTR) { // caller will call wperror return res; } } debug(4, L"Created pipe using fds %d and %d", fd[0], fd[1]); int max_fd = std::max(fd[0], fd[1]); if (max_fd >= 0 && open_fds.size() <= (size_t)max_fd) { open_fds.resize(max_fd + 1, false); } open_fds.at(fd[0]) = true; open_fds.at(fd[1]) = true; return res; } void print_open_fds(void) { for (size_t i=0; i < open_fds.size(); ++i) { if (open_fds.at(i)) { fprintf(stderr, "fd %lu\n", i); } } } /** Check if the specified fd is used as a part of a pipeline in the specidied set of IO redirections. This is called after fork(). \param fd the fd to search for \param io_chain the set of io redirections to search in */ static bool use_fd_in_pipe(int fd, const io_chain_t &io_chain) { for (size_t idx = 0; idx < io_chain.size(); idx++) { const shared_ptr &io = io_chain.at(idx); if ((io->io_mode == IO_BUFFER) || (io->io_mode == IO_PIPE)) { CAST_INIT(const io_pipe_t *, io_pipe, io.get()); if (io_pipe->pipe_fd[0] == fd || io_pipe->pipe_fd[1] == fd) return true; } } return false; } /** Close all fds in open_fds, except for those that are mentioned in the redirection list io. This should make sure that there are no stray opened file descriptors in the child. \param io the list of io redirections for this job. Pipes mentioned here should not be closed. */ void close_unused_internal_pipes(const io_chain_t &io) { /* A call to exec_close will modify open_fds, so be careful how we walk */ for (size_t i=0; i < open_fds.size(); i++) { if (open_fds[i]) { int fd = (int)i; if (!use_fd_in_pipe(fd, io)) { debug(4, L"Close fd %d, used in other context", fd); exec_close(fd); i--; } } } } void get_unused_internal_pipes(std::vector &fds, const io_chain_t &io) { for (size_t i=0; i < open_fds.size(); i++) { if (open_fds[i]) { int fd = (int)i; if (!use_fd_in_pipe(fd, io)) { fds.push_back(fd); } } } } /** Returns the interpreter for the specified script. Returns NULL if file is not a script with a shebang. */ char *get_interpreter(const char *command, char *interpreter, size_t buff_size) { // OK to not use CLO_EXEC here because this is only called after fork int fd = open(command, O_RDONLY); if (fd >= 0) { size_t idx = 0; while (idx + 1 < buff_size) { char ch; ssize_t amt = read(fd, &ch, sizeof ch); if (amt <= 0) break; if (ch == '\n') break; interpreter[idx++] = ch; } interpreter[idx++] = '\0'; close(fd); } if (strncmp(interpreter, "#! /", 4) == 0) { return interpreter + 3; } else if (strncmp(interpreter, "#!/", 3) == 0) { return interpreter + 2; } else { return NULL; } } /** This function is executed by the child process created by a call to fork(). It should be called after \c setup_child_process. It calls execve to replace the fish process image with the command specified in \c p. It never returns. */ /* Called in a forked child! Do not allocate memory, etc. */ static void safe_launch_process(process_t *p, const char *actual_cmd, const char *const* cargv, const char *const *cenvv) { int err; // debug( 1, L"exec '%ls'", p->argv[0] ); // This function never returns, so we take certain liberties with constness char * const * envv = const_cast(cenvv); char * const * argv = const_cast(cargv); execve(actual_cmd, argv, envv); err = errno; /* Something went wrong with execve, check for a ":", and run /bin/sh if encountered. This is a weird predecessor to the shebang that is still sometimes used since it is supported on Windows. */ /* OK to not use CLO_EXEC here because this is called after fork and the file is immediately closed */ int fd = open(actual_cmd, O_RDONLY); if (fd >= 0) { char begin[1] = {0}; ssize_t amt_read = read(fd, begin, 1); close(fd); if ((amt_read==1) && (begin[0] == ':')) { // Relaunch it with /bin/sh. Don't allocate memory, so if you have more args than this, update your silly script! Maybe this should be changed to be based on ARG_MAX somehow. char sh_command[] = "/bin/sh"; char *argv2[128]; argv2[0] = sh_command; for (size_t i=1; i < sizeof argv2 / sizeof *argv2; i++) { argv2[i] = argv[i-1]; if (argv2[i] == NULL) break; } execve(sh_command, argv2, envv); } } errno = err; safe_report_exec_error(errno, actual_cmd, argv, envv); exit_without_destructors(STATUS_EXEC_FAIL); } /** This function is similar to launch_process, except it is not called after a fork (i.e. it only calls exec) and therefore it can allocate memory. */ static void launch_process_nofork(process_t *p) { ASSERT_IS_MAIN_THREAD(); ASSERT_IS_NOT_FORKED_CHILD(); char **argv = wcsv2strv(p->get_argv()); const char *const *envv = env_export_arr(false); char *actual_cmd = wcs2str(p->actual_cmd.c_str()); /* Bounce to launch_process. This never returns. */ safe_launch_process(p, actual_cmd, argv, envv); } /** Check if the IO redirection chains contains redirections for the specified file descriptor */ static int has_fd(const io_chain_t &d, int fd) { return io_chain_get(d, fd) != NULL; } /** Close a list of fds. */ static void io_cleanup_fds(const std::vector &opened_fds) { std::for_each(opened_fds.begin(), opened_fds.end(), close); } /** Make a copy of the specified io redirection chain, but change file redirection into fd redirection. This makes the redirection chain suitable for use as block-level io, since the file won't be repeatedly reopened for every command in the block, which would reset the cursor position. \return the transmogrified chain on sucess, or 0 on failiure */ static bool io_transmogrify(const io_chain_t &in_chain, io_chain_t &out_chain, std::vector &out_opened_fds) { ASSERT_IS_MAIN_THREAD(); assert(out_chain.empty()); /* Just to be clear what we do for an empty chain */ if (in_chain.empty()) { return true; } bool success = true; /* Make our chain of redirections */ io_chain_t result_chain; /* In the event we can't finish transmorgrifying, we'll have to close all the files we opened. */ std::vector opened_fds; for (size_t idx = 0; idx < in_chain.size(); idx++) { const shared_ptr &in = in_chain.at(idx); shared_ptr out; //gets allocated via new switch (in->io_mode) { default: /* Unknown type, should never happen */ fprintf(stderr, "Unknown io_mode %ld\n", (long)in->io_mode); abort(); break; /* These redirections don't need transmogrification. They can be passed through. */ case IO_PIPE: case IO_FD: case IO_BUFFER: case IO_CLOSE: { out = in; break; } /* Transmogrify file redirections */ case IO_FILE: { int fd; CAST_INIT(io_file_t *, in_file, in.get()); if ((fd=open(in_file->filename_cstr, in_file->flags, OPEN_MASK))==-1) { debug(1, FILE_ERROR, in_file->filename_cstr); wperror(L"open"); success = false; break; } opened_fds.push_back(fd); out.reset(new io_fd_t(in->fd, fd, true)); break; } } if (out.get() != NULL) result_chain.push_back(out); /* Don't go any further if we failed */ if (! success) { break; } } /* Now either return success, or clean up */ if (success) { /* Yay */ out_chain.swap(result_chain); out_opened_fds.swap(opened_fds); } else { /* No dice - clean up */ result_chain.clear(); io_cleanup_fds(opened_fds); } return success; } /** Morph an io redirection chain into redirections suitable for passing to eval, call eval, and clean up morphed redirections. \param def the code to evaluate \param block_type the type of block to push on evaluation \param io the io redirections to be performed on this block */ static void internal_exec_helper(parser_t &parser, const wchar_t *def, enum block_type_t block_type, io_chain_t &ios) { io_chain_t morphed_chain; std::vector opened_fds; bool transmorgrified = io_transmogrify(ios, morphed_chain, opened_fds); int is_block_old=is_block; is_block=1; /* Did the transmogrification fail - if so, set error status and return */ if (! transmorgrified) { proc_set_last_status(STATUS_EXEC_FAIL); return; } signal_unblock(); parser.eval(def, morphed_chain, block_type); signal_block(); morphed_chain.clear(); io_cleanup_fds(opened_fds); job_reap(0); is_block=is_block_old; } /* Returns whether we can use posix spawn for a given process in a given job. Per https://github.com/fish-shell/fish-shell/issues/364 , error handling for file redirections is too difficult with posix_spawn, so in that case we use fork/exec. Furthermore, to avoid the race between the caller calling tcsetpgrp() and the client checking the foreground process group, we don't use posix_spawn if we're going to foreground the process. (If we use fork(), we can call tcsetpgrp after the fork, before the exec, and avoid the race). */ static bool can_use_posix_spawn_for_job(const job_t *job, const process_t *process) { if (job_get_flag(job, JOB_CONTROL)) { /* We are going to use job control; therefore when we launch this job it will get its own process group ID. But will it be foregrounded? */ if (job_get_flag(job, JOB_TERMINAL) && job_get_flag(job, JOB_FOREGROUND)) { /* It will be foregrounded, so we will call tcsetpgrp(), therefore do not use posix_spawn */ return false; } } bool result = true; for (size_t idx = 0; idx < job->io.size(); idx++) { const shared_ptr &io = job->io.at(idx); if (io->io_mode == IO_FILE) { CAST_INIT(const io_file_t *, io_file, io.get()); const char *path = io_file->filename_cstr; /* This IO action is a file redirection. Only allow /dev/null, which is a common case we assume won't fail. */ if (strcmp(path, "/dev/null") != 0) { result = false; break; } } } return result; } /* What exec does if no_exec is set. This only has to handle block pushing and popping. See #624. */ static void exec_no_exec(parser_t &parser, const job_t *job) { /* Hack hack hack. If this is an 'end' job, then trigger a pop. If this is a job that would create a block, trigger a push. See #624 */ const process_t *p = job->first_process; if (p && p->type == INTERNAL_BUILTIN) { const wchar_t *builtin_name_cstr = p->argv0(); if (builtin_name_cstr != NULL) { const wcstring builtin_name = builtin_name_cstr; if (contains(builtin_name, L"for", L"function", L"begin", L"switch")) { // The above builtins are the ones that produce an unbalanced block from within their function implementation // This list should be maintained somewhere else parser.push_block(new fake_block_t()); } else if (builtin_name == L"end") { if (parser.current_block == NULL || parser.current_block->type() == TOP) { fprintf(stderr, "Warning: not popping the root block\n"); } else { parser.pop_block(); } } } } } void exec(parser_t &parser, job_t *j) { pid_t pid = 0; sigset_t chldset; shared_ptr io_buffer; /* Set to true if something goes wrong while exec:ing the job, in which case the cleanup code will kick in. */ bool exec_error = false; bool needs_keepalive = false; process_t keepalive; CHECK(j,); CHECK_BLOCK(); if (no_exec) { exec_no_exec(parser, j); return; } sigemptyset(&chldset); sigaddset(&chldset, SIGCHLD); debug(4, L"Exec job '%ls' with id %d", j->command_wcstr(), j->job_id); if (! parser.block_io.empty()) { j->io.insert(j->io.begin(), parser.block_io.begin(), parser.block_io.end()); } const io_buffer_t *input_redirect = NULL; for (size_t idx = 0; idx < j->io.size(); idx++) { const shared_ptr &io = j->io.at(idx); if ((io->io_mode == IO_BUFFER)) { CAST_INIT(io_buffer_t *, io_buffer, io.get()); if (io_buffer->is_input) { /* Input redirection - create a new gobetween process to take care of buffering, save the redirection in input_redirect */ process_t *fake = new process_t(); fake->type = INTERNAL_BUFFER; fake->pipe_write_fd = 1; j->first_process->pipe_read_fd = io->fd; fake->next = j->first_process; j->first_process = fake; input_redirect = io_buffer; break; } } } if (j->first_process->type==INTERNAL_EXEC) { /* Do a regular launch - but without forking first... */ signal_block(); /* setup_child_process makes sure signals are properly set up. It will also call signal_unblock */ if (!setup_child_process(j, 0)) { /* launch_process _never_ returns */ launch_process_nofork(j->first_process); } else { job_set_flag(j, JOB_CONSTRUCTED, 1); j->first_process->completed=1; return; } } signal_block(); /* See if we need to create a group keepalive process. This is a process that we create to make sure that the process group doesn't die accidentally, and is often needed when a builtin/block/function is inside a pipeline, since that usually means we have to wait for one program to exit before continuing in the pipeline, causing the group leader to exit. */ if (job_get_flag(j, JOB_CONTROL)) { for (const process_t *p = j->first_process; p; p = p->next) { if (p->type != EXTERNAL) { if (p->next) { needs_keepalive = true; break; } if (p != j->first_process) { needs_keepalive = true; break; } } } } if (needs_keepalive) { /* Call fork. No need to wait for threads since our use is confined and simple. */ if (g_log_forks) { printf("fork #%d: Executing keepalive fork for '%ls'\n", g_fork_count, j->command_wcstr()); } keepalive.pid = execute_fork(false); if (keepalive.pid == 0) { /* Child */ keepalive.pid = getpid(); set_child_group(j, &keepalive, 1); pause(); exit_without_destructors(0); } else { /* Parent */ set_child_group(j, &keepalive, 0); } } /* This loop loops over every process_t in the job, starting it as appropriate. This turns out to be rather complex, since a process_t can be one of many rather different things. The loop also has to handle pipelining between the jobs. */ /* We can have up to three pipes "in flight" at a time: 1. The pipe the current process should read from (courtesy of the previous process) 2. The pipe that the current process should write to 3. The pipe that the next process should read from (courtesy of us) We are careful to set these to -1 when closed, so if we exit the loop abruptly, we can still close them. */ int pipe_current_read = -1, pipe_current_write = -1, pipe_next_read = -1; for (process_t *p=j->first_process; p; p = p->next) { /* "Consume" any pipe_next_read by making it current */ assert(pipe_current_read == -1); pipe_current_read = pipe_next_read; pipe_next_read = -1; /* See if we need a pipe */ const bool pipes_to_next_command = (p->next != NULL); /* The pipes the current process write to and read from. Unfortunately these can't be just allocated on the stack, since j->io wants shared_ptr. */ shared_ptr pipe_write; shared_ptr pipe_read; if (p != j->first_process) { pipe_read.reset(new io_pipe_t(p->pipe_read_fd, true)); /* Record the current read in pipe_read */ pipe_read->pipe_fd[0] = pipe_current_read; j->io.push_back(pipe_read); } if (p->next) { pipe_write.reset(new io_pipe_t(p->pipe_write_fd, false)); j->io.push_back(pipe_write); } /* This call is used so the global environment variable array is regenerated, if needed, before the fork. That way, we avoid a lot of duplicate work where EVERY child would need to generate it, since that result would not get written back to the parent. This call could be safely removed, but it would result in slightly lower performance - at least on uniprocessor systems. */ if (p->type == EXTERNAL) env_export_arr(true); /* Set up fd:s that will be used in the pipe */ if (pipes_to_next_command) { // debug( 1, L"%ls|%ls" , p->argv[0], p->next->argv[0]); int local_pipe[2] = {-1, -1}; if (exec_pipe(local_pipe) == -1) { debug(1, PIPE_ERROR); wperror(L"pipe"); exec_error = true; job_mark_process_as_failed(j, p); break; } // This tells the redirection about the fds, but the redirection does not close them memcpy(pipe_write->pipe_fd, local_pipe, sizeof(int)*2); // Record our pipes // The fds should be negative to indicate that we aren't overwriting an fd we failed to close assert(pipe_current_write == -1); pipe_current_write = local_pipe[1]; assert(pipe_next_read == -1); pipe_next_read = local_pipe[0]; } switch (p->type) { case INTERNAL_FUNCTION: { int shadows; /* Calls to function_get_definition might need to source a file as a part of autoloading, hence there must be no blocks. */ signal_unblock(); wcstring def; bool function_exists = function_get_definition(p->argv0(), &def); wcstring_list_t named_arguments = function_get_named_arguments(p->argv0()); shadows = function_get_shadows(p->argv0()); signal_block(); if (! function_exists) { debug(0, _(L"Unknown function '%ls'"), p->argv0()); break; } function_block_t *newv = new function_block_t(p, p->argv0(), shadows); parser.push_block(newv); /* set_argv might trigger an event handler, hence we need to unblock signals. */ signal_unblock(); parse_util_set_argv(p->get_argv()+1, named_arguments); signal_block(); parser.forbid_function(p->argv0()); if (p->next) { // Be careful to handle failure, e.g. too many open fds io_buffer.reset(io_buffer_t::create(0)); if (io_buffer.get() == NULL) { exec_error = true; job_mark_process_as_failed(j, p); } else { j->io.push_back(io_buffer); } } if (! exec_error) { internal_exec_helper(parser, def.c_str(), TOP, j->io); } parser.allow_function(); parser.pop_block(); break; } case INTERNAL_BLOCK: { if (p->next) { io_buffer.reset(io_buffer_t::create(0)); if (io_buffer.get() == NULL) { exec_error = true; job_mark_process_as_failed(j, p); } else { j->io.push_back(io_buffer); } } if (! exec_error) { internal_exec_helper(parser, p->argv0(), TOP, j->io); } break; } case INTERNAL_BUILTIN: { int builtin_stdin=0; int close_stdin=0; /* If this is the first process, check the io redirections and see where we should be reading from. */ if (p == j->first_process) { const shared_ptr &in = io_chain_get(j->io, 0); if (in) { switch (in->io_mode) { case IO_FD: { CAST_INIT(const io_fd_t *, in_fd, in.get()); builtin_stdin = in_fd->old_fd; break; } case IO_PIPE: { CAST_INIT(const io_pipe_t *, in_pipe, in.get()); builtin_stdin = in_pipe->pipe_fd[0]; break; } case IO_FILE: { /* Do not set CLO_EXEC because child needs access */ CAST_INIT(const io_file_t *, in_file, in.get()); builtin_stdin=open(in_file->filename_cstr, in_file->flags, OPEN_MASK); if (builtin_stdin == -1) { debug(1, FILE_ERROR, in_file->filename_cstr); wperror(L"open"); } else { close_stdin = 1; } break; } case IO_CLOSE: { /* FIXME: When requesting that stdin be closed, we really don't do anything. How should this be handled? */ builtin_stdin = -1; break; } default: { builtin_stdin=-1; debug(1, _(L"Unknown input redirection type %d"), in->io_mode); break; } } } } else { builtin_stdin = pipe_read->pipe_fd[0]; } if (builtin_stdin == -1) { exec_error = true; break; } else { int old_out = builtin_out_redirect; int old_err = builtin_err_redirect; /* Since this may be the foreground job, and since a builtin may execute another foreground job, we need to pretend to suspend this job while running the builtin, in order to avoid a situation where two jobs are running at once. The reason this is done here, and not by the relevant builtins, is that this way, the builtin does not need to know what job it is part of. It could probably figure that out by walking the job list, but it seems more robust to make exec handle things. */ builtin_push_io(parser, builtin_stdin); builtin_out_redirect = has_fd(j->io, 1); builtin_err_redirect = has_fd(j->io, 2); const int fg = job_get_flag(j, JOB_FOREGROUND); job_set_flag(j, JOB_FOREGROUND, 0); signal_unblock(); p->status = builtin_run(parser, p->get_argv(), j->io); builtin_out_redirect=old_out; builtin_err_redirect=old_err; signal_block(); /* Restore the fg flag, which is temporarily set to false during builtin execution so as not to confuse some job-handling builtins. */ job_set_flag(j, JOB_FOREGROUND, fg); } /* If stdin has been redirected, close the redirection stream. */ if (close_stdin) { exec_close(builtin_stdin); } break; } } if (exec_error) { break; } switch (p->type) { case INTERNAL_BLOCK: case INTERNAL_FUNCTION: { int status = proc_get_last_status(); /* Handle output from a block or function. This usually means do nothing, but in the case of pipes, we have to buffer such io, since otherwise the internal pipe buffer might overflow. */ if (!io_buffer) { /* No buffer, so we exit directly. This means we have to manually set the exit status. */ if (p->next == 0) { proc_set_last_status(job_get_flag(j, JOB_NEGATE)?(!status):status); } p->completed = 1; break; } io_remove(j->io, io_buffer); io_buffer->read(); const char *buffer = io_buffer->out_buffer_ptr(); size_t count = io_buffer->out_buffer_size(); if (io_buffer->out_buffer_size() > 0) { /* We don't have to drain threads here because our child process is simple */ if (g_log_forks) { printf("Executing fork for internal block or function for '%ls'\n", p->argv0()); } pid = execute_fork(false); if (pid == 0) { /* This is the child process. Write out the contents of the pipeline. */ p->pid = getpid(); setup_child_process(j, p); exec_write_and_exit(io_buffer->fd, buffer, count, status); } else { /* This is the parent process. Store away information on the child, and possibly give it control over the terminal. */ p->pid = pid; set_child_group(j, p, 0); } } else { if (p->next == 0) { proc_set_last_status(job_get_flag(j, JOB_NEGATE)?(!status):status); } p->completed = 1; } io_buffer.reset(); break; } case INTERNAL_BUFFER: { const char *buffer = input_redirect->out_buffer_ptr(); size_t count = input_redirect->out_buffer_size(); /* We don't have to drain threads here because our child process is simple */ if (g_log_forks) { printf("fork #%d: Executing fork for internal buffer for '%ls'\n", g_fork_count, p->argv0() ? p->argv0() : L"(null)"); } pid = execute_fork(false); if (pid == 0) { /* This is the child process. Write out the contents of the pipeline. */ p->pid = getpid(); setup_child_process(j, p); exec_write_and_exit(1, buffer, count, 0); } else { /* This is the parent process. Store away information on the child, and possibly give it control over the terminal. */ p->pid = pid; set_child_group(j, p, 0); } break; } case INTERNAL_BUILTIN: { bool skip_fork; /* Handle output from builtin commands. In the general case, this means forking of a worker process, that will write out the contents of the stdout and stderr buffers to the correct file descriptor. Since forking is expensive, fish tries to avoid it wehn possible. */ /* If a builtin didn't produce any output, and it is not inside a pipeline, there is no need to fork */ skip_fork = get_stdout_buffer().empty() && get_stderr_buffer().empty() && !p->next; /* If the output of a builtin is to be sent to an internal buffer, there is no need to fork. This helps out the performance quite a bit in complex completion code. */ const shared_ptr &stdout_io = io_chain_get(j->io, STDOUT_FILENO); const shared_ptr &stderr_io = io_chain_get(j->io, STDERR_FILENO); const bool buffer_stdout = stdout_io && stdout_io->io_mode == IO_BUFFER; if ((get_stderr_buffer().empty()) && (!p->next) && (! get_stdout_buffer().empty()) && (buffer_stdout)) { CAST_INIT(io_buffer_t *, io_buffer, stdout_io.get()); const std::string res = wcs2string(get_stdout_buffer()); io_buffer->out_buffer_append(res.c_str(), res.size()); skip_fork = true; } /* PCA for some reason, fish forks a lot, even for basic builtins like echo just to write out their buffers. I'm certain a lot of this is unnecessary, but I am not sure exactly when. If j->io is NULL, then it means there's no pipes or anything, so we can certainly just write out our data. Beyond that, we may be able to do the same if io_get returns 0 for STDOUT_FILENO and STDERR_FILENO. */ if (! skip_fork && stdout_io.get() == NULL && stderr_io.get() == NULL) { if (g_log_forks) { printf("fork #-: Skipping fork for internal builtin for '%ls'\n", p->argv0()); } const wcstring &out = get_stdout_buffer(), &err = get_stderr_buffer(); const std::string outbuff = wcs2string(out); const std::string errbuff = wcs2string(err); bool builtin_io_done = do_builtin_io(outbuff.data(), outbuff.size(), errbuff.data(), errbuff.size()); if (! builtin_io_done) { show_stackframe(); } skip_fork = true; } for (io_chain_t::iterator iter = j->io.begin(); iter != j->io.end(); ++iter) { const shared_ptr &tmp_io = *iter; if (tmp_io->io_mode == IO_FILE) { const io_file_t *tmp_file_io = static_cast(tmp_io.get()); if (strcmp(tmp_file_io->filename_cstr, "/dev/null")) { skip_fork = false; break; } } } if (skip_fork) { p->completed=1; if (p->next == 0) { debug(3, L"Set status of %ls to %d using short circuit", j->command_wcstr(), p->status); int status = p->status; proc_set_last_status(job_get_flag(j, JOB_NEGATE)?(!status):status); } break; } /* Ok, unfortunatly, we have to do a real fork. Bummer. We work hard to make sure we don't have to wait for all our threads to exit, by arranging things so that we don't have to allocate memory or do anything except system calls in the child. */ /* Get the strings we'll write before we fork (since they call malloc) */ const wcstring &out = get_stdout_buffer(), &err = get_stderr_buffer(); /* These strings may contain embedded nulls, so don't treat them as C strings */ const std::string outbuff_str = wcs2string(out); const char *outbuff = outbuff_str.data(); size_t outbuff_len = outbuff_str.size(); const std::string errbuff_str = wcs2string(err); const char *errbuff = errbuff_str.data(); size_t errbuff_len = errbuff_str.size(); fflush(stdout); fflush(stderr); if (g_log_forks) { printf("fork #%d: Executing fork for internal builtin for '%ls'\n", g_fork_count, p->argv0()); io_print(j->io); } pid = execute_fork(false); if (pid == 0) { /* This is the child process. Setup redirections, print correct output to stdout and stderr, and then exit. */ p->pid = getpid(); setup_child_process(j, p); do_builtin_io(outbuff, outbuff_len, errbuff, errbuff_len); exit_without_destructors(p->status); } else { /* This is the parent process. Store away information on the child, and possibly give it control over the terminal. */ p->pid = pid; set_child_group(j, p, 0); } break; } case EXTERNAL: { /* Get argv and envv before we fork */ null_terminated_array_t argv_array; convert_wide_array_to_narrow(p->get_argv_array(), &argv_array); /* Ensure that stdin is blocking before we hand it off (see issue #176). It's a little strange that we only do this with stdin and not with stdout or stderr. However in practice, setting or clearing O_NONBLOCK on stdin also sets it for the other two fds, presumably because they refer to the same underlying file (/dev/tty?) */ make_fd_blocking(STDIN_FILENO); const char * const *argv = argv_array.get(); const char * const *envv = env_export_arr(false); std::string actual_cmd_str = wcs2string(p->actual_cmd); const char *actual_cmd = actual_cmd_str.c_str(); const wchar_t *reader_current_filename(void); if (g_log_forks) { const wchar_t *file = reader_current_filename(); const wchar_t *func = parser_t::principal_parser().is_function(); printf("fork #%d: forking for '%s' in '%ls:%ls'\n", g_fork_count, actual_cmd, file ? file : L"", func ? func : L"?"); fprintf(stderr, "IO chain for %s:\n", actual_cmd); io_print(j->io); } #if FISH_USE_POSIX_SPAWN /* Prefer to use posix_spawn, since it's faster on some systems like OS X */ bool use_posix_spawn = g_use_posix_spawn && can_use_posix_spawn_for_job(j, p); if (use_posix_spawn) { /* Create posix spawn attributes and actions */ posix_spawnattr_t attr = posix_spawnattr_t(); posix_spawn_file_actions_t actions = posix_spawn_file_actions_t(); bool made_it = fork_actions_make_spawn_properties(&attr, &actions, j, p); if (made_it) { /* We successfully made the attributes and actions; actually call posix_spawn */ int spawn_ret = posix_spawn(&pid, actual_cmd, &actions, &attr, const_cast(argv), const_cast(envv)); /* This usleep can be used to test for various race conditions (https://github.com/fish-shell/fish-shell/issues/360) */ //usleep(10000); if (spawn_ret != 0) { safe_report_exec_error(spawn_ret, actual_cmd, argv, envv); /* Make sure our pid isn't set */ pid = 0; } /* Clean up our actions */ posix_spawn_file_actions_destroy(&actions); posix_spawnattr_destroy(&attr); } /* A 0 pid means we failed to posix_spawn. Since we have no pid, we'll never get told when it's exited, so we have to mark the process as failed. */ if (pid == 0) { job_mark_process_as_failed(j, p); exec_error = true; } } else #endif { pid = execute_fork(false); if (pid == 0) { /* This is the child process. */ p->pid = getpid(); setup_child_process(j, p); safe_launch_process(p, actual_cmd, argv, envv); /* safe_launch_process _never_ returns... */ } else if (pid < 0) { job_mark_process_as_failed(j, p); exec_error = true; } } /* This is the parent process. Store away information on the child, and possibly fice it control over the terminal. */ p->pid = pid; set_child_group(j, p, 0); break; } } if (p->type == INTERNAL_BUILTIN) builtin_pop_io(parser); /* Close the pipe the current process uses to read from the previous process_t */ if (pipe_current_read >= 0) { exec_close(pipe_current_read); pipe_current_read = -1; } /* Close the write end too, since the curent child subprocess already has a copy of it. */ if (pipe_current_write >= 0) { exec_close(pipe_current_write); pipe_current_write = -1; } if (pipe_write.get()) j->io.remove(pipe_write); if (pipe_read.get()) j->io.remove(pipe_read); } /* Clean up any file descriptors we left open */ if (pipe_current_read >= 0) exec_close(pipe_current_read); if (pipe_current_write >= 0) exec_close(pipe_current_write); if (pipe_next_read >= 0) exec_close(pipe_next_read); /* The keepalive process is no longer needed, so we terminate it with extreme prejudice */ if (needs_keepalive) { kill(keepalive.pid, SIGKILL); } signal_unblock(); debug(3, L"Job is constructed"); job_set_flag(j, JOB_CONSTRUCTED, 1); if (!job_get_flag(j, JOB_FOREGROUND)) { proc_last_bg_pid = j->pgid; } if (! exec_error) { job_continue(j, false); } else { /* Mark the errored job as not in the foreground. I can't fully justify whether this is the right place, but it prevents sanity_lose from complaining. */ job_set_flag(j, JOB_FOREGROUND, 0); } } static int exec_subshell_internal(const wcstring &cmd, wcstring_list_t *lst, bool apply_exit_status) { ASSERT_IS_MAIN_THREAD(); int prev_subshell = is_subshell; const int prev_status = proc_get_last_status(); char sep=0; const env_var_t ifs = env_get_string(L"IFS"); if (! ifs.missing_or_empty()) { if (ifs.at(0) < 128) { sep = '\n';//ifs[0]; } else { sep = 0; debug(0, L"Warning - invalid command substitution separator '%lc'. Please change the first character of IFS", ifs[0]); } } is_subshell=1; int subcommand_status = -1; //assume the worst // IO buffer creation may fail (e.g. if we have too many open files to make a pipe), so this may be null const shared_ptr io_buffer(io_buffer_t::create(0)); if (io_buffer.get() != NULL) { parser_t &parser = parser_t::principal_parser(); if (parser.eval(cmd, io_chain_t(io_buffer), SUBST) == 0) { subcommand_status = proc_get_last_status(); } io_buffer->read(); } // If the caller asked us to preserve the exit status, restore the old status // Otherwise set the status of the subcommand proc_set_last_status(apply_exit_status ? subcommand_status : prev_status); is_subshell = prev_subshell; if (lst != NULL && io_buffer.get() != NULL) { const char *begin = io_buffer->out_buffer_ptr(); const char *end = begin + io_buffer->out_buffer_size(); const char *cursor = begin; while (cursor < end) { // Look for the next separator const char *stop = (const char *)memchr(cursor, sep, end - cursor); const bool hit_separator = (stop != NULL); if (! hit_separator) { // If it's not found, just use the end stop = end; } // Stop now points at the first character we do not want to copy const wcstring wc = str2wcstring(cursor, stop - cursor); lst->push_back(wc); // If we hit a separator, skip over it; otherwise we're at the end cursor = stop + (hit_separator ? 1 : 0); } } return subcommand_status; } int exec_subshell(const wcstring &cmd, std::vector &outputs, bool apply_exit_status) { ASSERT_IS_MAIN_THREAD(); return exec_subshell_internal(cmd, &outputs, apply_exit_status); } int exec_subshell(const wcstring &cmd, bool apply_exit_status) { ASSERT_IS_MAIN_THREAD(); return exec_subshell_internal(cmd, NULL, apply_exit_status); } fish/exec.h000066400000000000000000000047231214535744100131200ustar00rootroot00000000000000/** \file exec.h Prototypes for functions for executing a program */ #ifndef FISH_EXEC_H /** Header guard */ #define FISH_EXEC_H #include #include #include "proc.h" #include "util.h" #include "common.h" /** pipe redirection error message */ #define PIPE_ERROR _(L"An error occurred while setting up pipe") /** Execute the processes specified by j. I've put a fair bit of work into making builtins behave like other programs as far as pipes are concerned. Unlike i.e. bash, builtins can pipe to other builtins with arbitrary amounts of data, and so on. To do this, after a builtin is run in the real process, it forks and a dummy process is created, responsible for writing the output of the builtin. This is surprisingly cheap on my computer, probably because of the marvels of copy on write forking. This rule is short circuited in the case where a builtin does not output to a pipe and does in fact not output anything. The speed improvement from this optimization is not noticable on a normal computer/OS in regular use, but the promiscous amounts of forking that resulted was responsible for a huge slowdown when using Valgrind as well as when doing complex command-specific completions. */ class parser_t; void exec(parser_t &parser, job_t *j); /** Evaluate the expression cmd in a subshell, add the outputs into the list l. On return, the status flag as returned bu \c proc_gfet_last_status will not be changed. \param cmd the command to execute \param outputs The list to insert output into. \return the status of the last job to exit, or -1 if en error was encountered. */ int exec_subshell(const wcstring &cmd, std::vector &outputs, bool preserve_exit_status); int exec_subshell(const wcstring &cmd, bool preserve_exit_status); /** Loops over close until the syscall was run without being interrupted. Then removes the fd from the open_fds list. */ void exec_close(int fd); /** Call pipe(), and add resulting fds to open_fds, the list of opend file descriptors for pipes. */ int exec_pipe(int fd[2]); /* Close all fds in open_fds. This is called from postfork.cpp */ void close_unused_internal_pipes(const io_chain_t &io); /* Gets all unused internal pipes into fds */ void get_unused_internal_pipes(std::vector &fds, const io_chain_t &io); /** Gets the interpreter for a given command */ char *get_interpreter(const char *command, char *interpreter, size_t buff_size); #endif fish/expand.cpp000066400000000000000000001514071214535744100140100ustar00rootroot00000000000000/**\file expand.c String expansion functions. These functions perform several kinds of parameter expansion. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef SunOS #include #endif #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" #include "env.h" #include "proc.h" #include "parser.h" #include "expand.h" #include "wildcard.h" #include "exec.h" #include "signal.h" #include "tokenizer.h" #include "complete.h" #include "parse_util.h" /** Error issued on invalid variable name */ #define COMPLETE_VAR_DESC _( L"The '$' character begins a variable name. The character '%lc', which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.") /** Error issued on $? */ #define COMPLETE_YOU_WANT_STATUS _( L"$? is not a valid variable in fish. If you want the exit status of the last command, try $status.") /** Error issued on invalid variable name */ #define COMPLETE_VAR_NULL_DESC _( L"The '$' begins a variable name. It was given at the end of an argument. Variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.") /** Error issued on invalid variable name */ #define COMPLETE_VAR_BRACKET_DESC _( L"Did you mean %ls{$%ls}%ls? The '$' character begins a variable name. A bracket, which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'." ) /** Error issued on invalid variable name */ #define COMPLETE_VAR_PARAN_DESC _( L"Did you mean (COMMAND)? In fish, the '$' character is only used for accessing variables. To learn more about command substitution in fish, type 'help expand-command-substitution'.") /** Description for child process */ #define COMPLETE_CHILD_PROCESS_DESC _( L"Child process") /** Description for non-child process */ #define COMPLETE_PROCESS_DESC _( L"Process") /** Description for long job */ #define COMPLETE_JOB_DESC _( L"Job") /** Description for short job. The job command is concatenated */ #define COMPLETE_JOB_DESC_VAL _( L"Job: %ls") /** Description for the shells own pid */ #define COMPLETE_SELF_DESC _( L"Shell process") /** Description for the shells own pid */ #define COMPLETE_LAST_DESC _( L"Last background job") /** String in process expansion denoting ourself */ #define SELF_STR L"self" /** String in process expansion denoting last background job */ #define LAST_STR L"last" /** Characters which make a string unclean if they are the first character of the string. See \c expand_is_clean(). */ #define UNCLEAN_FIRST L"~%" /** Unclean characters. See \c expand_is_clean(). */ #define UNCLEAN L"$*?\\\"'({})" static void remove_internal_separator(wcstring &s, bool conv); int expand_is_clean(const wchar_t *in) { const wchar_t * str = in; CHECK(in, 1); /* Test characters that have a special meaning in the first character position */ if (wcschr(UNCLEAN_FIRST, *str)) return 0; /* Test characters that have a special meaning in any character position */ while (*str) { if (wcschr(UNCLEAN, *str)) return 0; str++; } return 1; } /** Return the environment variable value for the string starting at \c in. */ static env_var_t expand_var(const wchar_t *in) { if (!in) return env_var_t::missing_var(); return env_get_string(in); } /** Test if the specified string does not contain character which can not be used inside a quoted string. */ static int is_quotable(const wchar_t *str) { switch (*str) { case 0: return 1; case L'\n': case L'\t': case L'\r': case L'\b': case L'\x1b': return 0; default: return is_quotable(str+1); } return 0; } static int is_quotable(const wcstring &str) { return is_quotable(str.c_str()); } wcstring expand_escape_variable(const wcstring &in) { wcstring_list_t lst; wcstring buff; tokenize_variable_array(in, lst); switch (lst.size()) { case 0: buff.append(L"''"); break; case 1: { const wcstring &el = lst.at(0); if (el.find(L' ') != wcstring::npos && is_quotable(el)) { buff.append(L"'"); buff.append(el); buff.append(L"'"); } else { buff.append(escape_string(el, 1)); } break; } default: { for (size_t j=0; j L'9') { return 0; } } return 1; } /** See if the process described by \c proc matches the commandline \c cmd */ static bool match_pid(const wcstring &cmd, const wchar_t *proc, int flags, size_t *offset) { /* Test for a direct match. If the proc string is empty (e.g. the user tries to complete against %), then return an offset pointing at the base command. That ensures that you don't see a bunch of dumb paths when completing against all processes. */ if (proc[0] != L'\0' && wcsncmp(cmd.c_str(), proc, wcslen(proc)) == 0) { if (offset) *offset = 0; return true; } /* Get the command to match against. We're only interested in the last path component. */ const wcstring base_cmd = wbasename(cmd); bool result = string_prefixes_string(proc, base_cmd); if (result) { /* It's a match. Return the offset within the full command. */ if (offset) *offset = cmd.size() - base_cmd.size(); } return result; } /** Helper class for iterating over processes. The names returned have been unescaped (e.g. may include spaces) */ #ifdef KERN_PROCARGS2 /* BSD / OS X process completions */ class process_iterator_t { std::vector pids; size_t idx; wcstring name_for_pid(pid_t pid); public: process_iterator_t(); bool next_process(wcstring *str, pid_t *pid); }; wcstring process_iterator_t::name_for_pid(pid_t pid) { wcstring result; int mib[4], maxarg = 0, numArgs = 0; size_t size = 0; char *args = NULL, *stringPtr = NULL; mib[0] = CTL_KERN; mib[1] = KERN_ARGMAX; size = sizeof(maxarg); if (sysctl(mib, 2, &maxarg, &size, NULL, 0) == -1) { return result; } args = (char *)malloc(maxarg); if (args == NULL) { return result; } mib[0] = CTL_KERN; mib[1] = KERN_PROCARGS2; mib[2] = pid; size = (size_t)maxarg; if (sysctl(mib, 3, args, &size, NULL, 0) == -1) { free(args); return result;; } memcpy(&numArgs, args, sizeof(numArgs)); stringPtr = args + sizeof(numArgs); result = str2wcstring(stringPtr); free(args); return result; } bool process_iterator_t::next_process(wcstring *out_str, pid_t *out_pid) { wcstring name; pid_t pid = 0; bool result = false; while (idx < pids.size()) { pid = pids.at(idx++); name = name_for_pid(pid); if (! name.empty()) { result = true; break; } } if (result) { *out_str = name; *out_pid = pid; } return result; } process_iterator_t::process_iterator_t() : idx(0) { int err; struct kinfo_proc * result; bool done; static const int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; // Declaring name as const requires us to cast it when passing it to // sysctl because the prototype doesn't include the const modifier. size_t length; // We start by calling sysctl with result == NULL and length == 0. // That will succeed, and set length to the appropriate length. // We then allocate a buffer of that size and call sysctl again // with that buffer. If that succeeds, we're done. If that fails // with ENOMEM, we have to throw away our buffer and loop. Note // that the loop causes use to call sysctl with NULL again; this // is necessary because the ENOMEM failure case sets length to // the amount of data returned, not the amount of data that // could have been returned. result = NULL; done = false; do { assert(result == NULL); // Call sysctl with a NULL buffer. length = 0; err = sysctl((int *) name, (sizeof(name) / sizeof(*name)) - 1, NULL, &length, NULL, 0); if (err == -1) { err = errno; } // Allocate an appropriately sized buffer based on the results // from the previous call. if (err == 0) { result = (struct kinfo_proc *)malloc(length); if (result == NULL) { err = ENOMEM; } } // Call sysctl again with the new buffer. If we get an ENOMEM // error, toss away our buffer and start again. if (err == 0) { err = sysctl((int *) name, (sizeof(name) / sizeof(*name)) - 1, result, &length, NULL, 0); if (err == -1) { err = errno; } if (err == 0) { done = true; } else if (err == ENOMEM) { assert(result != NULL); free(result); result = NULL; err = 0; } } } while (err == 0 && ! done); // Clean up and establish post conditions. if (err == 0 && result != NULL) { for (size_t idx = 0; idx < length / sizeof(struct kinfo_proc); idx++) pids.push_back(result[idx].kp_proc.p_pid); } if (result) free(result); } #else /* /proc style process completions */ class process_iterator_t { DIR *dir; public: process_iterator_t(); ~process_iterator_t(); bool next_process(wcstring *out_str, pid_t *out_pid); }; process_iterator_t::process_iterator_t(void) { dir = opendir("/proc"); } process_iterator_t::~process_iterator_t(void) { if (dir) closedir(dir); } bool process_iterator_t::next_process(wcstring *out_str, pid_t *out_pid) { wcstring cmd; pid_t pid = 0; while (cmd.empty()) { wcstring name; if (! dir || ! wreaddir(dir, name)) break; if (!iswnumeric(name.c_str())) continue; wcstring path = wcstring(L"/proc/") + name; struct stat buf; if (wstat(path, &buf)) continue; if (buf.st_uid != getuid()) continue; /* remember the pid */ pid = fish_wcstoi(name.c_str(), NULL, 10); /* the 'cmdline' file exists, it should contain the commandline */ FILE *cmdfile; if ((cmdfile=wfopen(path + L"/cmdline", "r"))) { wcstring full_command_line; fgetws2(&full_command_line, cmdfile); /* The command line needs to be escaped */ cmd = tok_first(full_command_line.c_str()); } #ifdef SunOS else if ((cmdfile=wfopen(path + L"/psinfo", "r"))) { psinfo_t info; if (fread(&info, sizeof(info), 1, cmdfile)) { /* The filename is unescaped */ cmd = str2wcstring(info.pr_fname); } } #endif if (cmdfile) fclose(cmdfile); } bool result = ! cmd.empty(); if (result) { *out_str = cmd; *out_pid = pid; } return result; } #endif std::vector expand_get_all_process_names(void) { wcstring name; pid_t pid; process_iterator_t iterator; std::vector result; while (iterator.next_process(&name, &pid)) { result.push_back(name); } return result; } /** Searches for a job with the specified job id, or a job or process which has the string \c proc as a prefix of its commandline. If the ACCEPT_INCOMPLETE flag is set, the remaining string for any matches are inserted. Otherwise, any job matching the specified string is matched, and the job pgid is returned. If no job matches, all child processes are searched. If no child processes match, and fish can understand the contents of the /proc filesystem, all the users processes are searched for matches. */ static int find_process(const wchar_t *proc, expand_flags_t flags, std::vector &out) { int found = 0; if (!(flags & EXPAND_SKIP_JOBS)) { ASSERT_IS_MAIN_THREAD(); const job_t *j; if (iswnumeric(proc) || (wcslen(proc)==0)) { /* This is a numeric job string, like '%2' */ if (flags & ACCEPT_INCOMPLETE) { job_iterator_t jobs; while ((j = jobs.next())) { wchar_t jid[16]; if (j->command_is_empty()) continue; swprintf(jid, 16, L"%d", j->job_id); if (wcsncmp(proc, jid, wcslen(proc))==0) { wcstring desc_buff = format_string(COMPLETE_JOB_DESC_VAL, j->command_wcstr()); append_completion(out, jid+wcslen(proc), desc_buff, 0); } } } else { int jid; wchar_t *end; errno = 0; jid = fish_wcstoi(proc, &end, 10); if (jid > 0 && !errno && !*end) { j = job_get(jid); if ((j != 0) && (j->command_wcstr() != 0)) { { append_completion(out, to_string(j->pgid)); found = 1; } } } } } if (found) return 1; job_iterator_t jobs; while ((j = jobs.next())) { if (j->command_is_empty()) continue; size_t offset; if (match_pid(j->command(), proc, flags, &offset)) { if (flags & ACCEPT_INCOMPLETE) { append_completion(out, j->command_wcstr() + offset + wcslen(proc), COMPLETE_JOB_DESC, 0); } else { append_completion(out, to_string(j->pgid)); found = 1; } } } if (found) { return 1; } jobs.reset(); while ((j = jobs.next())) { process_t *p; if (j->command_is_empty()) continue; for (p=j->first_process; p; p=p->next) { if (p->actual_cmd.empty()) continue; size_t offset; if (match_pid(p->actual_cmd, proc, flags, &offset)) { if (flags & ACCEPT_INCOMPLETE) { append_completion(out, wcstring(p->actual_cmd, offset + wcslen(proc)), COMPLETE_CHILD_PROCESS_DESC, 0); } else { append_completion(out, to_string(p->pid), L"", 0); found = 1; } } } } if (found) { return 1; } } /* Iterate over all processes */ wcstring process_name; pid_t process_pid; process_iterator_t iterator; while (iterator.next_process(&process_name, &process_pid)) { size_t offset; if (match_pid(process_name, proc, flags, &offset)) { if (flags & ACCEPT_INCOMPLETE) { append_completion(out, process_name.c_str() + offset + wcslen(proc), COMPLETE_PROCESS_DESC, 0); } else { append_completion(out, to_string(process_pid)); } } } return 1; } /** Process id expansion */ static int expand_pid(const wcstring &instr_with_sep, expand_flags_t flags, std::vector &out) { /* expand_string calls us with internal separators in instr...sigh */ wcstring instr = instr_with_sep; remove_internal_separator(instr, false); if (instr.empty() || instr.at(0) != PROCESS_EXPAND) { append_completion(out, instr); return 1; } const wchar_t * const in = instr.c_str(); if (flags & ACCEPT_INCOMPLETE) { if (wcsncmp(in+1, SELF_STR, wcslen(in+1))==0) { append_completion(out, &SELF_STR[wcslen(in+1)], COMPLETE_SELF_DESC, 0); } else if (wcsncmp(in+1, LAST_STR, wcslen(in+1))==0) { append_completion(out, &LAST_STR[wcslen(in+1)], COMPLETE_LAST_DESC, 0); } } else { if (wcscmp((in+1), SELF_STR)==0) { append_completion(out, to_string(getpid())); return 1; } if (wcscmp((in+1), LAST_STR)==0) { if (proc_last_bg_pid > 0) { append_completion(out, to_string(proc_last_bg_pid)); } return 1; } } size_t prev = out.size(); if (!find_process(in+1, flags, out)) return 0; if (prev == out.size()) { if (!(flags & ACCEPT_INCOMPLETE)) { return 0; } } return 1; } void expand_variable_error(parser_t &parser, const wchar_t *token, size_t token_pos, int error_pos) { size_t stop_pos = token_pos+1; switch (token[stop_pos]) { case BRACKET_BEGIN: { wchar_t *cpy = wcsdup(token); *(cpy+token_pos)=0; wchar_t *name = &cpy[stop_pos+1]; wchar_t *end = wcschr(name, BRACKET_END); wchar_t *post; int is_var=0; if (end) { post = end+1; *end = 0; if (!wcsvarname(name)) { is_var = 1; } } if (is_var) { parser.error(SYNTAX_ERROR, error_pos, COMPLETE_VAR_BRACKET_DESC, cpy, name, post); } else { parser.error(SYNTAX_ERROR, error_pos, COMPLETE_VAR_BRACKET_DESC, L"", L"VARIABLE", L""); } free(cpy); break; } case INTERNAL_SEPARATOR: { parser.error(SYNTAX_ERROR, error_pos, COMPLETE_VAR_PARAN_DESC); break; } case 0: { parser.error(SYNTAX_ERROR, error_pos, COMPLETE_VAR_NULL_DESC); break; } default: { wchar_t token_stop_char = token[stop_pos]; // Unescape (see http://github.com/fish-shell/fish-shell/issues/50) if (token_stop_char == ANY_CHAR) token_stop_char = L'?'; else if (token_stop_char == ANY_STRING || token_stop_char == ANY_STRING_RECURSIVE) token_stop_char = L'*'; parser.error(SYNTAX_ERROR, error_pos, (token_stop_char == L'?' ? COMPLETE_YOU_WANT_STATUS : COMPLETE_VAR_DESC), token_stop_char); break; } } } /** Parse an array slicing specification */ static int parse_slice(const wchar_t *in, wchar_t **end_ptr, std::vector &idx, size_t array_size) { wchar_t *end; const long size = (long)array_size; size_t pos = 1; //skip past the opening square bracket // debug( 0, L"parse_slice on '%ls'", in ); while (1) { long tmp; while (iswspace(in[pos]) || (in[pos]==INTERNAL_SEPARATOR)) pos++; if (in[pos] == L']') { pos++; break; } errno=0; tmp = wcstol(&in[pos], &end, 10); if ((errno) || (end == &in[pos])) { return 1; } // debug( 0, L"Push idx %d", tmp ); long i1 = tmp>-1 ? tmp : (long)array_size+tmp+1; pos = end-in; while (in[pos]==INTERNAL_SEPARATOR) pos++; if (in[pos]==L'.' && in[pos+1]==L'.') { pos+=2; while (in[pos]==INTERNAL_SEPARATOR) pos++; long tmp1 = wcstol(&in[pos], &end, 10); if ((errno) || (end == &in[pos])) { return 1; } pos = end-in; // debug( 0, L"Push range %d %d", tmp, tmp1 ); long i2 = tmp1>-1 ? tmp1 : size+tmp1+1; // debug( 0, L"Push range idx %d %d", i1, i2 ); short direction = i2 &out, long last_idx); static int expand_variables2(parser_t &parser, const wcstring &instr, std::vector &out, long last_idx) { wchar_t *in = wcsdup(instr.c_str()); int result = expand_variables_internal(parser, in, out, last_idx); free(in); return result; } static int expand_variables_internal(parser_t &parser, wchar_t * const in, std::vector &out, long last_idx) { int is_ok= 1; int empty=0; wcstring var_tmp; std::vector var_idx_list; // CHECK( out, 0 ); for (long i=last_idx; (i>=0) && is_ok && !empty; i--) { const wchar_t c = in[i]; if ((c == VARIABLE_EXPAND) || (c == VARIABLE_EXPAND_SINGLE)) { long start_pos = i+1; long stop_pos; long var_len; int is_single = (c==VARIABLE_EXPAND_SINGLE); stop_pos = start_pos; while (1) { if (!(in[stop_pos ])) break; if (!(iswalnum(in[stop_pos]) || (wcschr(L"_", in[stop_pos])!= 0))) break; stop_pos++; } /* printf( "Stop for '%c'\n", in[stop_pos]);*/ var_len = stop_pos - start_pos; if (var_len == 0) { expand_variable_error(parser, in, stop_pos-1, -1); is_ok = 0; break; } var_tmp.append(in + start_pos, var_len); env_var_t var_val = expand_var(var_tmp.c_str()); if (! var_val.missing()) { int all_vars=1; wcstring_list_t var_item_list; if (is_ok) { tokenize_variable_array(var_val.c_str(), var_item_list); if (in[stop_pos] == L'[') { wchar_t *slice_end; all_vars=0; if (parse_slice(in + stop_pos, &slice_end, var_idx_list, var_item_list.size())) { parser.error(SYNTAX_ERROR, -1, L"Invalid index value"); is_ok = 0; break; } stop_pos = (slice_end-in); } if (!all_vars) { wcstring_list_t string_values(var_idx_list.size()); for (size_t j=0; j var_item_list.size()) { parser.error(SYNTAX_ERROR, -1, ARRAY_BOUNDS_ERR); is_ok=0; var_idx_list.resize(j); break; } else { /* Replace each index in var_idx_list inplace with the string value at the specified index */ //al_set( var_idx_list, j, wcsdup((const wchar_t *)al_get( &var_item_list, tmp-1 ) ) ); string_values.at(j) = var_item_list.at(tmp-1); } } // string_values is the new var_item_list var_item_list.swap(string_values); } } if (is_ok) { if (is_single) { in[i]=0; wcstring res = in; res.push_back(INTERNAL_SEPARATOR); for (size_t j=0; j 0) new_in.append(in, start_pos - 1); // at this point new_in.size() is start_pos - 1 if (start_pos>1 && new_in[start_pos-2]!=VARIABLE_EXPAND) { new_in.push_back(INTERNAL_SEPARATOR); } new_in.append(next); new_in.append(in + stop_pos); is_ok &= expand_variables2(parser, new_in, out, i); } } } } } return is_ok; } else { /* Expand a non-existing variable */ if (c == VARIABLE_EXPAND) { /* Regular expansion, i.e. expand this argument to nothing */ empty = 1; } else { /* Expansion to single argument. */ wcstring res; in[i] = 0; res.append(in); res.append(in + stop_pos); is_ok &= expand_variables2(parser, res, out, i); return is_ok; } } } } if (!empty) { append_completion(out, in); } return is_ok; } /** Perform bracket expansion */ static int expand_brackets(parser_t &parser, const wcstring &instr, int flags, std::vector &out) { bool syntax_error = false; int bracket_count=0; const wchar_t *bracket_begin = NULL, *bracket_end = NULL; const wchar_t *last_sep = NULL; const wchar_t *item_begin; size_t length_preceding_brackets, length_following_brackets, tot_len; const wchar_t * const in = instr.c_str(); /* Locate the first non-nested bracket pair */ for (const wchar_t *pos = in; (*pos) && !syntax_error; pos++) { switch (*pos) { case BRACKET_BEGIN: { if (bracket_count == 0) bracket_begin = pos; bracket_count++; break; } case BRACKET_END: { bracket_count--; if (bracket_count < 0) { syntax_error = true; } else if (bracket_count == 0) { bracket_end = pos; break; } } case BRACKET_SEP: { if (bracket_count == 1) last_sep = pos; } } } if (bracket_count > 0) { if (!(flags & ACCEPT_INCOMPLETE)) { syntax_error = true; } else { /* The user hasn't typed an end bracket yet; make one up and append it, then expand that. */ wcstring mod; if (last_sep) { mod.append(in, bracket_begin-in+1); mod.append(last_sep+1); mod.push_back(BRACKET_END); } else { mod.append(in); mod.push_back(BRACKET_END); } return expand_brackets(parser, mod, 1, out); } } if (syntax_error) { parser.error(SYNTAX_ERROR, -1, _(L"Mismatched brackets")); return 0; } if (bracket_begin == NULL) { append_completion(out, instr); return 1; } length_preceding_brackets = (bracket_begin-in); length_following_brackets = wcslen(bracket_end)-1; tot_len = length_preceding_brackets+length_following_brackets; item_begin = bracket_begin+1; for (const wchar_t *pos =(bracket_begin+1); true; pos++) { if (bracket_count == 0) { if ((*pos == BRACKET_SEP) || (pos==bracket_end)) { assert(pos >= item_begin); size_t item_len = pos-item_begin; wcstring whole_item; whole_item.reserve(tot_len + item_len + 2); whole_item.append(in, length_preceding_brackets); whole_item.append(item_begin, item_len); whole_item.append(bracket_end + 1); expand_brackets(parser, whole_item, flags, out); item_begin = pos+1; if (pos == bracket_end) break; } } if (*pos == BRACKET_BEGIN) { bracket_count++; } if (*pos == BRACKET_END) { bracket_count--; } } return 1; } /** Perform cmdsubst expansion */ static int expand_cmdsubst(parser_t &parser, const wcstring &input, std::vector &outList) { wchar_t *paran_begin=0, *paran_end=0; std::vector sub_res; size_t i, j; wchar_t *tail_begin = 0; const wchar_t * const in = input.c_str(); int parse_ret; switch (parse_ret = parse_util_locate_cmdsubst(in, ¶n_begin, ¶n_end, 0)) { case -1: parser.error(SYNTAX_ERROR, -1, L"Mismatched parenthesis"); return 0; case 0: outList.push_back(completion_t(input)); return 1; case 1: break; } const wcstring subcmd(paran_begin + 1, paran_end-paran_begin - 1); if (exec_subshell(subcmd, sub_res, true /* do apply exit status */) == -1) { parser.error(CMDSUBST_ERROR, -1, L"Unknown error while evaulating command substitution"); return 0; } tail_begin = paran_end + 1; if (*tail_begin == L'[') { std::vector slice_idx; wchar_t *slice_end; if (parse_slice(tail_begin, &slice_end, slice_idx, sub_res.size())) { parser.error(SYNTAX_ERROR, -1, L"Invalid index value"); return 0; } else { std::vector sub_res2; tail_begin = slice_end; for (i=0; i < slice_idx.size(); i++) { long idx = slice_idx.at(i); if (idx < 1 || (size_t)idx > sub_res.size()) { parser.error(SYNTAX_ERROR, -1, ARRAY_BOUNDS_ERR); return 0; } idx = idx-1; sub_res2.push_back(sub_res.at(idx)); // debug( 0, L"Pushing item '%ls' with index %d onto sliced result", al_get( sub_res, idx ), idx ); //sub_res[idx] = 0; // ?? } sub_res = sub_res2; } } /* Recursively call ourselves to expand any remaining command substitutions. The result of this recursive call using the tail of the string is inserted into the tail_expand array list */ std::vector tail_expand; expand_cmdsubst(parser, tail_begin, tail_expand); /* Combine the result of the current command substitution with the result of the recursive tail expansion */ for (i=0; ipw_dir); } } if (! tilde_error) { input.replace(input.begin(), input.begin() + tail_idx, home); } } } void expand_tilde(wcstring &input) { // Avoid needless COW behavior by ensuring we use const at const wcstring &tmp = input; if (! tmp.empty() && tmp.at(0) == L'~') { input.at(0) = HOME_DIRECTORY; expand_home_directory(input); } } static void unexpand_tildes(const wcstring &input, std::vector *completions) { // If input begins with tilde, then try to replace the corresponding string in each completion with the tilde // If it does not, there's nothing to do if (input.empty() || input.at(0) != L'~') return; // We only operate on completions that replace their contents // If we don't have any, we're done. // In particular, empty vectors are common. bool has_candidate_completion = false; for (size_t i=0; i < completions->size(); i++) { if (completions->at(i).flags & COMPLETE_REPLACES_TOKEN) { has_candidate_completion = true; break; } } if (! has_candidate_completion) return; size_t tail_idx; wcstring username_with_tilde = L"~"; username_with_tilde.append(get_home_directory_name(input, &tail_idx)); // Expand username_with_tilde wcstring home = username_with_tilde; expand_tilde(home); // Now for each completion that starts with home, replace it with the username_with_tilde for (size_t i=0; i < completions->size(); i++) { completion_t &comp = completions->at(i); if ((comp.flags & COMPLETE_REPLACES_TOKEN) && string_prefixes_string(home, comp.completion)) { comp.completion.replace(0, home.size(), username_with_tilde); // And mark that our tilde is literal, so it doesn't try to escape it comp.flags |= COMPLETE_DONT_ESCAPE_TILDES; } } } /** Remove any internal separators. Also optionally convert wildcard characters to regular equivalents. This is done to support EXPAND_SKIP_WILDCARDS. */ static void remove_internal_separator(wcstring &str, bool conv) { /* Remove all instances of INTERNAL_SEPARATOR */ str.erase(std::remove(str.begin(), str.end(), (wchar_t)INTERNAL_SEPARATOR), str.end()); /* If conv is true, replace all instances of ANY_CHAR with '?', ANY_STRING with '*', ANY_STRING_RECURSIVE with '*' */ if (conv) { for (size_t idx = 0; idx < str.size(); idx++) { switch (str.at(idx)) { case ANY_CHAR: str.at(idx) = L'?'; break; case ANY_STRING: case ANY_STRING_RECURSIVE: str.at(idx) = L'*'; break; } } } } int expand_string(const wcstring &input, std::vector &output, expand_flags_t flags) { parser_t parser(PARSER_TYPE_ERRORS_ONLY, true /* show errors */); size_t i; int res = EXPAND_OK; if ((!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean(input.c_str())) { output.push_back(completion_t(input)); return EXPAND_OK; } std::vector clist1, clist2; std::vector *in = &clist1, *out = &clist2; if (EXPAND_SKIP_CMDSUBST & flags) { wchar_t *begin, *end; if (parse_util_locate_cmdsubst(input.c_str(), &begin, &end, 1) != 0) { parser.error(CMDSUBST_ERROR, -1, L"Command substitutions not allowed"); return EXPAND_ERROR; } in->push_back(completion_t(input)); } else { int cmdsubst_ok = expand_cmdsubst(parser, input, *in); if (! cmdsubst_ok) return EXPAND_ERROR; } for (i=0; i < in->size(); i++) { /* We accept incomplete strings here, since complete uses expand_string to expand incomplete strings from the commandline. */ int unescape_flags = UNESCAPE_SPECIAL | UNESCAPE_INCOMPLETE; wcstring next = expand_unescape_string(in->at(i).completion, unescape_flags); if (EXPAND_SKIP_VARIABLES & flags) { for (size_t i=0; i < next.size(); i++) { if (next.at(i) == VARIABLE_EXPAND) { next[i] = L'$'; } } out->push_back(completion_t(next)); } else { if (!expand_variables2(parser, next, *out, next.size() - 1)) { return EXPAND_ERROR; } } } in->clear(); std::swap(in, out); // note: this swaps the pointers only (last output is next input) for (i=0; i < in->size(); i++) { wcstring next = in->at(i).completion; if (!expand_brackets(parser, next, flags, *out)) { return EXPAND_ERROR; } } in->clear(); std::swap(in, out); // note: this swaps the pointers only (last output is next input) for (i=0; i < in->size(); i++) { wcstring next = in->at(i).completion; if (!(EXPAND_SKIP_HOME_DIRECTORIES & flags)) expand_home_directory(next); if (flags & ACCEPT_INCOMPLETE) { if (next[0] == PROCESS_EXPAND) { /* If process expansion matches, we are not interested in other completions, so we short-circuit and return */ if (!(flags & EXPAND_SKIP_PROCESS)) expand_pid(next, flags, output); return EXPAND_OK; } else { out->push_back(completion_t(next)); } } else { if (!(flags & EXPAND_SKIP_PROCESS) && ! expand_pid(next, flags, *out)) { return EXPAND_ERROR; } } } in->clear(); std::swap(in, out); // note: this swaps the pointers only (last output is next input) for (i=0; i < in->size(); i++) { wcstring next_str = in->at(i).completion; int wc_res; remove_internal_separator(next_str, (EXPAND_SKIP_WILDCARDS & flags) ? true : false); const wchar_t *next = next_str.c_str(); if (((flags & ACCEPT_INCOMPLETE) && (!(flags & EXPAND_SKIP_WILDCARDS))) || wildcard_has(next, 1)) { const wchar_t *start, *rest; if (next[0] == '/') { start = L"/"; rest = &next[1]; } else { start = L""; rest = next; } std::vector expanded; wc_res = wildcard_expand_string(rest, start, flags, expanded); if (flags & ACCEPT_INCOMPLETE) { out->insert(out->end(), expanded.begin(), expanded.end()); } else { switch (wc_res) { case 0: { if (res == EXPAND_OK) res = EXPAND_WILDCARD_NO_MATCH; break; } case 1: { res = EXPAND_WILDCARD_MATCH; sort_completions(expanded); out->insert(out->end(), expanded.begin(), expanded.end()); break; } case -1: { return EXPAND_ERROR; } } } } else { if (!(flags & ACCEPT_INCOMPLETE)) { out->push_back(completion_t(next_str)); } } } // Hack to un-expand tildes (see #647) if (!(flags & EXPAND_SKIP_HOME_DIRECTORIES)) { unexpand_tildes(input, out); } // Return our output output.insert(output.end(), out->begin(), out->end()); return res; } bool expand_one(wcstring &string, expand_flags_t flags) { std::vector completions; bool result = false; if ((!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean(string.c_str())) { return true; } if (expand_string(string, completions, flags)) { if (completions.size() == 1) { string = completions.at(0).completion; result = true; } } return result; } /* https://github.com/fish-shell/fish-shell/issues/367 With them the Seed of Wisdom did I sow, And with my own hand labour'd it to grow: And this was all the Harvest that I reap'd--- "I came like Water, and like Wind I go." */ static std::string escape_single_quoted_hack_hack_hack_hack(const char *str) { std::string result; size_t len = strlen(str); result.reserve(len + 2); result.push_back('\''); for (size_t i=0; i < len; i++) { char c = str[i]; // Escape backslashes and single quotes only if (c == '\\' || c == '\'') result.push_back('\\'); result.push_back(c); } result.push_back('\''); return result; } bool fish_xdm_login_hack_hack_hack_hack(std::vector *cmds, int argc, const char * const *argv) { bool result = false; if (cmds && cmds->size() == 1) { const std::string &cmd = cmds->at(0); if (cmd == "exec \"${@}\"" || cmd == "exec \"$@\"") { /* We're going to construct a new command that starts with exec, and then has the remaining arguments escaped */ std::string new_cmd = "exec"; for (int i=1; i < argc; i++) { const char *arg = argv[i]; if (arg) { new_cmd.push_back(' '); new_cmd.append(escape_single_quoted_hack_hack_hack_hack(arg)); } } cmds->at(0) = new_cmd; result = true; } } return result; } bool fish_openSUSE_dbus_hack_hack_hack_hack(std::vector *args) { static signed char isSUSE = -1; if (isSUSE == 0) return false; bool result = false; if (args && ! args->empty()) { const wcstring &cmd = args->at(0).completion; if (cmd.find(L"DBUS_SESSION_BUS_") != wcstring::npos) { /* See if we are SUSE */ if (isSUSE < 0) { struct stat buf = {}; isSUSE = (0 == stat("/etc/SuSE-release", &buf)); } if (isSUSE) { /* Look for an equal sign */ size_t where = cmd.find(L'='); if (where != wcstring::npos) { /* Oh my. It's presumably of the form foo=bar; find the = and split */ const wcstring key = wcstring(cmd, 0, where); /* Trim whitespace and semicolon */ wcstring val = wcstring(cmd, where+1); size_t last_good = val.find_last_not_of(L"\n ;"); if (last_good != wcstring::npos) val.resize(last_good + 1); args->clear(); args->push_back(completion_t(L"set")); if (key == L"DBUS_SESSION_BUS_ADDRESS") args->push_back(completion_t(L"-x")); args->push_back(completion_t(key)); args->push_back(completion_t(val)); result = true; } else if (string_prefixes_string(L"export DBUS_SESSION_BUS_ADDRESS;", cmd)) { /* Nothing, we already exported it */ args->clear(); args->push_back(completion_t(L"echo")); args->push_back(completion_t(L"-n")); result = true; } } } } return result; } fish/expand.h000066400000000000000000000151661214535744100134560ustar00rootroot00000000000000/**\file expand.h Prototypes for string expansion functions. These functions perform several kinds of parameter expansion. There are a lot of issues with regards to memory allocation. Overall, these functions would benefit from using a more clever memory allocation scheme, perhaps an evil combination of talloc, string buffers and reference counting. */ #ifndef FISH_EXPAND_H /** Header guard */ #define FISH_EXPAND_H #include #include "util.h" #include "common.h" #include enum { /** Flag specifying that cmdsubst expansion should be skipped */ EXPAND_SKIP_CMDSUBST = 1 << 0, /** Flag specifying that variable expansion should be skipped */ EXPAND_SKIP_VARIABLES = 1 << 1, /** Flag specifying that wildcard expansion should be skipped */ EXPAND_SKIP_WILDCARDS = 1 << 2, /** Incomplete matches in the last segment are ok (for tab completion). An incomplete match is a wildcard that matches a prefix of the filename. If accept_incomplete is true, only the remainder of the string is returned. */ ACCEPT_INCOMPLETE = 1 << 3, /** Only match files that are executable by the current user. Only applicable together with ACCEPT_INCOMPLETE. */ EXECUTABLES_ONLY = 1 << 4, /** Only match directories. Only applicable together with ACCEPT_INCOMPLETE. */ DIRECTORIES_ONLY = 1 << 5, /** Don't generate descriptions */ EXPAND_NO_DESCRIPTIONS = 1 << 6, /** Don't do process expansion */ EXPAND_SKIP_PROCESS = 1 << 7, /** Don't expand jobs (but you can still expand processes). This is because job expansion is not thread safe. */ EXPAND_SKIP_JOBS = 1 << 8, /** Don't expand home directories */ EXPAND_SKIP_HOME_DIRECTORIES = 1 << 9 }; typedef int expand_flags_t; /** Use unencoded private-use keycodes for internal characters */ #define EXPAND_RESERVED 0xf000 /** End of range reserved for expand */ #define EXPAND_RESERVED_END 0xf000f class completion_t; enum { /** Character represeting a home directory */ HOME_DIRECTORY = EXPAND_RESERVED, /** Character represeting process expansion */ PROCESS_EXPAND, /** Character representing variable expansion */ VARIABLE_EXPAND, /** Character rpresenting variable expansion into a single element*/ VARIABLE_EXPAND_SINGLE, /** Character representing the start of a bracket expansion */ BRACKET_BEGIN, /** Character representing the end of a bracket expansion */ BRACKET_END, /** Character representing separation between two bracket elements */ BRACKET_SEP, /** Separate subtokens in a token with this character. */ INTERNAL_SEPARATOR, } ; /** These are the possible return values for expand_string */ enum { /** Error */ EXPAND_ERROR, /** Ok */ EXPAND_OK, /** Ok, a wildcard in the string matched no files */ EXPAND_WILDCARD_NO_MATCH, /* Ok, a wildcard in the string matched a file */ EXPAND_WILDCARD_MATCH }; /** Character for separating two array elements. We use 30, i.e. the ascii record separator since that seems logical. */ #define ARRAY_SEP ((wchar_t)(0x1e)) /** String containing the character for separating two array elements */ #define ARRAY_SEP_STR L"\x1e" /** Error issued on array out of bounds */ #define ARRAY_BOUNDS_ERR _(L"Array index out of bounds") class parser_t; /** Perform various forms of expansion on in, such as tilde expansion (\~USER becomes the users home directory), variable expansion (\$VAR_NAME becomes the value of the environment variable VAR_NAME), cmdsubst expansion and wildcard expansion. The results are inserted into the list out. If the parameter does not need expansion, it is copied into the list out. \param input The parameter to expand \param output The list to which the result will be appended. \param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS \return One of EXPAND_OK, EXPAND_ERROR, EXPAND_WILDCARD_MATCH and EXPAND_WILDCARD_NO_MATCH. EXPAND_WILDCARD_NO_MATCH and EXPAND_WILDCARD_MATCH are normal exit conditions used only on strings containing wildcards to tell if the wildcard produced any matches. */ __warn_unused int expand_string(const wcstring &input, std::vector &output, expand_flags_t flags); /** expand_one is identical to expand_string, except it will fail if in expands to more than one string. This is used for expanding command names. \param inout_str The parameter to expand in-place \param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS \return Whether expansion succeded */ bool expand_one(wcstring &inout_str, expand_flags_t flags); /** Convert the variable value to a human readable form, i.e. escape things, handle arrays, etc. Suitable for pretty-printing. The result must be free'd! \param in the value to escape */ wcstring expand_escape_variable(const wcstring &in); /** Perform tilde expansion and nothing else on the specified string, which is modified in place. \param input the string to tilde expand */ void expand_tilde(wcstring &input); /** Test if the specified argument is clean, i.e. it does not contain any tokens which need to be expanded or otherwise altered. Clean strings can be passed through expand_string and expand_one without changing them. About two thirds of all strings are clean, so skipping expansion on them actually does save a small amount of time, since it avoids multiple memory allocations during the expansion process. \param in the string to test */ int expand_is_clean(const wchar_t *in); /** Perform error reporting for a syntax error related to the variable expansion beginning at the specified character of the specified token. This function will call the error function with an explanatory string about what is wrong with the specified token. \param token The token containing the error \param token_pos The position where the expansion begins \param error_pos The position on the line to report to the error function. */ void expand_variable_error(parser_t &parser, const wchar_t *token, size_t token_pos, int error_pos); /** Testing function for getting all process names. */ std::vector expand_get_all_process_names(void); /* Terrible hacks */ bool fish_xdm_login_hack_hack_hack_hack(std::vector *cmds, int argc, const char * const *argv); bool fish_openSUSE_dbus_hack_hack_hack_hack(std::vector *args); #endif fish/fallback.cpp000066400000000000000000001165771214535744100143010ustar00rootroot00000000000000/** This file only contains fallback implementations of functions which have been found to be missing or broken by the configuration scripts. Many of these functions are more or less broken and incomplete. lrand28_r internally uses the regular (bad) rand_r function, the gettext function doesn't actually do anything, etc. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if HAVE_GETTEXT #include #endif #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #include "fallback.h" #include "util.h" #ifndef HAVE___ENVIRON char **__environ = 0; #endif #ifdef TPUTS_KLUDGE int tputs(const char *str, int affcnt, int (*fish_putc)(tputs_arg_t)) { while (*str) { fish_putc(*str++); } } #endif #ifdef TPARM_SOLARIS_KLUDGE #undef tparm /** Checks for known string values and maps to correct number of parameters. */ char *tparm_solaris_kludge(char *str, ...) { long int param[9] = { }; va_list ap; va_start(ap, str); if ((set_a_foreground && ! strcmp(str, set_a_foreground)) || (set_a_background && ! strcmp(str, set_a_background)) || (set_foreground && ! strcmp(str, set_foreground)) || (set_background && ! strcmp(str, set_background)) || (enter_underline_mode && ! strcmp(str, enter_underline_mode)) || (exit_underline_mode && ! strcmp(str, exit_underline_mode)) || (enter_standout_mode && ! strcmp(str, enter_standout_mode)) || (exit_standout_mode && ! strcmp(str, exit_standout_mode)) || (flash_screen && ! strcmp(str, flash_screen)) || (enter_subscript_mode && ! strcmp(str, enter_subscript_mode)) || (exit_subscript_mode && ! strcmp(str, exit_subscript_mode)) || (enter_superscript_mode && ! strcmp(str, enter_superscript_mode)) || (exit_superscript_mode && ! strcmp(str, exit_superscript_mode)) || (enter_blink_mode && ! strcmp(str, enter_blink_mode)) || (enter_italics_mode && ! strcmp(str, enter_italics_mode)) || (exit_italics_mode && ! strcmp(str, exit_italics_mode)) || (enter_reverse_mode && ! strcmp(str, enter_reverse_mode)) || (enter_shadow_mode && ! strcmp(str, enter_shadow_mode)) || (exit_shadow_mode && ! strcmp(str, exit_shadow_mode)) || (enter_standout_mode && ! strcmp(str, enter_standout_mode)) || (exit_standout_mode && ! strcmp(str, exit_standout_mode)) || (enter_secure_mode && ! strcmp(str, enter_secure_mode)) || (enter_bold_mode && ! strcmp(str, enter_bold_mode))) { param[0] = va_arg(ap, long int); } else if (cursor_address && ! strcmp(str, cursor_address)) { param[0] = va_arg(ap, long int); param[1] = va_arg(ap, long int); } va_end(ap); return tparm(str, param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], param[8]); } // Re-defining just to make sure nothing breaks further down in this file. #define tparm tparm_solaris_kludge #endif #ifndef HAVE_FWPRINTF #define INTERNAL_FWPRINTF 1 #endif #ifdef HAVE_BROKEN_FWPRINTF #define INTERNAL_FWPRINTF 1 #endif #ifdef INTERNAL_FWPRINTF /** Internal function for the wprintf fallbacks. USed to write the specified number of spaces. */ static void pad(void (*writer)(wchar_t), int count) { int i; if (count < 0) return; for (i=0; i= L'0') && (*filter <= L'9')) { width=10*width+(*filter++ - L'0'); } } while (loop) { switch (*filter) { case L'l': /* Long variable */ is_long++; filter++; break; case L'*': /* Set minimum field width */ width = va_arg(va, int); filter++; break; case L'-': filter++; pad_left=0; break; case L'.': /* Set precision. */ filter++; if (*filter == L'*') { precision = va_arg(va, int); } else { precision=0; while ((*filter >= L'0') && (*filter <= L'9')) { precision=10*precision+(*filter++ - L'0'); } } break; default: loop=0; break; } } switch (*filter) { case L'c': { wchar_t c; if ((width >= 0) && pad_left) { pad(writer, width-1); count += maxi(width-1, 0); } c = is_long?va_arg(va, wint_t):btowc(va_arg(va, int)); if (precision != 0) writer(c); if ((width >= 0) && !pad_left) { pad(writer, width-1); count += maxi(width-1, 0); } count++; break; } case L's': { wchar_t *ss=0; wcstring wide_ss; if (is_long) { ss = va_arg(va, wchar_t *); } else { char *ns = va_arg(va, char*); if (ns) { wide_ss = str2wcstring(ns); ss = wide_ss.c_str(); } } if (!ss) { return -1; } if ((width >= 0) && pad_left) { pad(writer, width-wcslen(ss)); count += maxi(width-wcslen(ss), 0); } wchar_t *s=ss; int precount = count; while (*s) { if ((precision > 0) && (precision <= (count-precount))) break; writer(*(s++)); count++; } if ((width >= 0) && !pad_left) { pad(writer, width-wcslen(ss)); count += maxi(width-wcslen(ss), 0); } break; } case L'd': case L'i': case L'o': case L'u': case L'x': case L'X': { char str[33]; char *pos; char format[16]; int len; format[0]=0; strcat(format, "%"); if (precision >= 0) strcat(format, ".*"); switch (is_long) { case 2: strcat(format, "ll"); break; case 1: strcat(format, "l"); break; } len = strlen(format); format[len++]=(char)*filter; format[len]=0; switch (*filter) { case L'd': case L'i': { switch (is_long) { case 0: { int d = va_arg(va, int); if (precision >= 0) snprintf(str, 32, format, precision, d); else snprintf(str, 32, format, d); break; } case 1: { long d = va_arg(va, long); if (precision >= 0) snprintf(str, 32, format, precision, d); else snprintf(str, 32, format, d); break; } case 2: { long long d = va_arg(va, long long); if (precision >= 0) snprintf(str, 32, format, precision, d); else snprintf(str, 32, format, d); break; } default: debug(0, L"Invalid length modifier in string %ls\n", filter_org); return -1; } break; } case L'u': case L'o': case L'x': case L'X': { switch (is_long) { case 0: { unsigned d = va_arg(va, unsigned); if (precision >= 0) snprintf(str, 32, format, precision, d); else snprintf(str, 32, format, d); break; } case 1: { unsigned long d = va_arg(va, unsigned long); if (precision >= 0) snprintf(str, 32, format, precision, d); else snprintf(str, 32, format, d); break; } case 2: { unsigned long long d = va_arg(va, unsigned long long); if (precision >= 0) snprintf(str, 32, format, precision, d); else snprintf(str, 32, format, d); break; } default: debug(0, L"Invalid length modifier in string %ls\n", filter_org); return -1; } break; } default: debug(0, L"Invalid filter %ls in string %ls\n", *filter, filter_org); return -1; } if ((width >= 0) && pad_left) { int l = maxi(width-strlen(str), 0); pad(writer, l); count += l; } pos = str; while (*pos) { writer(*(pos++)); count++; } if ((width >= 0) && !pad_left) { int l = maxi(width-strlen(str), 0); pad(writer, l); count += l; } break; } case L'f': { char str[32]; char *pos; double val = va_arg(va, double); if (precision>= 0) { if (width>= 0) { snprintf(str, 32, "%*.*f", width, precision, val); } else { snprintf(str, 32, "%.*f", precision, val); } } else { if (width>= 0) { snprintf(str, 32, "%*f", width, val); } else { snprintf(str, 32, "%f", val); } } pos = str; while (*pos) { writer(*(pos++)); count++; } break; } case L'n': { int *n = va_arg(va, int *); *n = count; break; } case L'%': { writer('%'); count++; break; } default: debug(0, L"Unknown switch %lc in string %ls\n", *filter, filter_org); return -1; } } else { writer(*filter); count++; } } return count; } /** Holds data for swprintf writer */ static struct { int count; int max; wchar_t *pos; } sw_data; /** Writers for string output */ static void sw_writer(wchar_t c) { if (sw_data.count < sw_data.max) *(sw_data.pos++)=c; sw_data.count++; } int vswprintf(wchar_t *out, size_t n, const wchar_t *filter, va_list va) { int written; sw_data.pos=out; sw_data.max=n; sw_data.count=0; written=vgwprintf(&sw_writer, filter, va); if (written < n) { *sw_data.pos = 0; } else { written=-1; } return written; } int swprintf(wchar_t *out, size_t n, const wchar_t *filter, ...) { va_list va; int written; va_start(va, filter); written = vswprintf(out, n, filter, va); va_end(va); return written; } /** Holds auxiliary data for fwprintf and wprintf writer */ static FILE *fw_data; static void fw_writer(wchar_t c) { putwc(c, fw_data); } /* Writers for file output */ int vfwprintf(FILE *f, const wchar_t *filter, va_list va) { fw_data = f; return vgwprintf(&fw_writer, filter, va); } int fwprintf(FILE *f, const wchar_t *filter, ...) { va_list va; int written; va_start(va, filter); written = vfwprintf(f, filter, va); va_end(va); return written; } int vwprintf(const wchar_t *filter, va_list va) { return vfwprintf(stdout, filter, va); } int wprintf(const wchar_t *filter, ...) { va_list va; int written; va_start(va, filter); written=vwprintf(filter, va); va_end(va); return written; } #endif #ifndef HAVE_FGETWC wint_t fgetwc(FILE *stream) { wchar_t res=0; mbstate_t state; memset(&state, '\0', sizeof(state)); while (1) { int b = fgetc(stream); char bb; int sz; if (b == EOF) return WEOF; bb=b; sz = mbrtowc(&res, &bb, 1, &state); switch (sz) { case -1: memset(&state, '\0', sizeof(state)); return WEOF; case -2: break; case 0: return 0; default: return res; } } } wint_t getwc(FILE *stream) { return fgetwc(stream); } #endif #ifndef HAVE_FPUTWC wint_t fputwc(wchar_t wc, FILE *stream) { int res; char s[MB_CUR_MAX+1]; memset(s, 0, MB_CUR_MAX+1); wctomb(s, wc); res = fputs(s, stream); return res==EOF?WEOF:wc; } wint_t putwc(wchar_t wc, FILE *stream) { return fputwc(wc, stream); } #endif #ifndef HAVE_WCSTOK /* Used by fallback wcstok. Borrowed from glibc */ static size_t fish_wcsspn(const wchar_t *wcs, const wchar_t *accept) { register const wchar_t *p; register const wchar_t *a; register size_t count = 0; for (p = wcs; *p != L'\0'; ++p) { for (a = accept; *a != L'\0'; ++a) if (*p == *a) break; if (*a == L'\0') return count; else ++count; } return count; } /* Used by fallback wcstok. Borrowed from glibc */ static wchar_t *fish_wcspbrk(const wchar_t *wcs, const wchar_t *accept) { while (*wcs != L'\0') if (wcschr(accept, *wcs) == NULL) ++wcs; else return (wchar_t *) wcs; return NULL; } /* Fallback wcstok implementation. Borrowed from glibc. */ wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **save_ptr) { wchar_t *result; if (wcs == NULL) { if (*save_ptr == NULL) { errno = EINVAL; return NULL; } else wcs = *save_ptr; } /* Scan leading delimiters. */ wcs += fish_wcsspn(wcs, delim); if (*wcs == L'\0') { *save_ptr = NULL; return NULL; } /* Find the end of the token. */ result = wcs; wcs = fish_wcspbrk(result, delim); if (wcs == NULL) { /* This token finishes the string. */ *save_ptr = NULL; } else { /* Terminate the token and make *SAVE_PTR point past it. */ *wcs = L'\0'; *save_ptr = wcs + 1; } return result; } #endif /* Fallback implementations of wcsdup and wcscasecmp. On systems where these are not needed (e.g. building on Linux) these should end up just being stripped, as they are static functions that are not referenced in this file. */ static wchar_t *wcsdup_fallback(const wchar_t *in) { size_t len=wcslen(in); wchar_t *out = (wchar_t *)malloc(sizeof(wchar_t)*(len+1)); if (out == 0) { return 0; } memcpy(out, in, sizeof(wchar_t)*(len+1)); return out; } static int wcscasecmp_fallback(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_fallback(a+1,b+1); } static int wcsncasecmp_fallback(const wchar_t *a, const wchar_t *b, size_t 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_fallback(a+1,b+1, count-1); } #if __APPLE__ && __DARWIN_C_LEVEL >= 200809L /* Note parens avoid the macro expansion */ wchar_t *wcsdup_use_weak(const wchar_t *a) { if (wcsdup != NULL) return (wcsdup)(a); return wcsdup_fallback(a); } int wcscasecmp_use_weak(const wchar_t *a, const wchar_t *b) { if (wcscasecmp != NULL) return (wcscasecmp)(a, b); return wcscasecmp_fallback(a, b); } int wcsncasecmp_use_weak(const wchar_t *s1, const wchar_t *s2, size_t n) { if (wcsncasecmp != NULL) return (wcsncasecmp)(s1, s2, n); return wcsncasecmp_fallback(s1, s2, n); } #else //__APPLE__ #ifndef HAVE_WCSDUP wchar_t *wcsdup(const wchar_t *in) { return wcsdup_fallback(in); } #endif #ifndef HAVE_WCSCASECMP int wcscasecmp(const wchar_t *a, const wchar_t *b) { return wcscasecmp_fallback(a, b); } #endif #endif //__APPLE__ #ifndef HAVE_WCSLEN size_t wcslen(const wchar_t *in) { const wchar_t *end=in; while (*end) end++; return end-in; } #endif #ifndef HAVE_WCSNCASECMP int wcsncasecmp(const wchar_t *a, const wchar_t *b, size_t count) { return wcsncasecmp_fallback(a, b, count); } #endif #ifndef HAVE_WCWIDTH int wcwidth(wchar_t c) { if (c < 32) return 0; if (c == 127) return 0; return 1; } #endif #ifndef HAVE_WCSNDUP wchar_t *wcsndup(const wchar_t *in, size_t c) { wchar_t *res = (wchar_t *)malloc(sizeof(wchar_t)*(c+1)); if (res == 0) { return 0; } wcslcpy(res, in, c+1); 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; } #ifndef HAVE_WCSTOL 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++; } } #endif #ifndef HAVE_WCSLCAT /*$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $*/ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t siz) { register wchar_t *d = dst; register const wchar_t *s = src; register size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; dlen = d - dst; n = siz - dlen; if (n == 0) return(dlen + wcslen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return(dlen + (s - src)); /* count does not include NUL */ } #endif #ifndef HAVE_WCSLCPY /*$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $*/ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz) { register wchar_t *d = dst; register const wchar_t *s = src; register size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ } #endif #ifndef HAVE_LRAND48_R int lrand48_r(struct drand48_data *buffer, long int *result) { *result = rand_r(&buffer->seed); return 0; } int srand48_r(long int seedval, struct drand48_data *buffer) { buffer->seed = (unsigned int)seedval; return 0; } #endif #ifndef HAVE_FUTIMES int futimes(int fd, const struct timeval *times) { errno = ENOSYS; return -1; } #endif #if HAVE_GETTEXT char * fish_gettext(const char * msgid) { return gettext(msgid);; } char * fish_bindtextdomain(const char * domainname, const char * dirname) { return bindtextdomain(domainname, dirname); } char * fish_textdomain(const char * domainname) { return textdomain(domainname); } #else char *fish_gettext(const char * msgid) { return (char *)msgid; } char *fish_bindtextdomain(const char * domainname, const char * dirname) { return NULL; } char *fish_textdomain(const char * domainname) { return NULL; } #endif #if HAVE_DCGETTEXT char *fish_dcgettext(const char * domainname, const char * msgid, int category) { return dcgettext(domainname, msgid, category); } #else char *fish_dcgettext(const char * domainname, const char * msgid, int category) { return (char *)msgid; } #endif #ifndef HAVE__NL_MSG_CAT_CNTR int _nl_msg_cat_cntr=0; #endif #ifndef HAVE_KILLPG int killpg(int pgr, int sig) { assert(pgr > 1); return kill(-pgr, sig); } #endif #ifndef HAVE_WORKING_GETOPT_LONG int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex) { return getopt(argc, argv, optstring); } #endif #ifndef HAVE_BACKTRACE int backtrace(void **buffer, int size) { return 0; } #endif #ifndef HAVE_BACKTRACE_SYMBOLS char ** backtrace_symbols(void *const *buffer, int size) { return 0; } #endif #ifndef HAVE_SYSCONF long sysconf(int name) { if (name == _SC_ARG_MAX) { #ifdef ARG_MAX return ARG_MAX; #endif } return -1; } #endif #ifndef HAVE_NAN double nan(char *tagp) { return 0.0/0.0; } #endif /* Big hack to use our versions of wcswidth where we know them to be broken, like on OS X */ #ifndef HAVE_BROKEN_WCWIDTH #if __APPLE__ #define HAVE_BROKEN_WCWIDTH 1 #else #define HAVE_BROKEN_WCWIDTH 0 #endif #endif #if ! HAVE_BROKEN_WCWIDTH int fish_wcwidth(wchar_t wc) { return wcwidth(wc); } int fish_wcswidth(const wchar_t *str, size_t n) { return wcswidth(str, n); } #else static int mk_wcwidth(wchar_t wc); static int mk_wcswidth(const wchar_t *pwcs, size_t n); int fish_wcwidth(wchar_t wc) { return mk_wcwidth(wc); } int fish_wcswidth(const wchar_t *str, size_t n) { return mk_wcswidth(str, n); } /* * This is an implementation of wcwidth() and wcswidth() (defined in * IEEE Std 1002.1-2001) for Unicode. * * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html * * In fixed-width output devices, Latin characters all occupy a single * "cell" position of equal width, whereas ideographic CJK characters * occupy two such cells. Interoperability between terminal-line * applications and (teletype-style) character terminals using the * UTF-8 encoding requires agreement on which character should advance * the cursor by how many cell positions. No established formal * standards exist at present on which Unicode character shall occupy * how many cell positions on character terminals. These routines are * a first attempt of defining such behavior based on simple rules * applied to data provided by the Unicode Consortium. * * For some graphical characters, the Unicode standard explicitly * defines a character-cell width via the definition of the East Asian * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. * In all these cases, there is no ambiguity about which width a * terminal shall use. For characters in the East Asian Ambiguous (A) * class, the width choice depends purely on a preference of backward * compatibility with either historic CJK or Western practice. * Choosing single-width for these characters is easy to justify as * the appropriate long-term solution, as the CJK practice of * displaying these characters as double-width comes from historic * implementation simplicity (8-bit encoded characters were displayed * single-width and 16-bit ones double-width, even for Greek, * Cyrillic, etc.) and not any typographic considerations. * * Much less clear is the choice of width for the Not East Asian * (Neutral) class. Existing practice does not dictate a width for any * of these characters. It would nevertheless make sense * typographically to allocate two character cells to characters such * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be * represented adequately with a single-width glyph. The following * routines at present merely assign a single-cell width to all * neutral characters, in the interest of simplicity. This is not * entirely satisfactory and should be reconsidered before * establishing a formal standard in this area. At the moment, the * decision which Not East Asian (Neutral) characters should be * represented by double-width glyphs cannot yet be answered by * applying a simple rule from the Unicode database content. Setting * up a proper standard for the behavior of UTF-8 character terminals * will require a careful analysis not only of each Unicode character, * but also of each presentation form, something the author of these * routines has avoided to do so far. * * http://www.unicode.org/unicode/reports/tr11/ * * Markus Kuhn -- 2007-05-26 (Unicode 5.0) * * Permission to use, copy, modify, and distribute this software * for any purpose and without fee is hereby granted. The author * disclaims all warranties with regard to this software. * * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c */ #include struct interval { int first; int last; }; /* auxiliary function for binary search in interval table */ static int bisearch(wchar_t ucs, const struct interval *table, int max) { int min = 0; int mid; if (ucs < table[0].first || ucs > table[max].last) return 0; while (max >= min) { mid = (min + max) / 2; if (ucs > table[mid].last) min = mid + 1; else if (ucs < table[mid].first) max = mid - 1; else return 1; } return 0; } /* The following two functions define the column width of an ISO 10646 * character as follows: * * - The null character (U+0000) has a column width of 0. * * - Other C0/C1 control characters and DEL will lead to a return * value of -1. * * - Non-spacing and enclosing combining characters (general * category code Mn or Me in the Unicode database) have a * column width of 0. * * - SOFT HYPHEN (U+00AD) has a column width of 1. * * - Other format characters (general category code Cf in the Unicode * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. * * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) * have a column width of 0. * * - Spacing characters in the East Asian Wide (W) or East Asian * Full-width (F) category as defined in Unicode Technical * Report #11 have a column width of 2. * * - All remaining characters (including all printable * ISO 8859-1 and WGL4 characters, Unicode control characters, * etc.) have a column width of 1. * * This implementation assumes that wchar_t characters are encoded * in ISO 10646. */ static int mk_wcwidth(wchar_t ucs) { /* sorted list of non-overlapping intervals of non-spacing characters */ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ static const struct interval combining[] = { { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF } }; /* test for 8-bit control characters */ if (ucs == 0) return 0; if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) return -1; /* binary search in table of non-spacing characters */ if (bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1)) return 0; /* if we arrive here, ucs is not a combining or C0/C1 control character */ return 1 + (ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ ucs == 0x2329 || ucs == 0x232a || (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6) || (ucs >= 0x20000 && ucs <= 0x2fffd) || (ucs >= 0x30000 && ucs <= 0x3fffd))); } static int mk_wcswidth(const wchar_t *pwcs, size_t n) { int w, width = 0; for (; *pwcs && n-- > 0; pwcs++) if ((w = mk_wcwidth(*pwcs)) < 0) return -1; else width += w; return width; } #endif // HAVE_BROKEN_WCWIDTH fish/fallback.h000066400000000000000000000274171214535744100137400ustar00rootroot00000000000000 #ifndef FISH_FALLBACK_H #define FISH_FALLBACK_H #include #include #include #include #include #include #include #include #include /** fish's internal versions of wcwidth and wcswidth, which can use an internal implementation if the system one is busted. */ int fish_wcwidth(wchar_t wc); int fish_wcswidth(const wchar_t *str, size_t n); #ifndef WCHAR_MAX /** This _should_ be defined by wchar.h, but e.g. OpenBSD doesn't. */ #define WCHAR_MAX INT_MAX #endif /** Make sure __func__ is defined to some string. In C99, this should be the currently compiled function. If we aren't using C99 or later, older versions of GCC had __FUNCTION__. */ #if __STDC_VERSION__ < 199901L # if __GNUC__ >= 2 # define __func__ __FUNCTION__ # else # define __func__ "" # endif #endif /** Under curses, tputs expects an int (*func)(char) as its last parameter, but in ncurses, tputs expects a int (*func)(int) as its last parameter. tputs_arg_t is defined to always be what tputs expects. Hopefully. */ #ifdef NCURSES_VERSION typedef int tputs_arg_t; #else typedef char tputs_arg_t; #endif #ifndef SIGIO #define SIGIO SIGUSR1 #endif #ifndef SIGWINCH #define SIGWINCH SIGUSR2 #endif #ifndef HAVE_WINSIZE /** Structure used to get the size of a terminal window */ struct winsize { /** Number of rows */ unsigned short ws_row; /** Number of columns */ unsigned short ws_col; } ; #endif #ifdef TPUTS_KLUDGE /** Linux on PPC seems to have a tputs implementation that sometimes behaves strangely. This fallback seems to fix things. */ int tputs(const char *str, int affcnt, int (*fish_putc)(tputs_arg_t)); #endif #ifdef TPARM_SOLARIS_KLUDGE /** Solaris tparm has a set fixed of paramters in it's curses implementation, work around this here. */ #define tparm tparm_solaris_kludge char *tparm_solaris_kludge(char *str, ...); #endif #ifndef HAVE_FWPRINTF /** Print formated string. Some operating systems (Like NetBSD) do not have wide string formating functions. Therefore we implement our own. Not at all complete. Supports wide and narrow characters, strings and decimal numbers, position (%n), field width and precision. */ int fwprintf(FILE *f, const wchar_t *format, ...); /** Print formated string. Some operating systems (Like NetBSD) do not have wide string formating functions. Therefore we define our own. Not at all complete. Supports wide and narrow characters, strings and decimal numbers, position (%n), field width and precision. */ int swprintf(wchar_t *str, size_t l, const wchar_t *format, ...); /** Print formated string. Some operating systems (Like NetBSD) do not have wide string formating functions. Therefore we define our own. Not at all complete. Supports wide and narrow characters, strings and decimal numbers, position (%n), field width and precision. */ int wprintf(const wchar_t *format, ...); /** Print formated string. Some operating systems (Like NetBSD) do not have wide string formating functions. Therefore we define our own. Not at all complete. Supports wide and narrow characters, strings and decimal numbers, position (%n), field width and precision. */ int vwprintf(const wchar_t *filter, va_list va); /** Print formated string. Some operating systems (Like NetBSD) do not have wide string formating functions. Therefore we define our own. Not at all complete. Supports wide and narrow characters, strings and decimal numbers, position (%n), field width and precision. */ int vfwprintf(FILE *f, const wchar_t *filter, va_list va); /** Print formated string. Some operating systems (Like NetBSD) do not have wide string formating functions. Therefore we define our own. Not at all complete. Supports wide and narrow characters, strings and decimal numbers, position (%n), field width and precision. */ int vswprintf(wchar_t *out, size_t n, const wchar_t *filter, va_list va); #endif #ifndef HAVE_FGETWC /** Fallback implementation of fgetwc */ wint_t fgetwc(FILE *stream); /** Fallback implementation of getwc */ wint_t getwc(FILE *stream); #endif #ifndef HAVE_FPUTWC /** Fallback implementation of fputwc */ wint_t fputwc(wchar_t wc, FILE *stream); /** Fallback implementation of putwc */ wint_t putwc(wchar_t wc, FILE *stream); #endif #ifndef HAVE_WCSTOK /** Fallback implementation of wcstok. Uses code borrowed from glibc. */ wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr); #endif #ifndef HAVE_WCWIDTH /** Return the number of columns used by a character. This is a libc function, but the prototype for this function is missing in some libc implementations. Fish has a fallback implementation in case the implementation is missing altogether. In locales without a native wcwidth, Unicode is probably so broken that it isn't worth trying to implement a real wcwidth. Therefore, the fallback wcwidth assumes any printing character takes up one column and anything else uses 0 columns. */ int wcwidth(wchar_t c); #endif /** On OS X, use weak linking for wcsdup and wcscasecmp. Weak linking allows you to call the function only if it exists at runtime. You can detect it by testing the function pointer against NULL. To avoid making the callers do that, redefine wcsdup to wcsdup_use_weak, and likewise with wcscasecmp. This lets us use the same binary on SnowLeopard (10.6) and Lion+ (10.7), even though these functions only exist on 10.7+. On other platforms, use what's detected at build time. */ #if __APPLE__ && __DARWIN_C_LEVEL >= 200809L wchar_t *wcsdup_use_weak(const wchar_t *); int wcscasecmp_use_weak(const wchar_t *, const wchar_t *); int wcsncasecmp_use_weak(const wchar_t *s1, const wchar_t *s2, size_t n); #define wcsdup(a) wcsdup_use_weak((a)) #define wcscasecmp(a, b) wcscasecmp_use_weak((a), (b)) #define wcsncasecmp(a, b, c) wcsncasecmp_use_weak((a), (b), (c)) #else #ifndef HAVE_WCSDUP /** Create a duplicate string. Wide string version of strdup. Will automatically exit if out of memory. */ wchar_t *wcsdup(const wchar_t *in); #endif #ifndef HAVE_WCSCASECMP /** 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); #endif #endif //__APPLE__ #ifndef HAVE_WCSLEN /** Fallback for wclsen. Returns the length of the specified string. */ size_t wcslen(const wchar_t *in); #endif #ifndef HAVE_WCSNCASECMP /** 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, size_t count); /** 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. */ #endif #ifndef HAVE_WCSNDUP /** Fallback for wcsndup function. Returns a copy of \c in, truncated to a maximum length of \c c. */ wchar_t *wcsndup(const wchar_t *in, size_t c); #endif /** Converts from wide char to digit in the specified base. If d is not a valid digit in the specified base, return -1. This is a helper function for wcstol, but it is useful itself, so it is exported. */ long convert_digit(wchar_t d, int base); #ifndef HAVE_WCSTOL /** Fallback implementation. 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); #endif #ifndef HAVE_WCSLCAT /** Appends src to string dst of size siz (unlike wcsncat, siz is the full size of dst, not space left). At most siz-1 characters will be copied. Always NUL terminates (unless siz <= wcslen(dst)). Returns wcslen(src) + MIN(siz, wcslen(initial dst)). If retval >= siz, truncation occurred. This is the OpenBSD strlcat function, modified for wide characters, and renamed to reflect this change. */ size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t siz); #endif #ifndef HAVE_WCSLCPY /** Copy src to string dst of size siz. At most siz-1 characters will be copied. Always NUL terminates (unless siz == 0). Returns wcslen(src); if retval >= siz, truncation occurred. This is the OpenBSD strlcpy function, modified for wide characters, and renamed to reflect this change. */ size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz); #endif /** BSD del_curterm seems to do a double-free. We redefine it as a no-op */ #ifdef HAVE_BROKEN_DEL_CURTERM #define fish_del_curterm(X) OK #else #define fish_del_curterm(X) del_curterm(X) #endif #ifndef HAVE_LRAND48_R /** Datastructure for the lrand48_r fallback implementation. */ struct drand48_data { /** Seed value */ unsigned int seed; } ; /** Fallback implementation of lrand48_r. Internally uses rand_r, so it is pretty weak. */ int lrand48_r(struct drand48_data *buffer, long int *result); /** Fallback implementation of srand48_r, the seed function for lrand48_r. */ int srand48_r(long int seedval, struct drand48_data *buffer); #endif #ifndef HAVE_FUTIMES int futimes(int fd, const struct timeval *times); #endif /* autoconf may fail to detect gettext (645), so don't define a function call gettext or we'll get build errors */ /** Cover for gettext() */ char * fish_gettext(const char * msgid); /** Cover for bindtextdomain() */ char * fish_bindtextdomain(const char * domainname, const char * dirname); /** Cover for textdomain() */ char * fish_textdomain(const char * domainname); /* Cover for dcgettext */ char * fish_dcgettext(const char * domainname, const char * msgid, int category); #ifndef HAVE__NL_MSG_CAT_CNTR /** Some gettext implementation use have this variable, and by increasing it, one can tell the system that the translations need to be reloaded. */ extern int _nl_msg_cat_cntr; #endif #ifndef HAVE_KILLPG /** Send specified signal to specified process group. */ int killpg(int pgr, int sig); #endif #ifndef HAVE_WORKING_GETOPT_LONG /** Struct describing a long getopt option */ struct option { /** Name of option */ const char *name; /** Flag */ int has_arg; /** Flag */ int *flag; /** Return value */ int val; } ; #ifndef no_argument #define no_argument 0 #endif #ifndef required_argument #define required_argument 1 #endif #ifndef optional_argument #define optional_argument 2 #endif int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); #endif #ifndef HAVE_SYSCONF #define _SC_ARG_MAX 1 long sysconf(int name); #endif #ifndef HAVE_NAN double nan(char *tagp); #endif #endif fish/fish.cpp000066400000000000000000000364211214535744100134600ustar00rootroot00000000000000/* Copyright (C) 2005-2008 Axel Liljencrantz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** \file fish.c The main loop of fish. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include "fallback.h" #include "util.h" #include "common.h" #include "reader.h" #include "builtin.h" #include "function.h" #include "complete.h" #include "wutil.h" #include "env.h" #include "sanity.h" #include "proc.h" #include "parser.h" #include "expand.h" #include "intern.h" #include "exec.h" #include "event.h" #include "output.h" #include "history.h" #include "path.h" /* PATH_MAX may not exist */ #ifndef PATH_MAX #define PATH_MAX 1024 #endif /** The string describing the single-character options accepted by the main fish binary */ #define GETOPT_STRING "+hilnvc:p:d:" static bool has_suffix(const std::string &path, const char *suffix, bool ignore_case) { size_t pathlen = path.size(), suffixlen = strlen(suffix); return pathlen >= suffixlen && !(ignore_case ? strcasecmp : strcmp)(path.c_str() + pathlen - suffixlen, suffix); } /* Modifies the given path by calling realpath. Returns true if realpath succeeded, false otherwise */ static bool get_realpath(std::string &path) { char buff[PATH_MAX], *ptr; if ((ptr = realpath(path.c_str(), buff))) { path = ptr; } return ptr != NULL; } /* OS X function for getting the executable path */ extern "C" { int _NSGetExecutablePath(char* buf, uint32_t* bufsize); } /* Return the path to the current executable. This needs to be realpath'd. */ static std::string get_executable_path(const char *argv0) { char buff[PATH_MAX]; #if __APPLE__ { /* Returns 0 on success, -1 if the buffer is too small */ uint32_t buffSize = sizeof buff; if (0 == _NSGetExecutablePath(buff, &buffSize)) return std::string(buff); /* Loop until we're big enough */ char *mbuff = (char *)malloc(buffSize); while (0 > _NSGetExecutablePath(mbuff, &buffSize)) mbuff = (char *)realloc(mbuff, buffSize); /* Return the string */ std::string result = mbuff; free(mbuff); return result; } #endif { /* On other Unixes, try /proc directory. This might be worth breaking out into macros. */ if (0 < readlink("/proc/self/exe", buff, sizeof buff) || // Linux 0 < readlink("/proc/curproc/file", buff, sizeof buff) || // BSD 0 < readlink("/proc/self/path/a.out", buff, sizeof buff)) // Solaris { return std::string(buff); } } /* Just return argv0, which probably won't work (i.e. it's not an absolute path or a path relative to the working directory, but instead something the caller found via $PATH). We'll eventually fall back to the compile time paths. */ return std::string(argv0 ? argv0 : ""); } static struct config_paths_t determine_config_directory_paths(const char *argv0) { struct config_paths_t paths; bool done = false; std::string exec_path = get_executable_path(argv0); if (get_realpath(exec_path)) { #if __APPLE__ /* On OS X, maybe we're an app bundle, and should use the bundle's files. Since we don't link CF, use this lame approach to test it: see if the resolved path ends with /Contents/MacOS/fish, case insensitive since HFS+ usually is. */ if (! done) { const char *suffix = "/Contents/MacOS/fish"; const size_t suffixlen = strlen(suffix); if (has_suffix(exec_path, suffix, true)) { /* Looks like we're a bundle. Cut the string at the / prefixing /Contents... and then the rest */ wcstring wide_resolved_path = str2wcstring(exec_path); wide_resolved_path.resize(exec_path.size() - suffixlen); wide_resolved_path.append(L"/Contents/Resources/"); /* Append share, etc, doc */ paths.data = wide_resolved_path + L"share/fish"; paths.sysconf = wide_resolved_path + L"etc/fish"; paths.doc = wide_resolved_path + L"doc/fish"; /* But the bin_dir is the resolved_path, minus fish (aka the MacOS directory) */ paths.bin = str2wcstring(exec_path); paths.bin.resize(paths.bin.size() - strlen("/fish")); done = true; } } #endif if (! done) { /* The next check is that we are in a reloctable directory tree like this: bin/fish etc/fish share/fish Check it! */ const char *suffix = "/bin/fish"; if (has_suffix(exec_path, suffix, false)) { wcstring base_path = str2wcstring(exec_path); base_path.resize(base_path.size() - strlen(suffix)); paths.data = base_path + L"/share/fish"; paths.sysconf = base_path + L"/etc/fish"; paths.doc = base_path + L"/share/doc/fish"; paths.bin = base_path + L"/bin"; struct stat buf; if (0 == wstat(paths.data, &buf) && 0 == wstat(paths.sysconf, &buf)) { done = true; } } } } if (! done) { /* Fall back to what got compiled in. */ paths.data = L"" DATADIR "/fish"; paths.sysconf = L"" SYSCONFDIR "/fish"; paths.doc = L"" DATADIR "/doc/fish"; paths.bin = L"" BINDIR; done = true; } return paths; } /** Parse init files. exec_path is the path of fish executable as determined by argv[0]. */ static int read_init(const struct config_paths_t &paths) { parser_t &parser = parser_t::principal_parser(); const io_chain_t empty_ios; parser.eval(L"builtin . " + paths.data + L"/config.fish 2>/dev/null", empty_ios, TOP); parser.eval(L"builtin . " + paths.sysconf + L"/config.fish 2>/dev/null", empty_ios, TOP); /* We need to get the configuration directory before we can source the user configuration file */ wcstring config_dir; /* If path_get_config returns false then we have no configuration directory and no custom config to load. */ if (path_get_config(config_dir)) { wcstring config_dir_escaped = escape_string(config_dir, 1); wcstring eval_buff = format_string(L"builtin . %ls/config.fish 2>/dev/null", config_dir_escaped.c_str()); parser.eval(eval_buff, empty_ios, TOP); } return 1; } /** Parse the argument list, return the index of the first non-switch arguments. */ static int fish_parse_opt(int argc, char **argv, std::vector *out_cmds) { int my_optind; int force_interactive=0; bool has_cmd = false; while (1) { static struct option long_options[] = { { "command", required_argument, 0, 'c' }, { "debug-level", required_argument, 0, 'd' }, { "interactive", no_argument, 0, 'i' } , { "login", no_argument, 0, 'l' }, { "no-execute", no_argument, 0, 'n' }, { "profile", required_argument, 0, 'p' }, { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'v' }, { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = getopt_long(argc, argv, GETOPT_STRING, long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: { break; } case 'c': { out_cmds->push_back(optarg ? optarg : ""); has_cmd = true; is_interactive_session = 0; break; } case 'd': { char *end; long tmp; errno = 0; tmp = strtol(optarg, &end, 10); if (tmp >= 0 && tmp <=10 && !*end && !errno) { debug_level = (int)tmp; } else { debug(0, _(L"Invalid value '%s' for debug level switch"), optarg); exit_without_destructors(1); } break; } case 'h': { out_cmds->push_back("__fish_print_help fish"); has_cmd = true; break; } case 'i': { force_interactive = 1; break; } case 'l': { is_login=1; break; } case 'n': { no_exec=1; break; } case 'p': { profile = optarg; break; } case 'v': { fwprintf(stderr, _(L"%s, version %s\n"), PACKAGE_NAME, PACKAGE_VERSION); exit_without_destructors(0); } case '?': { exit_without_destructors(1); } } } my_optind = optind; is_login |= (strcmp(argv[0], "-fish") == 0); /* We are an interactive session if we have not been given an explicit command to execute, _and_ stdin is a tty. */ is_interactive_session &= ! has_cmd; is_interactive_session &= (my_optind == argc); is_interactive_session &= isatty(STDIN_FILENO); /* We are also an interactive session if we have are forced- */ is_interactive_session |= force_interactive; return my_optind; } /** Calls a bunch of init functions, parses the init files and then parses commands from stdin or files, depending on arguments */ static wcstring full_escape(const wchar_t *in) { wcstring out; for (; *in; in++) { if (*in < 32) { append_format(out, L"\\x%.2x", *in); } else if (*in < 128) { out.push_back(*in); } else if (*in < 65536) { append_format(out, L"\\u%.4x", *in); } else { append_format(out, L"\\U%.8x", *in); } } return out; } extern int g_fork_count; int main(int argc, char **argv) { int res=1; int my_optind=0; set_main_thread(); setup_fork_guards(); save_term_foreground_process_group(); wsetlocale(LC_ALL, L""); is_interactive_session=1; program_name=L"fish"; //struct stat tmp; //stat("----------FISH_HIT_MAIN----------", &tmp); std::vector cmds; my_optind = fish_parse_opt(argc, argv, &cmds); /* No-exec is prohibited when in interactive mode */ if (is_interactive_session && no_exec) { debug(1, _(L"Can not use the no-execute mode when running an interactive session")); no_exec = 0; } const struct config_paths_t paths = determine_config_directory_paths(argv[0]); proc_init(); event_init(); wutil_init(); builtin_init(); function_init(); env_init(&paths); reader_init(); history_init(); parser_t &parser = parser_t::principal_parser(); if (g_log_forks) printf("%d: g_fork_count: %d\n", __LINE__, g_fork_count); const io_chain_t empty_ios; if (read_init(paths)) { /* Stop the exit status of any initialization commands (#635) */ proc_set_last_status(STATUS_BUILTIN_OK); /* Run the commands specified as arguments, if any */ if (! cmds.empty()) { /* Do something nasty to support OpenSUSE assuming we're bash. This may modify cmds. */ if (is_login) { fish_xdm_login_hack_hack_hack_hack(&cmds, argc - my_optind, argv + my_optind); } for (size_t i=0; i < cmds.size(); i++) { const wcstring cmd_wcs = str2wcstring(cmds.at(i)); res = parser.eval(cmd_wcs, empty_ios, TOP); } reader_exit(0, 0); } else { if (my_optind == argc) { res = reader_read(STDIN_FILENO, empty_ios); } else { char **ptr; char *file = *(argv+(my_optind++)); int i; int fd; if ((fd = open(file, O_RDONLY)) == -1) { wperror(L"open"); return 1; } // OK to not do this atomically since we cannot have gone multithreaded yet set_cloexec(fd); if (*(argv+my_optind)) { wcstring sb; for (i=1,ptr = argv+my_optind; *ptr; i++, ptr++) { if (i != 1) sb.append(ARRAY_SEP_STR); sb.append(str2wcstring(*ptr)); } env_set(L"argv", sb.c_str(), 0); } const wcstring rel_filename = str2wcstring(file); const wchar_t *abs_filename = wrealpath(rel_filename, NULL); if (!abs_filename) { abs_filename = wcsdup(rel_filename.c_str()); } reader_push_current_filename(intern(abs_filename)); free((void *)abs_filename); res = reader_read(fd, empty_ios); if (res) { debug(1, _(L"Error while reading file %ls\n"), reader_current_filename()?reader_current_filename(): _(L"Standard input")); } reader_pop_current_filename(); } } } proc_fire_event(L"PROCESS_EXIT", EVENT_EXIT, getpid(), res); restore_term_foreground_process_group(); history_destroy(); proc_destroy(); builtin_destroy(); reader_destroy(); parser.destroy(); wutil_destroy(); event_destroy(); env_destroy(); if (g_log_forks) printf("%d: g_fork_count: %d\n", __LINE__, g_fork_count); exit_without_destructors(res ? STATUS_UNKNOWN_COMMAND : proc_get_last_status()); return EXIT_FAILURE; //above line should always exit } fish/fish.spec.in000066400000000000000000000132231214535744100142300ustar00rootroot00000000000000Summary: A friendly interactive shell Name: @PACKAGE_NAME@ Version: @PACKAGE_VERSION@ Release: 0%{?dist} License: GPL Group: System Environment/Shells URL: http://fishshell.com/ Source0: http://ridiculousfish.com/shell/files/%{version}/%{name}-%{version}.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: ncurses-devel gettext groff # Locate correct build time-dependencies for providing X headers %if "%fedora" >= "5" # Modern Fedora version, has modular X.org BuildRequires: xorg-x11-proto-devel libX11-devel libXt-devel libXext-devel %endif %if "%fedora" < "5" %if "%fedora" >= "3" # Semi-old Fedora version, has non-modular X.org BuildRequires: xorg-x11-devel %endif %endif %if 0%{?fedora} %if "%fedora" < "3" # Ancient Fedora version, has XFree86 BuildRequires: XFree86-devel %endif %else # The %fedora variable has not been correctly defined, or this is is # not a Fedora system, try guessing BuildRequires by looking at the # directory structure %define xinclude /usr%(if [ -d /usr/X11R6/include ]; then echo /X11R6; fi)/include BuildRequires: %{xinclude}/X11/StringDefs.h, %{xinclude}/X11/Xlib.h BuildRequires: %{xinclude}/X11/Intrinsic.h, %{xinclude}/X11/Xatom.h %endif %description fish is a shell geared towards interactive use. Its features are focused on user friendliness and discoverability. The language syntax is simple but incompatible with other shell languages. %prep %setup -q %build # The docdir argument is to make the name of the cosumantation # directory 'fish-VERSION', instead of the default, which is simply # 'fish'. %configure docdir=%_datadir/doc/%{name}-%{version} make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR="$RPM_BUILD_ROOT" # Find translation files %find_lang %{name}.\* %clean rm -rf $RPM_BUILD_ROOT %post # Add fish to the list of allowed shells in /etc/shells if ! grep %_bindir/fish %_sysconfdir/shells >/dev/null; then echo %_bindir/fish >>%_sysconfdir/shells fi %postun # Remove fish from the list of allowed shells in /etc/shells if [ "$1" = 0 ]; then grep -v %_bindir/fish %_sysconfdir/shells >%_sysconfdir/fish.tmp mv %_sysconfdir/fish.tmp %_sysconfdir/shells fi %files -f %{name}.\*.lang %defattr(-,root,root,-) # The documentation directory %doc %_datadir/doc/%{name}-%{version} # man files %_mandir/man1/fish.1* %_mandir/man1/fish_pager.1* %_mandir/man1/fish_indent.1* %_mandir/man1/fishd.1* %_mandir/man1/mimedb.1* %_mandir/man1/set_color.1* # The program binaries %attr(0755,root,root) %_bindir/fish %attr(0755,root,root) %_bindir/fish_indent %attr(0755,root,root) %_bindir/fish_pager %attr(0755,root,root) %_bindir/fishd %attr(0755,root,root) %_bindir/mimedb %attr(0755,root,root) %_bindir/set_color # Configuration files %config %_sysconfdir/fish/config.fish %dir %_sysconfdir/fish # Non-configuration initialization files %dir %_datadir/fish %_datadir/fish/config.fish # Program specific tab-completions %dir %_datadir/fish/completions %_datadir/fish/completions/*.fish # Dynamically loaded shellscript functions %dir %_datadir/fish/functions %_datadir/fish/functions/*.fish # Documentation for builtins and shellscript functions %dir %_datadir/fish/man %_datadir/fish/man/*.1 %changelog * Sat Apr 21 2007 Axel Liljencrantz 1.23.0-0 - Add fish_indent command * Thu Feb 8 2007 Axel Liljencrantz 1.22.3-0 - Tell rpm about the help pages in %_datadir/fish/man/ * Sat Oct 14 2006 Axel Liljencrantz 1.22.0-0 - Update names of various configuration files * Fri Aug 4 2006 Axel Liljencrantz 1.21.10-4 - Add better translation finding code from fedora spec to main spec. Thank you to Michael Schwendt. - Add missing dependency libXext-devel. - Remove one nesting level from dependency checking code. * Tue Aug 1 2006 Axel Liljencrantz 1.21.10-1 - Improved the dependency check for X headers. Thank you to Michael Schwendt for pointers on how to do this * Mon Jul 31 2006 Axel Liljencrantz 1.21.10-1 - Fixed spelling and punctuation as a per patch from Paul Howarth - Fixed dependencies as per patch from Paul Howarth * Tue Nov 29 2005 Axel Liljencrantz 1.17.0-0 - 1.17.0 * Sat Sep 24 2005 Axel Liljencrantz 1.14.0-0 - 1.14.0 * Mon Sep 12 2005 Axel Liljencrantz 1.13.4-0 - 1.13.4 * Wed Sep 07 2005 Axel Liljencrantz 1.13.3-0 - 1.13.3 * Tue Sep 06 2005 Axel Liljencrantz 1.13.2-0 - 1.13.2 * Fri Aug 30 2005 Axel Liljencrantz 1.13.1-0 - 1.13.1 * Sun Aug 28 2005 Axel Liljencrantz 1.13.0-0 - 1.13.0 * Sat Aug 13 2005 Axel Liljencrantz 1.13.0-0 - Add completions subdirectory * Thu Jul 28 2005 Axel Liljencrantz 1.12.1-0 - 1.12.1 * Fri Jul 15 2005 Axel Liljencrantz 1.12.0-1 - 1.12.0 * Thu Jun 30 2005 Michael Schwendt 1.11.1-9 - Set CFLAGS the proper way * Thu Jun 30 2005 Axel Liljencrantz 1.11.1-8 - Fix revision number in changelog * Wed Jun 29 2005 Axel Liljencrantz 1.11.1-7 - Send post-script output to /dev/null * Wed Jun 29 2005 Axel Liljencrantz 1.11.1-6 - Add changelog section to spec file - Add macros to source tags - Add smp_mflags to 'make all' - Fix typo in post install scriptlet test - Set CFLAGS from spec file fish/fish.xcodeproj/000077500000000000000000000000001214535744100147425ustar00rootroot00000000000000fish/fish.xcodeproj/project.pbxproj000066400000000000000000002547751214535744100200420ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXAggregateTarget section */ D07D265615E33B86009E43F6 /* install_tree */ = { isa = PBXAggregateTarget; buildConfigurationList = D07D266F15E33B86009E43F6 /* Build configuration list for PBXAggregateTarget "install_tree" */; buildPhases = ( D07D266915E33B86009E43F6 /* CopyFiles */, D07D266B15E33B86009E43F6 /* Copy Files */, D01A2CA716965ADD00767098 /* CopyFiles */, ); dependencies = ( D07D265715E33B86009E43F6 /* PBXTargetDependency */, D07D265915E33B86009E43F6 /* PBXTargetDependency */, D07D265B15E33B86009E43F6 /* PBXTargetDependency */, D07D265D15E33B86009E43F6 /* PBXTargetDependency */, D0A56500168D257900AF6161 /* PBXTargetDependency */, ); name = install_tree; productName = base; }; D0A564E6168CFDD800AF6161 /* man_pages */ = { isa = PBXAggregateTarget; buildConfigurationList = D0A564E9168CFDD800AF6161 /* Build configuration list for PBXAggregateTarget "man_pages" */; buildPhases = ( D0A564EB168CFDDE00AF6161 /* ShellScript */, ); dependencies = ( ); name = man_pages; productName = man_pages; }; D0F019EC15A976F30034B3B1 /* base */ = { isa = PBXAggregateTarget; buildConfigurationList = D0F019ED15A976F30034B3B1 /* Build configuration list for PBXAggregateTarget "base" */; buildPhases = ( D0F019F015A977010034B3B1 /* CopyFiles */, D0F019F715A977A00034B3B1 /* CopyFiles */, D0F019FC15A977B40034B3B1 /* CopyFiles */, D033780F15DC6D2A00A634BA /* CopyFiles */, D01A2C9B16964C8200767098 /* Copy Files */, ); dependencies = ( D0F01A1315AA36280034B3B1 /* PBXTargetDependency */, D0F01A1515AA362E0034B3B1 /* PBXTargetDependency */, D0F01A1915AA36310034B3B1 /* PBXTargetDependency */, D0F01A1715AA36300034B3B1 /* PBXTargetDependency */, D0A564EF168D09C000AF6161 /* PBXTargetDependency */, ); name = base; productName = base; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ D01A2D24169B736200767098 /* man1 in Copy Files */ = {isa = PBXBuildFile; fileRef = D01A2D23169B730A00767098 /* man1 */; }; D01A2D25169B737700767098 /* man1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = D01A2D23169B730A00767098 /* man1 */; }; D031890C15E36E4600D9CC39 /* base in Resources */ = {isa = PBXBuildFile; fileRef = D031890915E36D9800D9CC39 /* base */; }; D033781115DC6D4C00A634BA /* completions in CopyFiles */ = {isa = PBXBuildFile; fileRef = D025C02715D1FEA100B9DB63 /* completions */; }; D033781215DC6D5200A634BA /* functions in CopyFiles */ = {isa = PBXBuildFile; fileRef = D025C02815D1FEA100B9DB63 /* functions */; }; D033781315DC6D5400A634BA /* tools in CopyFiles */ = {isa = PBXBuildFile; fileRef = D025C02915D1FEA100B9DB63 /* tools */; }; D07B247315BCC15700D4ADB4 /* add-shell in Resources */ = {isa = PBXBuildFile; fileRef = D07B247215BCC15700D4ADB4 /* add-shell */; }; D07B247615BCC4BE00D4ADB4 /* install.sh in Resources */ = {isa = PBXBuildFile; fileRef = D07B247515BCC4BE00D4ADB4 /* install.sh */; }; D07D266A15E33B86009E43F6 /* config.fish in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0C4FD9415A7D7EE00212EF1 /* config.fish */; }; D07D266C15E33B86009E43F6 /* completions in Copy Files */ = {isa = PBXBuildFile; fileRef = D025C02715D1FEA100B9DB63 /* completions */; }; D07D266D15E33B86009E43F6 /* functions in Copy Files */ = {isa = PBXBuildFile; fileRef = D025C02815D1FEA100B9DB63 /* functions */; }; D07D266E15E33B86009E43F6 /* tools in Copy Files */ = {isa = PBXBuildFile; fileRef = D025C02915D1FEA100B9DB63 /* tools */; }; D07D267215E34171009E43F6 /* config.fish in Copy Files */ = {isa = PBXBuildFile; fileRef = D0CBD580159EE48F0024809C /* config.fish */; }; D0879AC816BF9AAB00E98E56 /* fish_term_icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = D0879AC616BF9A1A00E98E56 /* fish_term_icon.icns */; }; D0A564FE168D23D800AF6161 /* man in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0A564F1168D0BAB00AF6161 /* man */; }; D0A56501168D258300AF6161 /* man in Copy Files */ = {isa = PBXBuildFile; fileRef = D0A564F1168D0BAB00AF6161 /* man */; }; D0CBD587159EF0E10024809C /* launch_fish.scpt in Resources */ = {isa = PBXBuildFile; fileRef = D0CBD586159EF0E10024809C /* launch_fish.scpt */; }; D0D02A67159837AD008E62BD /* complete.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853713B3ACEE0099B651 /* complete.cpp */; }; D0D02A69159837B2008E62BD /* env.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853A13B3ACEE0099B651 /* env.cpp */; }; D0D02A6A1598381A008E62BD /* exec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853C13B3ACEE0099B651 /* exec.cpp */; }; D0D02A6B1598381F008E62BD /* expand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853D13B3ACEE0099B651 /* expand.cpp */; }; D0D02A6C15983829008E62BD /* highlight.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854713B3ACEE0099B651 /* highlight.cpp */; }; D0D02A6D1598382C008E62BD /* history.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854813B3ACEE0099B651 /* history.cpp */; }; D0D02A6E15983838008E62BD /* kill.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854F13B3ACEE0099B651 /* kill.cpp */; }; D0D02A6F1598383E008E62BD /* parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855413B3ACEE0099B651 /* parser.cpp */; }; D0D02A7015983842008E62BD /* proc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855713B3ACEE0099B651 /* proc.cpp */; }; D0D02A7115983848008E62BD /* reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855813B3ACEE0099B651 /* reader.cpp */; }; D0D02A721598384C008E62BD /* sanity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855913B3ACEE0099B651 /* sanity.cpp */; }; D0D02A7315983852008E62BD /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855D13B3ACEE0099B651 /* tokenizer.cpp */; }; D0D02A7415983857008E62BD /* wildcard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0856013B3ACEE0099B651 /* wildcard.cpp */; }; D0D02A751598385E008E62BD /* wgetopt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855F13B3ACEE0099B651 /* wgetopt.cpp */; }; D0D02A7615983869008E62BD /* wutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0856113B3ACEE0099B651 /* wutil.cpp */; }; D0D02A7715983875008E62BD /* input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854A13B3ACEE0099B651 /* input.cpp */; }; D0D02A781598387E008E62BD /* output.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855113B3ACEE0099B651 /* output.cpp */; }; D0D02A7915983888008E62BD /* intern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854B13B3ACEE0099B651 /* intern.cpp */; }; D0D02A7A15983916008E62BD /* env_universal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853913B3ACEE0099B651 /* env_universal.cpp */; }; D0D02A7B15983928008E62BD /* env_universal_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853813B3ACEE0099B651 /* env_universal_common.cpp */; }; D0D02A7C159839D5008E62BD /* autoload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0C6FCC914CFA4B0004CE8AD /* autoload.cpp */; }; D0D02A7D159839D5008E62BD /* builtin_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0F3373A1506DE3C00ECEFC0 /* builtin_test.cpp */; }; D0D02A7E159839D5008E62BD /* color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0B6B0FE14E88BA400AD6C10 /* color.cpp */; }; D0D02A7F159839D5008E62BD /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853613B3ACEE0099B651 /* common.cpp */; }; D0D02A80159839D5008E62BD /* event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853B13B3ACEE0099B651 /* event.cpp */; }; D0D02A81159839D5008E62BD /* input_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854913B3ACEE0099B651 /* input_common.cpp */; }; D0D02A82159839D5008E62BD /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854C13B3ACEE0099B651 /* io.cpp */; }; D0D02A83159839D5008E62BD /* iothread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854D13B3ACEE0099B651 /* iothread.cpp */; }; D0D02A84159839D5008E62BD /* parse_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855213B3ACEE0099B651 /* parse_util.cpp */; }; D0D02A85159839D5008E62BD /* path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855513B3ACEE0099B651 /* path.cpp */; }; D0D02A86159839D5008E62BD /* postfork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D09B1C1914FC7B5B00F91077 /* postfork.cpp */; }; D0D02A87159839D5008E62BD /* screen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855A13B3ACEE0099B651 /* screen.cpp */; }; D0D02A88159839D5008E62BD /* signal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855C13B3ACEE0099B651 /* signal.cpp */; }; D0D02A89159839DF008E62BD /* fish.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854213B3ACEE0099B651 /* fish.cpp */; }; D0D02A8B15983CDF008E62BD /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8A15983CDF008E62BD /* libiconv.dylib */; }; D0D02A8D15983CFA008E62BD /* libncurses.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8C15983CFA008E62BD /* libncurses.dylib */; }; D0D02A8F15983D8F008E62BD /* parser_keywords.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855313B3ACEE0099B651 /* parser_keywords.cpp */; }; D0D02AC215985F3F008E62BD /* fishd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854313B3ACEE0099B651 /* fishd.cpp */; }; D0D02AC315985F43008E62BD /* env_universal_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853813B3ACEE0099B651 /* env_universal_common.cpp */; }; D0D02AC415985F4D008E62BD /* wutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0856113B3ACEE0099B651 /* wutil.cpp */; }; D0D02AC515985F5B008E62BD /* print_help.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855613B3ACEE0099B651 /* print_help.cpp */; }; D0D02AC615985F65008E62BD /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853613B3ACEE0099B651 /* common.cpp */; }; D0D02AC715985F9D008E62BD /* libncurses.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8C15983CFA008E62BD /* libncurses.dylib */; }; D0D02AC815985F9F008E62BD /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8A15983CDF008E62BD /* libiconv.dylib */; }; D0D02AD615986492008E62BD /* fish_indent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853F13B3ACEE0099B651 /* fish_indent.cpp */; }; D0D02AD715986498008E62BD /* print_help.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855613B3ACEE0099B651 /* print_help.cpp */; }; D0D02AD81598649E008E62BD /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853613B3ACEE0099B651 /* common.cpp */; }; D0D02AD9159864A6008E62BD /* parser_keywords.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855313B3ACEE0099B651 /* parser_keywords.cpp */; }; D0D02ADA159864AB008E62BD /* wutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0856113B3ACEE0099B651 /* wutil.cpp */; }; D0D02ADB159864C2008E62BD /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855D13B3ACEE0099B651 /* tokenizer.cpp */; }; D0D02ADC159864D5008E62BD /* libncurses.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8C15983CFA008E62BD /* libncurses.dylib */; }; D0D02ADD159864D7008E62BD /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8A15983CDF008E62BD /* libiconv.dylib */; }; D0D02AEA15986549008E62BD /* libncurses.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8C15983CFA008E62BD /* libncurses.dylib */; }; D0D02AEB1598654C008E62BD /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D02A8A15983CDF008E62BD /* libiconv.dylib */; }; D0D1CD6C15B7451900F03988 /* fish_pager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854013B3ACEE0099B651 /* fish_pager.cpp */; }; D0D1CD6D15B7452100F03988 /* output.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855113B3ACEE0099B651 /* output.cpp */; }; D0D1CD6E15B7452600F03988 /* wutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0856113B3ACEE0099B651 /* wutil.cpp */; }; D0D1CD6F15B7452D00F03988 /* input_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854913B3ACEE0099B651 /* input_common.cpp */; }; D0D1CD7015B7453300F03988 /* env_universal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853913B3ACEE0099B651 /* env_universal.cpp */; }; D0D1CD7115B7453700F03988 /* env_universal_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853813B3ACEE0099B651 /* env_universal_common.cpp */; }; D0D1CD7215B7454A00F03988 /* print_help.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0855613B3ACEE0099B651 /* print_help.cpp */; }; D0D1CD7315B7455200F03988 /* color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0B6B0FE14E88BA400AD6C10 /* color.cpp */; }; D0D1CD7415B7456000F03988 /* iothread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854D13B3ACEE0099B651 /* iothread.cpp */; }; D0D1CD7515B7458B00F03988 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853613B3ACEE0099B651 /* common.cpp */; }; D0D2694915983772005D9B9C /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0854413B3ACEE0099B651 /* function.cpp */; }; D0D2694A15983779005D9B9C /* builtin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0A0853513B3ACEE0099B651 /* builtin.cpp */; }; D0F019F115A977140034B3B1 /* fish in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0D2693C159835CA005D9B9C /* fish */; }; D0F019F215A977270034B3B1 /* fishd in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0D02ABC15985EF9008E62BD /* fishd */; }; D0F019F315A977290034B3B1 /* fish_indent in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0D02AD01598642A008E62BD /* fish_indent */; }; D0F019F415A9772C0034B3B1 /* fish_pager in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0D02AE415986537008E62BD /* fish_pager */; }; D0F019F815A977AB0034B3B1 /* config.fish in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0CBD580159EE48F0024809C /* config.fish */; }; D0F019FD15A977CA0034B3B1 /* config.fish in CopyFiles */ = {isa = PBXBuildFile; fileRef = D0C4FD9415A7D7EE00212EF1 /* config.fish */; }; D0F01A0315A978910034B3B1 /* osx_fish_launcher.m in Sources */ = {isa = PBXBuildFile; fileRef = D0D02AFA159871B2008E62BD /* osx_fish_launcher.m */; }; D0F01A0515A978A10034B3B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0CBD583159EEE010024809C /* Foundation.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ D031890715E36CC000D9CC39 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0F019EC15A976F30034B3B1; remoteInfo = base; }; D07D265815E33B86009E43F6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D2693B159835CA005D9B9C; remoteInfo = fish_shell; }; D07D265A15E33B86009E43F6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D02ABB15985EF9008E62BD; remoteInfo = fishd; }; D07D265C15E33B86009E43F6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D02AE315986537008E62BD; remoteInfo = fish_pager; }; D07D265E15E33B86009E43F6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D02ACF1598642A008E62BD; remoteInfo = fish_indent; }; D0A564EE168D09C000AF6161 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0A564E6168CFDD800AF6161; remoteInfo = man_pages; }; D0A564FF168D257900AF6161 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0A564E6168CFDD800AF6161; remoteInfo = man_pages; }; D0F01A1215AA36280034B3B1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D2693B159835CA005D9B9C; remoteInfo = fish_shell; }; D0F01A1415AA362E0034B3B1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D02ABB15985EF9008E62BD; remoteInfo = fishd; }; D0F01A1615AA36300034B3B1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D02ACF1598642A008E62BD; remoteInfo = fish_indent; }; D0F01A1815AA36310034B3B1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D0A084F213B3AC130099B651 /* Project object */; proxyType = 1; remoteGlobalIDString = D0D02AE315986537008E62BD; remoteInfo = fish_pager; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ D01A2C9B16964C8200767098 /* Copy Files */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = base/share/man; dstSubfolderSpec = 1; files = ( D01A2D24169B736200767098 /* man1 in Copy Files */, ); name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; }; D01A2CA716965ADD00767098 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = "${INSTALL_PATH}/share/man/"; dstSubfolderSpec = 0; files = ( D01A2D25169B737700767098 /* man1 in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; D033780F15DC6D2A00A634BA /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = base/share/fish; dstSubfolderSpec = 1; files = ( D033781115DC6D4C00A634BA /* completions in CopyFiles */, D033781215DC6D5200A634BA /* functions in CopyFiles */, D033781315DC6D5400A634BA /* tools in CopyFiles */, D0A564FE168D23D800AF6161 /* man in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; D07D266915E33B86009E43F6 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = "${INSTALL_PATH}/etc/fish"; dstSubfolderSpec = 0; files = ( D07D266A15E33B86009E43F6 /* config.fish in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 1; }; D07D266B15E33B86009E43F6 /* Copy Files */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstPath = "${INSTALL_PATH}/share/fish"; dstSubfolderSpec = 0; files = ( D07D267215E34171009E43F6 /* config.fish in Copy Files */, D07D266C15E33B86009E43F6 /* completions in Copy Files */, D07D266D15E33B86009E43F6 /* functions in Copy Files */, D07D266E15E33B86009E43F6 /* tools in Copy Files */, D0A56501168D258300AF6161 /* man in Copy Files */, ); name = "Copy Files"; runOnlyForDeploymentPostprocessing = 1; }; D0F019F015A977010034B3B1 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = base/bin; dstSubfolderSpec = 1; files = ( D0F019F115A977140034B3B1 /* fish in CopyFiles */, D0F019F215A977270034B3B1 /* fishd in CopyFiles */, D0F019F315A977290034B3B1 /* fish_indent in CopyFiles */, D0F019F415A9772C0034B3B1 /* fish_pager in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; D0F019F715A977A00034B3B1 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = base/share/fish; dstSubfolderSpec = 1; files = ( D0F019F815A977AB0034B3B1 /* config.fish in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; D0F019FC15A977B40034B3B1 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = base/etc/fish; dstSubfolderSpec = 1; files = ( D0F019FD15A977CA0034B3B1 /* config.fish in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ D01A2D23169B730A00767098 /* man1 */ = {isa = PBXFileReference; lastKnownFileType = text; name = man1; path = pages_for_manpath/man1; sourceTree = BUILT_PRODUCTS_DIR; }; D025C02715D1FEA100B9DB63 /* completions */ = {isa = PBXFileReference; lastKnownFileType = folder; name = completions; path = share/completions; sourceTree = ""; }; D025C02815D1FEA100B9DB63 /* functions */ = {isa = PBXFileReference; lastKnownFileType = folder; name = functions; path = share/functions; sourceTree = ""; }; D025C02915D1FEA100B9DB63 /* tools */ = {isa = PBXFileReference; lastKnownFileType = folder; name = tools; path = share/tools; sourceTree = ""; }; D031890915E36D9800D9CC39 /* base */ = {isa = PBXFileReference; lastKnownFileType = text; path = base; sourceTree = BUILT_PRODUCTS_DIR; }; D03EE83814DF88B200FC7150 /* lru.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lru.h; sourceTree = ""; }; D07B247215BCC15700D4ADB4 /* add-shell */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "add-shell"; path = "build_tools/osx_package_scripts/add-shell"; sourceTree = ""; }; D07B247515BCC4BE00D4ADB4 /* install.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = install.sh; path = osx/install.sh; sourceTree = ""; }; D0879AC616BF9A1A00E98E56 /* fish_term_icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = fish_term_icon.icns; path = osx/fish_term_icon.icns; sourceTree = ""; }; D09B1C1914FC7B5B00F91077 /* postfork.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = postfork.cpp; sourceTree = ""; }; D09B1C1A14FC7B5B00F91077 /* postfork.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = postfork.h; sourceTree = ""; }; D0A0850313B3ACEE0099B651 /* builtin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = builtin.h; sourceTree = ""; }; D0A0850413B3ACEE0099B651 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; D0A0850513B3ACEE0099B651 /* complete.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complete.h; sourceTree = ""; }; D0A0850613B3ACEE0099B651 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; D0A0850713B3ACEE0099B651 /* env_universal_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = env_universal_common.h; sourceTree = ""; }; D0A0850813B3ACEE0099B651 /* env_universal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = env_universal.h; sourceTree = ""; }; D0A0850913B3ACEE0099B651 /* env.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = env.h; sourceTree = ""; }; D0A0850A13B3ACEE0099B651 /* event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event.h; sourceTree = ""; }; D0A0850B13B3ACEE0099B651 /* exec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exec.h; sourceTree = ""; }; D0A0850C13B3ACEE0099B651 /* expand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expand.h; sourceTree = ""; }; D0A0850D13B3ACEE0099B651 /* fallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fallback.h; sourceTree = ""; }; D0A0850E13B3ACEE0099B651 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = ""; }; D0A0851113B3ACEE0099B651 /* highlight.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = highlight.h; sourceTree = ""; }; D0A0851213B3ACEE0099B651 /* history.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = history.h; sourceTree = ""; }; D0A0851313B3ACEE0099B651 /* input_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input_common.h; sourceTree = ""; }; D0A0851413B3ACEE0099B651 /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; D0A0851513B3ACEE0099B651 /* intern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intern.h; sourceTree = ""; }; D0A0851613B3ACEE0099B651 /* io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = ""; }; D0A0851713B3ACEE0099B651 /* iothread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iothread.h; sourceTree = ""; }; D0A0851813B3ACEE0099B651 /* kill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kill.h; sourceTree = ""; }; D0A0851913B3ACEE0099B651 /* mimedb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mimedb.h; sourceTree = ""; }; D0A0851A13B3ACEE0099B651 /* output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = output.h; sourceTree = ""; }; D0A0851B13B3ACEE0099B651 /* parse_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_util.h; sourceTree = ""; }; D0A0851C13B3ACEE0099B651 /* parser_keywords.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parser_keywords.h; sourceTree = ""; }; D0A0851D13B3ACEE0099B651 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = ""; }; D0A0851E13B3ACEE0099B651 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = path.h; sourceTree = ""; }; D0A0851F13B3ACEE0099B651 /* print_help.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = print_help.h; sourceTree = ""; }; D0A0852013B3ACEE0099B651 /* proc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proc.h; sourceTree = ""; }; D0A0852113B3ACEE0099B651 /* reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reader.h; sourceTree = ""; }; D0A0852213B3ACEE0099B651 /* sanity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sanity.h; sourceTree = ""; }; D0A0852313B3ACEE0099B651 /* screen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = screen.h; sourceTree = ""; }; D0A0852413B3ACEE0099B651 /* signal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal.h; sourceTree = ""; }; D0A0852513B3ACEE0099B651 /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tokenizer.h; sourceTree = ""; }; D0A0852613B3ACEE0099B651 /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = ""; }; D0A0852713B3ACEE0099B651 /* wgetopt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wgetopt.h; sourceTree = ""; }; D0A0852813B3ACEE0099B651 /* wildcard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wildcard.h; sourceTree = ""; }; D0A0852913B3ACEE0099B651 /* wutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wutil.h; sourceTree = ""; }; D0A0852A13B3ACEE0099B651 /* xdgmime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xdgmime.h; sourceTree = ""; }; D0A0852B13B3ACEE0099B651 /* xdgmimealias.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xdgmimealias.h; sourceTree = ""; }; D0A0852C13B3ACEE0099B651 /* xdgmimeglob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xdgmimeglob.h; sourceTree = ""; }; D0A0852D13B3ACEE0099B651 /* xdgmimeint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xdgmimeint.h; sourceTree = ""; }; D0A0852E13B3ACEE0099B651 /* xdgmimemagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xdgmimemagic.h; sourceTree = ""; }; D0A0852F13B3ACEE0099B651 /* xdgmimeparent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xdgmimeparent.h; sourceTree = ""; }; D0A0853013B3ACEE0099B651 /* builtin_commandline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_commandline.cpp; sourceTree = ""; }; D0A0853113B3ACEE0099B651 /* builtin_complete.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_complete.cpp; sourceTree = ""; }; D0A0853213B3ACEE0099B651 /* builtin_jobs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_jobs.cpp; sourceTree = ""; }; D0A0853313B3ACEE0099B651 /* builtin_set.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_set.cpp; sourceTree = ""; }; D0A0853413B3ACEE0099B651 /* builtin_ulimit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_ulimit.cpp; sourceTree = ""; }; D0A0853513B3ACEE0099B651 /* builtin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = builtin.cpp; sourceTree = ""; }; D0A0853613B3ACEE0099B651 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = common.cpp; sourceTree = ""; }; D0A0853713B3ACEE0099B651 /* complete.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = complete.cpp; sourceTree = ""; }; D0A0853813B3ACEE0099B651 /* env_universal_common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = env_universal_common.cpp; sourceTree = ""; }; D0A0853913B3ACEE0099B651 /* env_universal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = env_universal.cpp; sourceTree = ""; }; D0A0853A13B3ACEE0099B651 /* env.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = env.cpp; sourceTree = ""; }; D0A0853B13B3ACEE0099B651 /* event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = event.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; D0A0853C13B3ACEE0099B651 /* exec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = exec.cpp; sourceTree = ""; }; D0A0853D13B3ACEE0099B651 /* expand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = expand.cpp; sourceTree = ""; }; D0A0853E13B3ACEE0099B651 /* fallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fallback.cpp; sourceTree = ""; }; D0A0853F13B3ACEE0099B651 /* fish_indent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fish_indent.cpp; sourceTree = ""; }; D0A0854013B3ACEE0099B651 /* fish_pager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fish_pager.cpp; sourceTree = ""; }; D0A0854113B3ACEE0099B651 /* fish_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fish_tests.cpp; sourceTree = ""; }; D0A0854213B3ACEE0099B651 /* fish.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fish.cpp; sourceTree = ""; }; D0A0854313B3ACEE0099B651 /* fishd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fishd.cpp; sourceTree = ""; }; D0A0854413B3ACEE0099B651 /* function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cpp; sourceTree = ""; }; D0A0854713B3ACEE0099B651 /* highlight.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = highlight.cpp; sourceTree = ""; }; D0A0854813B3ACEE0099B651 /* history.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = history.cpp; sourceTree = ""; }; D0A0854913B3ACEE0099B651 /* input_common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input_common.cpp; sourceTree = ""; }; D0A0854A13B3ACEE0099B651 /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; D0A0854B13B3ACEE0099B651 /* intern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = intern.cpp; sourceTree = ""; }; D0A0854C13B3ACEE0099B651 /* io.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = io.cpp; sourceTree = ""; }; D0A0854D13B3ACEE0099B651 /* iothread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iothread.cpp; sourceTree = ""; }; D0A0854E13B3ACEE0099B651 /* key_reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = key_reader.cpp; sourceTree = ""; }; D0A0854F13B3ACEE0099B651 /* kill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kill.cpp; sourceTree = ""; }; D0A0855013B3ACEE0099B651 /* mimedb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mimedb.cpp; sourceTree = ""; }; D0A0855113B3ACEE0099B651 /* output.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = output.cpp; sourceTree = ""; }; D0A0855213B3ACEE0099B651 /* parse_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse_util.cpp; sourceTree = ""; }; D0A0855313B3ACEE0099B651 /* parser_keywords.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser_keywords.cpp; sourceTree = ""; }; D0A0855413B3ACEE0099B651 /* parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = parser.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; D0A0855513B3ACEE0099B651 /* path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = path.cpp; sourceTree = ""; }; D0A0855613B3ACEE0099B651 /* print_help.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = print_help.cpp; sourceTree = ""; }; D0A0855713B3ACEE0099B651 /* proc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = proc.cpp; sourceTree = ""; }; D0A0855813B3ACEE0099B651 /* reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reader.cpp; sourceTree = ""; }; D0A0855913B3ACEE0099B651 /* sanity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sanity.cpp; sourceTree = ""; }; D0A0855A13B3ACEE0099B651 /* screen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = screen.cpp; sourceTree = ""; }; D0A0855C13B3ACEE0099B651 /* signal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = signal.cpp; sourceTree = ""; }; D0A0855D13B3ACEE0099B651 /* tokenizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tokenizer.cpp; sourceTree = ""; }; D0A0855E13B3ACEE0099B651 /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = util.cpp; sourceTree = ""; }; D0A0855F13B3ACEE0099B651 /* wgetopt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wgetopt.cpp; sourceTree = ""; }; D0A0856013B3ACEE0099B651 /* wildcard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wildcard.cpp; sourceTree = ""; }; D0A0856113B3ACEE0099B651 /* wutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wutil.cpp; sourceTree = ""; }; D0A0856213B3ACEE0099B651 /* xdgmime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xdgmime.cpp; sourceTree = ""; }; D0A0856313B3ACEE0099B651 /* xdgmimealias.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xdgmimealias.cpp; sourceTree = ""; }; D0A0856413B3ACEE0099B651 /* xdgmimeglob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xdgmimeglob.cpp; sourceTree = ""; }; D0A0856513B3ACEE0099B651 /* xdgmimeint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xdgmimeint.cpp; sourceTree = ""; }; D0A0856613B3ACEE0099B651 /* xdgmimemagic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xdgmimemagic.cpp; sourceTree = ""; }; D0A0856713B3ACEE0099B651 /* xdgmimeparent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xdgmimeparent.cpp; sourceTree = ""; }; D0A564D2168CF34A00AF6161 /* doc_src */ = {isa = PBXFileReference; lastKnownFileType = folder; path = doc_src; sourceTree = ""; }; D0A564F1168D0BAB00AF6161 /* man */ = {isa = PBXFileReference; lastKnownFileType = text; path = man; sourceTree = BUILT_PRODUCTS_DIR; }; D0A564F2168D1F2000AF6161 /* build_documentation.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = build_documentation.sh; path = build_tools/build_documentation.sh; sourceTree = ""; }; D0B6B0FE14E88BA400AD6C10 /* color.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = color.cpp; sourceTree = ""; }; D0B6B0FF14E88BA400AD6C10 /* color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = color.h; sourceTree = ""; }; D0C4FD9415A7D7EE00212EF1 /* config.fish */ = {isa = PBXFileReference; lastKnownFileType = text; name = config.fish; path = etc/config.fish; sourceTree = ""; }; D0C6FCC914CFA4B0004CE8AD /* autoload.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = autoload.cpp; sourceTree = ""; }; D0C6FCCB14CFA4B7004CE8AD /* autoload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autoload.h; sourceTree = ""; }; D0C861EA16CC7054003B5A04 /* builtin_set_color.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_set_color.cpp; sourceTree = ""; }; D0CA63F316FC275F00093BD4 /* builtin_printf.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_printf.cpp; sourceTree = ""; }; D0CBD580159EE48F0024809C /* config.fish */ = {isa = PBXFileReference; lastKnownFileType = text; name = config.fish; path = share/config.fish; sourceTree = ""; }; D0CBD583159EEE010024809C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D0CBD586159EF0E10024809C /* launch_fish.scpt */ = {isa = PBXFileReference; lastKnownFileType = file; name = launch_fish.scpt; path = osx/launch_fish.scpt; sourceTree = ""; }; D0D02A8A15983CDF008E62BD /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; D0D02A8C15983CFA008E62BD /* libncurses.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libncurses.dylib; path = usr/lib/libncurses.dylib; sourceTree = SDKROOT; }; D0D02A9A15985A75008E62BD /* fish.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fish.app; sourceTree = BUILT_PRODUCTS_DIR; }; D0D02AA915985C0C008E62BD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = osx/Info.plist; sourceTree = ""; }; D0D02ABC15985EF9008E62BD /* fishd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fishd; sourceTree = BUILT_PRODUCTS_DIR; }; D0D02AD01598642A008E62BD /* fish_indent */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fish_indent; sourceTree = BUILT_PRODUCTS_DIR; }; D0D02AE415986537008E62BD /* fish_pager */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fish_pager; sourceTree = BUILT_PRODUCTS_DIR; }; D0D02AFA159871B2008E62BD /* osx_fish_launcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = osx_fish_launcher.m; path = osx/osx_fish_launcher.m; sourceTree = ""; }; D0D2693C159835CA005D9B9C /* fish */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fish; sourceTree = BUILT_PRODUCTS_DIR; }; D0F3373A1506DE3C00ECEFC0 /* builtin_test.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = builtin_test.cpp; sourceTree = ""; }; D0F5E28415A7A32D00315DFF /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ D0D02AB915985EF9008E62BD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D0D02AC715985F9D008E62BD /* libncurses.dylib in Frameworks */, D0D02AC815985F9F008E62BD /* libiconv.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; D0D02ACD1598642A008E62BD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D0D02ADC159864D5008E62BD /* libncurses.dylib in Frameworks */, D0D02ADD159864D7008E62BD /* libiconv.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; D0D02AE115986537008E62BD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D0D02AEA15986549008E62BD /* libncurses.dylib in Frameworks */, D0D02AEB1598654C008E62BD /* libiconv.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; D0D26939159835CA005D9B9C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D0D02A8D15983CFA008E62BD /* libncurses.dylib in Frameworks */, D0D02A8B15983CDF008E62BD /* libiconv.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; D0F01A0415A9789C0034B3B1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D0F01A0515A978A10034B3B1 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ D01A2C9C16964CF600767098 /* pages_for_manpath */ = { isa = PBXGroup; children = ( D01A2D23169B730A00767098 /* man1 */, ); name = pages_for_manpath; sourceTree = ""; }; D031890A15E36DB500D9CC39 /* Other Build Products */ = { isa = PBXGroup; children = ( D031890915E36D9800D9CC39 /* base */, ); name = "Other Build Products"; sourceTree = ""; }; D0A084F013B3AC130099B651 = { isa = PBXGroup; children = ( D0D02A91159845EF008E62BD /* Sources */, D0F5E28115A7A32D00315DFF /* DerivedSources */, D0D02AFC159871BF008E62BD /* Launcher */, D0D02A8E15983D5F008E62BD /* Libraries */, D0D02AAB15985C14008E62BD /* Resources */, D031890A15E36DB500D9CC39 /* Other Build Products */, D0D2693215983562005D9B9C /* Products */, ); sourceTree = ""; }; D0D02A8E15983D5F008E62BD /* Libraries */ = { isa = PBXGroup; children = ( D0D02A8C15983CFA008E62BD /* libncurses.dylib */, D0D02A8A15983CDF008E62BD /* libiconv.dylib */, D0CBD583159EEE010024809C /* Foundation.framework */, ); name = Libraries; sourceTree = ""; }; D0D02A91159845EF008E62BD /* Sources */ = { isa = PBXGroup; children = ( D0C6FCCB14CFA4B7004CE8AD /* autoload.h */, D0C6FCC914CFA4B0004CE8AD /* autoload.cpp */, D0A0850313B3ACEE0099B651 /* builtin.h */, D0A0853013B3ACEE0099B651 /* builtin_commandline.cpp */, D0A0853113B3ACEE0099B651 /* builtin_complete.cpp */, D0A0853213B3ACEE0099B651 /* builtin_jobs.cpp */, D0A0853313B3ACEE0099B651 /* builtin_set.cpp */, D0C861EA16CC7054003B5A04 /* builtin_set_color.cpp */, D0A0853413B3ACEE0099B651 /* builtin_ulimit.cpp */, D0F3373A1506DE3C00ECEFC0 /* builtin_test.cpp */, D0CA63F316FC275F00093BD4 /* builtin_printf.cpp */, D0A0853513B3ACEE0099B651 /* builtin.cpp */, D0B6B0FF14E88BA400AD6C10 /* color.h */, D0B6B0FE14E88BA400AD6C10 /* color.cpp */, D0A0850413B3ACEE0099B651 /* common.h */, D0A0853613B3ACEE0099B651 /* common.cpp */, D0A0850513B3ACEE0099B651 /* complete.h */, D0A0853713B3ACEE0099B651 /* complete.cpp */, D0A0850613B3ACEE0099B651 /* config.h */, D0A0850713B3ACEE0099B651 /* env_universal_common.h */, D0A0853813B3ACEE0099B651 /* env_universal_common.cpp */, D0A0850813B3ACEE0099B651 /* env_universal.h */, D0A0853913B3ACEE0099B651 /* env_universal.cpp */, D0A0850913B3ACEE0099B651 /* env.h */, D0A0853A13B3ACEE0099B651 /* env.cpp */, D0A0850A13B3ACEE0099B651 /* event.h */, D0A0853B13B3ACEE0099B651 /* event.cpp */, D0A0850B13B3ACEE0099B651 /* exec.h */, D0A0853C13B3ACEE0099B651 /* exec.cpp */, D0A0850C13B3ACEE0099B651 /* expand.h */, D0A0853D13B3ACEE0099B651 /* expand.cpp */, D0A0850D13B3ACEE0099B651 /* fallback.h */, D0A0853E13B3ACEE0099B651 /* fallback.cpp */, D0A0850E13B3ACEE0099B651 /* function.h */, D0A0854413B3ACEE0099B651 /* function.cpp */, D0A0853F13B3ACEE0099B651 /* fish_indent.cpp */, D0A0854013B3ACEE0099B651 /* fish_pager.cpp */, D0A0854113B3ACEE0099B651 /* fish_tests.cpp */, D0A0854213B3ACEE0099B651 /* fish.cpp */, D0A0854313B3ACEE0099B651 /* fishd.cpp */, D0A0851113B3ACEE0099B651 /* highlight.h */, D0A0854713B3ACEE0099B651 /* highlight.cpp */, D0A0851213B3ACEE0099B651 /* history.h */, D0A0854813B3ACEE0099B651 /* history.cpp */, D0A0851313B3ACEE0099B651 /* input_common.h */, D0A0854913B3ACEE0099B651 /* input_common.cpp */, D0A0851413B3ACEE0099B651 /* input.h */, D0A0854A13B3ACEE0099B651 /* input.cpp */, D0A0851513B3ACEE0099B651 /* intern.h */, D0A0854B13B3ACEE0099B651 /* intern.cpp */, D0A0851613B3ACEE0099B651 /* io.h */, D0A0854C13B3ACEE0099B651 /* io.cpp */, D0A0851713B3ACEE0099B651 /* iothread.h */, D0A0854D13B3ACEE0099B651 /* iothread.cpp */, D0A0851813B3ACEE0099B651 /* kill.h */, D0A0854F13B3ACEE0099B651 /* kill.cpp */, D0A0854E13B3ACEE0099B651 /* key_reader.cpp */, D03EE83814DF88B200FC7150 /* lru.h */, D0A0851913B3ACEE0099B651 /* mimedb.h */, D0A0855013B3ACEE0099B651 /* mimedb.cpp */, D0A0851A13B3ACEE0099B651 /* output.h */, D0A0855113B3ACEE0099B651 /* output.cpp */, D0A0851B13B3ACEE0099B651 /* parse_util.h */, D0A0855213B3ACEE0099B651 /* parse_util.cpp */, D0A0851C13B3ACEE0099B651 /* parser_keywords.h */, D0A0855313B3ACEE0099B651 /* parser_keywords.cpp */, D0A0851D13B3ACEE0099B651 /* parser.h */, D0A0855413B3ACEE0099B651 /* parser.cpp */, D0A0851E13B3ACEE0099B651 /* path.h */, D0A0855513B3ACEE0099B651 /* path.cpp */, D09B1C1A14FC7B5B00F91077 /* postfork.h */, D09B1C1914FC7B5B00F91077 /* postfork.cpp */, D0A0851F13B3ACEE0099B651 /* print_help.h */, D0A0855613B3ACEE0099B651 /* print_help.cpp */, D0A0852013B3ACEE0099B651 /* proc.h */, D0A0855713B3ACEE0099B651 /* proc.cpp */, D0A0852113B3ACEE0099B651 /* reader.h */, D0A0855813B3ACEE0099B651 /* reader.cpp */, D0A0852213B3ACEE0099B651 /* sanity.h */, D0A0855913B3ACEE0099B651 /* sanity.cpp */, D0A0852313B3ACEE0099B651 /* screen.h */, D0A0855A13B3ACEE0099B651 /* screen.cpp */, D0A0852413B3ACEE0099B651 /* signal.h */, D0A0855C13B3ACEE0099B651 /* signal.cpp */, D0A0852513B3ACEE0099B651 /* tokenizer.h */, D0A0855D13B3ACEE0099B651 /* tokenizer.cpp */, D0A0852613B3ACEE0099B651 /* util.h */, D0A0855E13B3ACEE0099B651 /* util.cpp */, D0A0852713B3ACEE0099B651 /* wgetopt.h */, D0A0855F13B3ACEE0099B651 /* wgetopt.cpp */, D0A0852813B3ACEE0099B651 /* wildcard.h */, D0A0856013B3ACEE0099B651 /* wildcard.cpp */, D0A0852913B3ACEE0099B651 /* wutil.h */, D0A0856113B3ACEE0099B651 /* wutil.cpp */, D0A0852A13B3ACEE0099B651 /* xdgmime.h */, D0A0856213B3ACEE0099B651 /* xdgmime.cpp */, D0A0852B13B3ACEE0099B651 /* xdgmimealias.h */, D0A0856313B3ACEE0099B651 /* xdgmimealias.cpp */, D0A0852C13B3ACEE0099B651 /* xdgmimeglob.h */, D0A0856413B3ACEE0099B651 /* xdgmimeglob.cpp */, D0A0852D13B3ACEE0099B651 /* xdgmimeint.h */, D0A0856513B3ACEE0099B651 /* xdgmimeint.cpp */, D0A0852E13B3ACEE0099B651 /* xdgmimemagic.h */, D0A0856613B3ACEE0099B651 /* xdgmimemagic.cpp */, D0A0852F13B3ACEE0099B651 /* xdgmimeparent.h */, D0A0856713B3ACEE0099B651 /* xdgmimeparent.cpp */, ); name = Sources; sourceTree = ""; }; D0D02AAB15985C14008E62BD /* Resources */ = { isa = PBXGroup; children = ( D0879AC616BF9A1A00E98E56 /* fish_term_icon.icns */, D07B247215BCC15700D4ADB4 /* add-shell */, D0CBD586159EF0E10024809C /* launch_fish.scpt */, D0CBD580159EE48F0024809C /* config.fish */, D0C4FD9415A7D7EE00212EF1 /* config.fish */, D07B247515BCC4BE00D4ADB4 /* install.sh */, D0D02AA915985C0C008E62BD /* Info.plist */, D0A564F2168D1F2000AF6161 /* build_documentation.sh */, D01A2C9C16964CF600767098 /* pages_for_manpath */, D0A564F1168D0BAB00AF6161 /* man */, D025C02715D1FEA100B9DB63 /* completions */, D025C02815D1FEA100B9DB63 /* functions */, D025C02915D1FEA100B9DB63 /* tools */, D0A564D2168CF34A00AF6161 /* doc_src */, ); name = Resources; sourceTree = ""; }; D0D02AFC159871BF008E62BD /* Launcher */ = { isa = PBXGroup; children = ( D0D02AFA159871B2008E62BD /* osx_fish_launcher.m */, ); name = Launcher; sourceTree = ""; }; D0D2693215983562005D9B9C /* Products */ = { isa = PBXGroup; children = ( D0D2693C159835CA005D9B9C /* fish */, D0D02A9A15985A75008E62BD /* fish.app */, D0D02ABC15985EF9008E62BD /* fishd */, D0D02AD01598642A008E62BD /* fish_indent */, D0D02AE415986537008E62BD /* fish_pager */, ); name = Products; sourceTree = ""; }; D0F5E28115A7A32D00315DFF /* DerivedSources */ = { isa = PBXGroup; children = ( D0F5E28415A7A32D00315DFF /* config.h */, ); name = DerivedSources; sourceTree = DERIVED_FILE_DIR; }; /* End PBXGroup section */ /* Begin PBXLegacyTarget section */ D0A084F713B3AC130099B651 /* Makefile */ = { isa = PBXLegacyTarget; buildArgumentsString = " -f Makefile -k ${ACTION}"; buildConfigurationList = D0A084FA13B3AC130099B651 /* Build configuration list for PBXLegacyTarget "Makefile" */; buildPhases = ( ); buildToolPath = /usr/bin/make; buildWorkingDirectory = ""; dependencies = ( ); name = Makefile; passBuildSettingsInEnvironment = 1; productName = FishsFish; }; /* End PBXLegacyTarget section */ /* Begin PBXNativeTarget section */ D0D02A9915985A75008E62BD /* fish.app */ = { isa = PBXNativeTarget; buildConfigurationList = D0D02AA415985A75008E62BD /* Build configuration list for PBXNativeTarget "fish.app" */; buildPhases = ( D0F01A0215A9788B0034B3B1 /* Sources */, D0CBD585159EF09F0024809C /* Resources */, D0F01A0415A9789C0034B3B1 /* Frameworks */, ); buildRules = ( ); dependencies = ( D031890815E36CC000D9CC39 /* PBXTargetDependency */, ); name = fish.app; productName = fish; productReference = D0D02A9A15985A75008E62BD /* fish.app */; productType = "com.apple.product-type.application"; }; D0D02ABB15985EF9008E62BD /* fishd */ = { isa = PBXNativeTarget; buildConfigurationList = D0D02ABF15985EFA008E62BD /* Build configuration list for PBXNativeTarget "fishd" */; buildPhases = ( D0D02AB815985EF9008E62BD /* Sources */, D0D02AB915985EF9008E62BD /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = fishd; productName = fishd; productReference = D0D02ABC15985EF9008E62BD /* fishd */; productType = "com.apple.product-type.tool"; }; D0D02ACF1598642A008E62BD /* fish_indent */ = { isa = PBXNativeTarget; buildConfigurationList = D0D02AD31598642A008E62BD /* Build configuration list for PBXNativeTarget "fish_indent" */; buildPhases = ( D0D02ACC1598642A008E62BD /* Sources */, D0D02ACD1598642A008E62BD /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = fish_indent; productName = fish_indent; productReference = D0D02AD01598642A008E62BD /* fish_indent */; productType = "com.apple.product-type.tool"; }; D0D02AE315986537008E62BD /* fish_pager */ = { isa = PBXNativeTarget; buildConfigurationList = D0D02AE715986537008E62BD /* Build configuration list for PBXNativeTarget "fish_pager" */; buildPhases = ( D0D02AE015986537008E62BD /* Sources */, D0D02AE115986537008E62BD /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = fish_pager; productName = fish_pager; productReference = D0D02AE415986537008E62BD /* fish_pager */; productType = "com.apple.product-type.tool"; }; D0D2693B159835CA005D9B9C /* fish_shell */ = { isa = PBXNativeTarget; buildConfigurationList = D0D26943159835CA005D9B9C /* Build configuration list for PBXNativeTarget "fish_shell" */; buildPhases = ( D0D26938159835CA005D9B9C /* Sources */, D0D26939159835CA005D9B9C /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = fish_shell; productName = fish_Xcode; productReference = D0D2693C159835CA005D9B9C /* fish */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ D0A084F213B3AC130099B651 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0460; }; buildConfigurationList = D0A084F513B3AC130099B651 /* Build configuration list for PBXProject "fish" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = D0A084F013B3AC130099B651; productRefGroup = D0D2693215983562005D9B9C /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( D07D265615E33B86009E43F6 /* install_tree */, D0F019EC15A976F30034B3B1 /* base */, D0D02A9915985A75008E62BD /* fish.app */, D0D2693B159835CA005D9B9C /* fish_shell */, D0D02ABB15985EF9008E62BD /* fishd */, D0D02ACF1598642A008E62BD /* fish_indent */, D0D02AE315986537008E62BD /* fish_pager */, D0A564E6168CFDD800AF6161 /* man_pages */, D0A084F713B3AC130099B651 /* Makefile */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ D0CBD585159EF09F0024809C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( D031890C15E36E4600D9CC39 /* base in Resources */, D0CBD587159EF0E10024809C /* launch_fish.scpt in Resources */, D0879AC816BF9AAB00E98E56 /* fish_term_icon.icns in Resources */, D07B247315BCC15700D4ADB4 /* add-shell in Resources */, D07B247615BCC4BE00D4ADB4 /* install.sh in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ D0A564EB168CFDDE00AF6161 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/doc_src/alias.txt", "$(SRCROOT)/doc_src/and.txt", "$(SRCROOT)/doc_src/begin.txt", "$(SRCROOT)/doc_src/bg.txt", "$(SRCROOT)/doc_src/bind.txt", "$(SRCROOT)/doc_src/block.txt", "$(SRCROOT)/doc_src/break.txt", "$(SRCROOT)/doc_src/breakpoint.txt", "$(SRCROOT)/doc_src/builtin.txt", "$(SRCROOT)/doc_src/case.txt", "$(SRCROOT)/doc_src/cd.txt", "$(SRCROOT)/doc_src/command.txt", "$(SRCROOT)/doc_src/commandline.txt", "$(SRCROOT)/doc_src/complete.txt", "$(SRCROOT)/doc_src/contains.txt", "$(SRCROOT)/doc_src/continue.txt", "$(SRCROOT)/doc_src/count.txt", "$(SRCROOT)/doc_src/dirh.txt", "$(SRCROOT)/doc_src/dirs.txt", "$(SRCROOT)/doc_src/echo.txt", "$(SRCROOT)/doc_src/else.txt", "$(SRCROOT)/doc_src/emit.txt", "$(SRCROOT)/doc_src/end.txt", "$(SRCROOT)/doc_src/eval.txt", "$(SRCROOT)/doc_src/exec.txt", "$(SRCROOT)/doc_src/exit.txt", "$(SRCROOT)/doc_src/fg.txt", "$(SRCROOT)/doc_src/fish.txt", "$(SRCROOT)/doc_src/fish_config.txt", "$(SRCROOT)/doc_src/fish_indent.txt", "$(SRCROOT)/doc_src/fish_pager.txt", "$(SRCROOT)/doc_src/fish_prompt.txt", "$(SRCROOT)/doc_src/fish_right_prompt.txt", "$(SRCROOT)/doc_src/fish_update_completions.txt", "$(SRCROOT)/doc_src/fishd.txt", "$(SRCROOT)/doc_src/for.txt", "$(SRCROOT)/doc_src/funced.txt", "$(SRCROOT)/doc_src/funcsave.txt", "$(SRCROOT)/doc_src/function.txt", "$(SRCROOT)/doc_src/functions.txt", "$(SRCROOT)/doc_src/help.txt", "$(SRCROOT)/doc_src/history.txt", "$(SRCROOT)/doc_src/if.txt", "$(SRCROOT)/doc_src/isatty.txt", "$(SRCROOT)/doc_src/jobs.txt", "$(SRCROOT)/doc_src/math.txt", "$(SRCROOT)/doc_src/mimedb.txt", "$(SRCROOT)/doc_src/nextd.txt", "$(SRCROOT)/doc_src/not.txt", "$(SRCROOT)/doc_src/open.txt", "$(SRCROOT)/doc_src/or.txt", "$(SRCROOT)/doc_src/popd.txt", "$(SRCROOT)/doc_src/prevd.txt", "$(SRCROOT)/doc_src/psub.txt", "$(SRCROOT)/doc_src/pushd.txt", "$(SRCROOT)/doc_src/pwd.txt", "$(SRCROOT)/doc_src/random.txt", "$(SRCROOT)/doc_src/read.txt", "$(SRCROOT)/doc_src/return.txt", "$(SRCROOT)/doc_src/set.txt", "$(SRCROOT)/doc_src/set_color.txt", "$(SRCROOT)/doc_src/source.txt", "$(SRCROOT)/doc_src/status.txt", "$(SRCROOT)/doc_src/switch.txt", "$(SRCROOT)/doc_src/test.txt", "$(SRCROOT)/doc_src/trap.txt", "$(SRCROOT)/doc_src/type.txt", "$(SRCROOT)/doc_src/ulimit.txt", "$(SRCROOT)/doc_src/umask.txt", "$(SRCROOT)/doc_src/vared.txt", "$(SRCROOT)/doc_src/while.txt", ); outputPaths = ( "$(BUILT_PRODUCTS_DIR)/man/man1/alias.1", "$(BUILT_PRODUCTS_DIR)/man/man1/and.1", "$(BUILT_PRODUCTS_DIR)/man/man1/begin.1", "$(BUILT_PRODUCTS_DIR)/man/man1/bg.1", "$(BUILT_PRODUCTS_DIR)/man/man1/bind.1", "$(BUILT_PRODUCTS_DIR)/man/man1/block.1", "$(BUILT_PRODUCTS_DIR)/man/man1/break.1", "$(BUILT_PRODUCTS_DIR)/man/man1/breakpoint.1", "$(BUILT_PRODUCTS_DIR)/man/man1/builtin.1", "$(BUILT_PRODUCTS_DIR)/man/man1/case.1", "$(BUILT_PRODUCTS_DIR)/man/man1/cd.1", "$(BUILT_PRODUCTS_DIR)/man/man1/command.1", "$(BUILT_PRODUCTS_DIR)/man/man1/commandline.1", "$(BUILT_PRODUCTS_DIR)/man/man1/complete.1", "$(BUILT_PRODUCTS_DIR)/man/man1/contains.1", "$(BUILT_PRODUCTS_DIR)/man/man1/continue.1", "$(BUILT_PRODUCTS_DIR)/man/man1/count.1", "$(BUILT_PRODUCTS_DIR)/man/man1/dirh.1", "$(BUILT_PRODUCTS_DIR)/man/man1/dirs.1", "$(BUILT_PRODUCTS_DIR)/man/man1/echo.1", "$(BUILT_PRODUCTS_DIR)/man/man1/else.1", "$(BUILT_PRODUCTS_DIR)/man/man1/emit.1", "$(BUILT_PRODUCTS_DIR)/man/man1/end.1", "$(BUILT_PRODUCTS_DIR)/man/man1/eval.1", "$(BUILT_PRODUCTS_DIR)/man/man1/exec.1", "$(BUILT_PRODUCTS_DIR)/man/man1/exit.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fg.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fish.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fish_config.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fish_indent.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fish_pager.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fish_prompt.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fish_right_prompt.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fish_update_completions.1", "$(BUILT_PRODUCTS_DIR)/man/man1/fishd.1", "$(BUILT_PRODUCTS_DIR)/man/man1/for.1", "$(BUILT_PRODUCTS_DIR)/man/man1/funced.1", "$(BUILT_PRODUCTS_DIR)/man/man1/funcsave.1", "$(BUILT_PRODUCTS_DIR)/man/man1/function.1", "$(BUILT_PRODUCTS_DIR)/man/man1/functions.1", "$(BUILT_PRODUCTS_DIR)/man/man1/help.1", "$(BUILT_PRODUCTS_DIR)/man/man1/history.1", "$(BUILT_PRODUCTS_DIR)/man/man1/if.1", "$(BUILT_PRODUCTS_DIR)/man/man1/isatty.1", "$(BUILT_PRODUCTS_DIR)/man/man1/jobs.1", "$(BUILT_PRODUCTS_DIR)/man/man1/math.1", "$(BUILT_PRODUCTS_DIR)/man/man1/mimedb.1", "$(BUILT_PRODUCTS_DIR)/man/man1/nextd.1", "$(BUILT_PRODUCTS_DIR)/man/man1/not.1", "$(BUILT_PRODUCTS_DIR)/man/man1/open.1", "$(BUILT_PRODUCTS_DIR)/man/man1/or.1", "$(BUILT_PRODUCTS_DIR)/man/man1/popd.1", "$(BUILT_PRODUCTS_DIR)/man/man1/prevd.1", "$(BUILT_PRODUCTS_DIR)/man/man1/psub.1", "$(BUILT_PRODUCTS_DIR)/man/man1/pushd.1", "$(BUILT_PRODUCTS_DIR)/man/man1/pwd.1", "$(BUILT_PRODUCTS_DIR)/man/man1/random.1", "$(BUILT_PRODUCTS_DIR)/man/man1/read.1", "$(BUILT_PRODUCTS_DIR)/man/man1/return.1", "$(BUILT_PRODUCTS_DIR)/man/man1/set.1", "$(BUILT_PRODUCTS_DIR)/man/man1/set_color.1", "$(BUILT_PRODUCTS_DIR)/man/man1/source.1", "$(BUILT_PRODUCTS_DIR)/man/man1/status.1", "$(BUILT_PRODUCTS_DIR)/man/man1/switch.1", "$(BUILT_PRODUCTS_DIR)/man/man1/test.1", "$(BUILT_PRODUCTS_DIR)/man/man1/trap.1", "$(BUILT_PRODUCTS_DIR)/man/man1/type.1", "$(BUILT_PRODUCTS_DIR)/man/man1/ulimit.1", "$(BUILT_PRODUCTS_DIR)/man/man1/umask.1", "$(BUILT_PRODUCTS_DIR)/man/man1/vared.1", "$(BUILT_PRODUCTS_DIR)/man/man1/while.1", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}\" ;\n# Run build_documentation.sh\n# Do this in a subshell so that we keep going even if it calls exit\n( . \"./build_tools/build_documentation.sh\" \"./Doxyfile.help\" \"./doc_src\" \"$BUILT_PRODUCTS_DIR\" )\n\n# Copy certain files into man1, destined for share/man/man1 (instead of share/fish/man/man1)\n# These copies will fail of the documentation did not build; that's OK\n# We want to create the directory even if the documentation did not build, so that the Xcode build can still succeed\nmanpathdir=\"${BUILT_PRODUCTS_DIR}/pages_for_manpath/man1\"\necho \"Copying pages destined for manpath into $manpathdir\"\nrm -Rf \"$manpathdir\"\nmkdir -p \"$manpathdir\"\nfor manpage in fish.1 set_color.1 fish_pager.1 fishd.1 fish_indent.1; do\n manpagepath=\"${BUILT_PRODUCTS_DIR}/man/man1/${manpage}\"\n test -f \"$manpagepath\" && cp \"$manpagepath\" \"${BUILT_PRODUCTS_DIR}/pages_for_manpath/man1/\"\ndone\n\n# Always succeed\ntrue\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ D0D02AB815985EF9008E62BD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( D0D02AC215985F3F008E62BD /* fishd.cpp in Sources */, D0D02AC315985F43008E62BD /* env_universal_common.cpp in Sources */, D0D02AC415985F4D008E62BD /* wutil.cpp in Sources */, D0D02AC515985F5B008E62BD /* print_help.cpp in Sources */, D0D02AC615985F65008E62BD /* common.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; D0D02ACC1598642A008E62BD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( D0D02AD615986492008E62BD /* fish_indent.cpp in Sources */, D0D02AD715986498008E62BD /* print_help.cpp in Sources */, D0D02AD81598649E008E62BD /* common.cpp in Sources */, D0D02AD9159864A6008E62BD /* parser_keywords.cpp in Sources */, D0D02ADA159864AB008E62BD /* wutil.cpp in Sources */, D0D02ADB159864C2008E62BD /* tokenizer.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; D0D02AE015986537008E62BD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( D0D1CD6C15B7451900F03988 /* fish_pager.cpp in Sources */, D0D1CD6D15B7452100F03988 /* output.cpp in Sources */, D0D1CD6E15B7452600F03988 /* wutil.cpp in Sources */, D0D1CD6F15B7452D00F03988 /* input_common.cpp in Sources */, D0D1CD7015B7453300F03988 /* env_universal.cpp in Sources */, D0D1CD7115B7453700F03988 /* env_universal_common.cpp in Sources */, D0D1CD7315B7455200F03988 /* color.cpp in Sources */, D0D1CD7515B7458B00F03988 /* common.cpp in Sources */, D0D1CD7215B7454A00F03988 /* print_help.cpp in Sources */, D0D1CD7415B7456000F03988 /* iothread.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; D0D26938159835CA005D9B9C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( D0D02A7C159839D5008E62BD /* autoload.cpp in Sources */, D0D02A7D159839D5008E62BD /* builtin_test.cpp in Sources */, D0D02A7E159839D5008E62BD /* color.cpp in Sources */, D0D02A7F159839D5008E62BD /* common.cpp in Sources */, D0D02A80159839D5008E62BD /* event.cpp in Sources */, D0D02A81159839D5008E62BD /* input_common.cpp in Sources */, D0D02A82159839D5008E62BD /* io.cpp in Sources */, D0D02A83159839D5008E62BD /* iothread.cpp in Sources */, D0D02A84159839D5008E62BD /* parse_util.cpp in Sources */, D0D02A85159839D5008E62BD /* path.cpp in Sources */, D0D02A86159839D5008E62BD /* postfork.cpp in Sources */, D0D02A87159839D5008E62BD /* screen.cpp in Sources */, D0D02A88159839D5008E62BD /* signal.cpp in Sources */, D0D2694A15983779005D9B9C /* builtin.cpp in Sources */, D0D2694915983772005D9B9C /* function.cpp in Sources */, D0D02A67159837AD008E62BD /* complete.cpp in Sources */, D0D02A69159837B2008E62BD /* env.cpp in Sources */, D0D02A6A1598381A008E62BD /* exec.cpp in Sources */, D0D02A6B1598381F008E62BD /* expand.cpp in Sources */, D0D02A6C15983829008E62BD /* highlight.cpp in Sources */, D0D02A6D1598382C008E62BD /* history.cpp in Sources */, D0D02A6E15983838008E62BD /* kill.cpp in Sources */, D0D02A6F1598383E008E62BD /* parser.cpp in Sources */, D0D02A8F15983D8F008E62BD /* parser_keywords.cpp in Sources */, D0D02A7015983842008E62BD /* proc.cpp in Sources */, D0D02A7115983848008E62BD /* reader.cpp in Sources */, D0D02A721598384C008E62BD /* sanity.cpp in Sources */, D0D02A7315983852008E62BD /* tokenizer.cpp in Sources */, D0D02A7415983857008E62BD /* wildcard.cpp in Sources */, D0D02A751598385E008E62BD /* wgetopt.cpp in Sources */, D0D02A7615983869008E62BD /* wutil.cpp in Sources */, D0D02A7715983875008E62BD /* input.cpp in Sources */, D0D02A781598387E008E62BD /* output.cpp in Sources */, D0D02A7915983888008E62BD /* intern.cpp in Sources */, D0D02A7A15983916008E62BD /* env_universal.cpp in Sources */, D0D02A7B15983928008E62BD /* env_universal_common.cpp in Sources */, D0D02A89159839DF008E62BD /* fish.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; D0F01A0215A9788B0034B3B1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( D0F01A0315A978910034B3B1 /* osx_fish_launcher.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ D031890815E36CC000D9CC39 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0F019EC15A976F30034B3B1 /* base */; targetProxy = D031890715E36CC000D9CC39 /* PBXContainerItemProxy */; }; D07D265715E33B86009E43F6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D2693B159835CA005D9B9C /* fish_shell */; targetProxy = D07D265815E33B86009E43F6 /* PBXContainerItemProxy */; }; D07D265915E33B86009E43F6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D02ABB15985EF9008E62BD /* fishd */; targetProxy = D07D265A15E33B86009E43F6 /* PBXContainerItemProxy */; }; D07D265B15E33B86009E43F6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D02AE315986537008E62BD /* fish_pager */; targetProxy = D07D265C15E33B86009E43F6 /* PBXContainerItemProxy */; }; D07D265D15E33B86009E43F6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D02ACF1598642A008E62BD /* fish_indent */; targetProxy = D07D265E15E33B86009E43F6 /* PBXContainerItemProxy */; }; D0A564EF168D09C000AF6161 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0A564E6168CFDD800AF6161 /* man_pages */; targetProxy = D0A564EE168D09C000AF6161 /* PBXContainerItemProxy */; }; D0A56500168D257900AF6161 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0A564E6168CFDD800AF6161 /* man_pages */; targetProxy = D0A564FF168D257900AF6161 /* PBXContainerItemProxy */; }; D0F01A1315AA36280034B3B1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D2693B159835CA005D9B9C /* fish_shell */; targetProxy = D0F01A1215AA36280034B3B1 /* PBXContainerItemProxy */; }; D0F01A1515AA362E0034B3B1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D02ABB15985EF9008E62BD /* fishd */; targetProxy = D0F01A1415AA362E0034B3B1 /* PBXContainerItemProxy */; }; D0F01A1715AA36300034B3B1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D02ACF1598642A008E62BD /* fish_indent */; targetProxy = D0F01A1615AA36300034B3B1 /* PBXContainerItemProxy */; }; D0F01A1915AA36310034B3B1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0D02AE315986537008E62BD /* fish_pager */; targetProxy = D0F01A1815AA36310034B3B1 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ D007FDDA17136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "LOCALEDIR=\\\"/usr/local/share/locale\\\"", "PREFIX=L\\\"/usr/local\\\"", "DATADIR=L\\\"/usr/local/share\\\"", "SYSCONFDIR=L\\\"/usr/local/etc\\\"", "BINDIR=L\\\"/usr/local/bin\\\"", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/osx/**"; }; name = "Release_C++11"; }; D007FDDB17136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = /usr/local; PRODUCT_NAME = "base copy"; SKIP_INSTALL = NO; }; name = "Release_C++11"; }; D007FDDC17136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = /usr/local; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = NO; }; name = "Release_C++11"; }; D007FDDD17136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; EXECUTABLE_NAME = fish_launcher; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; INFOPLIST_FILE = osx/Info.plist; PRODUCT_NAME = fish; WRAPPER_EXTENSION = app; }; name = "Release_C++11"; }; D007FDDE17136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = fish; }; name = "Release_C++11"; }; D007FDDF17136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = "Release_C++11"; }; D007FDE017136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = "Release_C++11"; }; D007FDE117136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = "Release_C++11"; }; D007FDE217136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = "Release_C++11"; }; D007FDE317136EAA00A52BE6 /* Release_C++11 */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = "Release_C++11"; }; D07D267015E33B86009E43F6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = /usr/local; PRODUCT_NAME = "base copy"; SKIP_INSTALL = NO; }; name = Debug; }; D07D267115E33B86009E43F6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = /usr/local; PRODUCT_NAME = "base copy"; SKIP_INSTALL = NO; }; name = Release; }; D0A084F813B3AC130099B651 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "LOCALEDIR=\\\"/usr/local/share/locale\\\"", "PREFIX=L\\\"/usr/local\\\"", "DATADIR=L\\\"/usr/local/share\\\"", "SYSCONFDIR=L\\\"/usr/local/etc\\\"", "BINDIR=L\\\"/usr/local/bin\\\"", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/osx/**"; }; name = Debug; }; D0A084F913B3AC130099B651 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "LOCALEDIR=\\\"/usr/local/share/locale\\\"", "PREFIX=L\\\"/usr/local\\\"", "DATADIR=L\\\"/usr/local/share\\\"", "SYSCONFDIR=L\\\"/usr/local/etc\\\"", "BINDIR=L\\\"/usr/local/bin\\\"", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/osx/**"; }; name = Release; }; D0A084FB13B3AC130099B651 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUGGING_SYMBOLS = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; D0A084FC13B3AC130099B651 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; D0A564E7168CFDD800AF6161 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; D0A564E8168CFDD800AF6161 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; D0D02AA515985A75008E62BD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; EXECUTABLE_NAME = fish_launcher; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_UNINITIALIZED_AUTOS = YES; INFOPLIST_FILE = osx/Info.plist; PRODUCT_NAME = fish; WRAPPER_EXTENSION = app; }; name = Debug; }; D0D02AA615985A75008E62BD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; EXECUTABLE_NAME = fish_launcher; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; INFOPLIST_FILE = osx/Info.plist; PRODUCT_NAME = fish; WRAPPER_EXTENSION = app; }; name = Release; }; D0D02AC015985EFA008E62BD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; D0D02AC115985EFA008E62BD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; D0D02AD41598642A008E62BD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; D0D02AD51598642A008E62BD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; D0D02AE815986537008E62BD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; D0D02AE915986537008E62BD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; D0D26944159835CA005D9B9C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = fish; }; name = Debug; }; D0D26945159835CA005D9B9C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; PRODUCT_NAME = fish; }; name = Release; }; D0F019EE15A976F30034B3B1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = /usr/local; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = NO; }; name = Debug; }; D0F019EF15A976F30034B3B1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = /usr/local; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ D07D266F15E33B86009E43F6 /* Build configuration list for PBXAggregateTarget "install_tree" */ = { isa = XCConfigurationList; buildConfigurations = ( D07D267015E33B86009E43F6 /* Debug */, D07D267115E33B86009E43F6 /* Release */, D007FDDB17136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0A084F513B3AC130099B651 /* Build configuration list for PBXProject "fish" */ = { isa = XCConfigurationList; buildConfigurations = ( D0A084F813B3AC130099B651 /* Debug */, D0A084F913B3AC130099B651 /* Release */, D007FDDA17136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0A084FA13B3AC130099B651 /* Build configuration list for PBXLegacyTarget "Makefile" */ = { isa = XCConfigurationList; buildConfigurations = ( D0A084FB13B3AC130099B651 /* Debug */, D0A084FC13B3AC130099B651 /* Release */, D007FDE317136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0A564E9168CFDD800AF6161 /* Build configuration list for PBXAggregateTarget "man_pages" */ = { isa = XCConfigurationList; buildConfigurations = ( D0A564E7168CFDD800AF6161 /* Debug */, D0A564E8168CFDD800AF6161 /* Release */, D007FDE217136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0D02AA415985A75008E62BD /* Build configuration list for PBXNativeTarget "fish.app" */ = { isa = XCConfigurationList; buildConfigurations = ( D0D02AA515985A75008E62BD /* Debug */, D0D02AA615985A75008E62BD /* Release */, D007FDDD17136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0D02ABF15985EFA008E62BD /* Build configuration list for PBXNativeTarget "fishd" */ = { isa = XCConfigurationList; buildConfigurations = ( D0D02AC015985EFA008E62BD /* Debug */, D0D02AC115985EFA008E62BD /* Release */, D007FDDF17136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0D02AD31598642A008E62BD /* Build configuration list for PBXNativeTarget "fish_indent" */ = { isa = XCConfigurationList; buildConfigurations = ( D0D02AD41598642A008E62BD /* Debug */, D0D02AD51598642A008E62BD /* Release */, D007FDE017136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0D02AE715986537008E62BD /* Build configuration list for PBXNativeTarget "fish_pager" */ = { isa = XCConfigurationList; buildConfigurations = ( D0D02AE815986537008E62BD /* Debug */, D0D02AE915986537008E62BD /* Release */, D007FDE117136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0D26943159835CA005D9B9C /* Build configuration list for PBXNativeTarget "fish_shell" */ = { isa = XCConfigurationList; buildConfigurations = ( D0D26944159835CA005D9B9C /* Debug */, D0D26945159835CA005D9B9C /* Release */, D007FDDE17136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; D0F019ED15A976F30034B3B1 /* Build configuration list for PBXAggregateTarget "base" */ = { isa = XCConfigurationList; buildConfigurations = ( D0F019EE15A976F30034B3B1 /* Debug */, D0F019EF15A976F30034B3B1 /* Release */, D007FDDC17136EAA00A52BE6 /* Release_C++11 */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = D0A084F213B3AC130099B651 /* Project object */; } fish/fish.xcodeproj/project.xcworkspace/000077500000000000000000000000001214535744100207405ustar00rootroot00000000000000fish/fish.xcodeproj/project.xcworkspace/contents.xcworkspacedata000066400000000000000000000002251214535744100257010ustar00rootroot00000000000000 fish/fish.xcodeproj/project.xcworkspace/xcshareddata/000077500000000000000000000000001214535744100233735ustar00rootroot00000000000000fish/fish.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings000066400000000000000000000004101214535744100311620ustar00rootroot00000000000000 IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded fish/fish.xcodeproj/xcshareddata/000077500000000000000000000000001214535744100173755ustar00rootroot00000000000000fish/fish.xcodeproj/xcshareddata/xcschemes/000077500000000000000000000000001214535744100213575ustar00rootroot00000000000000fish/fish.xcodeproj/xcshareddata/xcschemes/Makefile.xcscheme000066400000000000000000000037431214535744100246240ustar00rootroot00000000000000 fish/fish.xcodeproj/xcshareddata/xcschemes/base.xcscheme000066400000000000000000000037331214535744100240200ustar00rootroot00000000000000 fish/fish.xcodeproj/xcshareddata/xcschemes/fish.app.xcscheme000066400000000000000000000060531214535744100246140ustar00rootroot00000000000000 fish/fish.xcodeproj/xcshareddata/xcschemes/fishd.xcscheme000066400000000000000000000060231214535744100241760ustar00rootroot00000000000000 fish/fish.xcodeproj/xcshareddata/xcschemes/install_tree.xcscheme000066400000000000000000000037531214535744100255750ustar00rootroot00000000000000 fish/fish_indent.cpp000066400000000000000000000211511214535744100150130ustar00rootroot00000000000000/* Copyright (C) 2005-2008 Axel Liljencrantz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** \file fish_indent.cpp The fish_indent proegram. */ #include "config.h" #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #endif #include #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" #include "tokenizer.h" #include "print_help.h" #include "parser_keywords.h" /** The string describing the single-character options accepted by the main fish binary */ #define GETOPT_STRING "hvi" /** Read the entire contents of a file into the specified string */ static void read_file(FILE *f, wcstring &b) { while (1) { errno=0; wint_t c = fgetwc(f); if (c == WEOF) { if (errno) { wperror(L"fgetwc"); exit(1); } break; } b.push_back((wchar_t)c); } } /** Insert the specified number of tabs into the output buffer */ static void insert_tabs(wcstring &out, int indent) { if (indent > 0) out.append((size_t)indent, L'\t'); } /** Indent the specified input */ static int indent(wcstring &out, const wcstring &in, int flags) { int res=0; int is_command = 1; int indent = 0; int do_indent = 1; int prev_type = 0; int prev_prev_type = 0; tokenizer_t tok(in.c_str(), TOK_SHOW_COMMENTS); for (; tok_has_next(&tok); tok_next(&tok)) { int type = tok_last_type(&tok); const wchar_t *last = tok_last(&tok); switch (type) { case TOK_STRING: { if (is_command) { int next_indent = indent; is_command = 0; wcstring unesc = last; unescape_string(unesc, UNESCAPE_SPECIAL); if (parser_keywords_is_block(unesc)) { next_indent++; } else if (unesc == L"else") { indent--; } /* case should have the same indent level as switch*/ else if (unesc == L"case") { indent--; } else if (unesc == L"end") { indent--; next_indent--; } if (do_indent && flags && prev_type != TOK_PIPE) { insert_tabs(out, indent); } append_format(out, L"%ls", last); indent = next_indent; } else { if (prev_type != TOK_REDIRECT_FD) out.append(L" "); out.append(last); } break; } case TOK_END: { if (prev_type != TOK_END || prev_prev_type != TOK_END) out.append(L"\n"); do_indent = 1; is_command = 1; break; } case TOK_PIPE: { out.append(L" "); if (last[0] == '2' && !last[1]) { out.append(L"^"); } else if (last[0] != '1' || last[1]) { out.append(last); out.append(L">"); } out.append(L" | "); is_command = 1; break; } case TOK_REDIRECT_OUT: { out.append(L" "); if (wcscmp(last, L"2") == 0) { out.append(L"^"); } else { if (wcscmp(last, L"1") != 0) out.append(last); out.append(L"> "); } break; } case TOK_REDIRECT_APPEND: { out.append(L" "); if (wcscmp(last, L"2") == 0) { out.append(L"^^"); } else { if (wcscmp(last, L"1") != 0) out.append(last); out.append(L">> "); } break; } case TOK_REDIRECT_IN: { out.append(L" "); if (wcscmp(last, L"0") != 0) out.append(last); out.append(L"< "); break; } case TOK_REDIRECT_FD: { out.append(L" "); if (wcscmp(last, L"1") != 0) out.append(last); out.append(L">& "); break; } case TOK_BACKGROUND: { out.append(L"&\n"); do_indent = 1; is_command = 1; break; } case TOK_COMMENT: { if (do_indent && flags) { insert_tabs(out, indent); } append_format(out, L"%ls", last); do_indent = 1; break; } default: { debug(0, L"Unknown token '%ls'", last); exit(1); } } prev_prev_type = prev_type; prev_type = type; } return res; } /** Remove any prefix and suffix newlines from the specified string. */ static void trim(wcstring &str) { if (str.empty()) return; size_t pos = str.find_first_not_of(L" \n"); if (pos > 0) str.erase(0, pos); pos = str.find_last_not_of(L" \n"); if (pos != wcstring::npos && pos + 1 < str.length()) str.erase(pos + 1); } /** The main mathod. Run the program. */ int main(int argc, char **argv) { int do_indent=1; set_main_thread(); setup_fork_guards(); wsetlocale(LC_ALL, L""); program_name=L"fish_indent"; while (1) { static struct option long_options[] = { { "no-indent", no_argument, 0, 'i' } , { "help", no_argument, 0, 'h' } , { "version", no_argument, 0, 'v' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = getopt_long(argc, argv, GETOPT_STRING, long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: { break; } case 'h': { print_help("fish_indent", 1); exit(0); break; } case 'v': { fwprintf(stderr, _(L"%ls, version %s\n"), program_name, PACKAGE_VERSION); exit(0); } case 'i': { do_indent = 0; break; } case '?': { exit(1); } } } wcstring sb_in, sb_out; read_file(stdin, sb_in); wutil_init(); if (!indent(sb_out, sb_in, do_indent)) { trim(sb_out); fwprintf(stdout, L"%ls", sb_out.c_str()); } else { /* Indenting failed - print original input */ fwprintf(stdout, L"%ls", sb_in.c_str()); } wutil_destroy(); return 0; } fish/fish_pager.cpp000066400000000000000000001047441214535744100146420ustar00rootroot00000000000000#include "config.h" #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #include #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "common.h" #include "complete.h" #include "output.h" #include "input_common.h" #include "env_universal.h" #include "print_help.h" enum { LINE_UP = R_NULL+1, LINE_DOWN, PAGE_UP, PAGE_DOWN } ; enum { HIGHLIGHT_PAGER_PREFIX, HIGHLIGHT_PAGER_COMPLETION, HIGHLIGHT_PAGER_DESCRIPTION, HIGHLIGHT_PAGER_PROGRESS, HIGHLIGHT_PAGER_SECONDARY } ; enum { /* Returnd by the pager if no more displaying is needed */ PAGER_DONE, /* Returned by the pager if the completions would not fit in the specified number of columns */ PAGER_RETRY, /* Returned by the pager if the terminal changes size */ PAGER_RESIZE } ; /** The minimum width (in characters) the terminal may have for fish_pager to not refuse showing the completions */ #define PAGER_MIN_WIDTH 16 /** The maximum number of columns of completion to attempt to fit onto the screen */ #define PAGER_MAX_COLS 6 /** The string describing the single-character options accepted by fish_pager */ #define GETOPT_STRING "c:hr:qvp:" /** Error to use when given an invalid file descriptor for reading completions or writing output */ #define ERR_NOT_FD _( L"%ls: Argument '%s' is not a valid file descriptor\n" ) /** This struct should be continually updated by signals as the term resizes, and as such always contain the correct current size. */ static struct winsize termsize; /** The termios modes the terminal had when the program started. These should be restored on exit */ static struct termios saved_modes; /** This flag is set to 1 of we have sent the enter_ca_mode terminfo sequence to save the previous terminal contents. */ static int is_ca_mode = 0; /** This buffer is used to buffer the output of the pager to improve screen redraw performance bu cutting down the number of write() calls to only one. */ static std::vector pager_buffer; /** The environment variables used to specify the color of different tokens. */ static const wchar_t *hightlight_var[] = { L"fish_pager_color_prefix", L"fish_pager_color_completion", L"fish_pager_color_description", L"fish_pager_color_progress", L"fish_pager_color_secondary" } ; /** This string contains the text that should be sent back to the calling program */ static wcstring out_buff; /** This is the file to which the output text should be sent. It is really a pipe. */ static FILE *out_file; /** Data structure describing one or a group of related completions */ struct comp_t { /** The list of all completin strings this entry applies to */ wcstring_list_t comp; /** The description */ wcstring desc; /** On-screen width of the completion string */ int comp_width; /** On-screen width of the description information */ int desc_width; /** Preffered total width */ int pref_width; /** Minimum acceptable width */ int min_width; }; /** This function translates from a highlight code to a specific color by check invironement variables */ static rgb_color_t get_color(int highlight) { const wchar_t *val; if (highlight < 0) return rgb_color_t::normal(); if (highlight >= (5)) return rgb_color_t::normal(); val = wgetenv(hightlight_var[highlight]); if (!val) { val = env_universal_get(hightlight_var[highlight]); } if (!val) { return rgb_color_t::normal(); } return parse_color(val, false); } /** This function calculates the minimum width for each completion entry in the specified array_list. This width depends on the terminal size, so this function should be called when the terminal changes size. */ static void recalc_width(std::vector &lst, const wchar_t *prefix) { for (size_t i=0; imin_width = mini(c->desc_width, maxi(0,termsize.ws_col/3 - 2)) + mini(c->desc_width, maxi(0,termsize.ws_col/5 - 4)) +4; } } /** Test if the specified character sequence has been entered on the keyboard */ static int try_sequence(const char *seq) { int j, k; wint_t c=0; for (j=0; seq[j] != '\0' && seq[j] == (c=input_common_readch(j>0)); j++) ; if (seq[j] == '\0') { return 1; } else { input_common_unreadch(c); for (k=j-1; k>=0; k--) input_common_unreadch(seq[k]); } return 0; } /** Read a character from keyboard */ static wint_t readch() { struct mapping { const char *seq; wint_t bnd; } ; struct mapping m[]= { { "\x1b[A", LINE_UP } , { key_up, LINE_UP } , { "\x1b[B", LINE_DOWN } , { key_down, LINE_DOWN } , { key_ppage, PAGE_UP } , { key_npage, PAGE_DOWN } , { " ", PAGE_DOWN } , { "\t", PAGE_DOWN } , { 0, 0 } } ; int i; for (i=0; m[i].bnd; i++) { if (!m[i].seq) { continue; } if (try_sequence(m[i].seq)) return m[i].bnd; } return input_common_readch(0); } /** Write specified character to the output buffer \c pager_buffer */ static int pager_buffered_writer(char c) { pager_buffer.push_back(c); return 0; } /** Flush \c pager_buffer to stdout */ static void pager_flush() { if (! pager_buffer.empty()) { write_loop(1, & pager_buffer.at(0), pager_buffer.size() * sizeof(char)); pager_buffer.clear(); } } /** Print the specified string, but use at most the specified amount of space. If the whole string can't be fitted, ellipsize it. \param str the string to print \param max the maximum space that may be used for printing \param has_more if this flag is true, this is not the entire string, and the string should be ellisiszed even if the string fits but takes up the whole space. */ static int print_max(const wchar_t *str, int max, int has_more) { int i; int written = 0; for (i=0; str[i]; i++) { if (written + wcwidth(str[i]) > max) break; if ((written + wcwidth(str[i]) == max) && (has_more || str[i+1])) { writech(ellipsis_char); written += wcwidth(ellipsis_char); break; } writech(str[i]); written+= wcwidth(str[i]); } return written; } /** Print the specified item using at the specified amount of space */ static void completion_print_item(const wchar_t *prefix, comp_t *c, int width, bool secondary) { int comp_width=0, desc_width=0; int written=0; if (c->pref_width <= width) { /* The entry fits, we give it as much space as it wants */ comp_width = c->comp_width; desc_width = c->desc_width; } else { /* The completion and description won't fit on the allocated space. Give a maximum of 2/3 of the space to the completion, and whatever is left to the description. */ int desc_all = c->desc_width?c->desc_width+4:0; comp_width = maxi(mini(c->comp_width, 2*(width-4)/3), width - desc_all); if (c->desc_width) desc_width = width-comp_width-4; else c->desc_width=0; } rgb_color_t bg = secondary ? get_color(HIGHLIGHT_PAGER_SECONDARY) : rgb_color_t::normal(); for (size_t i=0; icomp.size(); i++) { const wcstring &comp = c->comp.at(i); if (i != 0) written += print_max(L" ", comp_width - written, 2); set_color(get_color(HIGHLIGHT_PAGER_PREFIX), bg); written += print_max(prefix, comp_width - written, comp.empty()?0:1); set_color(get_color(HIGHLIGHT_PAGER_COMPLETION), bg); written += print_max(comp.c_str(), comp_width - written, i!=(c->comp.size()-1)); } if (desc_width) { while (written < (width-desc_width-2)) { written++; writech(L' '); } set_color(get_color(HIGHLIGHT_PAGER_DESCRIPTION), bg); written += print_max(L"(", 1, 0); written += print_max(c->desc.c_str(), desc_width, 0); written += print_max(L")", 1, 0); } else { while (written < width) { written++; writech(L' '); } } if (secondary) set_color(rgb_color_t::normal(), rgb_color_t::normal()); } /** Print the specified part of the completion list, using the specified column offsets and quoting style. \param l The list of completions to print \param cols number of columns to print in \param width An array specifying the width of each column \param row_start The first row to print \param row_stop the row after the last row to print \param prefix The string to print before each completion \param is_quoted Whether to print the completions are in a quoted environment */ static void completion_print(int cols, int *width, int row_start, int row_stop, const wchar_t *prefix, int is_quoted, const std::vector &lst) { size_t rows = (lst.size()-1)/cols+1; size_t i, j; for (i = row_start; i &lst) { /* The calculated preferred width of each column */ int pref_width[PAGER_MAX_COLS]; /* The calculated minimum width of each column */ int min_width[PAGER_MAX_COLS]; /* If the list can be printed with this width, width will contain the width of each column */ int *width=pref_width; /* Set to one if the list should be printed at this width */ int print=0; long i, j; int rows = (int)((lst.size()-1)/cols+1); int pref_tot_width=0; int min_tot_width = 0; int res=PAGER_RETRY; /* Skip completions on tiny terminals */ if (termsize.ws_col < PAGER_MIN_WIDTH) return PAGER_DONE; memset(pref_width, 0, sizeof(pref_width)); memset(min_width, 0, sizeof(min_width)); /* Calculate how wide the list would be */ for (j = 0; j < cols; j++) { for (i = 0; ipref_width; min = c->min_width; if (j != cols-1) { pref += 2; min += 2; } min_width[j] = maxi(min_width[j], min); pref_width[j] = maxi(pref_width[j], pref); } min_tot_width += min_width[j]; pref_tot_width += pref_width[j]; } /* Force fit if one column */ if (cols == 1) { if (pref_tot_width > termsize.ws_col) { pref_width[0] = termsize.ws_col; } width = pref_width; print=1; } else if (pref_tot_width <= termsize.ws_col) { /* Terminal is wide enough. Print the list! */ width = pref_width; print=1; } else { long next_rows = (lst.size()-1)/(cols-1)+1; /* fwprintf( stderr, L"cols %d, min_tot %d, term %d, rows=%d, nextrows %d, termrows %d, diff %d\n", cols, min_tot_width, termsize.ws_col, rows, next_rows, termsize.ws_row, pref_tot_width-termsize.ws_col ); */ if (min_tot_width < termsize.ws_col && (((rows < termsize.ws_row) && (next_rows >= termsize.ws_row)) || (pref_tot_width-termsize.ws_col< 4 && cols < 3))) { /* Terminal almost wide enough, or squeezing makes the whole list fit on-screen. This part of the code is really important. People hate having to scroll through the completion list. In cases where there are a huge number of completions, it can't be helped, but it is not uncommon for the completions to _almost_ fit on one screen. In those cases, it is almost always desirable to 'squeeze' the completions into a single page. If we are using N columns and can get everything to fit using squeezing, but everything would also fit using N-1 columns, don't try. */ int tot_width = min_tot_width; width = min_width; while (tot_width < termsize.ws_col) { for (i=0; (i 0) { pos--; writembs(tparm(cursor_address, 0, 0)); writembs(scroll_reverse); completion_print(cols, width, pos, pos+1, prefix, is_quoted, lst); writembs(tparm(cursor_address, termsize.ws_row-1, 0)); writembs(clr_eol); } break; } case LINE_DOWN: { if (pos <= (rows - termsize.ws_row)) { pos++; completion_print(cols, width, pos+termsize.ws_row-2, pos+termsize.ws_row-1, prefix, is_quoted, lst); } break; } case PAGE_DOWN: { npos = mini((int)(rows - termsize.ws_row+1), (int)(pos + termsize.ws_row-1)); if (npos != pos) { pos = npos; completion_print(cols, width, pos, pos+termsize.ws_row-1, prefix, is_quoted, lst); } else { if (flash_screen) writembs(flash_screen); } break; } case PAGE_UP: { npos = maxi(0, pos - termsize.ws_row+1); if (npos != pos) { pos = npos; completion_print(cols, width, pos, pos+termsize.ws_row-1, prefix, is_quoted, lst); } else { if (flash_screen) writembs(flash_screen); } break; } case R_NULL: { do_loop=0; res=PAGER_RESIZE; break; } default: { out_buff.push_back(c); do_loop = 0; break; } } } writembs(clr_eol); } } return res; } /** Substitute any series of whitespace with a single space character inside completion descriptions. Remove all whitespace from beginning/end of completion descriptions. */ static void mangle_descriptions(wcstring_list_t &lst) { int skip; for (size_t i=0; i desc_table; for (size_t i=0; i mangle_completions(wcstring_list_t &lst, const wchar_t *prefix) { std::vector result; for (size_t i=0; icomp_width += my_wcswidth(str.c_str()); comp->comp.push_back(str); start = end+1; } if (c == COMPLETE_SEP) { comp->desc = next.c_str() + start; break; } if (!c) break; } comp->comp_width += (int)(my_wcswidth(prefix)*comp->comp.size() + 2*(comp->comp.size()-1)); comp->desc_width = comp->desc.empty()?0:my_wcswidth(comp->desc.c_str()); comp->pref_width = comp->comp_width + comp->desc_width + (comp->desc_width?4:0); result.push_back(comp); } recalc_width(result, prefix); return result; } /** Respond to a winch signal by checking the terminal size */ static void handle_winch(int sig) { if (ioctl(1,TIOCGWINSZ,&termsize)!=0) { return; } } /** The callback function that the keyboard reading function calls when an interrupt occurs. This makes sure that R_NULL is returned at once when an interrupt has occured. */ static int interrupt_handler() { return R_NULL; } /** Initialize various subsystems. This also closes stdin and replaces it with a copy of stderr, so the reading of completion strings must be done before init is called. */ static void init(int mangle_descriptors, int out) { struct sigaction act; static struct termios pager_modes; char *term; if (mangle_descriptors) { /* Make fd 1 output to screen, and use some other fd for writing the resulting output back to the caller */ int in; out = dup(1); close(1); close(0); /* OK to not use CLO_EXEC here because fish_pager is single threaded */ if ((in = open(ttyname(2), O_RDWR)) != -1) { if (dup2(2, 1) == -1) { debug(0, _(L"Could not set up output file descriptors for pager")); exit(1); } if (dup2(in, 0) == -1) { debug(0, _(L"Could not set up input file descriptors for pager")); exit(1); } } else { debug(0, _(L"Could not open tty for pager")); exit(1); } } if (!(out_file = fdopen(out, "w"))) { debug(0, _(L"Could not initialize result pipe")); exit(1); } env_universal_init(0, 0, 0, 0); input_common_init(&interrupt_handler); output_set_writer(&pager_buffered_writer); sigemptyset(& act.sa_mask); act.sa_flags=0; act.sa_handler=SIG_DFL; act.sa_flags = 0; act.sa_handler= &handle_winch; if (sigaction(SIGWINCH, &act, 0)) { wperror(L"sigaction"); exit(1); } handle_winch(0); /* Set handler for window change events */ tcgetattr(0,&pager_modes); /* get the current terminal modes */ memcpy(&saved_modes, &pager_modes, sizeof(saved_modes)); /* save a copy so we can reset the terminal later */ pager_modes.c_lflag &= ~ICANON; /* turn off canonical mode */ pager_modes.c_lflag &= ~ECHO; /* turn off echo mode */ pager_modes.c_cc[VMIN]=1; pager_modes.c_cc[VTIME]=0; /* */ if (tcsetattr(0,TCSANOW,&pager_modes)) /* set the new modes */ { wperror(L"tcsetattr"); exit(1); } int errret; if (setupterm(0, STDOUT_FILENO, &errret) == ERR) { debug(0, _(L"Could not set up terminal")); exit(1); } term = getenv("TERM"); if (term) { wcstring wterm = str2wcstring(term); output_set_term(wterm); } /* Infer term256 support */ char *fish_term256 = getenv("fish_term256"); bool support_term256; if (fish_term256) { support_term256 = from_string(fish_term256); } else { support_term256 = term && strstr(term, "256color"); } output_set_supports_term256(support_term256); } /** Free memory used by various subsystems. */ static void destroy() { env_universal_destroy(); input_common_destroy(); wutil_destroy(); if (fish_del_curterm(cur_term) == ERR) { debug(0, _(L"Error while closing terminfo")); } fclose(out_file); } /** Read lines of input from the specified file, unescape them and insert them into the specified list. */ static void read_array(FILE* file, wcstring_list_t &comp) { std::vector buffer; int c; while (!feof(file)) { buffer.clear(); while (1) { c = getc(file); if (c == EOF) { break; } if (c == '\n') { break; } buffer.push_back(static_cast(c)); } if (! buffer.empty()) { buffer.push_back(0); wcstring wcs = str2wcstring(&buffer.at(0)); if (unescape_string(wcs, false)) { comp.push_back(wcs); } } } } static int get_fd(const char *str) { char *end; long fd; errno = 0; fd = strtol(str, &end, 10); if (fd < 0 || *end || errno) { debug(0, ERR_NOT_FD, program_name, optarg); exit(1); } return (int)fd; } int main(int argc, char **argv) { int i; int is_quoted=0; wcstring_list_t comp; wcstring prefix; int mangle_descriptors = 0; int result_fd = -1; set_main_thread(); setup_fork_guards(); /* This initialization is made early, so that the other init code can use global_context for memory managment */ program_name = L"fish_pager"; wsetlocale(LC_ALL, L""); /* The call signature for fish_pager is a mess. Because we want to be able to upgrade fish without breaking running instances, we need to support all previous modes. Unfortunatly, the two previous ones are a mess. The third one is designed to be extensible, so hopefully it will be the last. */ if (argc > 1 && argv[1][0] == '-') { /* Third mode */ int completion_fd = -1; FILE *completion_file; while (1) { static struct option long_options[] = { { "result-fd", required_argument, 0, 'r' } , { "completion-fd", required_argument, 0, 'c' } , { "prefix", required_argument, 0, 'p' } , { "is-quoted", no_argument, 0, 'q' } , { "help", no_argument, 0, 'h' } , { "version", no_argument, 0, 'v' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = getopt_long(argc, argv, GETOPT_STRING, long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: { break; } case 'r': { result_fd = get_fd(optarg); break; } case 'c': { completion_fd = get_fd(optarg); break; } case 'p': { prefix = str2wcstring(optarg); break; } case 'h': { print_help(argv[0], 1); exit(0); } case 'v': { debug(0, L"%ls, version %s\n", program_name, PACKAGE_VERSION); exit(0); } case 'q': { is_quoted = 1; } } } if (completion_fd == -1 || result_fd == -1) { debug(0, _(L"Unspecified file descriptors")); exit(1); } if ((completion_file = fdopen(completion_fd, "r"))) { read_array(completion_file, comp); fclose(completion_file); } else { debug(0, _(L"Could not read completions")); wperror(L"fdopen"); exit(1); } } else { /* Second or first mode. These suck, but we need to support them for backwards compatibility. At least for some time. Third mode was implemented in January 2007, and previous modes should be considered deprecated from that point forward. A reasonable time frame for removal of the code below has yet to be determined. */ if (argc < 3) { print_help(argv[0], 1); exit(0); } else { mangle_descriptors = 1; prefix = str2wcstring(argv[2]); is_quoted = strcmp("1", argv[1])==0; if (argc > 3) { /* First mode */ for (i=3; i completions = mangle_completions(comp, prefix.c_str()); /** Try to print the completions. Start by trying to print the list in PAGER_MAX_COLS columns, if the completions won't fit, reduce the number of columns by one. Printing a single column never fails. */ for (i = PAGER_MAX_COLS; i>0; i--) { switch (completion_try_print(i, prefix.c_str(), is_quoted, completions)) { case PAGER_RETRY: break; case PAGER_DONE: i=0; break; case PAGER_RESIZE: /* This means we got a resize event, so we start over from the beginning. Since it the screen got bigger, we might be able to fit all completions on-screen. */ i=PAGER_MAX_COLS+1; break; } } fwprintf(out_file, L"%ls", out_buff.c_str()); if (is_ca_mode) { writembs(exit_ca_mode); pager_flush(); } destroy(); } fish/fish_tests.cpp000066400000000000000000001445711214535744100147100ustar00rootroot00000000000000/** \file fish_tests.c Various bug and feature tests. Compiled and run by make test. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include #include #include "fallback.h" #include "util.h" #include "common.h" #include "proc.h" #include "reader.h" #include "builtin.h" #include "function.h" #include "autoload.h" #include "complete.h" #include "wutil.h" #include "env.h" #include "expand.h" #include "parser.h" #include "tokenizer.h" #include "output.h" #include "exec.h" #include "event.h" #include "path.h" #include "history.h" #include "highlight.h" #include "iothread.h" #include "postfork.h" #include "signal.h" #include "highlight.h" /** The number of tests to run */ //#define ESCAPE_TEST_COUNT 1000000 #define ESCAPE_TEST_COUNT 10000 /** The average length of strings to unescape */ #define ESCAPE_TEST_LENGTH 100 /** The higest character number of character to try and escape */ #define ESCAPE_TEST_CHAR 4000 /** Number of laps to run performance testing loop */ #define LAPS 50 /** The result of one of the test passes */ #define NUM_ANS L"-7 99999999 1234567 deadbeef DEADBEEFDEADBEEF" /** Number of encountered errors */ static int err_count=0; /** Print formatted output */ static void say(const wchar_t *blah, ...) { va_list va; va_start(va, blah); vwprintf(blah, va); va_end(va); wprintf(L"\n"); } /** Print formatted error string */ static void err(const wchar_t *blah, ...) { va_list va; va_start(va, blah); err_count++; wprintf(L"Error: "); vwprintf(blah, va); va_end(va); wprintf(L"\n"); } /** Test the escaping/unescaping code by escaping/unescaping random strings and verifying that the original string comes back. */ static void test_escape() { int i; wcstring sb; say(L"Testing escaping and unescaping"); for (i=0; i sb; say(L"Testing wide/narrow string conversion"); for (i=0; i&1 'nested \"quoted\" '(string containing subshells ){and,brackets}$as[$well (as variable arrays)] not_a_redirect^ ^ ^^is_a_redirect"; const int types[] = { TOK_STRING, TOK_REDIRECT_IN, TOK_STRING, TOK_REDIRECT_FD, TOK_STRING, TOK_STRING, TOK_STRING, TOK_REDIRECT_OUT, TOK_REDIRECT_APPEND, TOK_STRING, TOK_END }; say(L"Test correct tokenization"); tokenizer_t t(str, 0); for (size_t i=0; i < sizeof types / sizeof *types; i++, tok_next(&t)) { if (types[i] != tok_last_type(&t)) { err(L"Tokenization error:"); wprintf(L"Token number %d of string \n'%ls'\n, expected token type %ls, got token '%ls' of type %ls\n", i+1, str, tok_get_desc(types[i]), tok_last(&t), tok_get_desc(tok_last_type(&t))); } } } } static int test_fork_helper(void *unused) { size_t i; for (i=0; i < 1000; i++) { //delete [](new char[4 * 1024 * 1024]); for (int j=0; j < 1024; j++) { strerror(j); } } return 0; } static void test_fork(void) { return; say(L"Testing fork"); size_t i, max = 100; for (i=0; i < 100; i++) { printf("%lu / %lu\n", i+1, max); /* Do something horrible to try to trigger an error */ #define THREAD_COUNT 8 #define FORK_COUNT 10 #define FORK_LOOP_COUNT 16 signal_block(); for (size_t i=0; i < THREAD_COUNT; i++) { iothread_perform(test_fork_helper, NULL, NULL); } for (size_t q = 0; q < FORK_LOOP_COUNT; q++) { pid_t pids[FORK_COUNT]; for (size_t i=0; i < FORK_COUNT; i++) { pid_t pid = execute_fork(false); if (pid > 0) { /* Parent */ pids[i] = pid; } else if (pid == 0) { /* Child */ //new char[4 * 1024 * 1024]; for (size_t i=0; i < 1024 * 16; i++) { for (int j=0; j < 256; j++) { strerror(j); } } exit_without_destructors(0); } else { perror("fork"); } } for (size_t i=0; i < FORK_COUNT; i++) { int status = 0; if (pids[i] != waitpid(pids[i], &status, 0)) { perror("waitpid"); assert(0); } assert(WIFEXITED(status) && 0 == WEXITSTATUS(status)); } } iothread_drain_all(); signal_unblock(); } #undef FORK_COUNT } /** Test the parser */ static void test_parser() { say(L"Testing parser"); parser_t parser(PARSER_TYPE_GENERAL, true); say(L"Testing null input to parser"); if (!parser.test(NULL)) { err(L"Null input to parser.test undetected"); } say(L"Testing block nesting"); if (!parser.test(L"if; end")) { err(L"Incomplete if statement undetected"); } if (!parser.test(L"if test; echo")) { err(L"Missing end undetected"); } if (!parser.test(L"if test; end; end")) { err(L"Unbalanced end undetected"); } say(L"Testing detection of invalid use of builtin commands"); if (!parser.test(L"case foo")) { err(L"'case' command outside of block context undetected"); } if (!parser.test(L"switch ggg; if true; case foo;end;end")) { err(L"'case' command outside of switch block context undetected"); } if (!parser.test(L"else")) { err(L"'else' command outside of conditional block context undetected"); } if (!parser.test(L"else if")) { err(L"'else if' command outside of conditional block context undetected"); } if (!parser.test(L"if false; else if; end")) { err(L"'else if' missing command undetected"); } if (!parser.test(L"break")) { err(L"'break' command outside of loop block context undetected"); } if (!parser.test(L"exec ls|less") || !parser.test(L"echo|return")) { err(L"Invalid pipe command undetected"); } say(L"Testing basic evaluation"); #if 0 /* This fails now since the parser takes a wcstring&, and NULL converts to wchar_t * converts to wcstring which crashes (thanks C++) */ if (!parser.eval(0, 0, TOP)) { err(L"Null input when evaluating undetected"); } #endif if (!parser.eval(L"ls", io_chain_t(), WHILE)) { err(L"Invalid block mode when evaluating undetected"); } } class lru_node_test_t : public lru_node_t { public: lru_node_test_t(const wcstring &tmp) : lru_node_t(tmp) { } }; class test_lru_t : public lru_cache_t { public: test_lru_t() : lru_cache_t(16) { } std::vector evicted_nodes; virtual void node_was_evicted(lru_node_test_t *node) { assert(find(evicted_nodes.begin(), evicted_nodes.end(), node) == evicted_nodes.end()); evicted_nodes.push_back(node); } }; static void test_lru(void) { say(L"Testing LRU cache"); test_lru_t cache; std::vector expected_evicted; size_t total_nodes = 20; for (size_t i=0; i < total_nodes; i++) { assert(cache.size() == std::min(i, (size_t)16)); lru_node_test_t *node = new lru_node_test_t(to_string(i)); if (i < 4) expected_evicted.push_back(node); // Adding the node the first time should work, and subsequent times should fail assert(cache.add_node(node)); assert(! cache.add_node(node)); } assert(cache.evicted_nodes == expected_evicted); cache.evict_all_nodes(); assert(cache.evicted_nodes.size() == total_nodes); while (! cache.evicted_nodes.empty()) { lru_node_t *node = cache.evicted_nodes.back(); cache.evicted_nodes.pop_back(); delete node; } } /** Perform parameter expansion and test if the output equals the zero-terminated parameter list supplied. \param in the string to expand \param flags the flags to send to expand_string */ static int expand_test(const wchar_t *in, int flags, ...) { std::vector output; va_list va; size_t i=0; int res=1; wchar_t *arg; if (expand_string(in, output, flags)) { } #if 0 for (size_t idx=0; idx < output.size(); idx++) { printf("%ls\n", output.at(idx).completion.c_str()); } #endif va_start(va, flags); while ((arg=va_arg(va, wchar_t *))!= 0) { if (output.size() == i) { res=0; break; } if (output.at(i).completion != arg) { res=0; break; } i++; } va_end(va); return res; } /** Test globbing and other parameter expansion */ static void test_expand() { say(L"Testing parameter expansion"); if (!expand_test(L"foo", 0, L"foo", 0)) { err(L"Strings do not expand to themselves"); } if (!expand_test(L"a{b,c,d}e", 0, L"abe", L"ace", L"ade", 0)) { err(L"Bracket expansion is broken"); } if (!expand_test(L"a*", EXPAND_SKIP_WILDCARDS, L"a*", 0)) { err(L"Cannot skip wildcard expansion"); } if (system("mkdir -p /tmp/fish_expand_test/")) err(L"mkdir failed"); if (system("touch /tmp/fish_expand_test/.foo")) err(L"touch failed"); if (system("touch /tmp/fish_expand_test/bar")) err(L"touch failed"); // This is checking that .* does NOT match . and .. (https://github.com/fish-shell/fish-shell/issues/270). But it does have to match literal components (e.g. "./*" has to match the same as "*" if (! expand_test(L"/tmp/fish_expand_test/.*", 0, L"/tmp/fish_expand_test/.foo", 0)) { err(L"Expansion not correctly handling dotfiles"); } if (! expand_test(L"/tmp/fish_expand_test/./.*", 0, L"/tmp/fish_expand_test/./.foo", 0)) { err(L"Expansion not correctly handling literal path components in dotfiles"); } //system("rm -Rf /tmp/fish_expand_test"); } /** Test path functions */ static void test_path() { say(L"Testing path functions"); wcstring path = L"//foo//////bar/"; wcstring canon = path; path_make_canonical(canon); if (canon != L"/foo/bar") { err(L"Bug in canonical PATH code"); } path = L"/"; path_make_canonical(path); if (path != L"/") { err(L"Bug in canonical PATH code"); } } enum word_motion_t { word_motion_left, word_motion_right }; static void test_1_word_motion(word_motion_t motion, move_word_style_t style, const wcstring &test) { wcstring command; std::set stops; // Carets represent stops and should be cut out of the command for (size_t i=0; i < test.size(); i++) { wchar_t wc = test.at(i); if (wc == L'^') { stops.insert(command.size()); } else { command.push_back(wc); } } size_t idx, end; if (motion == word_motion_left) { idx = command.size(); end = 0; } else { idx = 0; end = command.size(); } move_word_state_machine_t sm(style); while (idx != end) { size_t char_idx = (motion == word_motion_left ? idx - 1 : idx); wchar_t wc = command.at(char_idx); bool will_stop = ! sm.consume_char(wc); //printf("idx %lu, looking at %lu (%c): %d\n", idx, char_idx, (char)wc, will_stop); bool expected_stop = (stops.count(idx) > 0); if (will_stop != expected_stop) { wcstring tmp = command; tmp.insert(idx, L"^"); const char *dir = (motion == word_motion_left ? "left" : "right"); if (will_stop) { err(L"Word motion: moving %s, unexpected stop at idx %lu: '%ls'", dir, idx, tmp.c_str()); } else if (! will_stop && expected_stop) { err(L"Word motion: moving %s, should have stopped at idx %lu: '%ls'", dir, idx, tmp.c_str()); } } // We don't expect to stop here next time if (expected_stop) { stops.erase(idx); } if (will_stop) { sm.reset(); } else { idx += (motion == word_motion_left ? -1 : 1); } } } /** Test word motion (forward-word, etc.). Carets represent cursor stops. */ static void test_word_motion() { say(L"Testing word motion"); test_1_word_motion(word_motion_left, move_word_style_punctuation, L"^echo ^hello_^world.^txt"); test_1_word_motion(word_motion_right, move_word_style_punctuation, L"echo^ hello^_world^.txt^"); test_1_word_motion(word_motion_left, move_word_style_punctuation, L"echo ^foo_^foo_^foo/^/^/^/^/^ "); test_1_word_motion(word_motion_right, move_word_style_punctuation, L"echo^ foo^_foo^_foo^/^/^/^/^/ ^"); test_1_word_motion(word_motion_left, move_word_style_path_components, L"^/^foo/^bar/^baz/"); test_1_word_motion(word_motion_left, move_word_style_path_components, L"^echo ^--foo ^--bar"); test_1_word_motion(word_motion_left, move_word_style_path_components, L"^echo ^hi ^> /^dev/^null"); test_1_word_motion(word_motion_left, move_word_style_path_components, L"^echo /^foo/^bar{^aaa,^bbb,^ccc}^bak/"); } /** Test is_potential_path */ static void test_is_potential_path() { say(L"Testing is_potential_path"); if (system("rm -Rf /tmp/is_potential_path_test/")) { err(L"Failed to remove /tmp/is_potential_path_test/"); } /* Directories */ if (system("mkdir -p /tmp/is_potential_path_test/alpha/")) err(L"mkdir failed"); if (system("mkdir -p /tmp/is_potential_path_test/beta/")) err(L"mkdir failed"); /* Files */ if (system("touch /tmp/is_potential_path_test/aardvark")) err(L"touch failed"); if (system("touch /tmp/is_potential_path_test/gamma")) err(L"touch failed"); const wcstring wd = L"/tmp/is_potential_path_test/"; const wcstring_list_t wds(1, wd); wcstring tmp; assert(is_potential_path(L"al", wds, PATH_REQUIRE_DIR, &tmp) && tmp == L"alpha/"); assert(is_potential_path(L"alpha/", wds, PATH_REQUIRE_DIR, &tmp) && tmp == L"alpha/"); assert(is_potential_path(L"aard", wds, 0, &tmp) && tmp == L"aardvark"); assert(! is_potential_path(L"balpha/", wds, PATH_REQUIRE_DIR, &tmp)); assert(! is_potential_path(L"aard", wds, PATH_REQUIRE_DIR, &tmp)); assert(! is_potential_path(L"aarde", wds, PATH_REQUIRE_DIR, &tmp)); assert(! is_potential_path(L"aarde", wds, 0, &tmp)); assert(is_potential_path(L"/tmp/is_potential_path_test/aardvark", wds, 0, &tmp) && tmp == L"/tmp/is_potential_path_test/aardvark"); assert(is_potential_path(L"/tmp/is_potential_path_test/al", wds, PATH_REQUIRE_DIR, &tmp) && tmp == L"/tmp/is_potential_path_test/alpha/"); assert(is_potential_path(L"/tmp/is_potential_path_test/aardv", wds, 0, &tmp) && tmp == L"/tmp/is_potential_path_test/aardvark"); assert(! is_potential_path(L"/tmp/is_potential_path_test/aardvark", wds, PATH_REQUIRE_DIR, &tmp)); assert(! is_potential_path(L"/tmp/is_potential_path_test/al/", wds, 0, &tmp)); assert(! is_potential_path(L"/tmp/is_potential_path_test/ar", wds, 0, &tmp)); assert(is_potential_path(L"/usr", wds, PATH_REQUIRE_DIR, &tmp) && tmp == L"/usr/"); } /** Test the 'test' builtin */ int builtin_test(parser_t &parser, wchar_t **argv); static bool run_one_test_test(int expected, wcstring_list_t &lst, bool bracket) { parser_t parser(PARSER_TYPE_GENERAL, true); size_t i, count = lst.size(); wchar_t **argv = new wchar_t *[count+3]; argv[0] = (wchar_t *)(bracket ? L"[" : L"test"); for (i=0; i < count; i++) { argv[i+1] = (wchar_t *)lst.at(i).c_str(); } if (bracket) { argv[i+1] = (wchar_t *)L"]"; i++; } argv[i+1] = NULL; int result = builtin_test(parser, argv); delete[] argv; return expected == result; } static bool run_test_test(int expected, const wcstring &str) { using namespace std; wcstring_list_t lst; wistringstream iss(str); copy(istream_iterator >(iss), istream_iterator >(), back_inserter >(lst)); bool bracket = run_one_test_test(expected, lst, true); bool nonbracket = run_one_test_test(expected, lst, false); assert(bracket == nonbracket); return nonbracket; } static void test_test_brackets() { // Ensure [ knows it needs a ] parser_t parser(PARSER_TYPE_GENERAL, true); const wchar_t *argv1[] = {L"[", L"foo", NULL}; assert(builtin_test(parser, (wchar_t **)argv1) != 0); const wchar_t *argv2[] = {L"[", L"foo", L"]", NULL}; assert(builtin_test(parser, (wchar_t **)argv2) == 0); const wchar_t *argv3[] = {L"[", L"foo", L"]", L"bar", NULL}; assert(builtin_test(parser, (wchar_t **)argv3) != 0); } static void test_test() { say(L"Testing test builtin"); test_test_brackets(); assert(run_test_test(0, L"5 -ne 6")); assert(run_test_test(0, L"5 -eq 5")); assert(run_test_test(0, L"0 -eq 0")); assert(run_test_test(0, L"-1 -eq -1")); assert(run_test_test(0, L"1 -ne -1")); assert(run_test_test(1, L"-1 -ne -1")); assert(run_test_test(0, L"abc != def")); assert(run_test_test(1, L"abc = def")); assert(run_test_test(0, L"5 -le 10")); assert(run_test_test(0, L"10 -le 10")); assert(run_test_test(1, L"20 -le 10")); assert(run_test_test(0, L"-1 -le 0")); assert(run_test_test(1, L"0 -le -1")); assert(run_test_test(0, L"15 -ge 10")); assert(run_test_test(0, L"15 -ge 10")); assert(run_test_test(1, L"! 15 -ge 10")); assert(run_test_test(0, L"! ! 15 -ge 10")); assert(run_test_test(0, L"0 -ne 1 -a 0 -eq 0")); assert(run_test_test(0, L"0 -ne 1 -a -n 5")); assert(run_test_test(0, L"-n 5 -a 10 -gt 5")); assert(run_test_test(0, L"-n 3 -a -n 5")); /* test precedence: '0 == 0 || 0 == 1 && 0 == 2' should be evaluated as: '0 == 0 || (0 == 1 && 0 == 2)' and therefore true. If it were '(0 == 0 || 0 == 1) && 0 == 2' it would be false. */ assert(run_test_test(0, L"0 = 0 -o 0 = 1 -a 0 = 2")); assert(run_test_test(0, L"-n 5 -o 0 = 1 -a 0 = 2")); assert(run_test_test(1, L"( 0 = 0 -o 0 = 1 ) -a 0 = 2")); assert(run_test_test(0, L"0 = 0 -o ( 0 = 1 -a 0 = 2 )")); /* A few lame tests for permissions; these need to be a lot more complete. */ assert(run_test_test(0, L"-e /bin/ls")); assert(run_test_test(1, L"-e /bin/ls_not_a_path")); assert(run_test_test(0, L"-x /bin/ls")); assert(run_test_test(1, L"-x /bin/ls_not_a_path")); assert(run_test_test(0, L"-d /bin/")); assert(run_test_test(1, L"-d /bin/ls")); /* This failed at one point */ assert(run_test_test(1, L"-d /bin -a 5 -eq 3")); assert(run_test_test(0, L"-d /bin -o 5 -eq 3")); assert(run_test_test(0, L"-d /bin -a ! 5 -eq 3")); /* We didn't properly handle multiple "just strings" either */ assert(run_test_test(0, L"foo")); assert(run_test_test(0, L"foo -a bar")); /* These should be errors */ assert(run_test_test(1, L"foo bar")); assert(run_test_test(1, L"foo bar baz")); /* This crashed */ assert(run_test_test(1, L"1 = 1 -a = 1")); /* Make sure we can treat -S as a parameter instead of an operator. https://github.com/fish-shell/fish-shell/issues/601 */ assert(run_test_test(0, L"-S = -S")); assert(run_test_test(1, L"! ! ! A")); } /** Testing colors */ static void test_colors() { say(L"Testing colors"); assert(rgb_color_t(L"#FF00A0").is_rgb()); assert(rgb_color_t(L"FF00A0").is_rgb()); assert(rgb_color_t(L"#F30").is_rgb()); assert(rgb_color_t(L"F30").is_rgb()); assert(rgb_color_t(L"f30").is_rgb()); assert(rgb_color_t(L"#FF30a5").is_rgb()); assert(rgb_color_t(L"3f30").is_none()); assert(rgb_color_t(L"##f30").is_none()); assert(rgb_color_t(L"magenta").is_named()); assert(rgb_color_t(L"MaGeNTa").is_named()); assert(rgb_color_t(L"mooganta").is_none()); } static void test_complete(void) { say(L"Testing complete"); const wchar_t *name_strs[] = {L"Foo1", L"Foo2", L"Foo3", L"Bar1", L"Bar2", L"Bar3"}; size_t count = sizeof name_strs / sizeof *name_strs; const wcstring_list_t names(name_strs, name_strs + count); complete_set_variable_names(&names); std::vector completions; complete(L"$F", completions, COMPLETION_REQUEST_DEFAULT); assert(completions.size() == 3); assert(completions.at(0).completion == L"oo1"); assert(completions.at(1).completion == L"oo2"); assert(completions.at(2).completion == L"oo3"); complete_set_variable_names(NULL); } static void test_1_completion(wcstring line, const wcstring &completion, complete_flags_t flags, bool append_only, wcstring expected, long source_line) { // str is given with a caret, which we use to represent the cursor position // find it const size_t in_cursor_pos = line.find(L'^'); assert(in_cursor_pos != wcstring::npos); line.erase(in_cursor_pos, 1); const size_t out_cursor_pos = expected.find(L'^'); assert(out_cursor_pos != wcstring::npos); expected.erase(out_cursor_pos, 1); size_t cursor_pos = in_cursor_pos; wcstring result = completion_apply_to_command_line(completion, flags, line, &cursor_pos, append_only); if (result != expected) { fprintf(stderr, "line %ld: %ls + %ls -> [%ls], expected [%ls]\n", source_line, line.c_str(), completion.c_str(), result.c_str(), expected.c_str()); } assert(result == expected); assert(cursor_pos == out_cursor_pos); } static void test_completion_insertions() { #define TEST_1_COMPLETION(a, b, c, d, e) test_1_completion(a, b, c, d, e, __LINE__) say(L"Testing completion insertions"); TEST_1_COMPLETION(L"foo^", L"bar", 0, false, L"foobar ^"); TEST_1_COMPLETION(L"foo^ baz", L"bar", 0, false, L"foobar ^ baz"); //we really do want to insert two spaces here - otherwise it's hidden by the cursor TEST_1_COMPLETION(L"'foo^", L"bar", 0, false, L"'foobar' ^"); TEST_1_COMPLETION(L"'foo'^", L"bar", 0, false, L"'foobar' ^"); TEST_1_COMPLETION(L"'foo\\'^", L"bar", 0, false, L"'foo\\'bar' ^"); TEST_1_COMPLETION(L"foo\\'^", L"bar", 0, false, L"foo\\'bar ^"); // Test append only TEST_1_COMPLETION(L"foo^", L"bar", 0, true, L"foobar ^"); TEST_1_COMPLETION(L"foo^ baz", L"bar", 0, true, L"foobar ^ baz"); TEST_1_COMPLETION(L"'foo^", L"bar", 0, true, L"'foobar' ^"); TEST_1_COMPLETION(L"'foo'^", L"bar", 0, true, L"'foo'bar ^"); TEST_1_COMPLETION(L"'foo\\'^", L"bar", 0, true, L"'foo\\'bar' ^"); TEST_1_COMPLETION(L"foo\\'^", L"bar", 0, true, L"foo\\'bar ^"); TEST_1_COMPLETION(L"foo^", L"bar", COMPLETE_NO_SPACE, false, L"foobar^"); TEST_1_COMPLETION(L"'foo^", L"bar", COMPLETE_NO_SPACE, false, L"'foobar^"); TEST_1_COMPLETION(L"'foo'^", L"bar", COMPLETE_NO_SPACE, false, L"'foobar'^"); TEST_1_COMPLETION(L"'foo\\'^", L"bar", COMPLETE_NO_SPACE, false, L"'foo\\'bar^"); TEST_1_COMPLETION(L"foo\\'^", L"bar", COMPLETE_NO_SPACE, false, L"foo\\'bar^"); TEST_1_COMPLETION(L"foo^", L"bar", COMPLETE_CASE_INSENSITIVE | COMPLETE_REPLACES_TOKEN, false, L"bar ^"); TEST_1_COMPLETION(L"'foo^", L"bar", COMPLETE_CASE_INSENSITIVE | COMPLETE_REPLACES_TOKEN, false, L"bar ^"); } static void perform_one_autosuggestion_test(const wcstring &command, const wcstring &wd, const wcstring &expected, long line) { wcstring suggestion; bool success = autosuggest_suggest_special(command, wd, suggestion); if (! success) { printf("line %ld: autosuggest_suggest_special() failed for command %ls\n", line, command.c_str()); assert(success); } if (suggestion != expected) { printf("line %ld: autosuggest_suggest_special() returned the wrong expected string for command %ls\n", line, command.c_str()); printf(" actual: %ls\n", suggestion.c_str()); printf("expected: %ls\n", expected.c_str()); assert(suggestion == expected); } } /* Testing test_autosuggest_suggest_special, in particular for properly handling quotes and backslashes */ static void test_autosuggest_suggest_special() { if (system("mkdir -p '/tmp/autosuggest_test/0foobar'")) err(L"mkdir failed"); if (system("mkdir -p '/tmp/autosuggest_test/1foo bar'")) err(L"mkdir failed"); if (system("mkdir -p '/tmp/autosuggest_test/2foo bar'")) err(L"mkdir failed"); if (system("mkdir -p '/tmp/autosuggest_test/3foo\\bar'")) err(L"mkdir failed"); if (system("mkdir -p /tmp/autosuggest_test/4foo\\'bar")) err(L"mkdir failed"); //a path with a single quote if (system("mkdir -p /tmp/autosuggest_test/5foo\\\"bar")) err(L"mkdir failed"); //a path with a double quote if (system("mkdir -p ~/test_autosuggest_suggest_special/")) err(L"mkdir failed"); //make sure tilde is handled const wcstring wd = L"/tmp/autosuggest_test/"; perform_one_autosuggestion_test(L"cd /tmp/autosuggest_test/0", wd, L"cd /tmp/autosuggest_test/0foobar/", __LINE__); perform_one_autosuggestion_test(L"cd \"/tmp/autosuggest_test/0", wd, L"cd \"/tmp/autosuggest_test/0foobar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '/tmp/autosuggest_test/0", wd, L"cd '/tmp/autosuggest_test/0foobar/'", __LINE__); perform_one_autosuggestion_test(L"cd 0", wd, L"cd 0foobar/", __LINE__); perform_one_autosuggestion_test(L"cd \"0", wd, L"cd \"0foobar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '0", wd, L"cd '0foobar/'", __LINE__); perform_one_autosuggestion_test(L"cd /tmp/autosuggest_test/1", wd, L"cd /tmp/autosuggest_test/1foo\\ bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"/tmp/autosuggest_test/1", wd, L"cd \"/tmp/autosuggest_test/1foo bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '/tmp/autosuggest_test/1", wd, L"cd '/tmp/autosuggest_test/1foo bar/'", __LINE__); perform_one_autosuggestion_test(L"cd 1", wd, L"cd 1foo\\ bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"1", wd, L"cd \"1foo bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '1", wd, L"cd '1foo bar/'", __LINE__); perform_one_autosuggestion_test(L"cd /tmp/autosuggest_test/2", wd, L"cd /tmp/autosuggest_test/2foo\\ \\ bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"/tmp/autosuggest_test/2", wd, L"cd \"/tmp/autosuggest_test/2foo bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '/tmp/autosuggest_test/2", wd, L"cd '/tmp/autosuggest_test/2foo bar/'", __LINE__); perform_one_autosuggestion_test(L"cd 2", wd, L"cd 2foo\\ \\ bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"2", wd, L"cd \"2foo bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '2", wd, L"cd '2foo bar/'", __LINE__); perform_one_autosuggestion_test(L"cd /tmp/autosuggest_test/3", wd, L"cd /tmp/autosuggest_test/3foo\\\\bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"/tmp/autosuggest_test/3", wd, L"cd \"/tmp/autosuggest_test/3foo\\bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '/tmp/autosuggest_test/3", wd, L"cd '/tmp/autosuggest_test/3foo\\bar/'", __LINE__); perform_one_autosuggestion_test(L"cd 3", wd, L"cd 3foo\\\\bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"3", wd, L"cd \"3foo\\bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '3", wd, L"cd '3foo\\bar/'", __LINE__); perform_one_autosuggestion_test(L"cd /tmp/autosuggest_test/4", wd, L"cd /tmp/autosuggest_test/4foo\\'bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"/tmp/autosuggest_test/4", wd, L"cd \"/tmp/autosuggest_test/4foo'bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '/tmp/autosuggest_test/4", wd, L"cd '/tmp/autosuggest_test/4foo\\'bar/'", __LINE__); perform_one_autosuggestion_test(L"cd 4", wd, L"cd 4foo\\'bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"4", wd, L"cd \"4foo'bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '4", wd, L"cd '4foo\\'bar/'", __LINE__); perform_one_autosuggestion_test(L"cd /tmp/autosuggest_test/5", wd, L"cd /tmp/autosuggest_test/5foo\\\"bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"/tmp/autosuggest_test/5", wd, L"cd \"/tmp/autosuggest_test/5foo\\\"bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '/tmp/autosuggest_test/5", wd, L"cd '/tmp/autosuggest_test/5foo\"bar/'", __LINE__); perform_one_autosuggestion_test(L"cd 5", wd, L"cd 5foo\\\"bar/", __LINE__); perform_one_autosuggestion_test(L"cd \"5", wd, L"cd \"5foo\\\"bar/\"", __LINE__); perform_one_autosuggestion_test(L"cd '5", wd, L"cd '5foo\"bar/'", __LINE__); perform_one_autosuggestion_test(L"cd ~/test_autosuggest_suggest_specia", wd, L"cd ~/test_autosuggest_suggest_special/", __LINE__); // A single quote should defeat tilde expansion perform_one_autosuggestion_test(L"cd '~/test_autosuggest_suggest_specia'", wd, L"", __LINE__); system("rm -Rf '/tmp/autosuggest_test/'"); system("rm -Rf ~/test_autosuggest_suggest_special/"); } static void test_autosuggestion_combining() { say(L"Testing autosuggestion combining"); assert(combine_command_and_autosuggestion(L"alpha", L"alphabeta") == L"alphabeta"); // when the last token contains no capital letters, we use the case of the autosuggestion assert(combine_command_and_autosuggestion(L"alpha", L"ALPHABETA") == L"ALPHABETA"); // when the last token contains capital letters, we use its case assert(combine_command_and_autosuggestion(L"alPha", L"alphabeTa") == L"alPhabeTa"); // if autosuggestion is not longer than input, use the input's case assert(combine_command_and_autosuggestion(L"alpha", L"ALPHAA") == L"ALPHAA"); assert(combine_command_and_autosuggestion(L"alpha", L"ALPHA") == L"alpha"); } /** Test speed of completion calculations */ void perf_complete() { wchar_t c; std::vector out; long long t1, t2; int matches=0; double t; wchar_t str[3]= { 0, 0, 0 } ; int i; say(L"Testing completion performance"); reader_push(L""); say(L"Here we go"); t1 = get_time(); for (c=L'a'; c<=L'z'; c++) { str[0]=c; reader_set_buffer(str, 0); complete(str, out, COMPLETION_REQUEST_DEFAULT, NULL); matches += out.size(); out.clear(); } t2=get_time(); t = (double)(t2-t1)/(1000000*26); say(L"One letter command completion took %f seconds per completion, %f microseconds/match", t, (double)(t2-t1)/matches); matches=0; t1 = get_time(); for (i=0; iitem_at_index(i); if (item.empty()) break; if (item.str() == txt) { result = true; break; } } return result; } class history_tests_t { public: static void test_history(void); static void test_history_merge(void); static void test_history_formats(void); static void test_history_speed(void); static void test_history_races(void); static void test_history_races_pound_on_history(); }; static wcstring random_string(void) { wcstring result; size_t max = 1 + rand() % 32; while (max--) { wchar_t c = 1 + rand()%ESCAPE_TEST_CHAR; result.push_back(c); } return result; } void history_tests_t::test_history(void) { say(L"Testing history"); history_t &history = history_t::history_with_name(L"test_history"); history.clear(); history.add(L"Gamma"); history.add(L"Beta"); history.add(L"Alpha"); /* All three items match "a" */ history_search_t search1(history, L"a"); test_history_matches(search1, 3); assert(search1.current_string() == L"Alpha"); /* One item matches "et" */ history_search_t search2(history, L"et"); test_history_matches(search2, 1); assert(search2.current_string() == L"Beta"); /* Test item removal */ history.remove(L"Alpha"); history_search_t search3(history, L"Alpha"); test_history_matches(search3, 0); /* Test history escaping and unescaping, yaml, etc. */ std::vector before, after; history.clear(); size_t i, max = 100; for (i=1; i <= max; i++) { /* Generate a value */ wcstring value = wcstring(L"test item ") + to_string(i); /* Maybe add some backslashes */ if (i % 3 == 0) value.append(L"(slashies \\\\\\ slashies)"); /* Generate some paths */ path_list_t paths; size_t count = rand() % 6; while (count--) { paths.push_back(random_string()); } /* Record this item */ history_item_t item(value, time(NULL), paths); before.push_back(item); history.add(item); } history.save(); /* Read items back in reverse order and ensure they're the same */ for (i=100; i >= 1; i--) { history_item_t item = history.item_at_index(i); assert(! item.empty()); after.push_back(item); } assert(before.size() == after.size()); for (size_t i=0; i < before.size(); i++) { const history_item_t &bef = before.at(i), &aft = after.at(i); assert(bef.contents == aft.contents); assert(bef.creation_timestamp == aft.creation_timestamp); assert(bef.required_paths == aft.required_paths); } /* Clean up after our tests */ history.clear(); } // wait until the next second static void time_barrier(void) { time_t start = time(NULL); do { usleep(1000); } while (time(NULL) == start); } static wcstring_list_t generate_history_lines(int pid) { wcstring_list_t result; long max = 256; result.reserve(max); for (long i=0; i < max; i++) { result.push_back(format_string(L"%ld %ld", (long)pid, i)); } return result; } void history_tests_t::test_history_races_pound_on_history() { /* Called in child process to modify history */ history_t *hist = new history_t(L"race_test"); hist->chaos_mode = true; const wcstring_list_t lines = generate_history_lines(getpid()); for (size_t idx = 0; idx < lines.size(); idx++) { const wcstring &line = lines.at(idx); hist->add(line); hist->save(); } delete hist; } void history_tests_t::test_history_races(void) { say(L"Testing history race conditions"); // Ensure history is clear history_t *hist = new history_t(L"race_test"); hist->clear(); delete hist; // Test concurrent history writing #define RACE_COUNT 10 pid_t children[RACE_COUNT]; for (size_t i=0; i < RACE_COUNT; i++) { pid_t pid = fork(); if (! pid) { // Child process setup_fork_guards(); test_history_races_pound_on_history(); exit_without_destructors(0); } else { // Parent process children[i] = pid; } } // Wait for all children for (size_t i=0; i < RACE_COUNT; i++) { int stat; waitpid(children[i], &stat, WUNTRACED); } // Compute the expected lines wcstring_list_t lines[RACE_COUNT]; for (size_t i=0; i < RACE_COUNT; i++) { lines[i] = generate_history_lines(children[i]); } // Count total lines size_t line_count = 0; for (size_t i=0; i < RACE_COUNT; i++) { line_count += lines[i].size(); } // Ensure we consider the lines that have been outputted as part of our history time_barrier(); /* Ensure that we got sane, sorted results */ hist = new history_t(L"race_test"); hist->chaos_mode = true; size_t hist_idx; for (hist_idx = 1; ; hist_idx ++) { history_item_t item = hist->item_at_index(hist_idx); if (item.empty()) break; // The item must be present in one of our 'lines' arrays // If it is present, then every item after it is assumed to be missed size_t i; for (i=0; i < RACE_COUNT; i++) { wcstring_list_t::iterator where = std::find(lines[i].begin(), lines[i].end(), item.str()); if (where != lines[i].end()) { // Delete everything from the found location onwards lines[i].resize(where - lines[i].begin()); // Break because we found it break; } } if (i >= RACE_COUNT) { err(L"Line '%ls' found in history not found in some array", item.str().c_str()); } } // every write should add at least one item assert(hist_idx >= RACE_COUNT); //hist->clear(); delete hist; } void history_tests_t::test_history_merge(void) { // In a single fish process, only one history is allowed to exist with the given name // But it's common to have multiple history instances with the same name active in different processes, // e.g. when you have multiple shells open. // We try to get that right and merge all their history together. Test that case. say(L"Testing history merge"); const size_t count = 3; const wcstring name = L"merge_test"; history_t *hists[count] = {new history_t(name), new history_t(name), new history_t(name)}; wcstring texts[count] = {L"History 1", L"History 2", L"History 3"}; /* Make sure history is clear */ for (size_t i=0; i < count; i++) { hists[i]->clear(); } /* Make sure we don't add an item in the same second as we created the history */ time_barrier(); /* Add a different item to each */ for (size_t i=0; i < count; i++) { hists[i]->add(texts[i]); } /* Save them */ for (size_t i=0; i < count; i++) { hists[i]->save(); } /* Make sure each history contains what it ought to, but they have not leaked into each other */ for (size_t i = 0; i < count; i++) { for (size_t j=0; j < count; j++) { bool does_contain = history_contains(hists[i], texts[j]); bool should_contain = (i == j); assert(should_contain == does_contain); } } /* Make a new history. It should contain everything. The time_barrier() is so that the timestamp is newer, since we only pick up items whose timestamp is before the birth stamp. */ time_barrier(); history_t *everything = new history_t(name); for (size_t i=0; i < count; i++) { assert(history_contains(everything, texts[i])); } /* Clean up */ for (size_t i=0; i < 3; i++) { delete hists[i]; } everything->clear(); delete everything; //not as scary as it looks } static bool install_sample_history(const wchar_t *name) { char command[512]; snprintf(command, sizeof command, "cp tests/%ls ~/.config/fish/%ls_history", name, name); if (system(command)) { err(L"Failed to copy sample history"); return false; } return true; } /* Indicates whether the history is equal to the given null-terminated array of strings. */ static bool history_equals(history_t &hist, const wchar_t * const *strings) { /* Count our expected items */ size_t expected_count = 0; while (strings[expected_count]) { expected_count++; } /* Ensure the contents are the same */ size_t history_idx = 1; size_t array_idx = 0; for (;;) { const wchar_t *expected = strings[array_idx]; history_item_t item = hist.item_at_index(history_idx); if (expected == NULL) { if (! item.empty()) { err(L"Expected empty item at history index %lu", history_idx); } break; } else { if (item.str() != expected) { err(L"Expected '%ls', found '%ls' at index %lu", expected, item.str().c_str(), history_idx); } } history_idx++; array_idx++; } return true; } void history_tests_t::test_history_formats(void) { const wchar_t *name; // Test inferring and reading legacy and bash history formats name = L"history_sample_fish_1_x"; say(L"Testing %ls", name); if (! install_sample_history(name)) { err(L"Couldn't open file tests/%ls", name); } else { /* Note: This is backwards from what appears in the file */ const wchar_t * const expected[] = { L"#def", L"echo #abc", L"function yay\n" "echo hi\n" "end", L"cd foobar", L"ls /", NULL }; history_t &test_history = history_t::history_with_name(name); if (! history_equals(test_history, expected)) { err(L"test_history_formats failed for %ls\n", name); } test_history.clear(); } name = L"history_sample_fish_2_0"; say(L"Testing %ls", name); if (! install_sample_history(name)) { err(L"Couldn't open file tests/%ls", name); } else { const wchar_t * const expected[] = { L"echo this has\\\nbackslashes", L"function foo\n" "echo bar\n" "end", L"echo alpha", NULL }; history_t &test_history = history_t::history_with_name(name); if (! history_equals(test_history, expected)) { err(L"test_history_formats failed for %ls\n", name); } test_history.clear(); } say(L"Testing bash import"); FILE *f = fopen("tests/history_sample_bash", "r"); if (! f) { err(L"Couldn't open file tests/history_sample_bash"); } else { // It should skip over the export command since that's a bash-ism const wchar_t *expected[] = { L"echo supsup", L"history --help", L"echo foo", NULL }; history_t &test_history = history_t::history_with_name(L"bash_import"); test_history.populate_from_bash(f); if (! history_equals(test_history, expected)) { err(L"test_history_formats failed for bash import\n"); } test_history.clear(); fclose(f); } } void history_tests_t::test_history_speed(void) { say(L"Testing history speed (pid is %d)", getpid()); history_t *hist = new history_t(L"speed_test"); wcstring item = L"History Speed Test - X"; /* Test for 10 seconds */ double start = timef(); double end = start + 10; double stop = 0; size_t count = 0; for (;;) { item[item.size() - 1] = L'0' + (count % 10); hist->add(item); count++; stop = timef(); if (stop >= end) break; } printf("%lu items - %.2f msec per item\n", (unsigned long)count, (stop - start) * 1E6 / count); hist->clear(); delete hist; } /** Main test */ int main(int argc, char **argv) { setlocale(LC_ALL, ""); srand(time(0)); configure_thread_assertions_for_testing(); program_name=L"(ignore)"; say(L"Testing low-level functionality"); say(L"Lines beginning with '(ignore):' are not errors, they are warning messages\ngenerated by the fish parser library when given broken input, and can be\nignored. All actual errors begin with 'Error:'."); set_main_thread(); setup_fork_guards(); proc_init(); event_init(); function_init(); builtin_init(); reader_init(); env_init(); test_format(); test_escape(); test_convert(); test_convert_nulls(); test_tok(); test_fork(); test_parser(); test_lru(); test_expand(); test_test(); test_path(); test_word_motion(); test_is_potential_path(); test_colors(); test_complete(); test_completion_insertions(); test_autosuggestion_combining(); test_autosuggest_suggest_special(); history_tests_t::test_history(); history_tests_t::test_history_merge(); history_tests_t::test_history_races(); history_tests_t::test_history_formats(); //history_tests_t::test_history_speed(); say(L"Encountered %d errors in low-level tests", err_count); /* Skip performance tests for now, since they seem to hang when running from inside make (?) */ // say( L"Testing performance" ); // perf_complete(); env_destroy(); reader_destroy(); builtin_destroy(); wutil_destroy(); event_destroy(); proc_destroy(); } fish/fishd.cpp000066400000000000000000000660501214535744100136250ustar00rootroot00000000000000/** \file fishd.c 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 communication between fish instances. When no clients are running, fishd will automatically shut down and save. \section fishd-commands Commands Fishd works by sending and receiving commands. Each command is ended with a newline. These are the commands supported by fishd:
set KEY:VALUE
set_export KEY:VALUE
These commands update the value of a variable. The only difference between the two is that set_export-variables should be exported to children of the process using them. When sending messages, all values below 32 or above 127 must be escaped using C-style backslash escapes. This means that the over the wire protocol is ASCII. However, any conforming reader must also accept non-ascii characters and interpret them as UTF-8. Lines containing invalid UTF-8 escape sequences must be ignored entirely.
erase KEY
Erase the variable with the specified name.
barrier
barrier_reply
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 #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include #include #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" #include "env_universal_common.h" #include "path.h" #include "print_help.h" #ifndef HOST_NAME_MAX /** Maximum length of hostname return. It is ok if this is too short, getting the actual hostname is not critical, so long as the string is unique in the filesystem namespace. */ #define HOST_NAME_MAX 255 #endif /** Maximum length of socket filename */ #ifndef UNIX_PATH_MAX #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 /* Length of a MAC address */ #define MAC_ADDRESS_MAX_LEN 6 /** Small greeting to show that fishd is running */ #define GREETING "# Fish universal variable daemon\n" /** Small not about not editing ~/.fishd manually. Inserted at the top of all .fishd files. */ #define SAVE_MSG "# This file is automatically generated by the fishd universal variable daemon.\n# Do NOT edit it directly, your changes will be overwritten.\n" /** The name of the save file. The machine identifier is appended to this. */ #define FILE "fishd." /** Maximum length of hostname. Longer hostnames are truncated */ #define HOSTNAME_LEN 32 /** The string to append to the socket name to name the lockfile */ #define LOCKPOSTFIX ".lock" /** The timeout in seconds on the lockfile for critical section */ #define LOCKTIMEOUT 1 /** Getopt short switches for fishd */ #define GETOPT_STRING "hv" /** The list of connections to clients */ typedef std::list connection_list_t; static connection_list_t connections; /** The socket to accept new clients on */ static int sock; /** Set to one when fishd should save and exit */ static int quit=0; /** Constructs the fish socket filename */ static std::string get_socket_filename(void) { const char *dir = getenv("FISHD_SOCKET_DIR"); char *uname = getenv("USER"); if (dir == NULL) { dir = "/tmp"; } if (uname == NULL) { const struct passwd *pw = getpwuid(getuid()); uname = pw->pw_name; } std::string name; name.reserve(strlen(dir)+ strlen(uname)+ strlen(SOCK_FILENAME) + 1); name.append(dir); name.push_back('/'); name.append(SOCK_FILENAME); name.append(uname); if (name.size() >= UNIX_PATH_MAX) { debug(1, L"Filename too long: '%s'", name.c_str()); exit(EXIT_FAILURE); } return name; } /** Signal handler for the term signal. */ static void handle_term(int signal) { quit=1; } /** Writes a pseudo-random number (between one and maxlen) of pseudo-random digits into str. str must point to an allocated buffer of size of at least maxlen chars. Returns the number of digits written. Since the randomness in part depends on machine time it has _some_ extra strength but still not enough for use in concurrent locking schemes on a single machine because gettimeofday may not return a different value on consecutive calls when: a) the OS does not support fine enough resolution b) the OS is running on an SMP machine. Additionally, gettimeofday errors are ignored. Excludes chars other than digits since ANSI C only guarantees that digits are consecutive. */ static void sprint_rand_digits(char *str, int maxlen) { int i, max; struct timeval tv; /* Seed the pseudo-random generator based on time - this assumes that consecutive calls to gettimeofday will return different values and ignores errors returned by gettimeofday. Cast to unsigned so that wrapping occurs on overflow as per ANSI C. */ static bool seeded = false; if (! seeded) { (void)gettimeofday(&tv, NULL); unsigned long long seed = tv.tv_sec + tv.tv_usec * 1000000ULL; srand((unsigned int)seed); seeded = true; } max = (int)(1 + (maxlen - 1) * (rand() / (RAND_MAX + 1.0))); for (i = 0; i < max; i++) { str[i] = '0' + 10 * (rand() / (RAND_MAX + 1.0)); } str[i] = 0; } /** Generate a filename unique in an NFS namespace by creating a copy of str and appending .{hostname}.{pid} to it. If gethostname() fails then a pseudo- random string is substituted for {hostname} - the randomness of the string should be strong enough across different machines. The main assumption though is that gethostname will not fail and this is just a "safe enough" fallback. The memory returned should be freed using free(). */ static std::string gen_unique_nfs_filename(const std::string &filename) { char hostname[HOST_NAME_MAX + 1]; char pid_str[256]; snprintf(pid_str, sizeof pid_str, "%ld", (long)getpid()); if (gethostname(hostname, sizeof hostname) != 0) { sprint_rand_digits(hostname, HOST_NAME_MAX); } std::string newname(filename); newname.push_back('.'); newname.append(hostname); newname.push_back('.'); newname.append(pid_str); return newname; } /* Thanks to Jan Brittenson http://lists.apple.com/archives/xcode-users/2009/May/msg00062.html */ #ifdef SIOCGIFHWADDR /* Linux */ #include static bool get_mac_address(unsigned char macaddr[MAC_ADDRESS_MAX_LEN], const char *interface = "eth0") { bool result = false; const int dummy = socket(AF_INET, SOCK_STREAM, 0); if (dummy >= 0) { struct ifreq r; strncpy((char *)r.ifr_name, interface, sizeof r.ifr_name - 1); r.ifr_name[sizeof r.ifr_name - 1] = 0; if (ioctl(dummy, SIOCGIFHWADDR, &r) >= 0) { memcpy(macaddr, r.ifr_hwaddr.sa_data, MAC_ADDRESS_MAX_LEN); result = true; } close(dummy); } return result; } #elif defined(HAVE_GETIFADDRS) /* OS X and BSD */ #include #include static bool get_mac_address(unsigned char macaddr[MAC_ADDRESS_MAX_LEN], const char *interface = "en0") { // BSD, Mac OS X struct ifaddrs *ifap; bool ok = false; if (getifaddrs(&ifap) == 0) { for (const ifaddrs *p = ifap; p; p = p->ifa_next) { if (p->ifa_addr->sa_family == AF_LINK) { if (p->ifa_name && p->ifa_name[0] && ! strcmp((const char*)p->ifa_name, interface)) { const sockaddr_dl& sdl = *(sockaddr_dl*)p->ifa_addr; size_t alen = sdl.sdl_alen; if (alen > MAC_ADDRESS_MAX_LEN) alen = MAC_ADDRESS_MAX_LEN; memcpy(macaddr, sdl.sdl_data + sdl.sdl_nlen, alen); ok = true; break; } } } freeifaddrs(ifap); } return ok; } #else /* Unsupported */ static bool get_mac_address(unsigned char macaddr[MAC_ADDRESS_MAX_LEN]) { return false; } #endif /* Function to get an identifier based on the hostname */ static bool get_hostname_identifier(std::string *result) { bool success = false; char hostname[HOSTNAME_LEN + 1] = {}; if (gethostname(hostname, HOSTNAME_LEN) == 0) { result->assign(hostname); success = true; } return success; } /* Get a sort of unique machine identifier. Prefer the MAC address; if that fails, fall back to the hostname; if that fails, pick something. */ static std::string get_machine_identifier(void) { std::string result; unsigned char mac_addr[MAC_ADDRESS_MAX_LEN] = {}; if (get_mac_address(mac_addr)) { result.reserve(2 * MAC_ADDRESS_MAX_LEN); for (size_t i=0; i < MAC_ADDRESS_MAX_LEN; i++) { char buff[3]; snprintf(buff, sizeof buff, "%02x", mac_addr[i]); result.append(buff); } } else if (get_hostname_identifier(&result)) { /* Hooray */ } else { /* Fallback */ result.assign("nohost"); } return result; } /** The number of milliseconds to wait between polls when attempting to acquire a lockfile */ #define LOCKPOLLINTERVAL 10 /** Attempt to acquire a lock based on a lockfile, waiting LOCKPOLLINTERVAL milliseconds between polls and timing out after timeout seconds, thereafter forcibly attempting to obtain the lock if force is non-zero. Returns 1 on success, 0 on failure. To release the lock the lockfile must be unlinked. A unique temporary file named by appending characters to the lockfile name is used; any pre-existing file of the same name is subject to deletion. */ static int acquire_lock_file(const std::string &lockfile_str, const int timeout, int force) { int fd, timed_out = 0; int ret = 0; /* early exit returns failure */ struct timespec pollint; struct timeval start, end; double elapsed; struct stat statbuf; const char * const lockfile = lockfile_str.c_str(); /* (Re)create a unique file and check that it has one only link. */ const std::string linkfile_str = gen_unique_nfs_filename(lockfile); const char * const linkfile = linkfile_str.c_str(); (void)unlink(linkfile); /* OK to not use CLO_EXEC here because fishd is single threaded */ if ((fd = open(linkfile, O_CREAT|O_RDONLY, 0600)) == -1) { debug(1, L"acquire_lock_file: open: %s", strerror(errno)); goto done; } /* Don't need to check exit status of close on read-only file descriptors */ close(fd); if (stat(linkfile, &statbuf) != 0) { debug(1, L"acquire_lock_file: stat: %s", strerror(errno)); goto done; } if (statbuf.st_nlink != 1) { debug(1, L"acquire_lock_file: number of hardlinks on unique " L"tmpfile is %d instead of 1.", (int)statbuf.st_nlink); goto done; } if (gettimeofday(&start, NULL) != 0) { debug(1, L"acquire_lock_file: gettimeofday: %s", strerror(errno)); goto done; } end = start; pollint.tv_sec = 0; pollint.tv_nsec = LOCKPOLLINTERVAL * 1000000; do { /* Try to create a hard link to the unique file from the lockfile. This will only succeed if the lockfile does not already exist. It is guaranteed to provide race-free semantics over NFS which the alternative of calling open(O_EXCL|O_CREAT) on the lockfile is not. The lock succeeds if the call to link returns 0 or the link count on the unique file increases to 2. */ if (link(linkfile, lockfile) == 0 || (stat(linkfile, &statbuf) == 0 && statbuf.st_nlink == 2)) { /* Successful lock */ ret = 1; break; } elapsed = end.tv_sec + end.tv_usec/1000000.0 - (start.tv_sec + start.tv_usec/1000000.0); /* The check for elapsed < 0 is to deal with the unlikely event that after the loop is entered the system time is set forward past the loop's end time. This would otherwise result in a (practically) infinite loop. */ if (timed_out || elapsed >= timeout || elapsed < 0) { if (timed_out == 0 && force) { /* Timed out and force was specified - attempt to remove stale lock and try a final time */ (void)unlink(lockfile); timed_out = 1; continue; } else { /* Timed out and final try was unsuccessful or force was not specified */ debug(1, L"acquire_lock_file: timed out " L"trying to obtain lockfile %s using " L"linkfile %s", lockfile, linkfile); break; } } nanosleep(&pollint, NULL); } while (gettimeofday(&end, NULL) == 0); done: /* The linkfile is not needed once the lockfile has been created */ (void)unlink(linkfile); return ret; } /** Acquire the lock for the socket Returns the name of the lock file if successful or NULL if unable to obtain lock. The returned string must be free()d after unlink()ing the file to release the lock */ static bool acquire_socket_lock(const std::string &sock_name, std::string *out_lockfile_name) { bool success = false; std::string lockfile; lockfile.reserve(sock_name.size() + strlen(LOCKPOSTFIX)); lockfile = sock_name; lockfile.append(LOCKPOSTFIX); if (acquire_lock_file(lockfile, LOCKTIMEOUT, 1)) { out_lockfile_name->swap(lockfile); success = true; } return success; } /** Connects to the fish socket and starts listening for connections */ static int get_socket(void) { int s, len, doexit = 0; int exitcode = EXIT_FAILURE; struct sockaddr_un local; const std::string sock_name = get_socket_filename(); /* Start critical section protected by lock */ std::string lockfile; if (! acquire_socket_lock(sock_name, &lockfile)) { debug(0, L"Unable to obtain lock on socket, exiting"); exit(EXIT_FAILURE); } debug(4, L"Acquired lockfile: %s", lockfile.c_str()); local.sun_family = AF_UNIX; strcpy(local.sun_path, sock_name.c_str()); len = sizeof(local); debug(1, L"Connect to socket at %s", sock_name.c_str()); if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { wperror(L"socket"); doexit = 1; goto unlock; } /* First check whether the socket has been opened by another fishd; if so, exit with success status */ if (connect(s, (struct sockaddr *)&local, len) == 0) { debug(1, L"Socket already exists, exiting"); doexit = 1; exitcode = 0; goto unlock; } unlink(local.sun_path); if (bind(s, (struct sockaddr *)&local, len) == -1) { wperror(L"bind"); doexit = 1; goto unlock; } if (make_fd_nonblocking(s) != 0) { wperror(L"fcntl"); close(s); doexit = 1; } else if (listen(s, 64) == -1) { wperror(L"listen"); doexit = 1; } unlock: (void)unlink(lockfile.c_str()); debug(4, L"Released lockfile: %s", lockfile.c_str()); /* End critical section protected by lock */ if (doexit) { exit_without_destructors(exitcode); } return s; } /** Event handler. Broadcasts updates to all clients. */ static void broadcast(fish_message_type_t type, const wchar_t *key, const wchar_t *val) { message_t *msg; if (connections.empty()) return; msg = create_message(type, key, val); /* Don't merge these loops, or try_send_all can free the message prematurely */ for (connection_list_t::iterator iter = connections.begin(); iter != connections.end(); ++iter) { msg->count++; iter->unsent.push(msg); } for (connection_list_t::iterator iter = connections.begin(); iter != connections.end(); ++iter) { try_send_all(&*iter); } } /** Make program into a creature of the night. */ static void daemonize() { /* Fork, and let parent exit */ switch (fork()) { case -1: debug(0, L"Could not put fishd in background. Quitting"); wperror(L"fork"); exit(1); case 0: { /* Ordinarily there's very limited things we will do after fork, due to multithreading. But fishd is safe because it's single threaded. So don't die in is_forked_child. */ setup_fork_guards(); /* Make fishd ignore the HUP signal. */ struct sigaction act; sigemptyset(& act.sa_mask); act.sa_flags=0; act.sa_handler=SIG_IGN; sigaction(SIGHUP, &act, 0); /* Make fishd save and exit on the TERM signal. */ sigfillset(& act.sa_mask); act.sa_flags=0; act.sa_handler=&handle_term; sigaction(SIGTERM, &act, 0); break; } default: { debug(0, L"Parent process exiting (This is normal)"); exit(0); } } /* Put ourself in out own processing group */ setsid(); /* Close stdin and stdout. We only use stderr, anyway. */ close(0); close(1); } /** Get environment variable value. */ static env_var_t fishd_env_get(const char *key) { const char *env = getenv(key); if (env != NULL) { return env_var_t(str2wcstring(env)); } else { const wcstring wkey = str2wcstring(key); const wchar_t *tmp = env_universal_common_get(wkey); return tmp ? env_var_t(tmp) : env_var_t::missing_var(); } } /** Get the configuration directory. The resulting string needs to be free'd. This is mostly the same code as path_get_config(), but had to be rewritten to avoid dragging in additional library dependencies. */ static wcstring fishd_get_config() { bool done = false; wcstring result; env_var_t xdg_dir = fishd_env_get("XDG_CONFIG_HOME"); if (! xdg_dir.missing_or_empty()) { result = xdg_dir; append_path_component(result, L"/fish"); if (!create_directory(result)) { done = true; } } else { env_var_t home = fishd_env_get("HOME"); if (! home.missing_or_empty()) { result = home; append_path_component(result, L"/.config/fish"); if (!create_directory(result)) { done = 1; } } } if (! done) { /* Bad juju */ debug(0, _(L"Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory where the current user has write access.")); result.clear(); } return result; } /** Load or save all variables */ static bool load_or_save_variables_at_path(bool save, const std::string &path) { bool result = false; debug(4, L"Open file for %s: '%s'", save?"saving":"loading", path.c_str()); /* OK to not use CLO_EXEC here because fishd is single threaded */ int fd = open(path.c_str(), save?(O_CREAT | O_TRUNC | O_WRONLY):O_RDONLY, 0600); if (fd >= 0) { /* Success */ result = true; connection_t c(fd); if (save) { /* Save to the file */ write_loop(c.fd, SAVE_MSG, strlen(SAVE_MSG)); enqueue_all(&c); } else { /* Read from the file */ read_message(&c); } connection_destroy(&c); } return result; } static std::string get_variables_file_path(const std::string &dir, const std::string &identifier) { std::string name; name.append(dir); name.append("/"); name.append(FILE); name.append(identifier); return name; } static bool load_or_save_variables(bool save) { const wcstring wdir = fishd_get_config(); const std::string dir = wcs2string(wdir); if (dir.empty()) return false; const std::string machine_id = get_machine_identifier(); const std::string machine_id_path = get_variables_file_path(dir, machine_id); bool success = load_or_save_variables_at_path(save, machine_id_path); if (! success && ! save && errno == ENOENT) { /* We failed to load, because the file was not found. Older fish used the hostname only. Try *moving* the filename based on the hostname into place; if that succeeds try again. Silently "upgraded." */ std::string hostname_id; if (get_hostname_identifier(&hostname_id) && hostname_id != machine_id) { std::string hostname_path = get_variables_file_path(dir, hostname_id); if (0 == rename(hostname_path.c_str(), machine_id_path.c_str())) { /* We renamed - try again */ success = load_or_save_variables_at_path(save, machine_id_path); } } } return success; } /** Load variables from disk */ static void load() { load_or_save_variables(false /* load, not save */); } /** Save variables to disk */ static void save() { load_or_save_variables(true /* save, not load */); } /** Do all sorts of boring initialization. */ static void init() { sock = get_socket(); daemonize(); env_universal_common_init(&broadcast); load(); } /** Main function for fishd */ int main(int argc, char ** argv) { int child_socket; struct sockaddr_un remote; socklen_t t; int max_fd; int update_count=0; fd_set read_fd, write_fd; set_main_thread(); setup_fork_guards(); program_name=L"fishd"; wsetlocale(LC_ALL, L""); /* Parse options */ while (1) { 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, GETOPT_STRING, long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: break; case 'h': print_help(argv[0], 1); exit(0); case 'v': debug(0, L"%ls, version %s\n", program_name, PACKAGE_VERSION); exit(0); case '?': return 1; } } init(); while (1) { int res; t = sizeof(remote); FD_ZERO(&read_fd); FD_ZERO(&write_fd); FD_SET(sock, &read_fd); max_fd = sock+1; for (connection_list_t::const_iterator iter = connections.begin(); iter != connections.end(); ++iter) { const connection_t &c = *iter; FD_SET(c.fd, &read_fd); max_fd = maxi(max_fd, c.fd+1); if (! c.unsent.empty()) { FD_SET(c.fd, &write_fd); } } while (1) { res=select(max_fd, &read_fd, &write_fd, 0, 0); if (quit) { save(); exit(0); } if (res != -1) break; if (errno != EINTR) { wperror(L"select"); exit(1); } } if (FD_ISSET(sock, &read_fd)) { if ((child_socket = accept(sock, (struct sockaddr *)&remote, &t)) == -1) { wperror(L"accept"); exit(1); } else { debug(4, L"Connected with new child on fd %d", child_socket); if (make_fd_nonblocking(child_socket) != 0) { wperror(L"fcntl"); close(child_socket); } else { connections.push_front(connection_t(child_socket)); connection_t &newc = connections.front(); send(newc.fd, GREETING, strlen(GREETING), MSG_DONTWAIT); enqueue_all(&newc); } } } for (connection_list_t::iterator iter = connections.begin(); iter != connections.end(); ++iter) { if (FD_ISSET(iter->fd, &write_fd)) { try_send_all(&*iter); } } for (connection_list_t::iterator iter = connections.begin(); iter != connections.end(); ++iter) { if (FD_ISSET(iter->fd, &read_fd)) { read_message(&*iter); /* Occasionally we save during normal use, so that we won't lose everything on a system crash */ update_count++; if (update_count >= 64) { save(); update_count = 0; } } } for (connection_list_t::iterator iter = connections.begin(); iter != connections.end();) { if (iter->killme) { debug(4, L"Close connection %d", iter->fd); while (! iter->unsent.empty()) { message_t *msg = iter->unsent.front(); iter->unsent.pop(); msg->count--; if (! msg->count) free(msg); } connection_destroy(&*iter); iter = connections.erase(iter); } else { ++iter; } } if (connections.empty()) { debug(0, L"No more clients. Quitting"); save(); break; } } } fish/function.cpp000066400000000000000000000242011214535744100143450ustar00rootroot00000000000000/** \file function.c Prototypes for functions for storing and retrieving function information. These functions also take care of autoloading functions in the $fish_function_path. Actual function evaluation is taken care of by the parser and to some degree the builtin handling library. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include "wutil.h" #include "fallback.h" #include "util.h" #include "function.h" #include "proc.h" #include "parser.h" #include "common.h" #include "intern.h" #include "event.h" #include "reader.h" #include "parse_util.h" #include "parser_keywords.h" #include "env.h" #include "expand.h" /** Table containing all functions */ typedef std::map function_map_t; static function_map_t loaded_functions; /* Lock for functions */ static pthread_mutex_t functions_lock; /* Autoloader for functions */ class function_autoload_t : public autoload_t { public: function_autoload_t(); virtual void command_removed(const wcstring &cmd); }; static function_autoload_t function_autoloader; /** Constructor */ function_autoload_t::function_autoload_t() : autoload_t(L"fish_function_path", NULL, 0) { } /** Removes a function from our internal table, returning true if it was found and false if not */ static bool function_remove_ignore_autoload(const wcstring &name); /** Callback when an autoloaded function is removed */ void function_autoload_t::command_removed(const wcstring &cmd) { function_remove_ignore_autoload(cmd); } /* Helper macro for vomiting */ #define VOMIT_ON_FAILURE(a) do { if (0 != (a)) { int err = errno; fprintf(stderr, "%s failed on line %d in file %s: %d (%s)\n", #a, __LINE__, __FILE__, err, strerror(err)); abort(); }} while (0) /** Kludgy flag set by the load function in order to tell function_add that the function being defined is autoloaded. There should be a better way to do this... */ static bool is_autoload = false; /** Make sure that if the specified function is a dynamically loaded function, it has been fully loaded. */ static int load(const wcstring &name) { ASSERT_IS_MAIN_THREAD(); scoped_lock lock(functions_lock); bool was_autoload = is_autoload; int res; function_map_t::iterator iter = loaded_functions.find(name); if (iter != loaded_functions.end() && !iter->second.is_autoload) { /* We have a non-autoload version already */ return 0; } is_autoload = true; res = function_autoloader.load(name, true); is_autoload = was_autoload; return res; } /** Insert a list of all dynamically loaded functions into the specified list. */ static void autoload_names(std::set &names, int get_hidden) { size_t i; const env_var_t path_var_wstr = env_get_string(L"fish_function_path"); if (path_var_wstr.missing()) return; const wchar_t *path_var = path_var_wstr.c_str(); wcstring_list_t path_list; tokenize_variable_array(path_var, path_list); for (i=0; itok_pos) - 1; const function_map_t::value_type new_pair(data.name, function_info_t(data, filename, def_offset, is_autoload)); loaded_functions.insert(new_pair); /* Add event handlers */ for (std::vector::const_iterator iter = data.events.begin(); iter != data.events.end(); ++iter) { event_add_handler(*iter); } } int function_exists(const wcstring &cmd) { if (parser_keywords_is_reserved(cmd)) return 0; scoped_lock lock(functions_lock); load(cmd); return loaded_functions.find(cmd) != loaded_functions.end(); } int function_exists_no_autoload(const wcstring &cmd, const env_vars_snapshot_t &vars) { if (parser_keywords_is_reserved(cmd)) return 0; scoped_lock lock(functions_lock); return loaded_functions.find(cmd) != loaded_functions.end() || function_autoloader.can_load(cmd, vars); } static bool function_remove_ignore_autoload(const wcstring &name) { scoped_lock lock(functions_lock); bool erased = (loaded_functions.erase(name) > 0); if (erased) { event_t ev(EVENT_ANY); ev.function_name=name; event_remove(ev); } return erased; } void function_remove(const wcstring &name) { if (function_remove_ignore_autoload(name)) function_autoloader.unload(name); } static const function_info_t *function_get(const wcstring &name) { // The caller must lock the functions_lock before calling this; however our mutex is currently recursive, so trylock will never fail // We need a way to correctly check if a lock is locked (or better yet, make our lock non-recursive) //ASSERT_IS_LOCKED(functions_lock); function_map_t::iterator iter = loaded_functions.find(name); if (iter == loaded_functions.end()) { return NULL; } else { return &iter->second; } } bool function_get_definition(const wcstring &name, wcstring *out_definition) { scoped_lock lock(functions_lock); const function_info_t *func = function_get(name); if (func && out_definition) { out_definition->assign(func->definition); } return func != NULL; } wcstring_list_t function_get_named_arguments(const wcstring &name) { scoped_lock lock(functions_lock); const function_info_t *func = function_get(name); return func ? func->named_arguments : wcstring_list_t(); } int function_get_shadows(const wcstring &name) { scoped_lock lock(functions_lock); const function_info_t *func = function_get(name); return func ? func->shadows : false; } bool function_get_desc(const wcstring &name, wcstring *out_desc) { /* Empty length string goes to NULL */ scoped_lock lock(functions_lock); const function_info_t *func = function_get(name); if (out_desc && func && ! func->description.empty()) { out_desc->assign(_(func->description.c_str())); return true; } else { return false; } } void function_set_desc(const wcstring &name, const wcstring &desc) { load(name); scoped_lock lock(functions_lock); function_map_t::iterator iter = loaded_functions.find(name); if (iter != loaded_functions.end()) { iter->second.description = desc; } } bool function_copy(const wcstring &name, const wcstring &new_name) { bool result = false; scoped_lock lock(functions_lock); function_map_t::const_iterator iter = loaded_functions.find(name); if (iter != loaded_functions.end()) { // This new instance of the function shouldn't be tied to the definition file of the original, so pass NULL filename, etc. const function_map_t::value_type new_pair(new_name, function_info_t(iter->second, NULL, 0, false)); loaded_functions.insert(new_pair); result = true; } return result; } wcstring_list_t function_get_names(int get_hidden) { std::set names; scoped_lock lock(functions_lock); autoload_names(names, get_hidden); function_map_t::const_iterator iter; for (iter = loaded_functions.begin(); iter != loaded_functions.end(); ++iter) { const wcstring &name = iter->first; /* Maybe skip hidden */ if (! get_hidden) { if (name.empty() || name.at(0) == L'_') continue; } names.insert(name); } return wcstring_list_t(names.begin(), names.end()); } const wchar_t *function_get_definition_file(const wcstring &name) { scoped_lock lock(functions_lock); const function_info_t *func = function_get(name); return func ? func->definition_file : NULL; } int function_get_definition_offset(const wcstring &name) { scoped_lock lock(functions_lock); const function_info_t *func = function_get(name); return func ? func->definition_offset : -1; } fish/function.h000066400000000000000000000113651214535744100140210ustar00rootroot00000000000000/** \file function.h Prototypes for functions for storing and retrieving function information. These functions also take care of autoloading functions in the $fish_function_path. Actual function evaluation is taken care of by the parser and to some degree the builtin handling library. */ #ifndef FISH_FUNCTION_H #define FISH_FUNCTION_H #include #include "util.h" #include "common.h" #include "event.h" class parser_t; class env_vars_snapshot_t; /** Structure describing a function. This is used by the parser to store data on a function while parsing it. It is not used internally to store functions, the function_internal_data_t structure is used for that purpose. Parhaps these two should be merged. */ struct function_data_t { /** Name of function */ wcstring name; /** Description of function */ wcstring description; /** Function definition */ wchar_t *definition; /** List of all event handlers for this function */ std::vector events; /** List of all named arguments for this function */ wcstring_list_t named_arguments; /** Set to non-zero if invoking this function shadows the variables of the underlying function. */ int shadows; }; class function_info_t { public: /** Constructs relevant information from the function_data */ function_info_t(const function_data_t &data, const wchar_t *filename, int def_offset, bool autoload); /** Used by function_copy */ function_info_t(const function_info_t &data, const wchar_t *filename, int def_offset, bool autoload); /** Function definition */ const wcstring definition; /** Function description. Only the description may be changed after the function is created. */ wcstring description; /** File where this function was defined (intern'd string) */ const wchar_t * const definition_file; /** Line where definition started */ const int definition_offset; /** List of all named arguments for this function */ const wcstring_list_t named_arguments; /** Flag for specifying that this function was automatically loaded */ const bool is_autoload; /** Set to true if invoking this function shadows the variables of the underlying function. */ const bool shadows; }; /** Initialize function data */ void function_init(); /** Add a function. */ void function_add(const function_data_t &data, const parser_t &parser); /** Remove the function with the specified name. */ void function_remove(const wcstring &name); /** Returns by reference the definition of the function with the name \c name. Returns true if successful, false if no function with the given name exists. */ bool function_get_definition(const wcstring &name, wcstring *out_definition); /** Returns by reference the description of the function with the name \c name. Returns true if the function exists and has a nonempty description, false if it does not. */ bool function_get_desc(const wcstring &name, wcstring *out_desc); /** Sets the description of the function with the name \c name. */ void function_set_desc(const wcstring &name, const wcstring &desc); /** Returns true if the function with the name name exists. */ int function_exists(const wcstring &name); /** Returns true if the function with the name name exists, without triggering autoload. */ int function_exists_no_autoload(const wcstring &name, const env_vars_snapshot_t &vars); /** Returns all function names. \param get_hidden whether to include hidden functions, i.e. ones starting with an underscore */ wcstring_list_t function_get_names(int get_hidden); /** Returns tha absolute path of the file where the specified function was defined. Returns 0 if the file was defined on the commandline. This function does not autoload functions, it will only work on functions that have already been defined. This returns an intern'd string. */ const wchar_t *function_get_definition_file(const wcstring &name); /** Returns the linenumber where the definition of the specified function started. This function does not autoload functions, it will only work on functions that have already been defined. */ int function_get_definition_offset(const wcstring &name); /** Returns a list of all named arguments of the specified function. */ wcstring_list_t function_get_named_arguments(const wcstring &name); /** Creates a new function using the same definition as the specified function. Returns true if copy is successful. */ bool function_copy(const wcstring &name, const wcstring &new_name); /** Returns whether this function shadows variables of the underlying function */ int function_get_shadows(const wcstring &name); #endif fish/highlight.cpp000066400000000000000000001456211214535744100145010ustar00rootroot00000000000000/** \file highlight.c Functions for syntax highlighting */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "highlight.h" #include "tokenizer.h" #include "proc.h" #include "parser.h" #include "parse_util.h" #include "parser_keywords.h" #include "builtin.h" #include "function.h" #include "env.h" #include "expand.h" #include "sanity.h" #include "common.h" #include "complete.h" #include "output.h" #include "wildcard.h" #include "path.h" #include "history.h" /** Number of elements in the highlight_var array */ #define VAR_COUNT ( sizeof(highlight_var)/sizeof(wchar_t *) ) static void highlight_universal_internal(const wcstring &buff, std::vector &color, size_t pos); /** The environment variables used to specify the color of different tokens. */ static const wchar_t * const highlight_var[] = { L"fish_color_normal", L"fish_color_error", L"fish_color_command", L"fish_color_end", L"fish_color_param", L"fish_color_comment", L"fish_color_match", L"fish_color_search_match", L"fish_color_operator", L"fish_color_escape", L"fish_color_quote", L"fish_color_redirection", L"fish_color_valid_path", L"fish_color_autosuggestion" }; /* If the given path looks like it's relative to the working directory, then prepend that working directory. */ static wcstring apply_working_directory(const wcstring &path, const wcstring &working_directory) { if (path.empty() || working_directory.empty()) return path; /* We're going to make sure that if we want to prepend the wd, that the string has no leading / */ bool prepend_wd; switch (path.at(0)) { case L'/': case L'~': prepend_wd = false; break; default: prepend_wd = true; break; } if (! prepend_wd) { /* No need to prepend the wd, so just return the path we were given */ return path; } else { /* Remove up to one ./ */ wcstring path_component = path; if (string_prefixes_string(L"./", path_component)) { path_component.erase(0, 2); } /* Removing leading /s */ while (string_prefixes_string(L"/", path_component)) { path_component.erase(0, 1); } /* Construct and return a new path */ wcstring new_path = working_directory; append_path_component(new_path, path_component); return new_path; } } /* Determine if the filesystem containing the given fd is case insensitive. */ typedef std::map case_sensitivity_cache_t; bool fs_is_case_insensitive(const wcstring &path, int fd, case_sensitivity_cache_t &case_sensitivity_cache) { /* If _PC_CASE_SENSITIVE is not defined, assume case sensitive */ bool result = false; #ifdef _PC_CASE_SENSITIVE /* Try the cache first */ case_sensitivity_cache_t::iterator cache = case_sensitivity_cache.find(path); if (cache != case_sensitivity_cache.end()) { /* Use the cached value */ result = cache->second; } else { /* Ask the system. A -1 value means error (so assume case sensitive), a 1 value means case sensitive, and a 0 value means case insensitive */ long ret = fpathconf(fd, _PC_CASE_SENSITIVE); result = (ret == 0); case_sensitivity_cache[path] = result; } #endif return result; } /* Tests whether the specified string cpath is the prefix of anything we could cd to. directories is a list of possible parent directories (typically either the working directory, or the cdpath). This does I/O! We expect the path to already be unescaped. */ bool is_potential_path(const wcstring &const_path, const wcstring_list_t &directories, path_flags_t flags, wcstring *out_path) { ASSERT_IS_BACKGROUND_THREAD(); const bool require_dir = !!(flags & PATH_REQUIRE_DIR); wcstring clean_path; int has_magic = 0; bool result = false; wcstring path(const_path); if (flags & PATH_EXPAND_TILDE) expand_tilde(path); // debug( 1, L"%ls -> %ls ->%ls", path, tilde, unescaped ); for (size_t i=0; i < path.size(); i++) { wchar_t c = path.at(i); switch (c) { case PROCESS_EXPAND: case VARIABLE_EXPAND: case VARIABLE_EXPAND_SINGLE: case BRACKET_BEGIN: case BRACKET_END: case BRACKET_SEP: case ANY_CHAR: case ANY_STRING: case ANY_STRING_RECURSIVE: { has_magic = 1; break; } case INTERNAL_SEPARATOR: { break; } default: { clean_path.push_back(c); break; } } } if (! has_magic && ! clean_path.empty()) { /* Don't test the same path multiple times, which can happen if the path is absolute and the CDPATH contains multiple entries */ std::set checked_paths; /* Keep a cache of which paths / filesystems are case sensitive */ case_sensitivity_cache_t case_sensitivity_cache; for (size_t wd_idx = 0; wd_idx < directories.size() && ! result; wd_idx++) { const wcstring &wd = directories.at(wd_idx); const wcstring abs_path = apply_working_directory(clean_path, wd); /* Skip this if it's empty or we've already checked it */ if (abs_path.empty() || checked_paths.count(abs_path)) continue; checked_paths.insert(abs_path); /* If we end with a slash, then it must be a directory */ bool must_be_full_dir = abs_path.at(abs_path.size()-1) == L'/'; if (must_be_full_dir) { struct stat buf; if (0 == wstat(abs_path, &buf) && S_ISDIR(buf.st_mode)) { result = true; /* Return the path suffix, not the whole absolute path */ if (out_path) *out_path = clean_path; } } else { DIR *dir = NULL; /* We do not end with a slash; it does not have to be a directory */ const wcstring dir_name = wdirname(abs_path); const wcstring base_name = wbasename(abs_path); if (dir_name == L"/" && base_name == L"/") { result = true; if (out_path) *out_path = clean_path; } else if ((dir = wopendir(dir_name))) { // We opened the dir_name; look for a string where the base name prefixes it wcstring ent; // Check if we're case insensitive bool case_insensitive = fs_is_case_insensitive(dir_name, dirfd(dir), case_sensitivity_cache); // Don't ask for the is_dir value unless we care, because it can cause extra filesystem acces */ bool is_dir = false; while (wreaddir_resolving(dir, dir_name, ent, require_dir ? &is_dir : NULL)) { /* Determine which function to call to check for prefixes */ bool (*prefix_func)(const wcstring &, const wcstring &); if (case_insensitive) { prefix_func = string_prefixes_string_case_insensitive; } else { prefix_func = string_prefixes_string; } if (prefix_func(base_name, ent) && (! require_dir || is_dir)) { result = true; if (out_path) { /* We want to return the path in the same "form" as it was given. Take the given path, get its basename. Append that to the output if the basename actually prefixes the path (which it won't if the given path contains no slashes), and isn't a slash (so we don't duplicate slashes). Then append the directory entry. */ out_path->clear(); const wcstring path_base = wdirname(const_path); if (prefix_func(path_base, const_path)) { out_path->append(path_base); if (! string_suffixes_string(L"/", *out_path)) out_path->push_back(L'/'); } out_path->append(ent); /* We actually do want a trailing / for directories, since it makes autosuggestion a bit nicer */ if (is_dir) out_path->push_back(L'/'); } break; } } closedir(dir); } } } } return result; } /* Given a string, return whether it prefixes a path that we could cd into. Return that path in out_path. Expects path to be unescaped. */ static bool is_potential_cd_path(const wcstring &path, const wcstring &working_directory, path_flags_t flags, wcstring *out_path) { wcstring_list_t directories; if (string_prefixes_string(L"./", path)) { /* Ignore the CDPATH in this case; just use the working directory */ directories.push_back(working_directory); } else { /* Get the CDPATH */ env_var_t cdpath = env_get_string(L"CDPATH"); if (cdpath.missing_or_empty()) cdpath = L"."; /* Tokenize it into directories */ wcstokenizer tokenizer(cdpath, ARRAY_SEP_STR); wcstring next_path; while (tokenizer.next(next_path)) { /* Ensure that we use the working directory for relative cdpaths like "." */ directories.push_back(apply_working_directory(next_path, working_directory)); } } /* Call is_potential_path with all of these directories */ bool result = is_potential_path(path, directories, flags | PATH_REQUIRE_DIR, out_path); #if 0 if (out_path) { printf("%ls -> %ls\n", path.c_str(), out_path->c_str()); } #endif return result; } rgb_color_t highlight_get_color(int highlight, bool is_background) { size_t idx=0; rgb_color_t result; if (highlight < 0) return rgb_color_t::normal(); if (highlight > (1< %d -> %ls", highlight, idx, val ); if (val_wstr.missing()) val_wstr = env_get_string(highlight_var[0]); if (! val_wstr.missing()) result = parse_color(val_wstr, is_background); if (highlight & HIGHLIGHT_VALID_PATH) { env_var_t val2_wstr = env_get_string(L"fish_color_valid_path"); const wcstring val2 = val2_wstr.missing() ? L"" : val2_wstr.c_str(); rgb_color_t result2 = parse_color(val2, is_background); if (result.is_normal()) result = result2; else { if (result2.is_bold()) result.set_bold(true); if (result2.is_underline()) result.set_underline(true); } } return result; } /** Highlight operators (such as $, ~, %, as well as escaped characters. */ static void highlight_param(const wcstring &buffstr, std::vector &colors, wcstring_list_t *error) { const wchar_t * const buff = buffstr.c_str(); enum {e_unquoted, e_single_quoted, e_double_quoted} mode = e_unquoted; size_t in_pos, len = buffstr.size(); int bracket_count=0; int normal_status = colors.at(0); for (in_pos=0; in_pos^ \\#;|&", buff[in_pos])) { colors.at(start_pos)=HIGHLIGHT_ESCAPE; colors.at(in_pos+1)=normal_status; } else if (wcschr(L"c", buff[in_pos])) { colors.at(start_pos)=HIGHLIGHT_ESCAPE; if (in_pos+2 < colors.size()) colors.at(in_pos+2)=normal_status; } else if (wcschr(L"uUxX01234567", buff[in_pos])) { int i; long long res=0; int chars=2; int base=16; wchar_t max_val = ASCII_MAX; switch (buff[in_pos]) { case L'u': { chars=4; max_val = UCS2_MAX; break; } case L'U': { chars=8; max_val = WCHAR_MAX; break; } case L'x': { break; } case L'X': { max_val = BYTE_MAX; break; } default: { base=8; chars=3; in_pos--; break; } } for (i=0; i= EXPAND_RESERVED && *str <= EXPAND_RESERVED_END) { return 1; } str++; } return 0; } /* Parse a command line. Return by reference the last command, its arguments, and the offset in the string of the beginning of the last argument. This is used by autosuggestions */ static bool autosuggest_parse_command(const wcstring &str, wcstring *out_command, wcstring_list_t *out_arguments, int *out_last_arg_pos) { if (str.empty()) return false; wcstring cmd; wcstring_list_t args; int arg_pos = -1; bool had_cmd = false; tokenizer_t tok(str.c_str(), TOK_ACCEPT_UNFINISHED | TOK_SQUASH_ERRORS); for (; tok_has_next(&tok); tok_next(&tok)) { int last_type = tok_last_type(&tok); switch (last_type) { case TOK_STRING: { if (had_cmd) { /* Parameter to the command. We store these escaped. */ args.push_back(tok_last(&tok)); arg_pos = tok_get_pos(&tok); } else { /* Command. First check that the command actually exists. */ wcstring local_cmd = tok_last(&tok); bool expanded = expand_one(cmd, EXPAND_SKIP_CMDSUBST | EXPAND_SKIP_VARIABLES); if (! expanded || has_expand_reserved(cmd.c_str())) { /* We can't expand this cmd, ignore it */ } else { bool is_subcommand = false; int mark = tok_get_pos(&tok); if (parser_keywords_is_subcommand(cmd)) { int sw; tok_next(&tok); sw = parser_keywords_is_switch(tok_last(&tok)); if (!parser_keywords_is_block(cmd) && sw == ARG_SWITCH) { /* It's an argument to the subcommand itself */ } else { if (sw == ARG_SKIP) mark = tok_get_pos(&tok); is_subcommand = true; } tok_set_pos(&tok, mark); } if (!is_subcommand) { /* It's really a command */ had_cmd = true; cmd = local_cmd; } } } break; } case TOK_REDIRECT_NOCLOB: case TOK_REDIRECT_OUT: case TOK_REDIRECT_IN: case TOK_REDIRECT_APPEND: case TOK_REDIRECT_FD: { if (!had_cmd) { break; } tok_next(&tok); break; } case TOK_PIPE: case TOK_BACKGROUND: case TOK_END: { had_cmd = false; cmd.clear(); args.clear(); arg_pos = -1; break; } case TOK_COMMENT: case TOK_ERROR: default: { break; } } } /* Remember our command if we have one */ if (had_cmd) { if (out_command) out_command->swap(cmd); if (out_arguments) out_arguments->swap(args); if (out_last_arg_pos) *out_last_arg_pos = arg_pos; } return had_cmd; } /* We have to return an escaped string here */ bool autosuggest_suggest_special(const wcstring &str, const wcstring &working_directory, wcstring &outSuggestion) { if (str.empty()) return false; ASSERT_IS_BACKGROUND_THREAD(); /* Parse the string */ wcstring parsed_command; wcstring_list_t parsed_arguments; int parsed_last_arg_pos = -1; if (! autosuggest_parse_command(str, &parsed_command, &parsed_arguments, &parsed_last_arg_pos)) { return false; } bool result = false; if (parsed_command == L"cd" && ! parsed_arguments.empty()) { /* We can possibly handle this specially */ const wcstring escaped_dir = parsed_arguments.back(); wcstring suggested_path; /* We always return true because we recognized the command. This prevents us from falling back to dumber algorithms; for example we won't suggest a non-directory for the cd command. */ result = true; outSuggestion.clear(); /* Unescape the parameter */ wcstring unescaped_dir = escaped_dir; bool unescaped = unescape_string(unescaped_dir, UNESCAPE_INCOMPLETE); /* Determine the quote type we got from the input directory. */ wchar_t quote = L'\0'; parse_util_get_parameter_info(escaped_dir, 0, "e, NULL, NULL); /* Big hack to avoid expanding a tilde inside quotes */ path_flags_t path_flags = (quote == L'\0') ? PATH_EXPAND_TILDE : 0; if (unescaped && is_potential_cd_path(unescaped_dir, working_directory, path_flags, &suggested_path)) { /* Note: this looks really wrong for strings that have an "unescapable" character in them, e.g. a \t, because parse_util_escape_string_with_quote will insert that character */ wcstring escaped_suggested_path = parse_util_escape_string_with_quote(suggested_path, quote); /* Return it */ outSuggestion = str; outSuggestion.erase(parsed_last_arg_pos); if (quote != L'\0') outSuggestion.push_back(quote); outSuggestion.append(escaped_suggested_path); if (quote != L'\0') outSuggestion.push_back(quote); } } else { /* Either an error or some other command, so we don't handle it specially */ } return result; } bool autosuggest_validate_from_history(const history_item_t &item, file_detection_context_t &detector, const wcstring &working_directory, const env_vars_snapshot_t &vars) { ASSERT_IS_BACKGROUND_THREAD(); bool handled = false, suggestionOK = false; /* Parse the string */ wcstring parsed_command; wcstring_list_t parsed_arguments; int parsed_last_arg_pos = -1; if (! autosuggest_parse_command(item.str(), &parsed_command, &parsed_arguments, &parsed_last_arg_pos)) return false; if (parsed_command == L"cd" && ! parsed_arguments.empty()) { /* We can possibly handle this specially */ wcstring dir = parsed_arguments.back(); if (expand_one(dir, EXPAND_SKIP_CMDSUBST)) { handled = true; bool is_help = string_prefixes_string(dir, L"--help") || string_prefixes_string(dir, L"-h"); if (is_help) { suggestionOK = false; } else { wcstring path; bool can_cd = path_get_cdpath(dir, &path, working_directory.c_str(), vars); if (! can_cd) { suggestionOK = false; } else if (paths_are_same_file(working_directory, path)) { /* Don't suggest the working directory as the path! */ suggestionOK = false; } else { suggestionOK = true; } } } } /* If not handled specially, handle it here */ if (! handled) { bool cmd_ok = false; if (path_get_path(parsed_command, NULL)) { cmd_ok = true; } else if (builtin_exists(parsed_command) || function_exists_no_autoload(parsed_command, vars)) { cmd_ok = true; } if (cmd_ok) { const path_list_t &paths = item.get_required_paths(); if (paths.empty()) { suggestionOK= true; } else { detector.potential_paths = paths; suggestionOK = detector.paths_are_valid(paths); } } } return suggestionOK; } // This function does I/O static void tokenize(const wchar_t * const buff, std::vector &color, const size_t pos, wcstring_list_t *error, const wcstring &working_directory, const env_vars_snapshot_t &vars) { ASSERT_IS_BACKGROUND_THREAD(); wcstring cmd; int had_cmd=0; wcstring last_cmd; int accept_switches = 1; int use_function = 1; int use_command = 1; int use_builtin = 1; CHECK(buff,); if (buff[0] == L'\0') return; std::fill(color.begin(), color.end(), -1); tokenizer_t tok(buff, TOK_SHOW_COMMENTS | TOK_SQUASH_ERRORS); for (; tok_has_next(&tok); tok_next(&tok)) { int last_type = tok_last_type(&tok); switch (last_type) { case TOK_STRING: { if (had_cmd) { /*Parameter */ const wchar_t *param = tok_last(&tok); if (param[0] == L'-') { if (wcscmp(param, L"--") == 0) { accept_switches = 0; color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; } else if (accept_switches) { if (complete_is_valid_option(last_cmd, param, error, false /* no autoload */)) color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; else color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; } else { color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; } } else { color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; } if (cmd == L"cd") { wcstring dir = tok_last(&tok); if (expand_one(dir, EXPAND_SKIP_CMDSUBST)) { int is_help = string_prefixes_string(dir, L"--help") || string_prefixes_string(dir, L"-h"); if (!is_help && ! is_potential_cd_path(dir, working_directory, PATH_EXPAND_TILDE, NULL)) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; } } } /* Highlight the parameter. highlight_param wants to write one more color than we have characters (hysterical raisins) so allocate one more in the vector. But don't copy it back. */ const wcstring param_str = param; size_t tok_pos = tok_get_pos(&tok); std::vector::const_iterator where = color.begin() + tok_pos; std::vector subcolors(where, where + param_str.size()); subcolors.push_back(-1); highlight_param(param_str, subcolors, error); /* Copy the subcolors back into our colors array */ std::copy(subcolors.begin(), subcolors.begin() + param_str.size(), color.begin() + tok_pos); } else { /* Command. First check that the command actually exists. */ cmd = tok_last(&tok); bool expanded = expand_one(cmd, EXPAND_SKIP_CMDSUBST | EXPAND_SKIP_VARIABLES | EXPAND_SKIP_JOBS); if (! expanded || has_expand_reserved(cmd.c_str())) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; } else { bool is_cmd = false; int is_subcommand = 0; int mark = tok_get_pos(&tok); color.at(tok_get_pos(&tok)) = HIGHLIGHT_COMMAND; if (parser_keywords_is_subcommand(cmd)) { int sw; if (cmd == L"builtin") { use_function = 0; use_command = 0; use_builtin = 1; } else if (cmd == L"command") { use_command = 1; use_function = 0; use_builtin = 0; } tok_next(&tok); sw = parser_keywords_is_switch(tok_last(&tok)); if (!parser_keywords_is_block(cmd) && sw == ARG_SWITCH) { /* The 'builtin' and 'command' builtins are normally followed by another command, but if they are invoked with a switch, they aren't. */ use_command = 1; use_function = 1; use_builtin = 2; } else { if (sw == ARG_SKIP) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; mark = tok_get_pos(&tok); } is_subcommand = 1; } tok_set_pos(&tok, mark); } if (!is_subcommand) { /* OK, this is a command, it has been successfully expanded and everything looks ok. Lets check if the command exists. */ /* First check if it is a builtin or function, since we don't have to stat any files for that */ if (! is_cmd && use_builtin) is_cmd = builtin_exists(cmd); if (! is_cmd && use_function) is_cmd = function_exists_no_autoload(cmd, vars); /* Moving on to expensive tests */ /* Check if this is a regular command */ if (! is_cmd && use_command) { is_cmd = path_get_path(cmd, NULL, vars); } /* Maybe it is a path for a implicit cd command. */ if (! is_cmd) { if (use_builtin || (use_function && function_exists_no_autoload(L"cd", vars))) is_cmd = path_can_be_implicit_cd(cmd, NULL, working_directory.c_str(), vars); } if (is_cmd) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_COMMAND; } else { if (error) { error->push_back(format_string(L"Unknown command \'%ls\'", cmd.c_str())); } color.at(tok_get_pos(&tok)) = (HIGHLIGHT_ERROR); } had_cmd = 1; } if (had_cmd) { last_cmd = tok_last(&tok); } } } break; } case TOK_REDIRECT_NOCLOB: case TOK_REDIRECT_OUT: case TOK_REDIRECT_IN: case TOK_REDIRECT_APPEND: case TOK_REDIRECT_FD: { if (!had_cmd) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; if (error) error->push_back(L"Redirection without a command"); break; } wcstring target_str; const wchar_t *target=NULL; color.at(tok_get_pos(&tok)) = HIGHLIGHT_REDIRECTION; tok_next(&tok); /* Check that we are redirecting into a file */ switch (tok_last_type(&tok)) { case TOK_STRING: { target_str = tok_last(&tok); if (expand_one(target_str, EXPAND_SKIP_CMDSUBST)) { target = target_str.c_str(); } /* Redirect filename may contain a cmdsubst. If so, it will be ignored/not flagged. */ } break; default: { size_t pos = tok_get_pos(&tok); if (pos < color.size()) { color.at(pos) = HIGHLIGHT_ERROR; } if (error) error->push_back(L"Invalid redirection"); } } if (target != 0) { wcstring dir = target; size_t slash_idx = dir.find_last_of(L'/'); struct stat buff; /* If file is in directory other than '.', check that the directory exists. */ if (slash_idx != wcstring::npos) { dir.resize(slash_idx); if (wstat(dir, &buff) == -1) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; if (error) error->push_back(format_string(L"Directory \'%ls\' does not exist", dir.c_str())); } } /* If the file is read from or appended to, check if it exists. */ if (last_type == TOK_REDIRECT_IN || last_type == TOK_REDIRECT_APPEND) { if (wstat(target, &buff) == -1) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; if (error) error->push_back(format_string(L"File \'%ls\' does not exist", target)); } } if (last_type == TOK_REDIRECT_NOCLOB) { if (wstat(target, &buff) != -1) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; if (error) error->push_back(format_string(L"File \'%ls\' exists", target)); } } } break; } case TOK_PIPE: case TOK_BACKGROUND: { if (had_cmd) { color.at(tok_get_pos(&tok)) = HIGHLIGHT_END; had_cmd = 0; use_command = 1; use_function = 1; use_builtin = 1; accept_switches = 1; } else { color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; if (error) error->push_back(L"No job to put in background"); } break; } case TOK_END: { color.at(tok_get_pos(&tok)) = HIGHLIGHT_END; had_cmd = 0; use_command = 1; use_function = 1; use_builtin = 1; accept_switches = 1; break; } case TOK_COMMENT: { color.at(tok_get_pos(&tok)) = HIGHLIGHT_COMMENT; break; } case TOK_ERROR: default: { /* If the tokenizer reports an error, highlight it as such. */ if (error) error->push_back(tok_last(&tok)); color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; break; } } } } // PCA This function does I/O, (calls is_potential_path, path_get_path, maybe others) and so ought to only run on a background thread void highlight_shell(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) { ASSERT_IS_BACKGROUND_THREAD(); const size_t length = buff.size(); assert(buff.size() == color.size()); if (length == 0) return; std::fill(color.begin(), color.end(), -1); /* Do something sucky and get the current working directory on this background thread. This should really be passed in. Note that we also need this as a vector (of one directory). */ const wcstring working_directory = env_get_pwd_slash(); /* Tokenize the string */ tokenize(buff.c_str(), color, pos, error, working_directory, vars); /* Locate and syntax highlight cmdsubsts recursively */ wchar_t * const subbuff = wcsdup(buff.c_str()); wchar_t * subpos = subbuff; bool done = false; while (1) { wchar_t *begin, *end; if (parse_util_locate_cmdsubst(subpos, &begin, &end, 1) <= 0) { break; } /* Note: This *end = 0 writes into subbuff! */ if (!*end) done = true; else *end = 0; //our subcolors start at color + (begin-subbuff)+1 size_t start = begin - subbuff + 1, len = wcslen(begin + 1); std::vector subcolors(len, -1); highlight_shell(begin+1, subcolors, -1, error, vars); // insert subcolors std::copy(subcolors.begin(), subcolors.end(), color.begin() + start); // highlight the end of the subcommand assert(end >= subbuff); if ((size_t)(end - subbuff) < length) { color.at(end-subbuff)=HIGHLIGHT_OPERATOR; } if (done) break; subpos = end+1; } free(subbuff); /* The highlighting code only changes the first element when the color changes. This fills in the rest. */ int last_val=0; for (size_t i=0; i < buff.size(); i++) { int ¤t_val = color.at(i); if (current_val >= 0) { last_val = current_val; } else { current_val = last_val; //note - this writes into the vector } } /* Color potentially valid paths in a special path color if they are the current token. For reasons that I don't yet understand, it's required that pos be allowed to be length (e.g. when backspacing). */ if (pos <= length) { const wchar_t *cbuff = buff.c_str(); const wchar_t *tok_begin, *tok_end; parse_util_token_extent(cbuff, pos, &tok_begin, &tok_end, 0, 0); if (tok_begin && tok_end) { wcstring token(tok_begin, tok_end-tok_begin); const wcstring_list_t working_directory_list(1, working_directory); if (unescape_string(token, 1)) { /* Big hack: is_potential_path expects a tilde, but unescape_string gives us HOME_DIRECTORY. Put it back. */ if (! token.empty() && token.at(0) == HOME_DIRECTORY) token.at(0) = L'~'; if (is_potential_path(token, working_directory_list, PATH_EXPAND_TILDE)) { for (ptrdiff_t i=tok_begin-cbuff; i < (tok_end-cbuff); i++) { // Don't color HIGHLIGHT_ERROR because it looks dorky. For example, trying to cd into a non-directory would show an underline and also red. if (!(color.at(i) & HIGHLIGHT_ERROR)) { color.at(i) |= HIGHLIGHT_VALID_PATH; } } } } } } highlight_universal_internal(buff, color, pos); /* Spaces should not be highlighted at all, since it makes cursor look funky in some terminals */ for (size_t i=0; i < buff.size(); i++) { if (iswspace(buff.at(i))) { color.at(i)=0; } } } /** Perform quote and parenthesis highlighting on the specified string. */ static void highlight_universal_internal(const wcstring &buffstr, std::vector &color, size_t pos) { assert(buffstr.size() == color.size()); if (pos < buffstr.size()) { /* Highlight matching quotes */ if ((buffstr.at(pos) == L'\'') || (buffstr.at(pos) == L'\"')) { std::vector lst; int level=0; wchar_t prev_q=0; const wchar_t * const buff = buffstr.c_str(); const wchar_t *str = buff; int match_found=0; while (*str) { switch (*str) { case L'\\': str++; break; case L'\"': case L'\'': if (level == 0) { level++; lst.push_back(str-buff); prev_q = *str; } else { if (prev_q == *str) { size_t pos1, pos2; level--; pos1 = lst.back(); pos2 = str-buff; if (pos1==pos || pos2==pos) { color.at(pos1)|=HIGHLIGHT_MATCH<<16; color.at(pos2)|=HIGHLIGHT_MATCH<<16; match_found = 1; } prev_q = *str==L'\"'?L'\'':L'\"'; } else { level++; lst.push_back(str-buff); prev_q = *str; } } break; } if ((*str == L'\0')) break; str++; } if (!match_found) color.at(pos) = HIGHLIGHT_ERROR<<16; } /* Highlight matching parenthesis */ const wchar_t c = buffstr.at(pos); if (wcschr(L"()[]{}", c)) { int step = wcschr(L"({[", c)?1:-1; wchar_t dec_char = *(wcschr(L"()[]{}", c) + step); wchar_t inc_char = c; int level = 0; int match_found=0; for (long i=pos; i >= 0 && (size_t)i < buffstr.size(); i+=step) { const wchar_t test_char = buffstr.at(i); if (test_char == inc_char) level++; if (test_char == dec_char) level--; if (level == 0) { long pos2 = i; color.at(pos)|=HIGHLIGHT_MATCH<<16; color.at(pos2)|=HIGHLIGHT_MATCH<<16; match_found=1; break; } } if (!match_found) color[pos] = HIGHLIGHT_ERROR<<16; } } } void highlight_universal(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) { assert(buff.size() == color.size()); std::fill(color.begin(), color.end(), 0); highlight_universal_internal(buff, color, pos); } fish/highlight.h000066400000000000000000000116011214535744100141340ustar00rootroot00000000000000/** \file highlight.h Prototypes for functions for syntax highlighting */ #ifndef FISH_HIGHLIGHT_H #define FISH_HIGHLIGHT_H #include #include "env.h" #include "util.h" #include "screen.h" #include "color.h" /** Internal value representing highlighting of normal text */ #define HIGHLIGHT_NORMAL 0x1 /** Internal value representing highlighting of an error */ #define HIGHLIGHT_ERROR 0x2 /** Internal value representing highlighting of a command */ #define HIGHLIGHT_COMMAND 0x4 /** Internal value representing highlighting of a process separator */ #define HIGHLIGHT_END 0x8 /** Internal value representing highlighting of a regular command parameter */ #define HIGHLIGHT_PARAM 0x10 /** Internal value representing highlighting of a comment */ #define HIGHLIGHT_COMMENT 0x20 /** Internal value representing highlighting of a matching parenteses, etc. */ #define HIGHLIGHT_MATCH 0x40 /** Internal value representing highlighting of a search match */ #define HIGHLIGHT_SEARCH_MATCH 0x80 /** Internal value representing highlighting of an operator */ #define HIGHLIGHT_OPERATOR 0x100 /** Internal value representing highlighting of an escape sequence */ #define HIGHLIGHT_ESCAPE 0x200 /** Internal value representing highlighting of a quoted string */ #define HIGHLIGHT_QUOTE 0x400 /** Internal value representing highlighting of an IO redirection */ #define HIGHLIGHT_REDIRECTION 0x800 /** Internal value representing highlighting a potentially valid path */ #define HIGHLIGHT_VALID_PATH 0x1000 /** Internal value representing highlighting an autosuggestion */ #define HIGHLIGHT_AUTOSUGGESTION 0x2000 class history_item_t; struct file_detection_context_t; /** Perform syntax highlighting for the shell commands in buff. The result is stored in the color array as a color_code from the HIGHLIGHT_ enum for each character in buff. \param buff The buffer on which to perform syntax highlighting \param color The array in wchich to store the color codes. The first 8 bits are used for fg color, the next 8 bits for bg color. \param pos the cursor position. Used for quote matching, etc. \param error a list in which a description of each error will be inserted. May be 0, in whcich case no error descriptions will be generated. */ void highlight_shell(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); /** Perform syntax highlighting for the text in buff. Matching quotes and paranthesis are highlighted. The result is stored in the color array as a color_code from the HIGHLIGHT_ enum for each character in buff. \param buff The buffer on which to perform syntax highlighting \param color The array in wchich to store the color codes. The first 8 bits are used for fg color, the next 8 bits for bg color. \param pos the cursor position. Used for quote matching, etc. \param error a list in which a description of each error will be inserted. May be 0, in whcich case no error descriptions will be generated. */ void highlight_universal(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); /** Translate from HIGHLIGHT_* to FISH_COLOR_* according to environment variables. Defaults to FISH_COLOR_NORMAL. Example: If the environment variable FISH_FISH_COLOR_ERROR is set to 'red', a call to highlight_get_color( HIGHLIGHT_ERROR) will return FISH_COLOR_RED. */ rgb_color_t highlight_get_color(int highlight, bool is_background); /** Given a command 'str' from the history, try to determine whether we ought to suggest it by specially recognizing the command. Returns true if we validated the command. If so, returns by reference whether the suggestion is valid or not. */ bool autosuggest_validate_from_history(const history_item_t &item, file_detection_context_t &detector, const wcstring &working_directory, const env_vars_snapshot_t &vars); /** Given the command line contents 'str', return via reference a suggestion by specially recognizing the command. The suggestion is escaped. Returns true if we recognized the command (even if we couldn't think of a suggestion for it). */ bool autosuggest_suggest_special(const wcstring &str, const wcstring &working_directory, wcstring &outString); /* Tests whether the specified string cpath is the prefix of anything we could cd to. directories is a list of possible parent directories (typically either the working directory, or the cdpath). This does I/O! This is used only internally to this file, and is exposed only for testing. */ enum { /* The path must be to a directory */ PATH_REQUIRE_DIR = 1 << 0, /* Expand any leading tilde in the path */ PATH_EXPAND_TILDE = 1 << 1 }; typedef unsigned int path_flags_t; bool is_potential_path(const wcstring &const_path, const wcstring_list_t &directories, path_flags_t flags, wcstring *out_path = NULL); #endif fish/history.cpp000066400000000000000000001504671214535744100142370ustar00rootroot00000000000000/** \file history.c History functions, part of the user interface. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "sanity.h" #include "tokenizer.h" #include "reader.h" #include "wutil.h" #include "history.h" #include "common.h" #include "intern.h" #include "path.h" #include "signal.h" #include "autoload.h" #include "iothread.h" #include #include /* Our history format is intended to be valid YAML. Here it is: - cmd: ssh blah blah blah when: 2348237 paths: - /path/to/something - /path/to/something_else Newlines are replaced by \n. Backslashes are replaced by \\. */ /** When we rewrite the history, the number of items we keep */ #define HISTORY_SAVE_MAX (1024 * 256) /** Whether we print timing information */ #define LOG_TIMES 0 /** Default buffer size for flushing to the history file */ #define HISTORY_OUTPUT_BUFFER_SIZE (4096 * 4) /* Helper class for certain output. This is basically a string that allows us to ensure we only flush at record boundaries, and avoids the copying of ostringstream. Have you ever tried to implement your own streambuf? Total insanity. */ class history_output_buffer_t { /* A null-terminated C string */ std::vector buffer; /* Offset is the offset of the null terminator */ size_t offset; static size_t safe_strlen(const char *s) { return s ? strlen(s) : 0; } public: /* Add a bit more to HISTORY_OUTPUT_BUFFER_SIZE because we flush once we've exceeded that size */ history_output_buffer_t() : buffer(HISTORY_OUTPUT_BUFFER_SIZE + 128, '\0'), offset(0) { } /* Append one or more strings */ void append(const char *s1, const char *s2 = NULL, const char *s3 = NULL) { const char *ptrs[4] = {s1, s2, s3, NULL}; const size_t lengths[4] = {safe_strlen(s1), safe_strlen(s2), safe_strlen(s3), 0}; /* Determine the additional size we'll need */ size_t additional_length = 0; for (size_t i=0; i < sizeof lengths / sizeof *lengths; i++) { additional_length += lengths[i]; } /* Allocate that much, plus a null terminator */ size_t required_size = offset + additional_length + 1; if (required_size > buffer.size()) { buffer.resize(required_size, '\0'); } /* Copy */ for (size_t i=0; ptrs[i] != NULL; i++) { memmove(&buffer.at(offset), ptrs[i], lengths[i]); offset += lengths[i]; } /* Null terminator was appended by virtue of the resize() above (or in a previous invocation). */ assert(buffer.at(buffer.size() - 1) == '\0'); } /* Output to a given fd, resetting our buffer. Returns true on success, false on error */ bool flush_to_fd(int fd) { bool result = write_loop(fd, &buffer.at(0), offset) >= 0; offset = 0; return result; } /* Return how much data we've accumulated */ size_t output_size() const { return offset; } }; class time_profiler_t { const char *what; double start; public: time_profiler_t(const char *w) { if (LOG_TIMES) { what = w; start = timef(); } } ~time_profiler_t() { if (LOG_TIMES) { double end = timef(); fprintf(stderr, "(LOG_TIMES %s: %02f msec)\n", what, (end - start) * 1000); } } }; static const file_id_t kInvalidFileID((dev_t)(-1), (ino_t)(-1)); /* Lock a file via fcntl; returns true on success, false on failure. */ static bool history_file_lock(int fd, short type) { assert(type == F_RDLCK || type == F_WRLCK); struct flock flk = {}; flk.l_type = type; flk.l_whence = SEEK_SET; int ret = fcntl(fd, F_SETLKW, (void *)&flk); return ret != -1; } /* Get a file_id_t corresponding to the given fd */ static file_id_t history_file_identify(int fd) { file_id_t result = kInvalidFileID; struct stat buf = {}; if (0 == fstat(fd, &buf)) { result.first = buf.st_dev; result.second = buf.st_ino; } return result; } /* Our LRU cache is used for restricting the amount of history we have, and limiting how long we order it. */ class history_lru_node_t : public lru_node_t { public: time_t timestamp; path_list_t required_paths; history_lru_node_t(const history_item_t &item) : lru_node_t(item.str()), timestamp(item.timestamp()), required_paths(item.required_paths) {} }; class history_lru_cache_t : public lru_cache_t { protected: /* Override to delete evicted nodes */ virtual void node_was_evicted(history_lru_node_t *node) { delete node; } public: history_lru_cache_t(size_t max) : lru_cache_t(max) { } /* Function to add a history item */ void add_item(const history_item_t &item) { /* Skip empty items */ if (item.empty()) return; /* See if it's in the cache. If it is, update the timestamp. If not, we create a new node and add it. Note that calling get_node promotes the node to the front. */ history_lru_node_t *node = this->get_node(item.str()); if (node != NULL) { node->timestamp = std::max(node->timestamp, item.timestamp()); /* What to do about paths here? Let's just ignore them */ } else { node = new history_lru_node_t(item); this->add_node(node); } } }; static pthread_mutex_t hist_lock = PTHREAD_MUTEX_INITIALIZER; static std::map histories; static wcstring history_filename(const wcstring &name, const wcstring &suffix); /** Replaces newlines with a literal backslash followed by an n, and replaces backslashes with two backslashes. */ static void escape_yaml(std::string &str); /** Undoes escape_yaml */ static void unescape_yaml(std::string &str); /* We can merge two items if they are the same command. We use the more recent timestamp and the longer list of required paths. */ bool history_item_t::merge(const history_item_t &item) { bool result = false; if (this->contents == item.contents) { this->creation_timestamp = std::max(this->creation_timestamp, item.creation_timestamp); if (this->required_paths.size() < item.required_paths.size()) { this->required_paths = item.required_paths; } result = true; } return result; } history_item_t::history_item_t(const wcstring &str) : contents(str), creation_timestamp(time(NULL)) { } history_item_t::history_item_t(const wcstring &str, time_t when, const path_list_t &paths) : contents(str), creation_timestamp(when), required_paths(paths) { } bool history_item_t::matches_search(const wcstring &term, enum history_search_type_t type) const { switch (type) { case HISTORY_SEARCH_TYPE_CONTAINS: /* We consider equal strings to NOT match a contains search (so that you don't have to see history equal to what you typed). The length check ensures that. */ return contents.size() > term.size() && contents.find(term) != wcstring::npos; case HISTORY_SEARCH_TYPE_PREFIX: /* We consider equal strings to match a prefix search, so that autosuggest will allow suggesting what you've typed */ return string_prefixes_string(term, contents); default: sanity_lose(); return false; } } /* Append our YAML history format to the provided vector at the given offset, updating the offset */ static void append_yaml_to_buffer(const wcstring &wcmd, time_t timestamp, const path_list_t &required_paths, history_output_buffer_t *buffer) { std::string cmd = wcs2string(wcmd); escape_yaml(cmd); buffer->append("- cmd: ", cmd.c_str(), "\n"); char timestamp_str[96]; snprintf(timestamp_str, sizeof timestamp_str, "%ld", timestamp); buffer->append(" when: ", timestamp_str, "\n"); if (! required_paths.empty()) { buffer->append(" paths:\n"); for (path_list_t::const_iterator iter = required_paths.begin(); iter != required_paths.end(); ++iter) { std::string path = wcs2string(*iter); escape_yaml(path); buffer->append(" - ", path.c_str(), "\n"); } } } // Parse a timestamp line that looks like this: spaces, "when:", spaces, timestamp, newline // The string is NOT null terminated; however we do know it contains a newline, so stop when we reach it static bool parse_timestamp(const char *str, time_t *out_when) { const char *cursor = str; /* Advance past spaces */ while (*cursor == ' ') cursor++; /* Look for "when:" */ size_t when_len = 5; if (strncmp(cursor, "when:", when_len) != 0) return false; cursor += when_len; /* Advance past spaces */ while (*cursor == ' ') cursor++; /* Try to parse a timestamp. */ long timestamp = 0; if (isdigit(*cursor) && (timestamp = strtol(cursor, NULL, 0)) > 0) { *out_when = (time_t)timestamp; return true; } return false; } // Returns a pointer to the start of the next line, or NULL // The next line must itself end with a newline // Note that the string is not null terminated static const char *next_line(const char *start, size_t length) { /* Handle the hopeless case */ if (length < 1) return NULL; /* Get a pointer to the end, that we must not pass */ const char * const end = start + length; /* Skip past the next newline */ const char *nextline = (const char *)memchr(start, '\n', length); if (! nextline || nextline >= end) { return NULL; } /* Skip past the newline character itself */ if (++nextline >= end) { return NULL; } /* Make sure this new line is itself "newline terminated". If it's not, return NULL; */ const char *next_newline = (const char *)memchr(nextline, '\n', end - nextline); if (! next_newline) { return NULL; } /* Done */ return nextline; } // Support for iteratively locating the offsets of history items // Pass the address and length of a mapped region. // Pass a pointer to a cursor size_t, initially 0 // If custoff_timestamp is nonzero, skip items created at or after that timestamp // Returns (size_t)(-1) when done static size_t offset_of_next_item_fish_2_0(const char *begin, size_t mmap_length, size_t *inout_cursor, time_t cutoff_timestamp) { size_t cursor = *inout_cursor; size_t result = (size_t)(-1); while (cursor < mmap_length) { const char * const line_start = begin + cursor; /* Advance the cursor to the next line */ const char *newline = (const char *)memchr(line_start, '\n', mmap_length - cursor); if (newline == NULL) break; /* Advance the cursor past this line. +1 is for the newline */ size_t line_len = newline - line_start; cursor += line_len + 1; /* Skip lines with a leading space, since these are in the interior of one of our items */ if (line_start[0] == ' ') continue; /* Skip very short lines to make one of the checks below easier */ if (line_len < 3) continue; /* Try to be a little YAML compatible. Skip lines with leading %, ---, or ... */ if (! memcmp(line_start, "%", 1) || ! memcmp(line_start, "---", 3) || ! memcmp(line_start, "...", 3)) continue; /* At this point, we know line_start is at the beginning of an item. But maybe we want to skip this item because of timestamps. A 0 cutoff means we don't care; if we do care, then try parsing out a timestamp. */ if (cutoff_timestamp != 0) { /* Hackish fast way to skip items created after our timestamp. This is the mechanism by which we avoid "seeing" commands from other sessions that started after we started. We try hard to ensure that our items are sorted by their timestamps, so in theory we could just break, but I don't think that works well if (for example) the clock changes. So we'll read all subsequent items. */ const char * const end = begin + mmap_length; /* Walk over lines that we think are interior. These lines are not null terminated, but are guaranteed to contain a newline. */ bool has_timestamp = false; time_t timestamp; const char *interior_line; for (interior_line = next_line(line_start, end - line_start); interior_line != NULL && ! has_timestamp; interior_line = next_line(interior_line, end - interior_line)) { /* If the first character is not a space, it's not an interior line, so we're done */ if (interior_line[0] != ' ') break; /* Hackish optimization: since we just stepped over some interior line, update the cursor so we don't have to look at these lines next time */ cursor = interior_line - begin; /* Try parsing a timestamp from this line. If we succeed, the loop will break. */ has_timestamp = parse_timestamp(interior_line, ×tamp); } /* Skip this item if the timestamp is past our cutoff. */ if (has_timestamp && timestamp > cutoff_timestamp) { continue; } } /* We made it through the gauntlet. */ result = line_start - begin; break; } *inout_cursor = cursor; return result; } // Same as offset_of_next_item_fish_2_0, but for fish 1.x (pre fishfish) // Adapted from history_populate_from_mmap in history.c static size_t offset_of_next_item_fish_1_x(const char *begin, size_t mmap_length, size_t *inout_cursor, time_t cutoff_timestamp) { if (mmap_length == 0 || *inout_cursor >= mmap_length) return (size_t)(-1); const char *end = begin + mmap_length; const char *pos; bool ignore_newline = false; bool do_push = true; bool all_done = false; size_t result = *inout_cursor; for (pos = begin + *inout_cursor; pos < end && ! all_done; pos++) { if (do_push) { ignore_newline = (*pos == '#'); do_push = false; } switch (*pos) { case '\\': { pos++; break; } case '\n': { if (ignore_newline) { ignore_newline = false; } else { /* Note: pos will be left pointing just after this newline, because of the ++ in the loop */ all_done = true; } break; } } } *inout_cursor = (pos - begin); return result; } // Returns the offset of the next item based on the given history type, or -1 static size_t offset_of_next_item(const char *begin, size_t mmap_length, history_file_type_t mmap_type, size_t *inout_cursor, time_t cutoff_timestamp) { size_t result; switch (mmap_type) { case history_type_fish_2_0: result = offset_of_next_item_fish_2_0(begin, mmap_length, inout_cursor, cutoff_timestamp); break; case history_type_fish_1_x: result = offset_of_next_item_fish_1_x(begin, mmap_length, inout_cursor, cutoff_timestamp); break; default: case history_type_unknown: // Oh well result = (size_t)(-1); break; } return result; } history_t & history_t::history_with_name(const wcstring &name) { /* Note that histories are currently never deleted, so we can return a reference to them without using something like shared_ptr */ scoped_lock locker(hist_lock); history_t *& current = histories[name]; if (current == NULL) current = new history_t(name); return *current; } history_t::history_t(const wcstring &pname) : name(pname), first_unwritten_new_item_index(0), mmap_start(NULL), mmap_length(0), mmap_file_id(kInvalidFileID), birth_timestamp(time(NULL)), countdown_to_vacuum(-1), loaded_old(false), chaos_mode(false) { pthread_mutex_init(&lock, NULL); } history_t::~history_t() { pthread_mutex_destroy(&lock); } void history_t::add(const history_item_t &item) { scoped_lock locker(lock); /* Try merging with the last item */ if (! new_items.empty() && new_items.back().merge(item)) { /* We merged, so we don't have to add anything */ } else { /* We have to add a new item */ new_items.push_back(item); } /* We may or may not vacuum. We try to vacuum every kVacuumFrequency items, but start the countdown at a random number so that even if the user never runs more than 25 commands, we'll eventually vacuum. If countdown_to_vacuum is -1, it means we haven't yet picked a value for the counter. */ const int kVacuumFrequency = 25; if (countdown_to_vacuum < 0) { static unsigned int seed = (unsigned int)time(NULL); /* Generate a number in the range [0, kVacuumFrequency) */ countdown_to_vacuum = rand_r(&seed) / (RAND_MAX / kVacuumFrequency + 1); } /* Determine if we're going to vacuum */ bool vacuum = false; if (countdown_to_vacuum == 0) { countdown_to_vacuum = kVacuumFrequency; vacuum = true; } /* This might be a good candidate for moving to a background thread */ time_profiler_t profiler(vacuum ? "save_internal vacuum" : "save_internal no vacuum"); this->save_internal(vacuum); /* Update our countdown */ assert(countdown_to_vacuum > 0); countdown_to_vacuum--; } void history_t::add(const wcstring &str, const path_list_t &valid_paths) { time_t when = time(NULL); /* Big hack: do not allow timestamps equal to our birthdate. This is because we include items whose timestamps are equal to our birthdate when reading old history, so we can catch "just closed" items. But this means that we may interpret our own items, that we just wrote, as old items, if we wrote them in the same second as our birthdate. */ if (when == this->birth_timestamp) when++; this->add(history_item_t(str, when, valid_paths)); } void history_t::remove(const wcstring &str) { /* Add to our list of deleted items */ deleted_items.insert(str); /* Remove from our list of new items */ size_t idx = new_items.size(); while (idx--) { if (new_items[idx].str() == str) { new_items.erase(new_items.begin() + idx); /* If this index is before our first_unwritten_new_item_index, then subtract one from that index so it stays pointing at the same item. If it is equal to or larger, then we have not yet writen this item, so we don't have to adjust the index. */ if (idx < first_unwritten_new_item_index) { first_unwritten_new_item_index--; } } } assert(first_unwritten_new_item_index <= new_items.size()); } void history_t::get_string_representation(wcstring &result, const wcstring &separator) { scoped_lock locker(lock); bool first = true; /* Append new items. Note that in principle we could use const_reverse_iterator, but we do not because reverse_iterator is not convertible to const_reverse_iterator ( http://github.com/fish-shell/fish-shell/issues/431 ) */ for (std::vector::reverse_iterator iter=new_items.rbegin(); iter < new_items.rend(); ++iter) { if (! first) result.append(separator); result.append(iter->str()); first = false; } /* Append old items */ load_old_if_needed(); for (std::vector::reverse_iterator iter = old_item_offsets.rbegin(); iter != old_item_offsets.rend(); ++iter) { size_t offset = *iter; const history_item_t item = history_t::decode_item(mmap_start + offset, mmap_length - offset, mmap_type); if (! first) result.append(separator); result.append(item.str()); first = false; } } history_item_t history_t::item_at_index(size_t idx) { scoped_lock locker(lock); /* 0 is considered an invalid index */ assert(idx > 0); idx--; /* idx=0 corresponds to last item in new_items */ size_t new_item_count = new_items.size(); if (idx < new_item_count) { return new_items.at(new_item_count - idx - 1); } /* Now look in our old items */ idx -= new_item_count; load_old_if_needed(); size_t old_item_count = old_item_offsets.size(); if (idx < old_item_count) { /* idx=0 corresponds to last item in old_item_offsets */ size_t offset = old_item_offsets.at(old_item_count - idx - 1); return history_t::decode_item(mmap_start + offset, mmap_length - offset, mmap_type); } /* Index past the valid range, so return an empty history item */ return history_item_t(wcstring(), 0); } /* Read one line, stripping off any newline, and updating cursor. Note that our input string is NOT null terminated; it's just a memory mapped file. */ static size_t read_line(const char *base, size_t cursor, size_t len, std::string &result) { /* Locate the newline */ assert(cursor <= len); const char *start = base + cursor; const char *newline = (char *)memchr(start, '\n', len - cursor); if (newline != NULL) { /* We found a newline. */ result.assign(start, newline - start); /* Return the amount to advance the cursor; skip over the newline */ return newline - start + 1; } else { /* We ran off the end */ result.clear(); return len - cursor; } } /* Trims leading spaces in the given string, returning how many there were */ static size_t trim_leading_spaces(std::string &str) { size_t i = 0, max = str.size(); while (i < max && str[i] == ' ') i++; str.erase(0, i); return i; } static bool extract_prefix_and_unescape_yaml(std::string &key, std::string &value, const std::string &line) { size_t where = line.find(":"); if (where != std::string::npos) { key.assign(line, 0, where); // skip a space after the : if necessary size_t val_start = where + 1; if (val_start < line.size() && line.at(val_start) == ' ') val_start++; value.assign(line, val_start, line.size() - val_start); unescape_yaml(key); unescape_yaml(value); } return where != std::string::npos; } /* Decode an item via the fish 2.0 format */ history_item_t history_t::decode_item_fish_2_0(const char *base, size_t len) { wcstring cmd; time_t when = 0; path_list_t paths; size_t indent = 0, cursor = 0; std::string key, value, line; /* Read the "- cmd:" line */ size_t advance = read_line(base, cursor, len, line); trim_leading_spaces(line); if (! extract_prefix_and_unescape_yaml(key, value, line) || key != "- cmd") goto done; cursor += advance; cmd = str2wcstring(value); /* Read the remaining lines */ for (;;) { /* Read a line */ size_t advance = read_line(base, cursor, len, line); /* Count and trim leading spaces */ size_t this_indent = trim_leading_spaces(line); if (indent == 0) indent = this_indent; if (this_indent == 0 || indent != this_indent) break; if (! extract_prefix_and_unescape_yaml(key, value, line)) break; /* We are definitely going to consume this line */ cursor += advance; if (key == "when") { /* Parse an int from the timestamp. Should this fail, strtol returns 0; that's acceptable. */ char *end = NULL; long tmp = strtol(value.c_str(), &end, 0); when = tmp; } else if (key == "paths") { /* Read lines starting with " - " until we can't read any more */ for (;;) { size_t advance = read_line(base, cursor, len, line); if (trim_leading_spaces(line) <= indent) break; if (strncmp(line.c_str(), "- ", 2)) break; /* We're going to consume this line */ cursor += advance; /* Skip the leading dash-space and then store this path it */ line.erase(0, 2); unescape_yaml(line); paths.push_back(str2wcstring(line)); } } } done: return history_item_t(cmd, when, paths); } history_item_t history_t::decode_item(const char *base, size_t len, history_file_type_t type) { switch (type) { case history_type_fish_1_x: return history_t::decode_item_fish_1_x(base, len); case history_type_fish_2_0: return history_t::decode_item_fish_2_0(base, len); default: return history_item_t(L""); } } /** Remove backslashes from all newlines. This makes a string from the history file better formated for on screen display. */ static wcstring history_unescape_newlines_fish_1_x(const wcstring &in_str) { wcstring out; for (const wchar_t *in = in_str.c_str(); *in; in++) { if (*in == L'\\') { if (*(in+1)!= L'\n') { out.push_back(*in); } } else { out.push_back(*in); } } return out; } /* Decode an item via the fish 1.x format. Adapted from fish 1.x's item_get(). */ history_item_t history_t::decode_item_fish_1_x(const char *begin, size_t length) { const char *end = begin + length; const char *pos=begin; bool was_backslash = 0; wcstring out; bool first_char = true; bool timestamp_mode = false; time_t timestamp = 0; while (1) { wchar_t c; mbstate_t state; size_t res; memset(&state, 0, sizeof(state)); res = mbrtowc(&c, pos, end-pos, &state); if (res == (size_t)-1) { pos++; continue; } else if (res == (size_t)-2) { break; } else if (res == (size_t)0) { pos++; continue; } pos += res; if (c == L'\n') { if (timestamp_mode) { const wchar_t *time_string = out.c_str(); while (*time_string && !iswdigit(*time_string)) time_string++; errno=0; if (*time_string) { time_t tm; wchar_t *end; errno = 0; tm = (time_t)wcstol(time_string, &end, 10); if (tm && !errno && !*end) { timestamp = tm; } } out.clear(); timestamp_mode = false; continue; } if (!was_backslash) break; } if (first_char) { if (c == L'#') timestamp_mode = true; } first_char = false; out.push_back(c); was_backslash = ((c == L'\\') && !was_backslash); } out = history_unescape_newlines_fish_1_x(out); return history_item_t(out, timestamp); } /* Try to infer the history file type based on inspecting the data */ static history_file_type_t infer_file_type(const char *data, size_t len) { history_file_type_t result = history_type_unknown; if (len > 0) { /* Old fish started with a # */ if (data[0] == '#') { result = history_type_fish_1_x; } else { /* Assume new fish */ result = history_type_fish_2_0; } } return result; } void history_t::populate_from_mmap(void) { mmap_type = infer_file_type(mmap_start, mmap_length); size_t cursor = 0; for (;;) { size_t offset = offset_of_next_item(mmap_start, mmap_length, mmap_type, &cursor, birth_timestamp); // If we get back -1, we're done if (offset == (size_t)(-1)) break; // Remember this item old_item_offsets.push_back(offset); } } /* Do a private, read-only map of the entirety of a history file with the given name. Returns true if successful. Returns the mapped memory region by reference. */ bool history_t::map_file(const wcstring &name, const char **out_map_start, size_t *out_map_len, file_id_t *file_id) { bool result = false; wcstring filename = history_filename(name, L""); if (! filename.empty()) { int fd = wopen_cloexec(filename, O_RDONLY); if (fd >= 0) { /* Get the file ID if requested */ if (file_id != NULL) *file_id = history_file_identify(fd); /* Take a read lock to guard against someone else appending. This is released when the file is closed (below). We will read the file after releasing the lock, but that's not a problem, because we never modify already written data. In short, the purpose of this lock is to ensure we don't see the file size change mid-update. We may fail to lock (e.g. on lockless NFS - see https://github.com/fish-shell/fish-shell/issues/685 ). In that case, we proceed as if it did not fail. The risk is that we may get an incomplete history item; this is unlikely because we only treat an item as valid if it has a terminating newline. Simulate a failing lock in chaos_mode */ if (! chaos_mode) history_file_lock(fd, F_RDLCK); off_t len = lseek(fd, 0, SEEK_END); if (len != (off_t)-1) { size_t mmap_length = (size_t)len; if (lseek(fd, 0, SEEK_SET) == 0) { char *mmap_start; if ((mmap_start = (char *)mmap(0, mmap_length, PROT_READ, MAP_PRIVATE, fd, 0)) != MAP_FAILED) { result = true; *out_map_start = mmap_start; *out_map_len = mmap_length; } } } close(fd); } } return result; } bool history_t::load_old_if_needed(void) { if (loaded_old) return true; loaded_old = true; // PCA not sure why signals were blocked here //signal_block(); bool ok = false; if (map_file(name, &mmap_start, &mmap_length, &mmap_file_id)) { // Here we've mapped the file ok = true; time_profiler_t profiler("populate_from_mmap"); this->populate_from_mmap(); } //signal_unblock(); return ok; } void history_search_t::skip_matches(const wcstring_list_t &skips) { external_skips = skips; std::sort(external_skips.begin(), external_skips.end()); } bool history_search_t::should_skip_match(const wcstring &str) const { return std::binary_search(external_skips.begin(), external_skips.end(), str); } bool history_search_t::go_forwards() { /* Pop the top index (if more than one) and return if we have any left */ if (prev_matches.size() > 1) { prev_matches.pop_back(); return true; } return false; } bool history_search_t::go_backwards() { /* Backwards means increasing our index */ const size_t max_idx = (size_t)(-1); size_t idx = 0; if (! prev_matches.empty()) idx = prev_matches.back().first; if (idx == max_idx) return false; const bool main_thread = is_main_thread(); while (++idx < max_idx) { if (main_thread ? reader_interrupted() : reader_thread_job_is_stale()) { return false; } const history_item_t item = history->item_at_index(idx); /* We're done if it's empty or we cancelled */ if (item.empty()) { return false; } /* Look for a term that matches and that we haven't seen before */ const wcstring &str = item.str(); if (item.matches_search(term, search_type) && ! match_already_made(str) && ! should_skip_match(str)) { prev_matches.push_back(prev_match_t(idx, item)); return true; } } return false; } /** Goes to the end (forwards) */ void history_search_t::go_to_end(void) { prev_matches.clear(); } /** Returns if we are at the end, which is where we start. */ bool history_search_t::is_at_end(void) const { return prev_matches.empty(); } /** Goes to the beginning (backwards) */ void history_search_t::go_to_beginning(void) { /* Just go backwards as far as we can */ while (go_backwards()) ; } history_item_t history_search_t::current_item() const { assert(! prev_matches.empty()); return prev_matches.back().second; } wcstring history_search_t::current_string() const { history_item_t item = this->current_item(); return item.str(); } bool history_search_t::match_already_made(const wcstring &match) const { for (std::vector::const_iterator iter = prev_matches.begin(); iter != prev_matches.end(); ++iter) { if (iter->second.str() == match) return true; } return false; } static void replace_all(std::string &str, const char *needle, const char *replacement) { size_t needle_len = strlen(needle), replacement_len = strlen(replacement); size_t offset = 0; while ((offset = str.find(needle, offset)) != std::string::npos) { str.replace(offset, needle_len, replacement); offset += replacement_len; } } static void escape_yaml(std::string &str) { replace_all(str, "\\", "\\\\"); //replace one backslash with two replace_all(str, "\n", "\\n"); //replace newline with backslash + literal n } /* This function is called frequently, so it ought to be fast. */ static void unescape_yaml(std::string &str) { size_t cursor = 0, size = str.size(); while (cursor < size) { // Operate on a const version of str, to avoid needless COWs that at() does. const std::string &const_str = str; // Look for a backslash size_t backslash = const_str.find('\\', cursor); if (backslash == std::string::npos || backslash + 1 >= size) { // Either not found, or found as the last character break; } else { // Backslash found. Maybe we'll do something about it. Be sure to invoke the const version of at(). char escaped_char = const_str.at(backslash + 1); if (escaped_char == '\\') { // Two backslashes in a row. Delete the second one. str.erase(backslash + 1, 1); size--; } else if (escaped_char == 'n') { // Backslash + n. Replace with a newline. str.replace(backslash, 2, "\n"); size--; } // The character at index backslash has now been made whole; start at the next character cursor = backslash + 1; } } } static wcstring history_filename(const wcstring &name, const wcstring &suffix) { wcstring path; if (! path_get_config(path)) return L""; wcstring result = path; result.append(L"/"); result.append(name); result.append(L"_history"); result.append(suffix); return result; } void history_t::clear_file_state() { /* Erase everything we know about our file */ if (mmap_start != NULL && mmap_start != MAP_FAILED) { munmap((void *)mmap_start, mmap_length); } mmap_start = NULL; mmap_length = 0; loaded_old = false; old_item_offsets.clear(); } void history_t::compact_new_items() { /* Keep only the most recent items with the given contents. This algorithm could be made more efficient, but likely would consume more memory too. */ std::set seen; size_t idx = new_items.size(); while (idx--) { const history_item_t &item = new_items[idx]; if (! seen.insert(item.contents).second) { // This item was not inserted because it was already in the set, so delete the item at this index new_items.erase(new_items.begin() + idx); if (idx < first_unwritten_new_item_index) { /* Decrement first_unwritten_new_item_index if we are deleting a previously written item */ first_unwritten_new_item_index--; } } } } bool history_t::save_internal_via_rewrite() { /* This must be called while locked */ ASSERT_IS_LOCKED(lock); bool ok = false; wcstring tmp_name_template = history_filename(name, L".XXXXXX"); if (! tmp_name_template.empty()) { /* Make an LRU cache to save only the last N elements */ history_lru_cache_t lru(HISTORY_SAVE_MAX); /* Insert old items in, from old to new. Merge them with our new items, inserting items with earlier timestamps first. */ std::vector::const_iterator new_item_iter = new_items.begin(); /* Map in existing items (which may have changed out from underneath us, so don't trust our old mmap'd data) */ const char *local_mmap_start = NULL; size_t local_mmap_size = 0; if (map_file(name, &local_mmap_start, &local_mmap_size, NULL)) { const history_file_type_t local_mmap_type = infer_file_type(local_mmap_start, local_mmap_size); size_t cursor = 0; for (;;) { size_t offset = offset_of_next_item(local_mmap_start, local_mmap_size, local_mmap_type, &cursor, 0); /* If we get back -1, we're done */ if (offset == (size_t)(-1)) break; /* Try decoding an old item */ const history_item_t old_item = history_t::decode_item(local_mmap_start + offset, local_mmap_size - offset, local_mmap_type); if (old_item.empty() || deleted_items.count(old_item.str()) > 0) { // debug(0, L"Item is deleted : %s\n", old_item.str().c_str()); continue; } /* The old item may actually be more recent than our new item, if it came from another session. Insert all new items at the given index with an earlier timestamp. */ for (; new_item_iter != new_items.end(); ++new_item_iter) { if (new_item_iter->timestamp() < old_item.timestamp()) { /* This "new item" is in fact older. */ lru.add_item(*new_item_iter); } else { /* The new item is not older. */ break; } } /* Now add this old item */ lru.add_item(old_item); } munmap((void *)local_mmap_start, local_mmap_size); } /* Insert any remaining new items */ for (; new_item_iter != new_items.end(); ++new_item_iter) { lru.add_item(*new_item_iter); } signal_block(); /* Try to create a temporary file, up to 10 times. We don't use mkstemps because we want to open it CLO_EXEC. This should almost always succeed on the first try. */ int out_fd = -1; wcstring tmp_name; for (size_t attempt = 0; attempt < 10 && out_fd == -1; attempt++) { char *narrow_str = wcs2str(tmp_name_template.c_str()); if (narrow_str && mktemp(narrow_str)) { /* It was successfully templated; try opening it atomically */ tmp_name = str2wcstring(narrow_str); out_fd = wopen_cloexec(tmp_name, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC, 0644); } free(narrow_str); } if (out_fd >= 0) { /* Write them out */ bool errored = false; history_output_buffer_t buffer; for (history_lru_cache_t::iterator iter = lru.begin(); iter != lru.end(); ++iter) { const history_lru_node_t *node = *iter; append_yaml_to_buffer(node->key, node->timestamp, node->required_paths, &buffer); if (buffer.output_size() >= HISTORY_OUTPUT_BUFFER_SIZE && ! buffer.flush_to_fd(out_fd)) { errored = true; break; } } if (! errored && buffer.flush_to_fd(out_fd)) { ok = true; } if (! ok) { /* This message does not have high enough priority to be shown by default. */ debug(2, L"Error when writing history file"); } else { wcstring new_name = history_filename(name, wcstring()); wrename(tmp_name, new_name); } close(out_fd); } signal_unblock(); /* Make sure we clear all nodes, since this doesn't happen automatically */ lru.evict_all_nodes(); } if (ok) { /* We've saved everything, so we have no more unsaved items */ this->first_unwritten_new_item_index = new_items.size(); /* We deleted our deleted items */ this->deleted_items.clear(); /* Our history has been written to the file, so clear our state so we can re-reference the file. */ this->clear_file_state(); } return ok; } bool history_t::save_internal_via_appending() { /* This must be called while locked */ ASSERT_IS_LOCKED(lock); /* No deleting allowed */ assert(deleted_items.empty()); bool ok = false; /* If the file is different (someone vacuumed it) then we need to update our mmap */ bool file_changed = false; /* Get the path to the real history file */ wcstring history_path = history_filename(name, wcstring()); signal_block(); /* Open the file */ int out_fd = wopen_cloexec(history_path, O_WRONLY | O_APPEND); if (out_fd >= 0) { /* Check to see if the file changed */ if (history_file_identify(out_fd) != mmap_file_id) file_changed = true; /* Exclusive lock on the entire file. This is released when we close the file (below). This may fail on (e.g.) lockless NFS. If so, proceed as if it did not fail; the risk is that we may get interleaved history items, which is considered better than no history, or forcing everything through the slow copy-move mode. We try to minimize this possibility by writing with O_APPEND. Simulate a failing lock in chaos_mode */ if (! chaos_mode) history_file_lock(out_fd, F_WRLCK); /* We (hopefully successfully) took the exclusive lock. Append to the file. Note that this is sketchy for a few reasons: - Another shell may have appended its own items with a later timestamp, so our file may no longer be sorted by timestamp. - Another shell may have appended the same items, so our file may now contain duplicates. We cannot modify any previous parts of our file, because other instances may be reading those portions. We can only append. Originally we always rewrote the file on saving, which avoided both of these problems. However, appending allows us to save history after every command, which is nice! Periodically we "clean up" the file by rewriting it, so that most of the time it doesn't have duplicates, although we don't yet sort by timestamp (the timestamp isn't really used for much anyways). */ /* So far so good. Write all items at or after first_unwritten_new_item_index */ bool errored = false; history_output_buffer_t buffer; while (first_unwritten_new_item_index < new_items.size()) { const history_item_t &item = new_items.at(first_unwritten_new_item_index); append_yaml_to_buffer(item.str(), item.timestamp(), item.get_required_paths(), &buffer); if (buffer.output_size() >= HISTORY_OUTPUT_BUFFER_SIZE) { errored = ! buffer.flush_to_fd(out_fd); if (errored) break; } /* We wrote this item, hooray */ first_unwritten_new_item_index++; } if (! errored && buffer.flush_to_fd(out_fd)) { ok = true; } close(out_fd); } signal_unblock(); /* If someone has replaced the file, forget our file state */ if (file_changed) { this->clear_file_state(); } return ok; } /** Save the specified mode to file; optionally also vacuums */ void history_t::save_internal(bool vacuum) { /* This must be called while locked */ ASSERT_IS_LOCKED(lock); /* Nothing to do if there's no new items */ if (first_unwritten_new_item_index >= new_items.size() && deleted_items.empty()) return; /* Compact our new items so we don't have duplicates */ this->compact_new_items(); /* Try saving. If we have items to delete, we have to rewrite the file. If we do not, we can append to it. */ bool ok = false; if (! vacuum && deleted_items.empty()) { /* Try doing a fast append */ ok = save_internal_via_appending(); } if (! ok) { /* We did not or could not append; rewrite the file ("vacuum" it) */ ok = this->save_internal_via_rewrite(); } } void history_t::save(void) { scoped_lock locker(lock); this->save_internal(false); } void history_t::save_and_vacuum(void) { scoped_lock locker(lock); this->save_internal(true); } void history_t::clear(void) { scoped_lock locker(lock); new_items.clear(); deleted_items.clear(); first_unwritten_new_item_index = 0; old_item_offsets.clear(); wcstring filename = history_filename(name, L""); if (! filename.empty()) wunlink(filename); this->clear_file_state(); } bool history_t::is_empty(void) { scoped_lock locker(lock); /* If we have new items, we're not empty */ if (! new_items.empty()) return false; bool empty = false; if (loaded_old) { /* If we've loaded old items, see if we have any offsets */ empty = old_item_offsets.empty(); } else { /* If we have not loaded old items, don't actually load them (which may be expensive); just stat the file and see if it exists and is nonempty */ const wcstring where = history_filename(name, L""); struct stat buf = {}; if (wstat(where, &buf) != 0) { /* Access failed, assume missing */ empty = true; } else { /* We're empty if the file is empty */ empty = (buf.st_size == 0); } } return empty; } /* Indicate whether we ought to import the bash history file into fish */ static bool should_import_bash_history_line(const std::string &line) { if (line.empty()) return false; /* Very naive tests! Skip export; probably should skip others. */ const char * const ignore_prefixes[] = { "export ", "#" }; for (size_t i=0; i < sizeof ignore_prefixes / sizeof *ignore_prefixes; i++) { const char *prefix = ignore_prefixes[i]; if (! line.compare(0, strlen(prefix), prefix)) { return false; } } /* Skip lines with backticks */ if (line.find('`') != std::string::npos) return false; return true; } void history_t::populate_from_bash(FILE *stream) { /* Bash's format is very simple: just lines with #s for comments. Ignore a few commands that are bash-specific. This list ought to be expanded. */ std::string line; for (;;) { line.clear(); bool success = false, has_newline = false; /* Loop until we've read a line */ do { char buff[128]; success = !! fgets(buff, sizeof buff, stream); if (success) { /* Skip the newline */ char *newline = strchr(buff, '\n'); if (newline) *newline = '\0'; has_newline = (newline != NULL); /* Append what we've got */ line.append(buff); } } while (success && ! has_newline); /* Maybe add this line */ if (should_import_bash_history_line(line)) { this->add(str2wcstring(line)); } if (line.empty()) break; } } void history_init() { } void history_destroy() { /* Save all histories */ for (std::map::iterator iter = histories.begin(); iter != histories.end(); ++iter) { iter->second->save(); } } void history_sanity_check() { /* No sanity checking implemented yet... */ } int file_detection_context_t::perform_file_detection(bool test_all) { ASSERT_IS_BACKGROUND_THREAD(); valid_paths.clear(); int result = 1; for (path_list_t::const_iterator iter = potential_paths.begin(); iter != potential_paths.end(); ++iter) { if (path_is_valid(*iter, working_directory)) { /* Push the original (possibly relative) path */ valid_paths.push_back(*iter); } else { /* Not a valid path */ result = 0; if (! test_all) break; } } return result; } bool file_detection_context_t::paths_are_valid(const path_list_t &paths) { this->potential_paths = paths; return perform_file_detection(false) > 0; } file_detection_context_t::file_detection_context_t(history_t *hist, const wcstring &cmd) : history(hist), command(cmd), when(time(NULL)), working_directory(env_get_pwd_slash()) { } static int threaded_perform_file_detection(file_detection_context_t *ctx) { ASSERT_IS_BACKGROUND_THREAD(); assert(ctx != NULL); return ctx->perform_file_detection(true /* test all */); } static void perform_file_detection_done(file_detection_context_t *ctx, int success) { /* Now that file detection is done, create the history item */ ctx->history->add(ctx->command, ctx->valid_paths); /* Done with the context. */ delete ctx; } static bool string_could_be_path(const wcstring &potential_path) { // Assume that things with leading dashes aren't paths if (potential_path.empty() || potential_path.at(0) == L'-') return false; return true; } void history_t::add_with_file_detection(const wcstring &str) { ASSERT_IS_MAIN_THREAD(); path_list_t potential_paths; /* Hack hack hack - if the command is likely to trigger an exit, then don't do background file detection, because we won't be able to write it to our history file before we exit. */ bool impending_exit = false; tokenizer_t tokenizer(str.c_str(), TOK_SQUASH_ERRORS); for (; tok_has_next(&tokenizer); tok_next(&tokenizer)) { int type = tok_last_type(&tokenizer); if (type == TOK_STRING) { const wchar_t *token_cstr = tok_last(&tokenizer); if (token_cstr) { wcstring potential_path = token_cstr; if (unescape_string(potential_path, false) && string_could_be_path(potential_path)) { potential_paths.push_back(potential_path); /* What a hack! */ impending_exit = impending_exit || contains(potential_path, L"exec", L"exit", L"reboot"); } } } } if (potential_paths.empty() || impending_exit) { this->add(str); } else { /* We have some paths. Make a context. */ file_detection_context_t *context = new file_detection_context_t(this, str); /* Store the potential paths. Reverse them to put them in the same order as in the command. */ context->potential_paths.swap(potential_paths); iothread_perform(threaded_perform_file_detection, perform_file_detection_done, context); } } fish/history.h000066400000000000000000000245171214535744100137000ustar00rootroot00000000000000/** \file history.h Prototypes for history functions, part of the user interface. */ #ifndef FISH_HISTORY_H #define FISH_HISTORY_H #include #include "common.h" #include "pthread.h" #include "wutil.h" #include #include #include #include /* fish supports multiple shells writing to history at once. Here is its strategy: 1. All history files are append-only. Data, once written, is never modified. 2. A history file may be re-written ("vacuumed"). This involves reading in the file and writing a new one, while performing maintenance tasks: discarding items in an LRU fashion until we reach the desired maximum count, removing duplicates, and sorting them by timestamp (eventually, not implemented yet). The new file is atomically moved into place via rename(). 3. History files are mapped in via mmap(). Before the file is mapped, the file takes a fcntl read lock. The purpose of this lock is to avoid seeing a transient state where partial data has been written to the file. 4. History is appended to under a fcntl write lock. 5. The chaos_mode boolean can be set to true to do things like lower buffer sizes which can trigger race conditions. This is useful for testing. */ typedef std::vector path_list_t; enum history_search_type_t { /** The history searches for strings containing the given string */ HISTORY_SEARCH_TYPE_CONTAINS, /** The history searches for strings starting with the given string */ HISTORY_SEARCH_TYPE_PREFIX }; class history_item_t { friend class history_t; friend class history_lru_node_t; friend class history_tests_t; private: explicit history_item_t(const wcstring &); explicit history_item_t(const wcstring &, time_t, const path_list_t &paths = path_list_t()); /** Attempts to merge two compatible history items together */ bool merge(const history_item_t &item); /** The actual contents of the entry */ wcstring contents; /** Original creation time for the entry */ time_t creation_timestamp; /** Paths that we require to be valid for this item to be autosuggested */ path_list_t required_paths; public: const wcstring &str() const { return contents; } bool empty() const { return contents.empty(); } /* Whether our contents matches a search term. */ bool matches_search(const wcstring &term, enum history_search_type_t type) const; time_t timestamp() const { return creation_timestamp; } const path_list_t &get_required_paths() const { return required_paths; } bool operator==(const history_item_t &other) const { return contents == other.contents && creation_timestamp == other.creation_timestamp && required_paths == other.required_paths; } }; /* The type of file that we mmap'd */ enum history_file_type_t { history_type_unknown, history_type_fish_2_0, history_type_fish_1_x }; class history_t { friend class history_tests_t; private: /** No copying */ history_t(const history_t&); history_t &operator=(const history_t&); /** Private creator */ history_t(const wcstring &pname); /** Privately add an item */ void add(const history_item_t &item); /** Destructor */ ~history_t(); /** Lock for thread safety */ pthread_mutex_t lock; /** Internal function */ void clear_file_state(); /** The name of this list. Used for picking a suitable filename and for switching modes. */ const wcstring name; /** New items. Note that these are NOT discarded on save. We need to keep these around so we can distinguish between items in our history and items in the history of other shells that were started after we were started. */ std::vector new_items; /** The index of the first new item that we have not yet written. */ size_t first_unwritten_new_item_index; /** Deleted item contents. */ std::set deleted_items; /** The mmaped region for the history file */ const char *mmap_start; /** The size of the mmap'd region */ size_t mmap_length; /** The type of file we mmap'd */ history_file_type_t mmap_type; /** The file ID of the file we mmap'd */ file_id_t mmap_file_id; /** Timestamp of when this history was created */ const time_t birth_timestamp; /** How many items we add until the next vacuum. Initially a random value. */ int countdown_to_vacuum; /** Figure out the offsets of our mmap data */ void populate_from_mmap(void); /** List of old items, as offsets into out mmap data */ std::vector old_item_offsets; /** Whether we've loaded old items */ bool loaded_old; /** Loads old if necessary */ bool load_old_if_needed(void); /** Memory maps the history file if necessary */ bool mmap_if_needed(void); /** Deletes duplicates in new_items. */ void compact_new_items(); /** Saves history by rewriting the file */ bool save_internal_via_rewrite(); /** Saves history by appending to the file */ bool save_internal_via_appending(); /** Saves history */ void save_internal(bool vacuum); /* Do a private, read-only map of the entirety of a history file with the given name. Returns true if successful. Returns the mapped memory region by reference. */ bool map_file(const wcstring &name, const char **out_map_start, size_t *out_map_len, file_id_t *file_id); /** Whether we're in maximum chaos mode, useful for testing */ bool chaos_mode; /* Versioned decoding */ static history_item_t decode_item_fish_2_0(const char *base, size_t len); static history_item_t decode_item_fish_1_x(const char *base, size_t len); static history_item_t decode_item(const char *base, size_t len, history_file_type_t type); public: /** Returns history with the given name, creating it if necessary */ static history_t & history_with_name(const wcstring &name); /** Determines whether the history is empty. Unfortunately this cannot be const, since it may require populating the history. */ bool is_empty(void); /** Add a new history item to the end */ void add(const wcstring &str, const path_list_t &valid_paths = path_list_t()); /** Remove a history item */ void remove(const wcstring &str); /** Add a new history item to the end */ void add_with_file_detection(const wcstring &str); /** Saves history */ void save(); /** Performs a full (non-incremental) save */ void save_and_vacuum(); /** Irreversibly clears history */ void clear(); /** Populates from a bash history file */ void populate_from_bash(FILE *f); /* Gets all the history into a string with ARRAY_SEP_STR. This is intended for the $history environment variable. This may be long! */ void get_string_representation(wcstring &str, const wcstring &separator); /** Return the specified history at the specified index. 0 is the index of the current commandline. (So the most recent item is at index 1.) */ history_item_t item_at_index(size_t idx); }; class history_search_t { /** The history in which we are searching */ history_t * history; /** Our type */ enum history_search_type_t search_type; /** Our list of previous matches as index, value. The end is the current match. */ typedef std::pair prev_match_t; std::vector prev_matches; /** Returns yes if a given term is in prev_matches. */ bool match_already_made(const wcstring &match) const; /** The search term */ wcstring term; /** Additional strings to skip (sorted) */ wcstring_list_t external_skips; bool should_skip_match(const wcstring &str) const; public: /** Gets the search term */ const wcstring &get_term() const { return term; } /** Sets additional string matches to skip */ void skip_matches(const wcstring_list_t &skips); /** Finds the next search term (forwards in time). Returns true if one was found. */ bool go_forwards(void); /** Finds the previous search result (backwards in time). Returns true if one was found. */ bool go_backwards(void); /** Goes to the end (forwards) */ void go_to_end(void); /** Returns if we are at the end. We start out at the end. */ bool is_at_end(void) const; /** Goes to the beginning (backwards) */ void go_to_beginning(void); /** Returns the current search result item. asserts if there is no current item. */ history_item_t current_item(void) const; /** Returns the current search result item contents. asserts if there is no current item. */ wcstring current_string(void) const; /** Constructor */ history_search_t(history_t &hist, const wcstring &str, enum history_search_type_t type = HISTORY_SEARCH_TYPE_CONTAINS) : history(&hist), search_type(type), term(str) {} /* Default constructor */ history_search_t() : history(), search_type(HISTORY_SEARCH_TYPE_CONTAINS), term() {} }; /** Init history library. The history file won't actually be loaded until the first time a history search is performed. */ void history_init(); /** Saves the new history to disc. */ void history_destroy(); /** Perform sanity checks */ void history_sanity_check(); /* A helper class for threaded detection of paths */ struct file_detection_context_t { /* Constructor */ file_detection_context_t(history_t *hist, const wcstring &cmd); /* Determine which of potential_paths are valid, and put them in valid_paths */ int perform_file_detection(); /* The history associated with this context */ history_t *history; /* The command */ wcstring command; /* When the command was issued */ time_t when; /* The working directory at the time the command was issued */ wcstring working_directory; /* Paths to test */ path_list_t potential_paths; /* Paths that were found to be valid */ path_list_t valid_paths; /* Performs file detection. Returns 1 if every path in potential_paths is valid, 0 otherwise. If test_all is true, tests every path; otherwise stops as soon as it reaches an invalid path. */ int perform_file_detection(bool test_all); /* Determine whether the given paths are all valid */ bool paths_are_valid(const path_list_t &paths); }; #endif fish/input.cpp000066400000000000000000000472311214535744100136670ustar00rootroot00000000000000/** \file input.c Functions for reading a character of input from stdin. */ #include "config.h" #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "reader.h" #include "proc.h" #include "common.h" #include "sanity.h" #include "input_common.h" #include "input.h" #include "parser.h" #include "env.h" #include "expand.h" #include "event.h" #include "signal.h" #include "output.h" #include "intern.h" #include /** Struct representing a keybinding. Returned by input_get_mappings. */ struct input_mapping_t { wcstring seq; /**< Character sequence which generates this event */ wcstring command; /**< command that should be evaluated by this mapping */ input_mapping_t(const wcstring &s, const wcstring &c) : seq(s), command(c) {} }; /** A struct representing the mapping from a terminfo key name to a terminfo character sequence */ struct terminfo_mapping_t { const wchar_t *name; /**< Name of key */ const char *seq; /**< Character sequence generated on keypress. Constant string. */ }; /** Names of all the input functions supported */ static const wchar_t * const name_arr[] = { L"beginning-of-line", L"end-of-line", L"forward-char", L"backward-char", L"forward-word", L"backward-word", L"history-search-backward", L"history-search-forward", L"delete-char", L"backward-delete-char", L"kill-line", L"yank", L"yank-pop", L"complete", L"beginning-of-history", L"end-of-history", L"backward-kill-line", L"kill-whole-line", L"kill-word", L"backward-kill-word", L"backward-kill-path-component", L"dump-functions", L"history-token-search-backward", L"history-token-search-forward", L"self-insert", L"null", L"eof", L"vi-arg-digit", L"execute", L"beginning-of-buffer", L"end-of-buffer", L"repaint", L"up-line", L"down-line", L"suppress-autosuggestion", L"accept-autosuggestion" } ; /** Description of each supported input function */ /* static const wchar_t *desc_arr[] = { L"Move to beginning of line", L"Move to end of line", L"Move forward one character", L"Move backward one character", L"Move forward one word", L"Move backward one word", L"Search backward through list of previous commands", L"Search forward through list of previous commands", L"Delete one character forward", L"Delete one character backward", L"Move contents from cursor to end of line to killring", L"Paste contents of killring", L"Rotate to previous killring entry", L"Guess the rest of the next input token", L"Move to first item of history", L"Move to last item of history", L"Clear current line", L"Move contents from beginning of line to cursor to killring", L"Move entire line to killring", L"Move next word to killring", L"Move previous word to killring", L"Write out key bindings", L"Clear entire screen", L"Quit the running program", L"Search backward through list of previous commands for matching token", L"Search forward through list of previous commands for matching token", L"Insert the pressed key", L"Do nothing", L"End of file", L"Repeat command" } ; */ /** Internal code for each supported input function */ static const wchar_t code_arr[] = { R_BEGINNING_OF_LINE, R_END_OF_LINE, R_FORWARD_CHAR, R_BACKWARD_CHAR, R_FORWARD_WORD, R_BACKWARD_WORD, R_HISTORY_SEARCH_BACKWARD, R_HISTORY_SEARCH_FORWARD, R_DELETE_CHAR, R_BACKWARD_DELETE_CHAR, R_KILL_LINE, R_YANK, R_YANK_POP, R_COMPLETE, R_BEGINNING_OF_HISTORY, R_END_OF_HISTORY, R_BACKWARD_KILL_LINE, R_KILL_WHOLE_LINE, R_KILL_WORD, R_BACKWARD_KILL_WORD, R_BACKWARD_KILL_PATH_COMPONENT, R_DUMP_FUNCTIONS, R_HISTORY_TOKEN_SEARCH_BACKWARD, R_HISTORY_TOKEN_SEARCH_FORWARD, R_SELF_INSERT, R_NULL, R_EOF, R_VI_ARG_DIGIT, R_EXECUTE, R_BEGINNING_OF_BUFFER, R_END_OF_BUFFER, R_REPAINT, R_UP_LINE, R_DOWN_LINE, R_SUPPRESS_AUTOSUGGESTION, R_ACCEPT_AUTOSUGGESTION } ; /** Mappings for the current input mode */ static std::vector mapping_list; /* Terminfo map list */ static std::vector terminfo_mappings; #define TERMINFO_ADD(key) { (L ## #key) + 4, key } /** List of all terminfo mappings */ static std::vector mappings; /** Set to one when the input subsytem has been initialized. */ static bool is_init = false; /** Initialize terminfo. */ static void input_terminfo_init(); /** Returns the function description for the given function code. */ void input_mapping_add(const wchar_t *sequence, const wchar_t *command) { CHECK(sequence,); CHECK(command,); // debug( 0, L"Add mapping from %ls to %ls", escape(sequence, 1), escape(command, 1 ) ); for (size_t i=0; i(fish_term256); } else { env_var_t term = env_get_string(L"TERM"); if (term.missing()) { support_term256 = false; } else if (term.find(L"256color") != wcstring::npos) { /* Explicitly supported */ support_term256 = true; } else if (term.find(L"xterm") != wcstring::npos) { // assume that all xterms are 256, except for OS X SnowLeopard env_var_t prog = env_get_string(L"TERM_PROGRAM"); support_term256 = (prog != L"Apple_Terminal"); } else { // Don't know, default to false support_term256 = false; } } output_set_supports_term256(support_term256); } int input_init() { if (is_init) return 1; is_init = true; input_common_init(&interrupt_handler); int errret; if (setupterm(0, STDOUT_FILENO, &errret) == ERR) { debug(0, _(L"Could not set up terminal")); exit_without_destructors(1); } const env_var_t term = env_get_string(L"TERM"); assert(! term.missing()); output_set_term(term); input_terminfo_init(); update_fish_term256(); /* If we have no keybindings, add a few simple defaults */ if (mapping_list.empty()) { input_mapping_add(L"", L"self-insert"); input_mapping_add(L"\n", L"execute"); input_mapping_add(L"\t", L"complete"); input_mapping_add(L"\x3", L"commandline \"\""); input_mapping_add(L"\x4", L"exit"); input_mapping_add(L"\x5", L"bind"); } return 1; } void input_destroy() { if (!is_init) return; is_init = false; input_common_destroy(); if (fish_del_curterm(cur_term) == ERR) { debug(0, _(L"Error while closing terminfo")); } } /** Perform the action of the specified binding */ static wint_t input_exec_binding(const input_mapping_t &m, const wcstring &seq) { wchar_t code = input_function_get_code(m.command); if (code != -1) { switch (code) { case R_SELF_INSERT: { return seq[0]; } default: { return code; } } } else { /* This key sequence is bound to a command, which is sent to the parser for evaluation. */ int last_status = proc_get_last_status(); parser_t::principal_parser().eval(m.command.c_str(), io_chain_t(), TOP); proc_set_last_status(last_status); /* We still need to return something to the caller, R_NULL tells the reader that no key press needs to be handled, and no repaint is needed. Bindings that produce output should emit a R_REPAINT function by calling 'commandline -f repaint' to tell fish that a repaint is in order. */ return R_NULL; } } /** Try reading the specified function mapping */ static wint_t input_try_mapping(const input_mapping_t &m) { wint_t c=0; int j; /* Check if the actual function code of this mapping is on the stack */ c = input_common_readch(0); if (c == input_function_get_code(m.command)) { return input_exec_binding(m, m.seq); } input_unreadch(c); const wchar_t *str = m.seq.c_str(); for (j=0; str[j] != L'\0'; j++) { bool timed = (j > 0); c = input_common_readch(timed); if (str[j] != c) break; } if (str[j] == L'\0') { /* We matched the entire sequence */ return input_exec_binding(m, m.seq); } else { int k; /* Return the read characters */ input_unreadch(c); for (k=j-1; k>=0; k--) { input_unreadch(m.seq[k]); } } return 0; } void input_unreadch(wint_t ch) { input_common_unreadch(ch); } wint_t input_readch() { size_t i; CHECK_BLOCK(R_NULL); /* Clear the interrupted flag */ reader_reset_interrupted(); /* Search for sequence in mapping tables */ while (1) { const input_mapping_t *generic = 0; for (i=0; i #include "input_common.h" /** Key codes for inputrc-style keyboard functions that are passed on to the caller of input_read() */ enum { R_BEGINNING_OF_LINE = R_NULL+10, /* This give input_common ten slots for lowlevel keycodes */ R_END_OF_LINE, R_FORWARD_CHAR, R_BACKWARD_CHAR, R_FORWARD_WORD, R_BACKWARD_WORD, R_HISTORY_SEARCH_BACKWARD, R_HISTORY_SEARCH_FORWARD, R_DELETE_CHAR, R_BACKWARD_DELETE_CHAR, R_KILL_LINE, R_YANK, R_YANK_POP, R_COMPLETE, R_BEGINNING_OF_HISTORY, R_END_OF_HISTORY, R_BACKWARD_KILL_LINE, R_KILL_WHOLE_LINE, R_KILL_WORD, R_BACKWARD_KILL_WORD, R_BACKWARD_KILL_PATH_COMPONENT, R_DUMP_FUNCTIONS, R_HISTORY_TOKEN_SEARCH_BACKWARD, R_HISTORY_TOKEN_SEARCH_FORWARD, R_SELF_INSERT, R_VI_ARG_DIGIT, R_VI_DELETE_TO, R_EXECUTE, R_BEGINNING_OF_BUFFER, R_END_OF_BUFFER, R_REPAINT, R_UP_LINE, R_DOWN_LINE, R_SUPPRESS_AUTOSUGGESTION, R_ACCEPT_AUTOSUGGESTION } ; /** Initialize the terminal by calling setupterm, and set up arrays used by readch to detect escape sequences for special keys. Before calling input_init, terminfo is not initialized and MUST not be used */ int input_init(); /** free up memory used by terminal functions. */ void input_destroy(); /** Read a character from fd 0. Try to convert some escape sequences into character constants, but do not permanently block the escape character. This is performed in the same way vim does it, i.e. if an escape character is read, wait for more input for a short time (a few milliseconds). If more input is avaialable, it is assumed to be an escape sequence for a special character (such as an arrow key), and readch attempts to parse it. If no more input follows after the escape key, it is assumed to be an actual escape key press, and is returned as such. */ 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. */ void input_unreadch(wint_t ch); /** Add a key mapping from the specified sequence to the specified command \param sequence the sequence to bind \param command an input function that will be run whenever the key sequence occurs */ void input_mapping_add(const wchar_t *sequence, const wchar_t *command); /** Insert all mapping names into the specified wcstring_list_t */ void input_mapping_get_names(wcstring_list_t &lst); /** Erase binding for specified key sequence */ bool input_mapping_erase(const wchar_t *sequence); /** Gets the command bound to the specified key sequence. Returns true if it exists, false if not. */ bool input_mapping_get(const wcstring &sequence, wcstring &cmd); /** Return the sequence for the terminfo variable of the specified name. If no terminfo variable of the specified name could be found, return false and set errno to ENOENT. If the terminfo variable does not have a value, return false and set errno to EILSEQ. */ bool input_terminfo_get_sequence(const wchar_t *name, wcstring *out_seq); /** Return the name of the terminfo variable with the specified sequence */ bool input_terminfo_get_name(const wcstring &seq, wcstring &name); /** Return a list of all known terminfo names */ wcstring_list_t input_terminfo_get_names(bool skip_null); /** Returns the input function code for the given input function name. */ wchar_t input_function_get_code(const wcstring &name); /** Returns a list of all existing input function names */ wcstring_list_t input_function_get_names(void); /** Updates our idea of whether we support term256 */ void update_fish_term256(); #endif fish/input_common.cpp000066400000000000000000000156511214535744100152400ustar00rootroot00000000000000/** \file input_common.c Implementation file for the low level input library */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include #endif #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" #include "input_common.h" #include "env_universal.h" #include "iothread.h" /** Time in milliseconds to wait for another byte to be available for reading after \\x1b is read before assuming that escape key was pressed, and not an escape sequence. */ #define WAIT_ON_ESCAPE 10 /** Characters that have been read and returned by the sequence matching code */ static std::stack > lookahead_list; /* Queue of pairs of (function pointer, argument) to be invoked */ typedef std::pair callback_info_t; typedef std::queue > callback_queue_t; static callback_queue_t callback_queue; static void input_flush_callbacks(void); static bool has_lookahead(void) { return ! lookahead_list.empty(); } static wint_t lookahead_pop(void) { wint_t result = lookahead_list.top(); lookahead_list.pop(); return result; } static void lookahead_push(wint_t c) { lookahead_list.push(c); } static wint_t lookahead_top(void) { return lookahead_list.top(); } /** Callback function for handling interrupts on reading */ static int (*interrupt_handler)(); void input_common_init(int (*ih)()) { interrupt_handler = ih; } void input_common_destroy() { } /** Internal function used by input_common_readch to read one byte from fd 0. This function should only be called by input_common_readch(). */ static wint_t readb() { /* do_loop must be set on every path through the loop; leaving it uninitialized allows the static analyzer to assist in catching mistakes. */ unsigned char arr[1]; bool do_loop; do { /* Flush callbacks */ input_flush_callbacks(); fd_set fdset; int fd_max=0; int ioport = iothread_port(); int res; FD_ZERO(&fdset); FD_SET(0, &fdset); if (env_universal_server.fd > 0) { FD_SET(env_universal_server.fd, &fdset); if (fd_max < env_universal_server.fd) fd_max = env_universal_server.fd; } if (ioport > 0) { FD_SET(ioport, &fdset); if (fd_max < ioport) fd_max = ioport; } res = select(fd_max + 1, &fdset, 0, 0, 0); if (res==-1) { switch (errno) { case EINTR: case EAGAIN: { if (interrupt_handler) { int res = interrupt_handler(); if (res) { return res; } if (has_lookahead()) { return lookahead_pop(); } } do_loop = true; break; } default: { /* The terminal has been closed. Save and exit. */ return R_EOF; } } } else { /* Assume we loop unless we see a character in stdin */ do_loop = true; if (env_universal_server.fd > 0 && FD_ISSET(env_universal_server.fd, &fdset)) { debug(3, L"Wake up on universal variable event"); env_universal_read_all(); if (has_lookahead()) { return lookahead_pop(); } } if (ioport > 0 && FD_ISSET(ioport, &fdset)) { iothread_service_completion(); if (has_lookahead()) { return lookahead_pop(); } } if (FD_ISSET(STDIN_FILENO, &fdset)) { if (read_blocked(0, arr, 1) != 1) { /* The teminal has been closed. Save and exit. */ return R_EOF; } /* We read from stdin, so don't loop */ do_loop = false; } } } while (do_loop); return arr[0]; } wchar_t input_common_readch(int timed) { if (! has_lookahead()) { if (timed) { int count; fd_set fds; struct timeval tm= { 0, 1000 * WAIT_ON_ESCAPE } ; FD_ZERO(&fds); FD_SET(0, &fds); count = select(1, &fds, 0, 0, &tm); switch (count) { case 0: return WEOF; case -1: return WEOF; break; default: break; } } wchar_t res; static mbstate_t state; while (1) { wint_t b = readb(); char bb; size_t sz; if ((b >= R_NULL) && (b < R_NULL + 1000)) return b; bb=b; sz = mbrtowc(&res, &bb, 1, &state); switch (sz) { case (size_t)(-1): memset(&state, '\0', sizeof(state)); debug(2, L"Illegal input"); return R_NULL; case (size_t)(-2): break; case 0: return 0; default: return res; } } } else { if (!timed) { while (has_lookahead() && lookahead_top() == WEOF) lookahead_pop(); if (! has_lookahead()) return input_common_readch(0); } return lookahead_pop(); } } void input_common_unreadch(wint_t ch) { lookahead_push(ch); } void input_common_add_callback(void (*callback)(void *), void *arg) { ASSERT_IS_MAIN_THREAD(); callback_queue.push(callback_info_t(callback, arg)); } static void input_flush_callbacks(void) { /* Nothing to do if nothing to do */ if (callback_queue.empty()) return; /* We move the queue into a local variable, so that events queued up during a callback don't get fired until next round. */ callback_queue_t local_queue; std::swap(local_queue, callback_queue); while (! local_queue.empty()) { const callback_info_t &callback = local_queue.front(); callback.first(callback.second); //cute local_queue.pop(); } } fish/input_common.h000066400000000000000000000027441214535744100147040ustar00rootroot00000000000000/** \file input_common.h Header file for the low level input library */ #ifndef INPUT_COMMON_H #define INPUT_COMMON_H #include /** Use unencoded private-use keycodes for internal characters */ #define INPUT_COMMON_RESERVED 0xe000 enum { /** R_NULL is sometimes returned by the input when a character was requested but none could be delivered, or when an exception happened. */ R_NULL = INPUT_COMMON_RESERVED, R_EOF } ; /** Init the library */ void input_common_init(int (*ih)()); /** Free memory used by the library */ void input_common_destroy(); /** Function used by input_readch to read bytes from stdin until enough bytes have been read to convert them to a wchar_t. Conversion is done using mbrtowc. If a character has previously been read and then 'unread' using \c input_common_unreadch, that character is returned. If timed is true, readch2 will wait at most WAIT_ON_ESCAPE milliseconds for a character to be available for reading before returning with the value WEOF. */ 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); /** Adds a callback to be invoked at the next turn of the "event loop." The callback function will be invoked and passed arg. */ void input_common_add_callback(void (*callback)(void *), void *arg); #endif fish/install-sh000077500000000000000000000127261214535744100140310ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 fish/intern.cpp000066400000000000000000000037311214535744100140240ustar00rootroot00000000000000/** \file intern.c Library for pooling common strings */ #include "config.h" #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "common.h" #include "intern.h" /** Comparison function for intern'd strings */ class string_table_compare_t { public: bool operator()(const wchar_t *a, const wchar_t *b) const { return wcscmp(a, b) < 0; } }; /* A sorted vector ends up being a little more memory efficient than a std::set for the intern'd string table */ #define USE_SET 0 #if USE_SET /** The table of intern'd strings */ typedef std::set string_table_t; #else /** The table of intern'd strings */ typedef std::vector string_table_t; #endif static string_table_t string_table; /** The lock to provide thread safety for intern'd strings */ static pthread_mutex_t intern_lock = PTHREAD_MUTEX_INITIALIZER; static const wchar_t *intern_with_dup(const wchar_t *in, bool dup) { if (!in) return NULL; // debug( 0, L"intern %ls", in ); scoped_lock lock(intern_lock); const wchar_t *result; #if USE_SET string_table_t::const_iterator iter = string_table.find(in); if (iter != string_table.end()) { result = *iter; } else { result = dup ? wcsdup(in) : in; string_table.insert(result); } #else string_table_t::iterator iter = std::lower_bound(string_table.begin(), string_table.end(), in, string_table_compare_t()); if (iter != string_table.end() && wcscmp(*iter, in) == 0) { result = *iter; } else { result = dup ? wcsdup(in) : in; string_table.insert(iter, result); } #endif return result; } const wchar_t *intern(const wchar_t *in) { return intern_with_dup(in, true); } const wchar_t *intern_static(const wchar_t *in) { return intern_with_dup(in, false); } fish/intern.h000066400000000000000000000011671214535744100134720ustar00rootroot00000000000000/** \file intern.h Library for pooling common strings */ #ifndef FISH_INTERN_H #define FISH_INTERN_H #include /** Return an identical copy of the specified string from a pool of unique strings. If the string was not in the pool, add a copy. \param in the string to return an interned copy of */ const wchar_t *intern(const wchar_t *in); /** Insert the specified string literal into the pool of unique strings. The string will not first be copied, and it will not be free'd on exit. \param in the string to add to the interned pool */ const wchar_t *intern_static(const wchar_t *in); #endif fish/io.cpp000066400000000000000000000141351214535744100131340ustar00rootroot00000000000000/** \file io.c Utilities for io redirection. */ #include "config.h" #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #include "fallback.h" #include "util.h" #include "wutil.h" #include "exec.h" #include "common.h" #include "io.h" io_data_t::~io_data_t() { } void io_close_t::print() const { fprintf(stderr, "close %d\n", fd); } void io_fd_t::print() const { fprintf(stderr, "FD map %d -> %d\n", old_fd, fd); } void io_file_t::print() const { fprintf(stderr, "file (%s)\n", filename_cstr); } void io_pipe_t::print() const { fprintf(stderr, "pipe {%d, %d} (input: %s)\n", pipe_fd[0], pipe_fd[1], is_input ? "yes" : "no"); } void io_buffer_t::print() const { fprintf(stderr, "buffer %p (input: %s, size %lu)\n", out_buffer_ptr(), is_input ? "yes" : "no", out_buffer_size()); } void io_buffer_t::read() { exec_close(pipe_fd[1]); if (io_mode == IO_BUFFER) { /* if( fcntl( pipe_fd[0], F_SETFL, 0 ) ) { wperror( L"fcntl" ); return; } */ debug(4, L"io_buffer_t::read: blocking read on fd %d", pipe_fd[0]); while (1) { char b[4096]; long l; l=read_blocked(pipe_fd[0], b, 4096); if (l==0) { break; } else if (l<0) { /* exec_read_io_buffer is only called on jobs that have exited, and will therefore never block. But a broken pipe seems to cause some flags to reset, causing the EOF flag to not be set. Therefore, EAGAIN is ignored and we exit anyway. */ if (errno != EAGAIN) { debug(1, _(L"An error occured while reading output from code block on file descriptor %d"), pipe_fd[0]); wperror(L"io_buffer_t::read"); } break; } else { out_buffer_append(b, l); } } } } io_buffer_t *io_buffer_t::create(bool is_input, int fd) { bool success = true; if (fd == -1) { fd = is_input ? 0 : 1; } io_buffer_t *buffer_redirect = new io_buffer_t(fd, is_input); if (exec_pipe(buffer_redirect->pipe_fd) == -1) { debug(1, PIPE_ERROR); wperror(L"pipe"); success = false; } else if (make_fd_nonblocking(buffer_redirect->pipe_fd[0]) != 0) { debug(1, PIPE_ERROR); wperror(L"fcntl"); success = false; } if (! success) { delete buffer_redirect; buffer_redirect = NULL; } else { //fprintf(stderr, "Created pipes {%d, %d} for %p\n", buffer_redirect->pipe_fd[0], buffer_redirect->pipe_fd[1], buffer_redirect); } return buffer_redirect; } io_buffer_t::~io_buffer_t() { //fprintf(stderr, "Deallocating pipes {%d, %d} for %p\n", this->pipe_fd[0], this->pipe_fd[1], this); /** If this is an input buffer, then io_read_buffer will not have been called, and we need to close the output fd as well. */ if (is_input && pipe_fd[1] >= 0) { exec_close(pipe_fd[1]); } if (pipe_fd[0] >= 0) { exec_close(pipe_fd[0]); } /* Dont free fd for writing. This should already be free'd before calling exec_read_io_buffer on the buffer */ } void io_chain_t::remove(const shared_ptr &element) { // See if you can guess why std::find doesn't work here for (io_chain_t::iterator iter = this->begin(); iter != this->end(); ++iter) { if (*iter == element) { this->erase(iter); break; } } } void io_chain_t::push_back(const shared_ptr &element) { // Ensure we never push back NULL assert(element.get() != NULL); std::vector >::push_back(element); } void io_remove(io_chain_t &list, const shared_ptr &element) { list.remove(element); } void io_print(const io_chain_t &chain) { if (chain.empty()) { fprintf(stderr, "Empty chain %p\n", &chain); return; } fprintf(stderr, "Chain %p (%ld items):\n", &chain, (long)chain.size()); for (size_t i=0; i < chain.size(); i++) { const shared_ptr &io = chain.at(i); if (io.get() == NULL) { fprintf(stderr, "\t(null)\n"); } else { fprintf(stderr, "\t%lu: fd:%d, ", (unsigned long)i, io->fd); io->print(); } } } /* Return the last IO for the given fd */ shared_ptr io_chain_t::get_io_for_fd(int fd) const { size_t idx = this->size(); while (idx--) { const shared_ptr &data = this->at(idx); if (data->fd == fd) { return data; } } return shared_ptr(); } shared_ptr io_chain_t::get_io_for_fd(int fd) { size_t idx = this->size(); while (idx--) { const shared_ptr &data = this->at(idx); if (data->fd == fd) { return data; } } return shared_ptr(); } /* The old function returned the last match, so we mimic that. */ shared_ptr io_chain_get(const io_chain_t &src, int fd) { return src.get_io_for_fd(fd); } shared_ptr io_chain_get(io_chain_t &src, int fd) { return src.get_io_for_fd(fd); } io_chain_t::io_chain_t(const shared_ptr &data) : std::vector >(1, data) { } io_chain_t::io_chain_t() : std::vector >() { } fish/io.h000066400000000000000000000110411214535744100125720ustar00rootroot00000000000000#ifndef FISH_IO_H #define FISH_IO_H #include #if __cplusplus > 199711L // C++11 #include using std::shared_ptr; #else // C++03 #include using std::tr1::shared_ptr; #endif /** Describes what type of IO operation an io_data_t represents */ enum io_mode_t { IO_FILE, IO_PIPE, IO_FD, IO_BUFFER, IO_CLOSE }; /** Represents an FD redirection */ class io_data_t { private: /* No assignment or copying allowed */ io_data_t(const io_data_t &rhs); void operator=(const io_data_t &rhs); protected: io_data_t(io_mode_t m, int f) : io_mode(m), fd(f) { } public: /** Type of redirect */ const io_mode_t io_mode; /** FD to redirect */ const int fd; virtual void print() const = 0; virtual ~io_data_t() = 0; }; class io_close_t : public io_data_t { public: io_close_t(int f) : io_data_t(IO_CLOSE, f) { } virtual void print() const; }; class io_fd_t : public io_data_t { public: /** fd to redirect specified fd to */ const int old_fd; /** Whether to close old_fd */ const bool close_old; virtual void print() const; io_fd_t(int f, int old, bool close = false) : io_data_t(IO_FD, f), old_fd(old), close_old(close) { } }; class io_file_t : public io_data_t { public: /** Filename, malloc'd. This needs to be used after fork, so don't use wcstring here. */ const char * const filename_cstr; /** file creation flags to send to open */ const int flags; virtual void print() const; io_file_t(int f, const wcstring &fname, int fl = 0) : io_data_t(IO_FILE, f), filename_cstr(wcs2str(fname)), flags(fl) { } virtual ~io_file_t() { free((void *)filename_cstr); } }; class io_pipe_t : public io_data_t { protected: io_pipe_t(io_mode_t m, int f, bool i): io_data_t(m, f), is_input(i) { pipe_fd[0] = pipe_fd[1] = -1; } public: int pipe_fd[2]; const bool is_input; virtual void print() const; io_pipe_t(int f, bool i): io_data_t(IO_PIPE, f), is_input(i) { pipe_fd[0] = pipe_fd[1] = -1; } }; class io_buffer_t : public io_pipe_t { private: /** buffer to save output in */ std::vector out_buffer; io_buffer_t(int f, bool i): io_pipe_t(IO_BUFFER, f, i), out_buffer() { } public: virtual void print() const; virtual ~io_buffer_t(); /** Function to append to the buffer */ void out_buffer_append(const char *ptr, size_t count) { out_buffer.insert(out_buffer.end(), ptr, ptr + count); } /** Function to get a pointer to the buffer */ char *out_buffer_ptr(void) { return out_buffer.empty() ? NULL : &out_buffer.at(0); } const char *out_buffer_ptr(void) const { return out_buffer.empty() ? NULL : &out_buffer.at(0); } /** Function to get the size of the buffer */ size_t out_buffer_size(void) const { return out_buffer.size(); } /** Close output pipe, and read from input pipe until eof. */ void read(); /** Create a IO_BUFFER type io redirection, complete with a pipe and a vector for output. The default file descriptor used is 1 for output buffering and 0 for input buffering. \param is_input set this parameter to zero if the buffer should be used to buffer the output of a command, or non-zero to buffer the input to a command. \param fd when -1, determined from is_input. */ static io_buffer_t *create(bool is_input, int fd = -1); }; class io_chain_t : public std::vector > { public: io_chain_t(); io_chain_t(const shared_ptr &); void remove(const shared_ptr &element); void push_back(const shared_ptr &element); shared_ptr get_io_for_fd(int fd) const; shared_ptr get_io_for_fd(int fd); }; /** Remove the specified io redirection from the chain */ void io_remove(io_chain_t &list, const shared_ptr &element); /** Destroys an io_chain */ void io_chain_destroy(io_chain_t &chain); /** Return the last io redirection in the chain for the specified file descriptor. */ shared_ptr io_chain_get(const io_chain_t &src, int fd); shared_ptr io_chain_get(io_chain_t &src, int fd); /** Print debug information about the specified IO redirection chain to stderr. */ void io_print(const io_chain_t &chain); #endif fish/iothread.cpp000066400000000000000000000145351214535744100143300ustar00rootroot00000000000000#include "config.h" #include "iothread.h" #include "common.h" #include #include #include #include #include #include #include #include #include #include #ifdef _POSIX_THREAD_THREADS_MAX #if _POSIX_THREAD_THREADS_MAX < 64 #define IO_MAX_THREADS _POSIX_THREAD_THREADS_MAX #endif #endif #ifndef IO_MAX_THREADS #define IO_MAX_THREADS 64 #endif static int s_active_thread_count; typedef unsigned char ThreadIndex_t; static struct WorkerThread_t { ThreadIndex_t idx; pthread_t thread; } threads[IO_MAX_THREADS]; struct ThreadedRequest_t { int sequenceNumber; int (*handler)(void *); void (*completionCallback)(void *, int); void *context; int handlerResult; }; static struct WorkerThread_t *next_vacant_thread_slot(void) { for (ThreadIndex_t i=0; i < IO_MAX_THREADS; i++) { if (! threads[i].thread) return &threads[i]; } return NULL; } static pthread_mutex_t s_request_queue_lock; static std::queue s_request_queue; static int s_last_sequence_number; static int s_read_pipe, s_write_pipe; static void iothread_init(void) { static bool inited = false; if (! inited) { inited = true; /* Initialize the queue lock */ VOMIT_ON_FAILURE(pthread_mutex_init(&s_request_queue_lock, NULL)); /* Initialize the completion pipes */ int pipes[2] = {0, 0}; VOMIT_ON_FAILURE(pipe(pipes)); s_read_pipe = pipes[0]; s_write_pipe = pipes[1]; // 0 means success to VOMIT_ON_FAILURE. Arrange to pass 0 if fcntl returns anything other than -1. VOMIT_ON_FAILURE(-1 == fcntl(s_read_pipe, F_SETFD, FD_CLOEXEC)); VOMIT_ON_FAILURE(-1 == fcntl(s_write_pipe, F_SETFD, FD_CLOEXEC)); /* Tell each thread its index */ for (ThreadIndex_t i=0; i < IO_MAX_THREADS; i++) { threads[i].idx = i; } } } static void add_to_queue(struct ThreadedRequest_t *req) { ASSERT_IS_LOCKED(s_request_queue_lock); s_request_queue.push(req); } static ThreadedRequest_t *dequeue_request(void) { ThreadedRequest_t *result = NULL; scoped_lock lock(s_request_queue_lock); if (! s_request_queue.empty()) { result = s_request_queue.front(); s_request_queue.pop(); } return result; } /* The function that does thread work. */ static void *iothread_worker(void *threadPtr) { assert(threadPtr != NULL); struct WorkerThread_t *thread = (struct WorkerThread_t *)threadPtr; /* Grab a request off of the queue */ struct ThreadedRequest_t *req = dequeue_request(); /* Run the handler and store the result */ if (req) { req->handlerResult = req->handler(req->context); } /* Write our index to wake up the main thread */ VOMIT_ON_FAILURE(! write_loop(s_write_pipe, (const char *)&thread->idx, sizeof thread->idx)); /* We're done */ return req; } /* Spawn another thread if there's work to be done. */ static void iothread_spawn_if_needed(void) { ASSERT_IS_LOCKED(s_request_queue_lock); if (! s_request_queue.empty() && s_active_thread_count < IO_MAX_THREADS) { struct WorkerThread_t *thread = next_vacant_thread_slot(); assert(thread != NULL); /* The spawned thread inherits our signal mask. We don't want the thread to ever receive signals on the spawned thread, so temporarily block all signals, spawn the thread, and then restore it. */ sigset_t newSet, savedSet; sigfillset(&newSet); VOMIT_ON_FAILURE(pthread_sigmask(SIG_BLOCK, &newSet, &savedSet)); /* Spawn a thread. */ int err; do { err = 0; if (pthread_create(&thread->thread, NULL, iothread_worker, thread)) { err = errno; } } while (err == EAGAIN); /* Need better error handling - perhaps try again later. */ assert(err == 0); /* Note that we are spawned another thread */ s_active_thread_count += 1; /* Restore our sigmask */ VOMIT_ON_FAILURE(pthread_sigmask(SIG_SETMASK, &savedSet, NULL)); } } int iothread_perform_base(int (*handler)(void *), void (*completionCallback)(void *, int), void *context) { ASSERT_IS_MAIN_THREAD(); ASSERT_IS_NOT_FORKED_CHILD(); iothread_init(); /* Create and initialize a request. */ struct ThreadedRequest_t *req = new ThreadedRequest_t(); req->handler = handler; req->completionCallback = completionCallback; req->context = context; req->sequenceNumber = ++s_last_sequence_number; /* Take our lock */ scoped_lock lock(s_request_queue_lock); /* Add to the queue */ add_to_queue(req); /* Spawn a thread if necessary */ iothread_spawn_if_needed(); return 0; } int iothread_port(void) { iothread_init(); return s_read_pipe; } void iothread_service_completion(void) { ASSERT_IS_MAIN_THREAD(); ThreadIndex_t threadIdx = (ThreadIndex_t)-1; VOMIT_ON_FAILURE(1 != read_loop(iothread_port(), &threadIdx, sizeof threadIdx)); assert(threadIdx < IO_MAX_THREADS); struct WorkerThread_t *thread = &threads[threadIdx]; assert(thread->thread != 0); struct ThreadedRequest_t *req = NULL; VOMIT_ON_FAILURE(pthread_join(thread->thread, (void **)&req)); /* Free up this thread */ thread->thread = 0; assert(s_active_thread_count > 0); s_active_thread_count -= 1; /* Handle the request */ if (req) { if (req->completionCallback) req->completionCallback(req->context, req->handlerResult); delete req; } /* Maybe spawn another thread, if there's more work to be done. */ VOMIT_ON_FAILURE(pthread_mutex_lock(&s_request_queue_lock)); iothread_spawn_if_needed(); VOMIT_ON_FAILURE(pthread_mutex_unlock(&s_request_queue_lock)); } void iothread_drain_all(void) { ASSERT_IS_MAIN_THREAD(); ASSERT_IS_NOT_FORKED_CHILD(); if (s_active_thread_count == 0) return; #define TIME_DRAIN 0 #if TIME_DRAIN int thread_count = s_active_thread_count; double now = timef(); #endif while (s_active_thread_count > 0) { iothread_service_completion(); } #if TIME_DRAIN double after = timef(); printf("(Waited %.02f msec for %d thread(s) to drain)\n", 1000 * (after - now), thread_count); #endif } fish/iothread.h000066400000000000000000000025021214535744100137640ustar00rootroot00000000000000/** \file iothread.h Handles IO that may hang. */ #ifndef FISH_IOTHREAD_H #define FISH_IOTHREAD_H /** Runs a command on a thread. \param handler The function to execute on a background thread. Accepts an arbitrary context pointer, and returns an int, which is passed to the completionCallback. \param completionCallback The function to execute on the main thread once the background thread is complete. Accepts an int (the return value of handler) and the context. \param context A arbitary context pointer to pass to the handler and completion callback. \return A sequence number, currently not very useful. */ int iothread_perform_base(int (*handler)(void *), void (*completionCallback)(void *, int), void *context); /** Gets the fd on which to listen for completion callbacks. \return A file descriptor on which to listen for completion callbacks. */ int iothread_port(void); /** Services one iothread competion callback. */ void iothread_service_completion(void); /** Waits for all iothreads to terminate. */ void iothread_drain_all(void); /** Helper template */ template int iothread_perform(int (*handler)(T *), void (*completionCallback)(T *, int), T *context) { return iothread_perform_base((int (*)(void *))handler, (void (*)(void *, int))completionCallback, static_cast(context)); } #endif fish/key_reader.cpp000066400000000000000000000043211214535744100146330ustar00rootroot00000000000000/* A small utility to print the resulting key codes from pressing a key. Servers the same function as hitting ^V in bash, but I prefer the way key_reader works. Type ^C to exit the program. */ #include "config.h" #include #include #include #include #include #include #include #include "common.h" #include "fallback.h" #include "input_common.h" int writestr(char *str) { write(1, str, strlen(str)); return 0; } int main(int argc, char **argv) { set_main_thread(); setup_fork_guards(); setlocale(LC_ALL, ""); if (argc == 2) { static char term_buffer[2048]; char *termtype = getenv("TERM"); char *tbuff = new char[9999]; char *res; tgetent(term_buffer, termtype); res = tgetstr(argv[1], &tbuff); if (res != 0) { while (*res != 0) { printf("%d ", *res); res++; } printf("\n"); } else { printf("Undefined sequence\n"); } } else { char scratch[1024]; unsigned int c; struct termios modes, /* so we can change the modes */ savemodes; /* so we can reset the modes when we're done */ input_common_init(0); tcgetattr(0,&modes); /* get the current terminal modes */ savemodes = modes; /* save a copy so we can reset them */ modes.c_lflag &= ~ICANON; /* turn off canonical mode */ modes.c_lflag &= ~ECHO; /* turn off echo mode */ modes.c_cc[VMIN]=1; modes.c_cc[VTIME]=0; tcsetattr(0,TCSANOW,&modes); /* set the new modes */ while (1) { if ((c=input_common_readch(0)) == EOF) break; if ((c > 31) && (c != 127)) sprintf(scratch, "dec: %d hex: %x char: %c\n", c, c, c); else sprintf(scratch, "dec: %d hex: %x\n", c, c); writestr(scratch); } /* reset the terminal to the saved mode */ tcsetattr(0,TCSANOW,&savemodes); input_common_destroy(); } return 0; } fish/kill.cpp000066400000000000000000000116101214535744100134530ustar00rootroot00000000000000/** \file kill.c The killring. Works like the killring in emacs and readline. The killring is cut and paste with a memory of previous cuts. It supports integration with the X clipboard. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "kill.h" #include "proc.h" #include "sanity.h" #include "common.h" #include "env.h" #include "exec.h" #include "path.h" /** Maximum entries in killring */ #define KILL_MAX 8192 /** Last kill string */ //static ll_node_t *kill_last=0; /** Current kill string */ //static ll_node_t *kill_current=0; /** Kill ring */ typedef std::list kill_list_t; static kill_list_t kill_list; /** Contents of the X clipboard, at last time we checked it */ static wchar_t *cut_buffer=0; /** Test if the xsel command is installed. Since this is called often, cache the result. */ static int has_xsel() { static signed char res=-1; if (res < 0) { res = !! path_get_path(L"xsel", NULL); } return res; } void kill_add(const wcstring &str) { ASSERT_IS_MAIN_THREAD(); if (str.empty()) return; wcstring cmd; wchar_t *escaped_str = NULL; kill_list.push_front(str); /* Check to see if user has set the FISH_CLIPBOARD_CMD variable, and, if so, use it instead of checking the display, etc. I couldn't think of a safe way to allow overide of the echo command too, so, the command used must accept the input via stdin. */ const env_var_t clipboard_wstr = env_get_string(L"FISH_CLIPBOARD_CMD"); if (!clipboard_wstr.missing()) { escaped_str = escape(str.c_str(), 1); cmd.assign(L"echo -n "); cmd.append(escaped_str); cmd.append(clipboard_wstr); } else { /* This is for sending the kill to the X copy-and-paste buffer */ if (!has_xsel()) { return; } const env_var_t disp_wstr = env_get_string(L"DISPLAY"); if (!disp_wstr.missing()) { escaped_str = escape(str.c_str(), ESCAPE_ALL); cmd.assign(L"echo -n "); cmd.append(escaped_str); cmd.append(L" | xsel -i -b"); } } if (! cmd.empty()) { if (exec_subshell(cmd, false /* do not apply exit status */) == -1) { /* Do nothing on failiure */ } free(cut_buffer); cut_buffer = escaped_str; } } /** Remove first match for specified string from circular list */ static void kill_remove(const wcstring &s) { ASSERT_IS_MAIN_THREAD(); kill_list_t::iterator iter = std::find(kill_list.begin(), kill_list.end(), s); if (iter != kill_list.end()) kill_list.erase(iter); } void kill_replace(const wcstring &old, const wcstring &newv) { kill_remove(old); kill_add(newv); } const wchar_t *kill_yank_rotate() { ASSERT_IS_MAIN_THREAD(); // Move the first element to the end if (kill_list.empty()) { return NULL; } else { kill_list.splice(kill_list.end(), kill_list, kill_list.begin()); return kill_list.front().c_str(); } } /** Check the X clipboard. If it has been changed, add the new clipboard contents to the fish killring. */ static void kill_check_x_buffer() { if (!has_xsel()) return; const env_var_t disp = env_get_string(L"DISPLAY"); if (! disp.missing()) { size_t i; wcstring cmd = L"xsel -t 500 -b"; wcstring new_cut_buffer=L""; wcstring_list_t list; if (exec_subshell(cmd, list, false /* do not apply exit status */) != -1) { for (i=0; i 0) new_cut_buffer += L"\\n"; new_cut_buffer += next_line; } if (new_cut_buffer.size() > 0) { /* The buffer is inserted with backslash escapes, since we don't really like tabs, newlines, etc. anyway. */ if (cut_buffer == NULL || cut_buffer != new_cut_buffer) { free(cut_buffer); cut_buffer = wcsdup(new_cut_buffer.c_str()); kill_list.push_front(new_cut_buffer); } } } } } const wchar_t *kill_yank() { kill_check_x_buffer(); if (kill_list.empty()) { return L""; } else { return kill_list.front().c_str(); } } void kill_sanity_check() { } void kill_init() { } void kill_destroy() { if (cut_buffer) free(cut_buffer); } fish/kill.h000066400000000000000000000013021214535744100131150ustar00rootroot00000000000000/** \file kill.h Prototypes for the killring. Works like the killring in emacs and readline. The killring is cut and paste whith a memory of previous cuts. */ #ifndef FISH_KILL_H #define FISH_KILL_H #include /** Replace the specified string in the killring */ void kill_replace(const wcstring &old, const wcstring &newv); /** Add a string to the top of the killring */ void kill_add(const wcstring &str); /** Rotate the killring */ const wchar_t *kill_yank_rotate(); /** Paste from the killring */ const wchar_t *kill_yank(); /** Sanity check */ void kill_sanity_check(); /** Initialize the killring */ void kill_init(); /** Destroy the killring */ void kill_destroy(); #endif fish/lru.h000066400000000000000000000142121214535744100127700ustar00rootroot00000000000000/** \file lru.h Least-recently-used cache implementation */ #ifndef FISH_LRU_H #define FISH_LRU_H #include #include #include #include #include "common.h" /** A predicate to compare dereferenced pointers */ struct dereference_less_t { template bool operator()(ptr_t p1, ptr_t p2) const { return *p1 < *p2; } }; class lru_node_t { template friend class lru_cache_t; /** Our linked list pointer */ lru_node_t *prev, *next; public: /** The key used to look up in the cache */ const wcstring key; /** Constructor */ lru_node_t(const wcstring &pkey) : prev(NULL), next(NULL), key(pkey) { } /** operator< for std::set */ bool operator<(const lru_node_t &other) const { return key < other.key; } }; template class lru_cache_t { private: /** Max node count */ const size_t max_node_count; /** Count of nodes */ size_t node_count; /** The set of nodes */ typedef std::set node_set_t; node_set_t node_set; void promote_node(node_type_t *node) { /* We should never promote the mouth */ assert(node != &mouth); /* First unhook us */ node->prev->next = node->next; node->next->prev = node->prev; /* Put us after the mouth */ node->next = mouth.next; node->next->prev = node; node->prev = &mouth; mouth.next = node; } void evict_node(node_type_t *condemned_node) { /* We should never evict the mouth */ assert(condemned_node != NULL && condemned_node != &mouth); /* Remove it from the linked list */ condemned_node->prev->next = condemned_node->next; condemned_node->next->prev = condemned_node->prev; /* Remove us from the set */ node_set.erase(condemned_node); node_count--; /* Tell ourselves */ this->node_was_evicted(condemned_node); } void evict_last_node(void) { /* Simple */ evict_node((node_type_t *)mouth.prev); } static lru_node_t *get_previous(lru_node_t *node) { return node->prev; } protected: /** Head of the linked list */ lru_node_t mouth; /** Overridable callback for when a node is evicted */ virtual void node_was_evicted(node_type_t *node) { } public: /** Constructor */ lru_cache_t(size_t max_size = 1024) : max_node_count(max_size), node_count(0), mouth(wcstring()) { /* Hook up the mouth to itself: a one node circularly linked list! */ mouth.prev = mouth.next = &mouth; } /** Note that we do not evict nodes in our destructor (even though they typically need to be deleted by their creator). */ virtual ~lru_cache_t() { } /** Returns the node for a given key, or NULL */ node_type_t *get_node(const wcstring &key) { node_type_t *result = NULL; /* Construct a fake node as our key */ lru_node_t node_key(key); /* Look for it in the set */ node_set_t::iterator iter = node_set.find(&node_key); /* If we found a node, promote and return it */ if (iter != node_set.end()) { result = static_cast(*iter); promote_node(result); } return result; } /** Evicts the node for a given key, returning true if a node was evicted. */ bool evict_node(const wcstring &key) { /* Construct a fake node as our key */ lru_node_t node_key(key); /* Look for it in the set */ node_set_t::iterator iter = node_set.find(&node_key); if (iter == node_set.end()) return false; /* Evict the given node */ evict_node(static_cast(*iter)); return true; } /** Adds a node under the given key. Returns true if the node was added, false if the node was not because a node with that key is already in the set. */ bool add_node(node_type_t *node) { /* Add our node without eviction */ if (! this->add_node_without_eviction(node)) return false; /* Evict */ while (node_count > max_node_count) evict_last_node(); /* Success */ return true; } /** Adds a node under the given key without triggering eviction. Returns true if the node was added, false if the node was not because a node with that key is already in the set. */ bool add_node_without_eviction(node_type_t *node) { assert(node != NULL && node != &mouth); /* Try inserting; return false if it was already in the set */ if (! node_set.insert(node).second) return false; /* Add the node after the mouth */ node->next = mouth.next; node->next->prev = node; node->prev = &mouth; mouth.next = node; /* Update the count */ node_count++; /* Evict */ while (node_count > max_node_count) evict_last_node(); /* Success */ return true; } /** Counts nodes */ size_t size(void) { return node_count; } /** Evicts all nodes */ void evict_all_nodes(void) { while (node_count > 0) { evict_last_node(); } } /** Iterator for walking nodes, from least recently used to most */ class iterator { lru_node_t *node; public: iterator(lru_node_t *val) : node(val) { } void operator++() { node = lru_cache_t::get_previous(node); } void operator++(int x) { node = lru_cache_t::get_previous(node); } bool operator==(const iterator &other) { return node == other.node; } bool operator!=(const iterator &other) { return !(*this == other); } node_type_t *operator*() { return static_cast(node); } }; iterator begin() { return iterator(mouth.prev); } iterator end() { return iterator(&mouth); } }; #endif fish/mimedb.cpp000066400000000000000000000765061214535744100137740ustar00rootroot00000000000000/** \file mimedb.c mimedb is a program for checking the mimetype, description and default action associated with a file or mimetype. It uses the xdgmime library written by the fine folks at freedesktop.org. There does not seem to be any standard way for the user to change the preferred application yet. The first implementation of mimedb used xml_grep to parse the xml file for the mime entry to determine the description. This was abandoned because of the performance implications of parsing xml. The current version only does a simple string search, which is much, much faster but it might fall on it's head. This code is Copyright 2005-2008 Axel Liljencrantz. It is released under the GPL. The xdgmime library is dual licensed under LGPL/artistic license. Read the source code of the library for more information. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #endif #if HAVE_LIBINTL_H #include #endif #include "xdgmime.h" #include "fallback.h" #include "util.h" #include "print_help.h" typedef std::vector string_list_t; /** Location of the applications .desktop file, relative to a base mime directory */ #define APPLICATIONS_DIR "applications/" /** Location of the mime xml database, relative to a base mime directory */ #define MIME_DIR "mime/" /** Filename suffix for XML files */ #define MIME_SUFFIX ".xml" /** Start tag for langauge-specific comment */ #define START_TAG "" /** End tab for comment */ #define STOP_TAG "" /** 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" /** Getopt short switches for mimedb */ #define GETOPT_STRING "tfimdalhv" /** Error message if system call goes wrong. */ #define ERROR_SYSTEM "%s: Could not execute command \"%s\"\n" /** Exit code if system call goes wrong. */ #define STATUS_ERROR_SYSTEM 1 /** All types of input and output possible */ enum { FILEDATA, FILENAME, MIMETYPE, DESCRIPTION, ACTION, LAUNCH } ; /** 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. */ static int error = 0; /** String of characters to send to system() to launch a file */ static char *launch_buff=0; /** Length of the launch_buff buffer */ static int launch_len=0; /** Current position in the launch_buff buffer */ static int launch_pos=0; /** gettext alias */ #ifdef USE_GETTEXT #define _(string) fish_gettext(string) #else #define _(string) (string) #endif /** Call malloc, set error flag and print message on failure */ void *my_malloc(size_t s) { void *res = malloc(s); if (!s) { error=1; fprintf(stderr, _("%s: Out of memory\n"), MIMEDB); } return res; } /** Duplicate string, set error flag and print message on failure */ char *my_strdup(const char *s) { char *res = strdup(s); if (!s) { error=1; fprintf(stderr, _("%s: Out of memory\n"), MIMEDB); } return res; } /** Search the file \c filename for the first line starting with \c match, which is returned in a newly allocated string. */ static const char * search_ini(const char *filename, const char *match) { /* OK to not use CLO_EXEC here because mimedb is single threaded */ FILE *f = fopen(filename, "r"); char buf[4096]; int len=strlen(match); int done = 0; if (!f) { perror("fopen"); error=1; return 0; } while (!done) { if (!fgets(buf, 4096, f)) { if (!feof(f)) { perror("fgets"); error=1; } buf[0]=0; done = 1; } else if (strncmp(buf, match, len) == 0 && buf[len] == '=') { done=1; } } fclose(f); if (buf[0]) { char *res=strdup(buf); if (res) { if (res[strlen(res)-1]=='\n') res[strlen(res)-1]='\0'; } return res; } else return (char *)0; } /** Test if the specified file exists. If it does not, also try replacing dashes with slashes in \c in. */ static char *file_exists(const char *dir, const char *in) { int dir_len = strlen(dir); int need_sep = dir[dir_len - 1] != '/'; char *filename = (char *)my_malloc(dir_len + need_sep + strlen(in) + 1); char *replaceme; struct stat buf; // fprintf( stderr, "Check %s%s\n", dir, in ); if (!filename) { return 0; } strcpy(filename, dir); if (need_sep) filename[dir_len++] = '/'; strcpy(filename + dir_len, in); if (!stat(filename, &buf)) return filename; free(filename); /* DOH! File does not exist. But all is not lost. KDE sometimes uses a slash in the name as a directory separator. We try to replace a dash with a slash and try again. */ replaceme = const_cast(strchr(in, '-')); if (replaceme) { char *res; *replaceme = '/'; res = file_exists(dir, in); *replaceme = '-'; return res; } /* OK, no more slashes left. We really are screwed. Nothing to to but admit defeat and go home. */ return 0; } /** Try to find the specified file in any of the possible directories where mime files can be located. This code is shamelessly stolen from xdg_run_command_on_dirs. \param list Full file paths will be appended to this list. \param f The relative filename search for the data directories. \param all If zero, then stop after the first filename. \return The number of filenames added to the list. */ static int append_filenames(string_list_t &list, const char *f, int all) { size_t prev_count = list.size(); char *result; const char *xdg_data_home; const char *xdg_data_dirs; const char *ptr; xdg_data_home = getenv("XDG_DATA_HOME"); if (xdg_data_home) { result = file_exists(xdg_data_home, f); if (result) { list.push_back(result); if (!all) return 1; } } else { const char *home; home = getenv("HOME"); if (home != NULL) { char *guessed_xdg_home; guessed_xdg_home = (char *)my_malloc(strlen(home) + strlen("/.local/share") + 1); if (!guessed_xdg_home) return 0; strcpy(guessed_xdg_home, home); strcat(guessed_xdg_home, "/.local/share"); result = file_exists(guessed_xdg_home, f); free(guessed_xdg_home); if (result) { list.push_back(result); if (!all) return 1; } } } xdg_data_dirs = getenv("XDG_DATA_DIRS"); if (xdg_data_dirs == NULL) xdg_data_dirs = "/usr/local/share:/usr/share"; ptr = xdg_data_dirs; while (*ptr != '\000') { const char *end_ptr; char *dir; int len; end_ptr = ptr; while (*end_ptr != ':' && *end_ptr != '\000') end_ptr ++; if (end_ptr == ptr) { ptr++; continue; } len = end_ptr - ptr; dir = (char *)my_malloc(len + 1); if (!dir) return 0; strncpy(dir, ptr, len); dir[len] = '\0'; result = file_exists(dir, f); free(dir); if (result) { list.push_back(result); if (!all) { return 1; } } ptr = end_ptr; } return list.size() - prev_count; } /** Find at most one file relative to the XDG data directories; returns the empty string on failure */ static std::string get_filename(char *f) { string_list_t list; append_filenames(list, f, 0); if (list.empty()) { return ""; } else { return list.back(); } } /** Remove excessive whitespace from string. Replaces arbitrary sequence of whitespace with a single space. Also removes any leading and trailing whitespace */ static char *munge(char *in) { char *out = (char *)my_malloc(strlen(in)+1); char *p=out; int had_whitespace = 0; int printed = 0; if (!out) { return 0; } while (1) { // fprintf( stderr, "%c\n", *in ); switch (*in) { case ' ': case '\n': case '\t': case '\r': { had_whitespace = 1; break; } case '\0': *p = '\0'; return out; default: { if (printed && had_whitespace) { *(p++)=' '; } printed=1; had_whitespace=0; *(p++)=*in; break; } } in++; } 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++ = ')'; *out++ = '?'; } close=1; *out++ = '('; *out++ = *lang; break; default: *out++ = *lang; } } if (close) { *out++ = ')'; *out++ = '?'; } *out++=0; return buff; } /** Get description for a specified mimetype. */ static char *get_description(const char *mimetype) { char *fn_part; std::string fn; int fd; struct stat st; char *contents; char *start=0, *stop=0, *best_start=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 = (regex_t *)my_malloc(sizeof(regex_t)); stop_re = (regex_t *)my_malloc(sizeof(regex_t)); int reg_status; if ((reg_status = regcomp(start_re, buff, REG_EXTENDED))) { char regerrbuf[BUFF_SIZE]; regerror(reg_status, start_re, regerrbuf, BUFF_SIZE); fprintf(stderr, _("%s: Could not compile regular expressions %s with error %s\n"), MIMEDB, buff, regerrbuf); error=1; } else if ((reg_status = regcomp(stop_re, STOP_TAG, REG_EXTENDED))) { char regerrbuf[BUFF_SIZE]; regerror(reg_status, stop_re, regerrbuf, BUFF_SIZE); fprintf(stderr, _("%s: Could not compile regular expressions %s with error %s\n"), MIMEDB, buff, regerrbuf); error=1; } if (error) { free(start_re); free(stop_re); start_re = stop_re = 0; return 0; } } fn_part = (char *)my_malloc(strlen(MIME_DIR) + strlen(mimetype) + strlen(MIME_SUFFIX) + 1); if (!fn_part) { return 0; } strcpy(fn_part, MIME_DIR); strcat(fn_part, mimetype); strcat(fn_part, MIME_SUFFIX); fn = get_filename(fn_part); //malloc( strlen(MIME_DIR) +strlen( MIME_SUFFIX)+ strlen( mimetype ) + 1 ); free(fn_part); if (fn.empty()) { return 0; } /* OK to not use CLO_EXEC here because mimedb is single threaded */ fd = open(fn.c_str(), O_RDONLY); // fprintf( stderr, "%s\n", fn ); if (fd == -1) { perror("open"); error=1; return 0; } if (stat(fn.c_str(), &st)) { perror("stat"); error=1; return 0; } contents = (char *)my_malloc(st.st_size + 1); if (!contents) { return 0; } if (read(fd, contents, st.st_size) != st.st_size) { perror("read"); error=1; free((void *)contents); return 0; } /* Don't need to check exit status of close on read-only file descriptors */ close(fd); contents[st.st_size]=0; 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)) { int new_w = match[0].rm_eo - match[0].rm_so; start += match[0].rm_eo; if (new_w > w) { /* New match is for a longer match then the previous match, so we use the new match */ w=new_w; best_start = start; } } if (w != -1) { start = best_start; 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); return res; } } free(contents); fprintf(stderr, _("%s: No description for type %s\n"), MIMEDB, mimetype); error=1; return 0; } /** Get default action for a specified mimetype. */ static char *get_action(const char *mimetype) { char *res=0; const char *launcher, *end; string_list_t mime_filenames; const char *launcher_str = NULL; const char *launcher_command_str, *launcher_command; char *launcher_full; if (!append_filenames(mime_filenames, DESKTOP_DEFAULT, 1)) { return 0; } for (size_t i = 0; i < mime_filenames.size(); i++) { launcher_str = search_ini(mime_filenames.at(i).c_str(), mimetype); if (launcher_str) break; } if (!launcher_str) { /* This type does not have a launcher. Try the supertype! */ // fprintf( stderr, "mimedb: %s does not have launcher, try supertype\n", mimetype ); const char ** parents = xdg_mime_get_mime_parents(mimetype); const char **p; if (parents) { for (p=parents; *p; p++) { char *a = get_action(*p); if (a != 0) return a; } } /* Just in case subclassing doesn't work, (It doesn't on Fedora Core 3) we also test some common subclassings. */ if (strncmp(mimetype, "text/plain", 10) != 0 && strncmp(mimetype, "text/", 5) == 0) return get_action("text/plain"); return 0; } // fprintf( stderr, "WOOT %s\n", launcher_str ); launcher = const_cast(strchr(launcher_str, '=')); if (!launcher) { fprintf(stderr, _("%s: Could not parse launcher string '%s'\n"), MIMEDB, launcher_str); error=1; return 0; } /* Skip the = */ launcher++; /* Make one we can change */ std::string mut_launcher = launcher; /* Only use first launcher */ end = strchr(launcher, ';'); if (end) mut_launcher.resize(end - launcher); launcher_full = (char *)my_malloc(mut_launcher.size() + strlen(APPLICATIONS_DIR)+1); if (!launcher_full) { free((void *)launcher_str); return 0; } strcpy(launcher_full, APPLICATIONS_DIR); strcat(launcher_full, mut_launcher.c_str()); free((void *)launcher_str); std::string launcher_filename = get_filename(launcher_full); free(launcher_full); launcher_command_str = search_ini(launcher_filename.c_str(), "Exec"); if (!launcher_command_str) { fprintf(stderr, _("%s: Default launcher '%s' does not specify how to start\n"), MIMEDB, launcher_filename.c_str()); return 0; } launcher_command = strchr(launcher_command_str, '='); launcher_command++; res = my_strdup(launcher_command); free((void *)launcher_command_str); return res; } /** Helper function for launch. Write the specified byte to the string we will execute */ static void writer(char c) { if (launch_len == -1) return; if (launch_len <= launch_pos) { int new_len = launch_len?2*launch_len:256; char *new_buff = (char *)realloc(launch_buff, new_len); if (!new_buff) { free(launch_buff); launch_len = -1; error=1; return; } launch_buff = new_buff; launch_len = new_len; } launch_buff[launch_pos++]=c; } /** Write out the specified byte in hex */ static void writer_hex(int num) { int a, b; a = num /16; b = num %16; writer(a>9?('A'+a-10):('0'+a)); writer(b>9?('A'+b-10):('0'+b)); } /** Return current directory in newly allocated string */ static char *my_getcwd() { size_t size = 100; while (1) { char *buffer = (char *) malloc(size); if (getcwd(buffer, size) == buffer) return buffer; free(buffer); if (errno != ERANGE) return 0; size *= 2; } } /** Return absolute filename of specified file */ static const char *get_fullfile(const char *file) { const char *fullfile; if (file[0] == '/') { fullfile = file; } else { char *cwd = my_getcwd(); if (!cwd) { error = 1; perror("getcwd"); return 0; } int l = strlen(cwd); char *tmp = (char *)my_malloc(l + strlen(file)+2); if (!tmp) { free(cwd); return 0; } strcpy(tmp, cwd); if (cwd[l-1] != '/') strcat(tmp, "/"); strcat(tmp, file); free(cwd); fullfile = tmp; } return fullfile; } /** Write specified file as an URL */ static void write_url(const char *file) { const char *fullfile = get_fullfile(file); const char *str = fullfile; if (str == 0) { launch_len = -1; return; } writer('f'); writer('i'); writer('l'); writer('e'); writer(':'); writer('/'); writer('/'); while (*str) { if (((*str >= 'a') && (*str <='z')) || ((*str >= 'A') && (*str <='Z')) || ((*str >= '0') && (*str <='9')) || (strchr("-_.~/",*str) != 0)) { writer(*str); } else if (strchr("()?&=",*str) != 0) { writer('\\'); writer(*str); } else { writer('%'); writer_hex((unsigned char)*str); } str++; } if (fullfile != file) free((void *)fullfile); } /** Write specified file */ static void write_file(const char *file, int print_path) { const char *fullfile; const char *str; if (print_path) { fullfile = get_fullfile(file); str = fullfile; } else { char *tmp = my_strdup(file); if (!tmp) { return; } str = basename(tmp); fullfile = tmp; } if (!str) { error = 1; return; } while (*str) { switch (*str) { case ')': case '(': case '-': case '#': case '$': case '}': case '{': case ']': case '[': case '*': case '?': case ' ': case '|': case '<': case '>': case '^': case '&': case '\\': case '`': case '\'': case '\"': writer('\\'); writer(*str); break; case '\n': writer('\\'); writer('n'); break; case '\r': writer('\\'); writer('r'); break; case '\t': writer('\\'); writer('t'); break; case '\b': writer('\\'); writer('b'); break; case '\v': writer('\\'); writer('v'); break; default: writer(*str); break; } str++; } if (fullfile != file) free((void *)fullfile); } /** Use the specified launch filter to launch all the files in the specified list. \param filter the action to take \param files the list of files for which to perform the action \param fileno an internal value. Should always be set to zero. */ static void launch(char *filter, const string_list_t &files, size_t fileno) { char *filter_org=filter; int count=0; int launch_again=0; if (files.size() <= fileno) return; launch_pos=0; for (; *filter && !error; filter++) { if (*filter == '%') { filter++; switch (*filter) { case 'u': { launch_again = 1; write_url(files.at(fileno).c_str()); break; } case 'U': { for (size_t i=0; i launch_hash_t; launch_hash_t launch_hash; locale_init(); /* Parse options */ while (1) { static struct option long_options[] = { { "input-file-data", no_argument, 0, 't' } , { "input-filename", no_argument, 0, 'f' } , { "input-mime", no_argument, 0, 'i' } , { "output-mime", no_argument, 0, 'm' } , { "output-description", no_argument, 0, 'd' } , { "output-action", no_argument, 0, 'a' } , { "help", no_argument, 0, 'h' } , { "version", no_argument, 0, 'v' } , { "launch", no_argument, 0, 'l' } , { 0, 0, 0, 0 } } ; int opt_index = 0; int opt = getopt_long(argc, argv, GETOPT_STRING, long_options, &opt_index); if (opt == -1) break; switch (opt) { case 0: break; case 't': input_type=FILEDATA; break; case 'f': input_type=FILENAME; break; case 'i': input_type=MIMETYPE; break; case 'm': output_type=MIMETYPE; break; case 'd': output_type=DESCRIPTION; break; case 'a': output_type=ACTION; break; case 'l': output_type=LAUNCH; break; case 'h': print_help(argv[0], 1); exit(0); case 'v': printf(_("%s, version %s\n"), MIMEDB, PACKAGE_VERSION); exit(0); case '?': return 1; } } if ((output_type == LAUNCH)&&(input_type==MIMETYPE)) { fprintf(stderr, _("%s: Can not launch a mimetype\n"), MIMEDB); print_help(argv[0], 2); exit(1); } /* Loop over all non option arguments and do the specified lookup */ //fprintf( stderr, "Input %d, output %d\n", input_type, output_type ); for (i = optind; (i < argc)&&(!error); i++) { /* Convert from filename to mimetype, if needed */ if (input_type == FILENAME) { mimetype = xdg_mime_get_mime_type_from_file_name(argv[i]); } else if (input_type == FILEDATA) { mimetype = xdg_mime_get_mime_type_for_file(argv[i]); } else mimetype = xdg_mime_is_valid_mime_type(argv[i])?argv[i]:0; mimetype = xdg_mime_unalias_mime_type(mimetype); if (!mimetype) { fprintf(stderr, _("%s: Could not parse mimetype from argument '%s'\n"), MIMEDB, argv[i]); error=1; return 1; } /* Convert from mimetype to whatever, if needed */ switch (output_type) { case MIMETYPE: { output = (char *)mimetype; break; } case DESCRIPTION: { output = get_description(mimetype); if (!output) output = strdup(_("Unknown")); break; } case ACTION: { output = get_action(mimetype); break; } case LAUNCH: { /* There may be more files using the same launcher, we add them all up in little array_list_ts and launched them together after all the arguments have been parsed. */ output = 0; string_list_t &l = launch_hash[mimetype]; l.push_back(argv[i]); } } /* Print the glorious result */ if (output) { printf("%s\n", output); if (output != mimetype) free(output); } output = 0; } /* Perform the actual launching */ if (output_type == LAUNCH && !error) { for (launch_hash_t::iterator iter = launch_hash.begin(); iter != launch_hash.end(); ++iter) { const char *mimetype = iter->first.c_str(); string_list_t &files = iter->second; char *launcher = get_action(mimetype); if (launcher) { launch(launcher, files, 0); free(launcher); } } } 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; } fish/mimedb.h000066400000000000000000000000641214535744100134230ustar00rootroot00000000000000#ifndef FISH_MIMEDB_H #define FISH_MIMEDB_H #endif fish/osx/000077500000000000000000000000001214535744100126265ustar00rootroot00000000000000fish/osx/Info.plist000066400000000000000000000020401214535744100145720ustar00rootroot00000000000000 CFBundleDisplayName fish shell CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile fish_term_icon CFBundleIdentifier com.ridiculousfish.fish-shell CFBundleInfoDictionaryVersion 6.0 CFBundleName fish shell CFBundlePackageType APPL CFBundleShortVersionString 2.0 CFBundleVersion 289.5 LSApplicationCategoryType public.app-category.productivity LSMinimumSystemVersion 10.6 LSUIElement NSHumanReadableCopyright Copyright © 2012, ridiculous_fish All rights reserved. fish/osx/config.h000066400000000000000000000143511214535744100142500ustar00rootroot00000000000000/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the `backtrace' function. */ #define HAVE_BACKTRACE 1 /* Define to 1 if you have the `backtrace_symbols' function. */ #define HAVE_BACKTRACE_SYMBOLS 1 /* del_curterm is broken, redefine it to a no-op to avoid a double-free bug */ /* #undef HAVE_BROKEN_DEL_CURTERM */ /* Define to 1 one if the implemented fwprintf is broken */ /* #undef HAVE_BROKEN_FWPRINTF */ /* Define to 1 if you have the header file. */ #define HAVE_CURSES_H 1 /* Define to 1 if you have the `dcgettext' function. */ /* #undef HAVE_DCGETTEXT */ /* Define to 1 if you have the header file. */ #define HAVE_EXECINFO_H 1 /* Define to 1 if you have the `fgetwc' function. */ #define HAVE_FGETWC 1 /* Define to 1 if you have the `fputwc' function. */ #define HAVE_FPUTWC 1 /* Define to 1 if you have the `futimes' function. */ #define HAVE_FUTIMES 1 /* Define to 1 if you have the `fwprintf' function. */ #define HAVE_FWPRINTF 1 /* Define to 1 if you have the `getifaddrs' function. */ #define HAVE_GETIFADDRS 1 /* Define to 1 if you have the header file. */ #define HAVE_GETOPT_H 1 /* Define to 1 if you have the `gettext' function. */ /* #undef HAVE_GETTEXT */ /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `killpg' function. */ #define HAVE_KILLPG 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_LIBINTL_H */ /* Define to 1 if you have the `lrand48_r' function. */ /* #undef HAVE_LRAND48_R */ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the nan function */ #define HAVE_NAN 1 /* Define to 1 if you have the header file. */ #define HAVE_NCURSES_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_NCURSES_TERM_H */ /* Define to 1 if realpath accepts null for its second argument. */ #define HAVE_REALPATH_NULL 1 /* Define to 1 if you have the header file. */ #define HAVE_REGEX_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_SIGINFO_H */ /* Define to 1 if you have the header file. */ #define HAVE_SPAWN_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_STROPTS_H */ /* Define to 1 if you have the `sysconf' function. */ #define HAVE_SYSCONF 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_IOCTL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_RESOURCE_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_SELECT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TERMIOS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_TERMIO_H */ /* Define to 1 if you have the header file. */ #define HAVE_TERM_H 1 /* Define to 1 if the wgettext function should be used for translating strings. */ #define HAVE_TRANSLATE_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the `wcscasecmp' function. */ #define HAVE_WCSCASECMP 1 /* Define to 1 if you have the `wcsdup' function. */ #define HAVE_WCSDUP 1 /* Define to 1 if you have the `wcslcat' function. */ #define HAVE_WCSLCAT 1 /* Define to 1 if you have the `wcslcpy' function. */ #define HAVE_WCSLCPY 1 /* Define to 1 if you have the `wcslen' function. */ #define HAVE_WCSLEN 1 /* Define to 1 if you have the `wcsncasecmp' function. */ #define HAVE_WCSNCASECMP 1 /* Define to 1 if you have the `wcsndup' function. */ /* #undef HAVE_WCSNDUP */ /* Define to 1 if you have the `wcstok' function. */ #define HAVE_WCSTOK 1 /* Define to 1 if you have the `wcstol' function. */ #define HAVE_WCSTOL 1 /* Define to 1 if you have the `wcswidth' function. */ #define HAVE_WCSWIDTH 1 /* Define to 1 if you have the `wcwidth' function. */ #define HAVE_WCWIDTH 1 /* Define to 1 if the winsize struct and TIOCGWINSZ macro exist */ #define HAVE_WINSIZE 1 /* Define to 1 if getopt_long exists and works. */ #define HAVE_WORKING_GETOPT_LONG 1 /* Define to 1 if the _nl_msg_cat_cntr symbol is exported. */ /* #undef HAVE__NL_MSG_CAT_CNTR */ /* Define to 1 if you have the file `/proc/self/stat'. */ /* #undef HAVE__PROC_SELF_STAT */ /* Define to 1 if the __environ symbol is exported. */ /* #undef HAVE___ENVIRON */ /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "fish-users@lists.sf.net" /* Define to the full name of this package. */ #define PACKAGE_NAME "fish" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "fish 2.0.0" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "fish" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "2.0.0" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define to 1 if tparm accepts a fixed amount of paramters. */ /* #undef TPARM_SOLARIS_KLUDGE */ /* Evil kludge to get Power based machines to work */ /* #undef TPUTS_KLUDGE */ /* Perform string translations with gettext */ #define USE_GETTEXT 1 /* Macro to enable additional prototypes under BSD */ /* #undef _NETBSD_SOURCE */ /* Macro to enable additional prototypes under BSD */ /* #undef __BSD_VISIBLE */ /* Macro to enable additional prototypes under Solaris */ /* #undef __EXTENSIONS__ */ #if __GNUC__ >= 3 #define __warn_unused __attribute__ ((warn_unused_result)) #define __sentinel __attribute__ ((sentinel)) #else #define __warn_unused #define __sentinel #endif fish/osx/fish_term_icon.icns000066400000000000000000011066141214535744100165050ustar00rootroot00000000000000icnsŒTOC His32s8mkil32 l8mkit32t”t8mk@ic08îßic09×is32ýþÿþüûúüþþÿüýÿþüúúüþÿýöåïÿúýÿþþÿüðâÓÆ¸¯ž~ýÿûëØÅ´¥š‘‰}uOƒÞÁ|kdZSKD=11X„ÄœV4+(.16F83:-L…«ÈU'$8BE?H?/2+5†—Ú^:,?=AG2;1/3(‰òk@3:@BG40;10r‚ÿH84D>?:6e6GJ#k‚ÿœM4075>96GE9Aƒÿ·W<2/)! 2=J]ÿÑe4&5@Rdu}ƒƒyzhÿåwmakkmns~¥ÂßúüÿyZp~™µÒíþþÿþÿýüÿìàûþþÿþÿýøõöúþýþÿþüûúüþþÿüýÿþüúúüþÿýöåïÿúýÿþþÿüðâÓÆ¸¯ž~ýÿûëÙÅ´¥š‘‰}uOƒÞÁ|kdZSKE=11X„ÄœV4+(.17F83:-L…«ÈU'$8BE?H?/2+5†—Ú^;,?=BG2;1/4(‰òkA3:@BG40;10r‚ÿI84D>?:6e6GJ#k‚ÿœM4075>96GE9Aƒÿ·V<2/)! 2=J]ÿÑe4&5@Rcu}ƒƒyzhÿåwmalkmns~¥ÂßúüÿyZp~™µÒíþþÿþÿýüÿìàûþþÿþÿýøõöúþýþÿþüûúüþþÿüýÿþüúúüþÿýöåïÿúýÿþþÿüðâÓÆ¸¯ž~ýÿûëÙÅ´¥š‘‰~uOƒÞÁ|kdZSKE=11X„ÄœV4+(.17F83:-L…«ÈU'$8BE?H?/2+5†—Ú^:,?=BG2;1/3(‰òkA3:@BG40;10r‚ÿI84D>?:6e6GJ#k‚ÿœM4075>96GE9Aƒÿ·V<2/)! 2=J]ÿÑe4&5@Sdu}ƒƒyzhÿåwmakkmns~¥ÂßúüÿyZp~™µÒíþþÿþÿýüÿìàûþþÿþÿýøõöúþs8mk   Br—×[ .W…²Úøþÿ÷ÿ¢  ÄëþþÿþÿþøøñÿÈ<ÿúÿûöõ÷úþþÿýÿìéûûÿþþþþþýüÿúÿ5Òÿúÿýüýýýýýÿöÿ^§ÿöÿýýýýýýüÿõÿŠzÿõÿüýýýýýýÿøÿ¹Nÿ÷ÿýþÿþþþþþöþÕ'ýþÿÿþû÷ööûÿÿþû ÝüóúýÿþÿþþìÉ¡o½ÿøÿ÷ܶŠ]4c¯nK!il32 ÿþ”ÿþƒÿüù÷ùùø‡ÿþƒÿþúø÷ùþ‚ÿþþÿþƒÿüù÷øû‚ÿ ýëÒ²¢|ªÿûÿþ‚ÿþûø÷ùý‚ÿ÷ßħ‚~…”££)àÿûÿýù÷÷ú‚ÿþîÒµ™†{}‰œ¯¾ÄÁ³£Ò>«ÿõüýÿLúâĦ‹yru„–©¸½·¨’uVE,KÑLƒÿôÿôÓ¶—}lflzŒœ§© zbM=3,*,34@ÉrXÿõÙgbes‚Ž”’†u`L:/)(.59;7441±—:ÿûmk|r]I7)" !%.3;D>:6321105+”·*êÿ[x")+/6<6>GPG2‚406)uÍ-ÄÿÃNƒ*$))+*4EIF>KFHQ934€305*YÕ@˜ÿãM~:(',A::47=6@BM?04€2/2,BÏ_lÿüXrM!/*6D6X@CQ<49I:13€1/0/3½„Gÿÿob^$103>?6>9OP709<21310/.1)¢¨0úÿRl*3367GFB;TO:5/6:1-,//,2%ƒÄ*Øÿ²Gt3579:8E@:GHA64/>:=8./,2&eÓ5®ÿÔFu?5:967AEF6F9,//*=<;@n,-1)LÔO‚ÿñOqN6:52:KC>>D>F:<:5@@I;+0,9ÈrXüÿbh]17351FH-;NA5;B<6INYX/-.*®—9øÿ]k.63425610A4+/-0OP6NF--4*•¸-÷ÿ Sy25€32€1<,-0--,?a=+.0,/oÎ*øÿÃN‚:242210.-00/1201/()(*2CXÐOûÿãP…G-3011€20.,)'(-8Ld‚¡½ÏÚžBÿÿû]Z-722/,*(*1>Rm‹©ÄÔÖÇ«†^9%/ÿúÿrzr&/*.5CWpŒ§½Çų•qL-2Uƒ±Üýÿ÷ÿ‘g}C^t¢±¶­—yV6!&BkšÈïÿþÿþÿúÿ÷ÿ¯k­¡§•}]>&2U‚±Ýû‚ÿùôóöûÿÿûÿÝ3K+%Ck›Èïÿþ€ÿýöóôøý‚ÿ þþÿûÿ¨W…°Ýû‚ÿúôóöúƒÿ‚þÿþþÿýöóôøýƒÿ‚þ‡ÿ÷óôöûþ‚ÿ‚þ‰ÿÿþ”ÿþƒÿüù÷ùùø‡ÿþƒÿþúø÷ùþ‚ÿþþÿþƒÿüù÷øû‚ÿ ýëÒ²¢|ªÿûÿþ‚ÿþûø÷ùý‚ÿ÷ßħ‚~…”££)àÿûÿýù÷÷ú‚ÿþîÒµ™†|}‰œ¯¾ÄÁ³£Ò>«ÿõüýÿLúâĦ‹yruƒ–©¸½¸¨’uVE,KÑLƒÿôÿôÓ¶—|lflzŒœ§¨ zbM=3,*,34@ÉrXÿõÙgbes‚Ž”’†u`L:/)(/59;7441±—:ÿûmk|r^I7)" !&/3;E?:6321105+”·*êÿ[x")+07<7>GQG2‚406)uÍ-ÄÿÃNƒ*$))+*4EIF?KFHQ924€305*YÕ@˜ÿãM~:(',A::48=6@BM?14€2/2,BÏ_lÿüXrM!/+6D6X@CQ<39I:13€1/0/3½„Gÿÿob^$103>?6>:OP719<21310/.2)¢¨0úÿSl*3367GFB;TO:5/6:1-,//-2%ƒÄ*Øÿ²Gt3579:8E@:GHA64/>:=8./,2&eÓ5®ÿÔFu?6;967BEF6F9,//*=<<@n,-1)LÔO‚ÿñOqN6:52:KC>>D>F:<:5@@I;+0,9ÈrXüÿbh]17351FH-;NA5;B<6INYX/-.*®—9øÿ]k.63425620A4*/-0OP6NF--4*•¸-÷ÿ Sy25€32€1<+-0--,?a=+.0,/oÎ*øÿÃNƒ:242210.-00/1201/()(*2CXÐOûÿãP…H-3011€20.,)'(-8Ld‚¡½ÏÚžBÿÿû]Z-722/,*(*1>Rm‹©ÄÔÖÇ«†^9%/ÿúÿrzr&/*.5CWpŒ§½Çų–qL-2Uƒ±Üýÿ÷ÿ‘g}C^sŒ¢±¶­—yV6!&BkšÈïÿþÿþÿúÿ÷ÿ¯k®¡§–}]>%2U‚±Ýû‚ÿùôóöûÿÿûÿÝ3K+%Ck›Èïÿþ€ÿýöóôøý‚ÿ þþÿûÿ¨W…°Ýû‚ÿúôóöúƒÿ‚þÿþþÿýöóôøýƒÿ‚þ‡ÿ÷óôöûþ‚ÿ‚þ‰ÿÿþ”ÿþƒÿüù÷ùùø‡ÿþƒÿþúø÷ùþ‚ÿþþÿþƒÿüù÷øû‚ÿ ýëÒ²¢}ªÿûÿþ‚ÿþûø÷ùý‚ÿ÷ßħ‚~…”££)àÿûÿýù÷÷ú‚ÿþîÒµ™†|}‰œ¯¾ÄÁ³£Ò>«ÿõüýÿLúâĦ‹yru„–©¸½·¨’uVE,KÑLƒÿôÿôÓ¶—}kflzŒœ§¨ zbM=4,*,34@ÉrXÿõÙgbes‚Ž”’†u`L:/)(.59;7441±—:ÿûmk|r]I7)" !&/3;E?:6321105+”·*êÿ[x")+07<7>GQG2‚416)uÍ-ÄÿÃNƒ*$))+*4EIF?KFHQ934€305*YÕ@˜ÿãM~:(',A::47=6@BM?14€2/2,BÏ_lÿüXrM!/+6D6X@CQ<49I:13€1/0/3½„Gÿÿob^$103>?6>:OP70:<21310/.2)¢¨0úÿSl*3367GFB;TO:5/6:1--//,2%ƒÄ*Øÿ²Gt3579:8E@:GHA64/>:=8./,2&eÓ5®ÿÔFu?6;957BEF6F9,//*=<<@n,-1)LÔO‚ÿñOqN6:52:KC>>D>F:<:5@@I;+0,9ÈrXüÿbh]17351FH-Rm‹©ÄÔÖÇ«†^9%/ÿúÿrzr&/*.5CWp§½Çų•qL-2Uƒ±Üýÿ÷ÿ‘g}C^t¢±¶­—yV6!&BkšÈïÿþÿþÿúÿ÷ÿ¯k­¡§–}]>%2U‚±Ýû‚ÿùôóöûÿÿûÿÝ3K+%Ck›Èïÿþ€ÿýöóôøý‚ÿ þþÿûÿ¨W…°Ýû‚ÿúôóöúƒÿ‚þÿþþÿýöóôøýƒÿ‚þ‡ÿ÷óôöûþ‚ÿ‚þ‰ÿl8mk  '2 5_Žºâ÷ÿU "Iv¤Íðÿÿÿþÿöÿ˜4^Œ¸ßûÿÿÿÿÿûöö÷þùÿ¾!Ht¢Ìïÿÿÿÿÿþøö÷úýÿÿÿþÿûÿâv»Üûÿÿÿÿÿûööøûÿÿÿÿÿÿþþþþþÿýû1÷ÿÿþøööùýÿÿÿÿÿÿþþþþþÿÿÿÿþÿùÿWØÿøÿþÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿþÿöÿ¹ÿøÿýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ¬‹ÿöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿÑ_ÿ÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿï 5ÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿCíÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿlÌÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ—¢ÿ÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ¿uÿöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿâIÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþû0#úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿøÿWÝÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿþÿ÷ÿ€·ÿøÿþÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿþúûðÿ­Œÿöÿþÿÿþþþþþÿÿÿÿÿÿýú÷÷ùþþÿùÿ¹^ÿöÿýþÿÿÿÿÿÿþûø÷øûÿÿÿÿÿøÞ¼’j%5ÿûÿÿÿÿýú÷÷ùþÿÿÿÿþíΨ~T/êþ÷ø÷üÿÿÿÿÿùß¼”iAÌÿúÿþÿîÏ©U/m帗jB  it32t”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿþöÿ‚þÿþîÿþ„ÿþþÿÿþþæÿ‚þƒÿ ýùööøýÿÿý÷ýâÿþ„ÿûøööû‚ÿùîðûÿüüÛÿ‚þƒÿýúööøý‚ÿêÖd31|ìÿýÿþÓÿþ„ÿûøööû‚ÿøÙ­|K)CF%ßÿýÿþÌÿ‚þƒÿýúööøþÿþéÕc3€4//26:=>>=8344€5ƒ4325-I¶´¶´·±¾05ÿûˆÿþÿýøöøý‚ÿGïÊŸn>&Fe’šœ™”‹ŠŒ’•—˜˜——˜™š›žžœ››ž¢¦«®­¨ž|gSB6/-.26:==<:9898545‡4329©¸´µ¸¯ÃPíÿþ‡ÿý÷þ€ÿúÝ´…U) €5Tp†“—–’Œ‡†‡‰Œ’ƒ“*”•—˜™˜˜——˜›Ÿ£§¨¦Ÿ“‚o[I:0**-169;;:987789:;965ˆ4325.—¼²¶·¯ÃqÍÿúÿþ„ÿ(üüÿì©l?#BazŠ“”‘‹†ƒ‚„†‰‹ŽŽŽ‘’“””“€’“—œ¡££ž•‡uaN=1*(*-1586656899€:;;7‚5‡4‚3417)¿±¶¶±¾ £ÿ÷ÿþƒÿýÿîf 2Pl’‹…„‡‰€Š‰‰ŠŠ‹€ŽŽŽ”˜œœ•ŠzhTC5+&%(-147654€35678‚9::;:645‡4ƒ3417)i¿±·µ´¸© vÿ÷ÿþ„ÿ æ& Qs†ŽŒ†€}€‚…†‡‡†‡‰Š‰ˆˆŠ’–™™”Œ~mZH8,%#$(,024332€13456€7889::;8‚5ˆ4…316+Rº²¶´¶³¹!Iÿùÿþ„ÿ G—ˆ„~{{}ƒ€„ƒ„…€†+……„…‡ŠŽ’“‘Œr`N=/&"!#',/110/../01334455677889€:;745‡4‡324/?°¶µ´·¯Â@"úþ…ÿÌq€x€‚ƒ‚€€‚€ƒ‚€€‚…ˆŒ‹ƒufTC4(!#'+€. --,,--/01234567‚9::;:65ˆ4‰3231 º³µ·¯Ãbßÿüÿþ‚ÿt€€~€€€~€ƒ‡Š‹‰„ykZI8*"#&)+,++€) +,-.//0012€3 4454579=;8€9::;9‚5‡4‰32206)‹¾±¶·°À‚ ¸ÿùÿþ‚ÿAlz~€}~{z{~…‡ˆ„|p`O>/$"&)*)(€'()*+,-./0112€34457<;85.3<8::;;745ˆ4ˆ322307'tÀ°·¶²» ÿ÷ÿþ‚ÿ]Z‚y~|*‚…ƒ}seUE5'"$&'&&%%$%'()+**+,--..//0122€345575+,5?XL1<9;:65ˆ4ˆ32306)\½±·€µ²_ÿ÷ÿþ‚ÿ¢F‚x}{|{|aJ;,!!$%%#€"#$%&&'())€*+,-€.//1€233445575=frxp]>L9;8ƒ5†4Š3‚214,G¶´µ´·±¿16ÿû„ÿÑ+w|€z{&!€"!€ !"#$%€& ''())**+,,-../€011€345€6 86AL."@?H284€5‡4‰3„21206¨¸´µ¸¯ÄQíÿþƒÿì|wzyzw;$ € !""##$$%€&'(()€*+,-€.-..0146‚3487:77?Pkr§p`V!;355‡4ˆ3…21104,•¼²¶·¯ÃrÍÿúÿþ‚ÿ7rxxyzuH! !!"##$%€&'(()€*$+,-+,-/24755/-358;9>-^£pzkeI?5#I)9<25†4Š3„2112/5&¿°¶¶±¾ ¤ÿ÷ÿþ‚ÿ bd{vyyu~Z" €!""##$$%€&.'())**+,--/3230,*&,.BM63/,+19UQ+/&&)',*34]l(925ƒ4‰3…2€12/5%g¿°·µ´¸© vÿ÷ÿþ‚ÿO|tywu{h !!€"##$%&(()€*+,$+#''4BVm{Œ‘(@=?/`\v4//3'?Fc^ld%;14‰3„2ƒ1‚0.3&‰¾±¶·°À‚ ¸ÿùÿþ€ÿùÿKgurtuq{Q%"$$%€&6'(()**++,,.JpecRA-8:77534459:99678>3B/JU0:Ee‚’sJe<04ˆ3„2ƒ1‚01-4$rÀ°·¶²»žŽÿ÷ÿþ€ÿ÷ÿyWvqtsqx^%#%%€&'()€*0+,,--4\Q$"%/10536788:3864::;::0-7q9%LY9:(>4)71‡3…2ƒ1„0-3&Z½±·€µ²`ÿ÷ÿþ€ÿøÿ§Bwosrqtj&$%&'()€*+,,0'@\–J:6:95670€76<2aA@L;<:535;,F^hY/#*7:t‰3…2ƒ1‚0€/.1*D¶´µ´·±¿15ÿû‚ÿûÿÏ(wnsqrqr0"'%&'(()€*3+,.+5e>NP:,1/234R7788;3Oq]€>5787437118-o2R[£bjF)72ƒ3„2„1ƒ0ƒ/.4§¸´µ¸¯ÄQíÿþÿKþÿîsnqprov=!(%(())**+,,-.-1(\*61-29,RPuxmU,>8:>-UE)74,1553632*VbeWM-V1.52‚3…2‚1„0ƒ/.2)”¼²¶·¯Ãr Ìÿúÿþ€ÿûÿ5jpopqnwJ )&()€*+,--€..0.::3&bL-,f\ŽŠTX&@659;G*rV':Q@5343466-V+).*42‚3„2ƒ1„0ƒ/0-4$}À°·¶±¾‘ ¤ÿ÷ÿþ€ÿøÿb]qmppnuX"*')€*6+,--../-6#[q=0s?,Od\o:6/=7[C+xKM‡izlM,935442:!TCJu(814€3…2‚1…0„/0-4$e¿°·µ´¸ª vÿ÷ÿþ€ÿ÷ÿ‘Jslponrd'))**++--€.#/00209”P30B?.96+.)4;5Cr/.Wf]n&,/13€4343@p+}-53…2‚1„0†/0-2'Mº²¶´¶³º"Iÿùÿþ€ÿùÿ»3sjpnnol0(+*+,--€.$/012233>*.75-697:;<9>0`V$4M=748k2-;=64 16'PVS(.533„2ƒ1„0ˆ/./+:¯¶µµ·¯Â@"úƒÿüÿàqjnmomq:&,*,--../001231*p=1<98:8899<7>005:[(’Ajkrp524360.%6c)31ƒ2ƒ1ƒ0ˆ/€.-/-ž»³µ·¯ÃbÞÿüÿþ€ÿþú"lkmmnksF%.+-..//0122€3 43:3Fp1<3:8;8@V.68)ˆ;~]M;+'.ƒ3 2529+dW-603€2‚1„0‰//../,2%ˆ¿±¶·°Àƒ ¹ÿùÿþÿþÿùÿLamklmksR&/,..//0122€3 446491L7/I9:=?>B,Qb":6,fGX->(,*,„32321.Y'2ƒ1ƒ0Š/€.Q/,3#pÀ°·¶²»žÿ÷ÿþÿþÿ÷ÿyQoimlkp^*.-.//0122334456685>*OXJo):/,1)n>'83/L+EIVv5HaO€2„317"H:-3ƒ1ƒ0ˆ/ƒ./,2%X¾±·€µ²`ÿ÷ÿþÿþÿøÿ¦>phmkkmf0-//0012€34456€797>4vAgVB[bioM$372[NƒH‰=Œ`oWK+:„3214.Ml)701ƒ0ˆ/….-0)Cµ´µ´·±¿26ÿû€ÿ þÿûÿÏ&ogl€k2m9,001223344556778898:3BT'TaUG8,*6702t,ŠQ|Xm0',)13€2306#ZJ#3././0010Š/‡.-2§¸´µ¸¯ÃRíÿþÿþÿîlhkjljpC+2122334456677889;;/Y-''&),,)33\S:]3?')76ER933„2 14--@53553//.-ˆ/ˆ.-1(“½²¶·¯ÂsÌÿúÿþ€ÿûÿ7e€jliqO,41€344566788‚9 ;8?1_c)69DM\iln[%0=xfAZhixfk9.41ƒ21107,$%*2134/.--ƒ/ˆ.&/,3#|¿°·¶±¾‘ £ÿ÷ÿþÿþÿøÿbXkhkkioZ.423€45677889::;:55-_Qjfe`N<-#12:[ƒ[`I<+'(„2112/5&†m?Wcb-,&$/234.//./‰.-/,3#d¿°·µ´¸ª vÿ÷ÿþÿþÿ÷ÿFmgkjjmc23344566778‚9 ::;955673O2H7%(/7C8,:coF,*(+95ƒ2‚12-?6PT>,1@Yk.)/.+,1'Mº²¶´¶³º"Jÿùÿþÿþÿùÿ»1nfkjkkj92545667789"::;;7553:(YVAx<=:2Ej$:15*!5(;5OM102„101+'&'u—y|'BJ],-0Œ.-/+:¯¶µµ·¯ÂA"ûþ€ÿþÿüÿßmgkjkjoB065677889::;:6€539+q51/CO9+0D/18'`YCpkudb/‚2‚1€0/243980<.Rda>J4*.-‹.-/,»²µ·¯Äbßÿü‚ÿþú"hhjjliqL076778‚9::;9‚5450T/02D4N.J@p>-44'lTJ2)+3€2‚1‚0/-/$%+,)130GI|M]NY3,Š.-2¦¸³µ¸¯ÄRìÿþÿþÿîmimlmkqK5;8::;:65ƒ4A36/APk8r0i_"82-p9)05)3F*8amˆ›),;IWfgccH3-1)0-7|XyC^f>D02;)0-‡.-1(“½²¶·¯ÂsÌÿú‚ÿûÿ6fkllnkrU4;9:;9ƒ5ƒ4A2:&^f1o?eS];0341D4-:n‚?(]”^`:,FqbXR1J>m<'6,/+9sCR./@3k7zRn)0-†./,3#{À°·¶±¾’ £ÿ÷€ÿþÿ÷ÿbZnknmlr_6;:;7ƒ5…4A527uQ/5@*-5225'rAec_MeJ 6 $'<"?:%8~-44p,(..-+387vRo^_^gVn:(0-…./,2#c¿±·µ´·ª vÿ÷€ÿþÿ÷ÿ‘Hrjonnqh;;:65‡4€3>40:2AiK*7031311lC,"E@(.225743+.3w@,;n1+4/A3%Lr€bDCzVvhbd3C$0-‡.-1'L¹³¶´¶²º"Jÿù€ÿþÿùÿ»2skpnoonB864€5ˆ4B3325/7v>³T#8/321320,)RJ[Z(3-.-../3&8WdY-'4&J?€E'1}M_iiWH/%$%6N8*0-†.-/+9®¶´µ·¯ÂA#ûÿþÿüÿßrkonposF1745‰4€3A418'OUk<"8032306&U]S°ObwŠ˜¢¨©¨¥£¡ ¢¤§©ª«¬««­®¯±±°¯€­ ¯´ºÀÃÁ¸§rQ1  ‚ )O{¨Ððÿüøÿþ„ÿþÿüÿà†ƒ‚„‡G-301#0//..001221/,('(-6EWj}Žš¡¥¥¢ŸœœŸ¢¤¦§¨©«­®®­«©©ª®³ºÀÁ½°œbA# ‚  ;f“½âû‚ÿû÷÷úÿÿþˆÿ þû"‚ƒƒ…‹U+4€0//01€31.*('*1=M_q‚™Ÿ Ÿš™˜šœŸ ¢€£¤¥¦¨©ª©¨§¦¦©­³¹½¼´¥ŽqQ2  ‚&P|¨Ïð‚ÿýø÷øúþ‚ÿþ‡ÿþÿùÿMs†‚……‚Œe*30€320-*()-6CTfw†‘™œœš—•”•—™œžŸ¡£¥¦¦¥¤¢¢£§­³¸º¶ª˜~`@# ‚  9c»ßú‚ÿû÷÷ùü„ÿ€þ‰ÿ'þÿ÷ÿz`Š‚‡…„‹s04/,))+2" ‚  ‚7b»ßù‚ÿû÷÷ùü„ÿþ¡ÿ+ûÿ7~ŠˆŠ‰‰Šˆ‰‹ŒŽŽ‘’“””’‘’–›¢¦¥ “€gK/ ‚%Lw¤Ìí‚ÿþù÷øúþƒÿþ¥ÿ þÿøÿbnއ‹ŠŠ‹€ŒŽ‘’’‘ŽŽ‘•› ¢Ÿ—‡rX=" ‚  ‚6`¸Ýù‚ÿü÷÷ùü„ÿþªÿ"þÿ÷ÿV’ˆŒŠŒŽŽŽ‹Œ‘–›Ÿž™Ž{cI. ‚$Kx¥Ìí‚ÿþù÷÷úýƒÿþ°ÿ þÿùÿ¼8‘†ŽŒ€Š ‘–››’ƒoV;" ‚ ‚6_¸Ýø‚ÿü÷÷øü„ÿþµÿþÿüÿâ ‡“‰Œ’—››–ŠxbH. $Kw¤Íî‚ÿþù÷÷úþƒÿþ¼ÿþÿûÿB0‡–—mU;" ‚ ‚5]‰µÜù‚ÿü÷÷øü„ÿþÁÿ þÿ÷ÿ• &$ "Ht¡Êì‚ÿþù÷÷úþƒÿþÊÿ ýû7  ‚5]жÛ÷‚ÿüø÷øü„ÿþÍÿ þÿýÿÞ'"Ht¡Êì‚ÿþù÷÷úýƒÿþÖÿ ýþó‹B)#7^еÛ÷‚ÿü÷÷ùü„ÿþÜÿüüÿÿüù‚ÿþú÷÷úþƒÿþãÿ ý÷úýþûø÷øûþƒÿþçÿþþ‡ÿþïÿþþ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿþöÿ‚þÿþîÿþ„ÿþþÿÿþþæÿ‚þƒÿ ýùööøýÿÿý÷ýâÿþ„ÿûøööû‚ÿùîðûÿüüÛÿ‚þƒÿýúööøý‚ÿêÖd31|ìÿýÿþÓÿþ„ÿûøööû‚ÿøÙ­|K)CF%ßÿýÿþÌÿ‚þƒÿýúööøþÿþéÕc3€40/26:=>?=84€3€455ƒ4325-I¶´¶´·±¾05ÿûˆÿþÿýøöøý‚ÿïÊŸn>&Ff‘šœ™”‹‹ŒŽ’•—€˜-—˜™šœžžœ›œž¢¦«®­¨žŽ|hTB6/-.27;==<;:998545565‡4328©¸´µ¸¯ÃPíÿþ‡ÿý÷þ€ÿúÝ´…U) €4Tp†’˜–’Œˆ††‰Œ’ƒ“)”•—˜™˜˜——˜›Ÿ£§¨¦Ÿ’‚o[H:0**-26:;;:987789;<95‰4325.—¼²¶·¯ÃqÍÿúÿþ„ÿQüüÿì©l?#BazŠ“”‘‹†ƒ‚„†‰‹ŽŽŽ’“””“’‘’”—œ ££ž•‡uaN>2+(*.2589987667899:;:;;745‡4‚3417)¿±¶¶±¾ £ÿ÷ÿþƒÿ ýÿîf 2Pl’‹†‚„‡‰Š‹ŠŠ‰Š‹Œ€&ŽŽ‘”™œœ•ŠzhUC5+&%(-15775433456889:99€:;:6‚5‡4ƒ3417)i¿±·µ´¸© vÿ÷ÿþ„ÿæ& Qs†ŽŒ‡~}}€ƒ…€‡†‡‰‰€Š!‰ˆˆŠŽ’–™˜”‹~mZI8,&$%(,034432112345€7889::;<8ƒ5‡4…316+Rº²¶´¶³¹!Iÿùÿþ„ÿ G—ˆ„}{{|ƒ€„ƒ„†#…„„…‡ŠŽ’“’Œr`N=0&"!#',/110/../01334€5677889::;;7‚5‡4‡324/@°¶µ´·¯Â@"úþ…ÿÌp€w€€€‚€€‚€ƒ‚€‚…ˆŒŽ‹‚vfTC4(!#'+-..--€,./022€344567667‚9::;:6‚5‡4‰3131 º³µ·¯Ãbßÿüÿþ‚ÿt€€€~,€€€~}~€ƒ‡Š‹‰„ykZH8*"#&*+,,+))*+,../00122€34454579=;899::;<9‚5ˆ4ˆ32206)‹¾±¶·°À‚ ¸ÿùÿþ‚ÿAl{~}{z|~‚…ˆ‡„|p`O>/$"&())(€'()*+,-€.//012233€457<<96.3<9::;;74‚5‡4‰32307'tÀ°·¶²» ÿ÷ÿþ‚ÿ]Z‚y~{€|‚…ƒ}sfUE4'"$&'&&%%$%'()€*+,--..//012233445575+,5?XL1<9<:6‚5‡4ˆ32306(\½±·€µ²_ÿ÷ÿþ‚ÿ¢F‚x}z{{|aJ:,!!$%%#€" #$%&&(())**++€-../0122€3445575=frxq]>L:;8‚5ˆ4‰3‚214,G¶´¶´·±¿16ÿû„ÿÑ+w|y{y{&!€"!€ !"#$%€&''()€*+,--../00€13344566786AL."@?I284€5†4Š3„21106¨¸´µ¸¯ÄQíÿþƒÿì|w{yzw;$€ !""##$$%€& '(()**++,-ƒ.01464€34587:87@Olr§p`V!;355‡4‰3„21104,•¼²¶·¯ÃrÍÿúÿþ‚ÿ7syxyzv€H! !!"##$%€&+'())**+,,-,,-/24755/-358;:>.^£pzkeJ?5#I):<25†4‰3…2112/5&¿°¶¶±¾ ¤ÿ÷ÿþ‚ÿbdzvyxu~Y" !!""##$%€&''()€*(+,,-/3230,*&-.BN74/,+19UQ+/%'*',*34]l(925ƒ4Š3ƒ212/5&g¿°·µ´¸© vÿ÷ÿþ‚ÿN|txwu{g !!€"##$%€&'(()€*,%-+#''4BVm{Œ‘(=IYhnnY!2058Bgh‹¤Kw)635‚4‰3„2ƒ1.3)Pº²¶´¶³º!Kÿùÿþ‚ÿ »6}sxvvwr'"!€"#$$%€&1'(()**+,,-/12:dešzXQ2%VscXG4P'=?Ydry‘hhF55J 925€4Š3„2‚100/1-=¯¶µµ·¯Â@"úþ„ÿàzrvuvty3#!""#$%%&&''()€*+++*./+*"1•b^?1!#-4;("".)^l*2gR8-%$#"R635€4‰3…2ƒ1€0/1/Ÿ»³µ·¯Ãbßÿüÿþ€ÿþû"ssttur{B%!##$%€&'(()€*/+,-4,-6AR_,%.4:;=:75:>@>?/_\v4//3(@Fc^ld%;144ˆ3„2ƒ1‚0.4&‰¾±¶·°À‚ ¸ÿùÿþ€ÿùÿKgtsttq{Q%"$$%€&'(()**++,-.JpecSA-9:875€45::99688>3B/JU0:Ee’sJe<04‡3…2ƒ1‚01.4$rÀ°·¶²»žŽÿ÷ÿþ€ÿ÷ÿyWwptsqx_%#%€&7''())**+,,.-4]Q$"%/10546788;3874::<::0-7q9%LY9:(>4)71‡3„2„1„0-3&Z½±·€µ²`ÿ÷ÿþ€ÿøÿ§Bxotrqtj&$%€&''()€*+,,0'@\—K:6:956707<2aA@L;<:435;,F]hY/#*7:t‰3„2„1ƒ0//.1*D¶´µ´·±¿15ÿû‚ÿûÿÏ(wnr€q@r0"'%&'(()**+,,-+5e>NP:,10144S7788:3Oq^>5787437118-o2RZ£bjF)72„3„2ƒ1ƒ0ƒ/.4§¸´µ¸¯ÃQíÿþÿþÿîrnqprov=!(%(()€*5+,--.-2(\*62-29,RPvymU->79>.UE)74,1453632*VbeWN-V1.52‚3…2ƒ1ƒ0ƒ/.2)”¼²¶·¯Ãr Ìÿúÿþ€ÿûÿ6j€pqmwJ *&()€*+,--€..1.;:3&bM.,f[ŽŠTX&@669;H*sV':P@4343466-V+).*42‚3„2ƒ1„0ƒ/0-3$}¿°·¶±¾‘ ¤ÿ÷ÿþ€ÿøÿb]qnppmuW"*'€*+,,-€.0/-7$\q>0s?,Od\o:6/=7[C,xKM‡izlM,935442:"TCJu(8143„2ƒ1„0„/0-3$e¿°·µ´¸ª vÿ÷ÿþ€ÿ;÷ÿ‘Jskponrc'))**+,--..//00309”P30B?.:6+.)4;6Cr/.Wf]n&,/13‚43@p+}-53„2„1ƒ0†/0-1'Nº²¶´¶³º"Iÿùÿþ€ÿùÿ»3tjpnnol0)+*+,-€.//012€3,>+.86-697;;<9>0`W$4M=748k2-;=6443316'PVS(.533…2‚1„0‡/../+:¯¶µµ·¯Â@"úƒÿüÿàqjnmnmq:&,+,-€./0112€3 41+q=2<98:8€9<8>015:[(’Ajkrp525360.%6c)31ƒ2ƒ1ƒ0ˆ/€.-/-ž»³µ·¯ÃbÞÿüÿþ€ÿþú"lkmmnksF&.+€.(//012233453:3Fp1=3:8898;9@V.68)‰;~]M;+&.ƒ3 2529+dW,60322„1ƒ0ˆ/€.Q/,2%ˆ¿±¶·°Àƒ ¹ÿùÿþÿþÿùÿMamkmnkrR'/,..//0122334456491L7/I9;=?>B,Qb":6,fGX->(,*,„32.Z'2ƒ1ƒ0ˆ/‚.+/,3#pÀ°·¶²»žÿ÷ÿþÿþÿ÷ÿyQoimlkq^*/-./0112€3"4556686>+OXJo);0,1)m>'92/L+EIUv5GaN€2„317"H:-30‚1ƒ0ˆ/ƒ./,2%X¾±·€µH²`ÿ÷ÿþÿþÿøÿ¦>phmlkmg1-//0122334456677897>4vAhVB[bioL$372[NƒH‰=Œ`oWK+:ƒ3 2214.Ml)701„0‰/ƒ.-0)Cµ´µ´·±¿26ÿû€ÿ?þÿûÿÏ&ohmjlkm9,101223344566778998:3BT'TaUG8-*6702s,ŠQ|Xm0'+)13€2306#ZJ$3././00100‰/‡.-2§¸´µ¸¯ÃRíÿþÿþÿîlhkjljpC,212€3445677889:;,1@Yk.)/.+,1'Mº²¶´¶³º"Jÿùÿþÿþÿùÿ»1ofkjkkj92545677889"::;;7553:(YVAx<=:2Ej$:14*!4(;5OM10‚2ƒ1/1+'&'u—y|'BJ],-/Œ.-/+9®¶´µ·¯ÂA"ûþ€ÿþÿüÿßmfjikjnB16567789€:<:6€539,q51/CO9+1D/18'`YCpkudb/2ƒ1€0/243990<.Rc`>K4*.-‹.-/,»²µ·¯Äbßÿü‚ÿþú"hhjjlipL1867889::;<8‚5460T/02D5N.J@p>-44'lTJ2)+3€21ƒ0/-/$%+,)130GI|M]NY3,Š.-2¦¸³µ¸¯ÄRìÿþÿþÿîmimlmkqK5;9::;:65ƒ4A360APk8r0i_"82-p9)05)3F*8amˆ›),;JWffccH3-1)/-7{XyC^f>D02;)0-‡.-1(“½²¶·¯ÂsÌÿú‚ÿûÿ6fklmnkrU5<9;;8ƒ5ƒ4A2:&^f1o?eS];0331D3-:o?(]”^`:,FrbYR1J>m<'6,/+9sCR./@3k7zRn)0-†./,3#{À°·¶±¾’ £ÿ÷€ÿþÿ÷ÿbZnknmlr_7;:;7‚5†4A527uQ/5@*-5225'qAec_NeJ 6 $'<"?:%8~-44p,(./-+387vRo^_^gVn:(0-…./,2#c¿±·µ´·ª vÿ÷€ÿþÿ÷ÿ‘Hqkonmqh;;:6‚5‡4@3340:2AhK*7131311lC,"E@(.225743,-3w@,;n1+4/A3%Lr€bDCzVvhbd3C$0-‡.-1'L¹³¶´¶²º"Jÿù€ÿþÿùÿ»2skpnoonB7645‡4B3325/8v>³S"8/321320,)RJ[Z(3-.-../3&8WdY-'4'J?€E'1}M_iiWH/%$%6N8*0-†.-/+9®¶´µ·¯ÂA#ûÿþÿüÿßrlpopnsF17455‡43A418'OUk<"8032306&T]S°Ocw‰˜¢¨©¨¥£¡¡¢¤§©ª€«¬­®¯€±¯­¬­¯´ºÀÃÁ¸§rQ1  ‚ )O{¨Ððÿüøÿþ„ÿþÿüÿà…ƒƒ‡G-30100/.//0€21/,('(-7EWj}𢥥¢ŸœŸ¢¤¦§¨©«­®®­«ª©ª®´º¿Á¼°œbA# ‚  ;f“½âû‚ÿû÷÷úÿÿþˆÿMþû"‚ƒƒ…ŠU+4/00//013321-*('*1=L_q‚šŸ¡ š™™šœž ¢¢££¤¥¦¨©ªª¨§¦¦¨­³º½¼´¥ŽpQ2  ‚&P|¨Ïð‚ÿýø÷øúþ‚ÿþ‡ÿ.þÿùÿMs†ƒ……‚Œe*3034320-*()-6CTfw†‘™œœš—•”–—™œžŸ¡£¥¦§¥¤¢¡£§­³¸º¶ª˜`@# ‚  9c»ßú‚ÿû÷÷ùü„ÿ€þ‰ÿ(þÿ÷ÿz`Ї†„‹s04/,))+2" ‚  ‚7b»ßù‚ÿû÷÷ùü„ÿþ¡ÿûÿ7~‰ˆŠ‰ŠŠˆ‰‹Ž‘’€”“‘’–œ¢¥¥ “gK/ ‚%Lw¤Ìí‚ÿþù÷øúþƒÿþ¥ÿ þÿøÿbnއŒŠ‹‹ŒŽ‘’’‘ŽŽ‘–› ¢Ÿ—‡rX=" ‚  ‚6`¸Ýù‚ÿü÷÷ùü„ÿþªÿ"þÿ÷ÿV’ˆŠŒŽŽ‹‹‘–›Ÿž™Ž{dI. ‚$Kx¥Ìí‚ÿþù÷÷úýƒÿþ°ÿ þÿùÿ¼8’‡ŽŒ€Š ‘–›š’ƒoV;" ‚ ‚6_¸Ýø‚ÿü÷÷øü„ÿþµÿþÿüÿâ †“‰ŒŽ“—››•ŠxbH. $Kw¤Íî‚ÿþù÷÷úþƒÿþ¼ÿþÿûÿB0ˆ––mU;" ‚ ‚5]‰µÜù‚ÿü÷÷øü„ÿþÁÿ þÿ÷ÿ• &$ "Ht¡Êì‚ÿþù÷÷úþƒÿþÊÿ ýû7  ‚5]жÛ÷‚ÿüø÷øü„ÿþÍÿ þÿýÿÞ'"Ht¡Êì‚ÿþù÷÷úýƒÿþÖÿ ýþó‹B)#7^еÛ÷‚ÿü÷÷ùü„ÿþÜÿüüÿÿüù‚ÿþú÷÷úþƒÿþãÿ ý÷úýþûø÷øûþƒÿþçÿþþ‡ÿþïÿþþ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿþöÿ‚þÿþîÿþ„ÿþþÿÿþþæÿ‚þƒÿ ýùööøýÿÿý÷ýâÿþ„ÿûøööû‚ÿùîðûÿüüÛÿ‚þƒÿýúööøý‚ÿêÖd31|ìÿýÿþÓÿþ„ÿûøööû‚ÿøÙ­|K)CF%ßÿýÿþÌÿ‚þƒÿýúööøþÿþéÕc3€4//26:=??=834455…425-I¶´¶´·±¾05ÿûˆÿþÿýøöøý‚ÿïÊŸn>&Fe€‘šœ™”‹ŠŒ’”—€˜-—˜™šœžœ›œž¡¦«®­¨ž|hTB6/-.26;==<;:998545655‡4329©¸´µ¸¯ÃPíÿþ‡ÿý÷þ€ÿúÝ´…U) €4Tp†“˜–’Œˆ††‰Œ’ƒ“”–—˜˜™˜——˜›Ÿ£¦¨¦Ÿ“‚o[I:/+*-26:€;987789:<9ƒ5‡4325.—¼²¶·¯ÃrÍÿúÿþ„ÿüüÿì©l?#BazŠ“”‘‹†ƒ‚ƒ†‰‹Ž€Ž.’“””“’‘’”˜œ ££ž•‡uaN>2+(*-1589977667899:;;<;7‚5‡4‚3417)¿±¶¶±¾ £ÿ÷ÿþƒÿýÿîf 2Ql‘‘‹†‚„‡‰ƒŠ‹Œ€$ŽŽ”˜œ›•‰zhUC5+&&(-25776433456789:€9::<:6‚5†4„3417)i¿±·µ´¸© vÿ÷ÿþ„ÿæ& Rs‡ŽŒ†~}~€‚…€‡†‡ˆ‰€Š!‰ˆˆŠŽ’–˜™”Œ~m[H8,%#%(,034432112345€7889::;;8„5…4†316+Sº²¶´¶³¹!Iÿùÿþ„ÿ G—ˆ„~{{}ƒ€„ƒ„…€†…„„…‡ŠŽ’”‘Œ‚s`N=0&"!#',/110/ 023345566778‚9::;;75‰4†324/?°¶µ´·°Â@"úþ…ÿÌp€w€€‚ƒ‚‚€€‚ƒ‚‚…ˆŒ‹ƒvfTC4(! #'+-..-€,-./022€3445676679€:;:65ˆ4‰3231 º³µ·¯Ãbßÿüÿþ‚ÿt€€~€€~$€ƒ‡Š‹‰„ykZH8+"#&*,,++))*+,..//0122€34454579=;899::;;9ƒ5‡4ˆ32206*‹¾±¶·°À‚ ¸ÿùÿþ‚ÿAlz~€}~{z|~‚…ˆ‡„|o`O>/$"&€)(€'())+--€.//0122€34557<<96.3<9::;;75ˆ4‰322307'tÀ°·¶²» ÿ÷ÿþ‚ÿ]Z‚y~{€|‚„ƒ}sfUD5'"$&%%$%'()€*+,--../0012233445575+-5?XL1<9<:65ˆ4‰3€2306)\½±·€µ²_ÿ÷ÿþ‚ÿ¢F‚x}z{{|bI;,!!$%%#€"#$%&'(())€* +,--../0122€3445575=frxq\>L:;8‚5ˆ4‰3‚214,G¶´¶´·±¿16ÿû„ÿÑ+w|y{y{&!€"!€ !"#$%&'()€*+,--../00€13344566786AL."@?I2745†4Š3ƒ21106¨¸´µ¸¯ÄQíÿþƒÿì|wzy{w;$ !""##$$%€&'(()**++,„.015643587:87@Plr§p`V!;355†4Š3„21104,•¼²¶·¯ÃrÍÿúÿþ‚ÿ7syxyzv€H! €!€"##$%€&+'())**++--,--/24755/-358;:>._£pzkeJ?5#I)9<26†4Š3…212/6&¿°¶¶±¾ ¤ÿ÷ÿþ‚ÿ bdzvyyu~Z" €!""##$%€&''()€*(+,,./3230,*&,.BN74/,+19UQ+/%&)'-*34]l(925ƒ4‰3…2€12/5&g¿°·µ´¸© vÿ÷ÿþ‚ÿO|tywv{g !!€"##$%€&'(()€*+,$+#''4BVm{Œ‘(=IYhnnY"2058Bgh‹¤Kw)635‚4‰3…2‚1/3(Pº²¶´¶³º!Kÿùÿþ‚ÿ »6|sxvvwr'"!€"#$$%€&1'())**+,,-.12:deŒšzXQ2&VtcXG4P'=?Ydry‘hhF55J 9254ˆ3…2ƒ10/1-=¯¶µµ·¯Â@"úþ„ÿHàzrvtvtx3#!"##$%%&&''())**++*./**"1•b^?1!#-4;("#.)^l*2gR8-$$#"Q6354ˆ3„2ƒ10/1/Ÿº³µ·¯Ãbßÿüÿþ€ÿþû"ssutvr{B%!##$%€&'(()€*.+,-4,-6AR`,%.4:<=:75:>@>?/`\v4//3'@Fc^ld%;14‰3ƒ2„1‚0.3&‰¾±¶·°À‚ ¸ÿùÿþ€ÿùÿKgtrtuq{Q%"$$%€&'(()**+,,-.JpebSA-8:875€45::99688>3B0JU0:Ee‚’sJe<04ˆ3„2ƒ1ƒ0-4$rÀ°·¶²»žŽÿ÷ÿþ€ÿ÷ÿyWwqtsqx_%#%%€&6'())**+,-.-4]Q$" %/11546798;3864::<::0-7q:%LY9:(>4)72‡3„2„1„0-3&Z½±·€µ²`ÿ÷ÿþ€ÿøÿ§Bwotrrtj&$%€&'(()€*+,,0'@\–J:6:966707<2aA@L<<:536;,F^hY/#*7:t‰3…2‚1„0//.1*D¶´µ´·±¿25ÿû‚ÿûÿÏ(vnspqqr0"'%&'())€*3+,-+5f>NP:,20144S7788:3Nq^€>5787427119-o1RZ£bkF)72„3„2ƒ1ƒ0ƒ/.4§¸´µ¸¯ÃQíÿþÿþÿîsnqprov=!(%(()€*5+,--.-2(\*62-29,RPvxmU->79>-UE)74,1453632*VbeWM.V1.52‚3…2ƒ1ƒ0ƒ/.2)”¼²¶·¯ÂrÌÿúÿþ€ÿûÿ5jpopqnwJ )&))€*+,-.0.;:3&cM.,f[ŽŠTX&@669;H*sV':Q@€4 3466-V,*.)42‚3…2‚1ƒ0„/0-4$}¿°·¶±¾‘ ¤ÿ÷ÿþ€ÿøÿb]qmppmuW"*(€*++,-€.0/-7$\q>0s?-Od[o:6/=8[C,xKM‡izlL,935442;"SCJu(8143„2ƒ1ƒ0…/0-3$e¿°·µ´¸ª vÿ÷ÿþ€ÿ;÷ÿ‘Jskpomrc'))**+,--..//0030:”P30B@/96+.)4<6Dr/.Wf]n&,/13€4343@p+}-5‚3„2‚1„0‡/-1'Mº²¶´¶³º"Iÿùÿþ€ÿùÿ»3tkonnol0(+*+,-€.4//012233>+.85-697::<9>0`W$4M=738k2-;=6443416'PVS(.543„2ƒ1„0ˆ/-/+:¯¶µµ·¯Â@"úƒÿüÿàqjnmomq:&,+--€./0112€3 41*q=2<98:8899<8>005:[(’Ajkrp524360.%7c)41ƒ2ƒ1ƒ0‰/..-/-ž»³µ·¯ÃcÞÿüÿþ€ÿþú"lkmmnksF&.,-..//0122€3 43:3Fp1=3:8998;9@V.69*‰;~]M;+&.4‚3 2529+dW-603€2ƒ1„0ˆ/S../,2%ˆ¿±¶·°Àƒ ¹ÿùÿþÿþÿùÿMamkmnjrR'/,..//0122334456491L7/I9;=??C,Qb":6,fGX->(,*,„32322.Z'‚2‚1„0ˆ/.+/,3#pÀ°·¶²»žÿ÷ÿþÿþÿ÷ÿyQnimlkp^*/-./0112€3"4456686>+OXJo);0,1)n>'93/L+EIUv5GaN€2„317"H:-30‚1ƒ0ˆ/ƒ./,2%X¾±·€µH²`ÿ÷ÿþÿþÿøÿ¦>phmkkng0-//0122334455677897>4vAhVB[bioL%372[NƒH‰=Œ_oWK+:„3 214.Ml)702€1ƒ0ˆ/….-0)Cµ´µ´·±¿16ÿû€ÿ?þÿûÿÏ&ogljlkm9,001223344566778998:3BT'TaUG8-*6702t,ŠQ|Xm0'+)13€2306#ZJ$3././0011Š/‡.-2§¸´µ¸¯ÃRíÿþÿþÿîlhkklipC+212€34456€789:;-1@Yk.)/./‹.+,1'Mº²¶´¶³º"Jÿùÿþÿþÿùÿ»1nfkjkkj9254667788€9€: ;;7553:(YVAx<=:2Ej#:15*!4(;5ON20‚2ƒ101+'&'u—y|'BJ],-0Œ.-/+:¯¶µµ·¯ÂA"ûþ€ÿþÿüÿßmfkjkjnB165€789€:<:6€539,q51/CO9+1D/18'`YCpkudb/2„1€0243980<.Rd`>K4*.-‹.-/,»²µ·¯Ãcßÿü‚ÿþú"hhjjliqM0867889€:<8‚5450T/02D5N.K@p>-44'lTJ2)+3€2‚1‚0/-/$%+,)130GI|M]NY3,Š.-2¦¸³µ¸¯ÄSìÿþÿþÿîmillmkqK5;9::;:6‚5‚4A360APk8r0i_"82-p9)05)3F*8amˆ›),;IWfgccH3-1)0-7|XyC^f>D02;)0-‡.-1(“½²¶·¯Âs Ìÿú‚ÿûÿ6fllmnkrU5<9;<8‚5„4A2:&^f1o?eS];0341D4-:n?(]”^`:,FrbXR1J>m<'6,/+9sCR./@3k7zRn)0-†./,3#{À°·¶±½’ £ÿ÷€ÿþÿ÷ÿbZnknmlr_7;:;7‚5†4A527uQ/5@*-5225'rAec_MeJ 6 $'<"?:%8~-44p,(./-+387vRo^_^gVn:(0-…./,2#c¿±·µ´·ª vÿ÷€ÿþÿ÷ÿ‘Hrjommqh;;:65ˆ4@3340:2AhK*7131311lC,"D@(/225743,.3w@,;n1+4/B4%Lr€bDCzVvhbd3C$0-‡.-1'L¹³¶´¶²º#Jÿù€ÿþÿùÿ»2skonoonB765‡4€3@25/8v>³S"8/321320,)RJ[[(3-.-../3&8WdY-'4&I?€E'1}M_iiWH/%$%6N8*0-†.-/+9®¶´µ·¯ÂA#ûÿþÿüÿßrkonpnsF174€5†43A418'OUk="8032307&U]S°.--./0121/,(%%)2@Sh}‘¡¬±²°­ª©¨ª¬®°²²³²²³µ¶··¶´±¯¯±µ»ÁÃÁ¸§ŽpP0  )œþü„ÿ þÿ÷ÿ’R…|‚€€„v‚2ƒ1„0$//..-..01221.*'%'-7G[p„•¢«®®«§¥¤¤§ª¬®‚¯°²´µµ³±€¯ ³¸¾Âþ±œa@" ‚   ;f’Ëûÿûý„ÿþÿùÿ¼9ˆ}ƒ‚‚€;03„1‚0/.-./0€20-*&&)1>Ocw‰˜¢¨©§¥¢¡¡¢¤§©ª«­®°±±°¯®¬­¯´ºÀÃÁ¸§rQ1  ‚ )O{¨Ððÿüøÿþ„ÿþÿüÿà†ƒ‚ƒ‡G-401#0//.//01221/,('(-7EWj}𢥥¢ŸœœŸ¡¤¦§¨©«­®®­«©©ª­´ºÀÁ¼°œbA# ‚  ;f“½âû‚ÿû÷÷úÿÿþˆÿþû"‚ƒƒ…‹U+4/00//01€31.*('*1=M_q‚™Ÿ¡ š˜˜šœž ¢¢€£¥¦¨©ª©¨§¦¦¨­³º½¼´¥ŽqQ2  ‚&P|¨Ïð‚ÿýø÷øúþ‚ÿþ‡ÿ.þÿùÿMs†ƒ……‚Œd)3034320-*()-6CTfw†‘™œœš—•”–—šœž€Ÿ ¡£¥¦¦¥¤¢¢£¦­´¹º¶«˜`@# ‚  9c»ßú‚ÿû÷÷ùü„ÿ€þ‰ÿ(þÿ÷ÿz`Š‚‡…„‹s04/,)(+2" ‚  ‚7b»ßù‚ÿû÷÷ùü„ÿþ¡ÿ+ûÿ7~‰ˆŠ‰ŠŠˆ‰‹ŽŽŽŽ‘’“””“‘’–œ¢¦¥ “gK/ ‚%Lw¤Ìí‚ÿþù÷øúþƒÿþ¥ÿ þÿøÿbn‡Œ€Š€ŒŽ‘’’‘ŽŽ‘–› ¢Ÿ—‡rX<" ‚  ‚6`¸Ýù‚ÿü÷÷ùü„ÿþªÿ"þÿ÷ÿV’ˆŠ‹ŒŽŽ‹‹‘–›Ÿž™{cI/ ‚$Kx¥Ìí‚ÿþù÷÷úýƒÿþ°ÿþÿùÿ¼8‘†Œ‹ŠŠ‘–›š’ƒnV;! ‚ ‚6_¸Ýø‚ÿü÷÷øü„ÿþµÿþÿüÿâ †’ˆŒ’—››–ŠxbH. $Kw¤Íî‚ÿþù÷÷úþƒÿþ¼ÿþÿûÿB1ˆ––mU:" ‚ ‚5]‰µÜù‚ÿü÷÷øü„ÿþÁÿ þÿ÷ÿ• &$ "Ht¡Êì‚ÿþù÷÷úþƒÿþÊÿ ýû7  ‚5]жÛ÷‚ÿüø÷øü„ÿþÍÿ þÿýÿÞ'"Ht¡Êì‚ÿþù÷÷úýƒÿþÖÿ ýþó‹B)#7^еÛ÷‚ÿü÷÷ùü„ÿþÜÿüüÿÿüù‚ÿþú÷÷úþƒÿþãÿ ý÷úýþûø÷øûþƒÿþçÿþþ‡ÿþïÿþþ€ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿt8mk@ %Gaa+ 6]‰³Ùõÿÿÿõk  $HržÆéýÿÿÿÿþúùöÿèY5\‡²×õÿÿÿÿÿüø÷øûþÿþÿûÿ¥9#GpœÅçýÿÿÿÿÿú÷÷ùýÿÿÿÿÿÿþýÿüÿÎX3Z†±Öôÿÿÿÿÿýø÷øûþÿÿÿÿÿÿþþþþÿÿÿÿýÿås%"Fo›Äæüÿÿÿÿÿû÷÷ùýÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿþÿô‹02Y„¯Õôÿÿÿÿÿýù÷øûþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý¡= !Dn™Âåüÿÿÿÿÿû÷÷ùýÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿýÿ·K1Wƒ®Ôóÿÿÿÿÿýù÷øûþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿýþÿÿÿÿýÿÌZ Cl˜Áäüÿÿÿÿÿû÷÷ùýÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿÞm!0V¬Óòÿÿÿÿÿýù÷øûþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿÿÿÿþÿî+Ak–¿ãûÿÿÿÿÿû÷÷ùýÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿù–6 .T«Òñÿÿÿÿÿþù÷øûþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿÿÿÿþÿ­CAi•¾âûÿÿÿÿÿû÷÷ùüÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿýÿÂS.S~©Ððÿÿÿÿÿþù÷øûþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿÖd?h“½áúÿÿÿÿÿû÷÷ùüÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿçv&,R|¨Ïïÿÿÿÿÿþù÷øúþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿÿÿÿþÿôŒ0>f’¼àúÿÿÿÿÿû÷÷ùüÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿÿÿÿÿý¢< $‹Éîÿÿÿÿÿþù÷øúþÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿýÿ¸J7ðÿÿÿû÷÷ùüÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿýÿÌ[®ÿðýýÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿßm!Îÿûÿþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿÿÿÿþÿî+Çÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿù–6 «ÿøÿþÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿÿÿÿþÿ­C‚ÿ÷ÿþÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿýÿÂRZÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿÖd5úþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿýÿçv&âÿüÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûÿÿÿÿþÿôŒ0¿ÿùÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþÿÿÿÿÿý¡= —ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿýÿ¸KnÿøÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿýÿÍZHÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿßm!&îÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿþÿî+ Ñÿûÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿù—6 ¬ÿøÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿþÿ­CƒÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿýÿÂSYÿúÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿÖd5úþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿýÿçv&áÿüÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿþÿôŒ0¾ÿùÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿý¢= —ÿøÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿýÿ¸JnÿøÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿÿýÿÍ[Fÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿßm!%îÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿþÿî+ Ðÿûÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿú—6 ¬ÿøÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿþÿ­C‚ÿøÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿýÿÂRXÿúÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿÖc5úþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿýÿèw&áÿüÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿþÿôŒ0¾ÿùÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿý¢< –ÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿýÿ¸JmÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿÿýÿÍ[Fÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüÿÿÿÿýÿßm!%îÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿþÿî+ Ðÿûÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿú—6 «ÿøÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿþÿ­C‚ÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿýÿÃRXÿúÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿÿýÿÖd4úÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿýÿçw&áÿüÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿþÿôŒ0¾ÿùÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿÿý¢= –ÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿýÿ¸KmÿøÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿÿýÿÍZFÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿýÿßm!$íÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿþÿî* Ïÿûÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿú—6 «ÿøÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿþÿ­CÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿÿÿýÿÃRXÿúÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿÿýÿ×d4ùÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿýÿèv&áÿüÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿþÿôŒ0½ÿùÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿý¢< •ÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ýÿÿÿÿýÿ¸JlÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýüûûûøþÿÿÿÿýÿÌZFÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüûûûûûüþÿÿÿÿÿÿÿÿýÿßl!$íÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüûûûûüýþÿÿÿÿÿÿÿþÿÿÿÿÿþÿì~) Ïÿûÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüûûûûûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿð‰/ªÿøÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüûûûüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿè…/ÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüüûûûüýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿüÇp#Xÿúÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüûûüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿüôä‹E3ùÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüûûûüüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþùðå×Ƕ¢ŠjAàÿüÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýüûûüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿüõëßÐÀ­›ˆvdTD3 ½ÿùÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüüüüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþùñæØÈ·¥’m\L=1% •ÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüüüüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿüõëàÐÀ®›‰veTE6*  lÿøÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüüûüüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþùñæØÈ·¥’€m\L>1$ DÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüüüüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿüõìßÑÀ®œ‰weUE7+  $ìÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüüüüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþùñæÙɸ¥“€n]M>1%  ÎÿûÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿþýýüüüýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýöìàÑÁ¯œ‰wfUF7+  ©ÿøÿþÿÿþÿÿÿÿÿÿþýýýüüýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþúòçÙɸ¦“n]M>1% €ÿøÿþÿÿþýþýýüüýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýöíàÒÁ¯ŠxfUF8+  VÿúÿþÿÿÿüýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿúòçÙʸ¦”o^N?1& 3ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿýöíáÒ°ŠxfVF8+! ßÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿúòçÚʹ§”o^N?1& ¼ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿýöíáÒ°‹ygVF8,! ’ÿøÿþÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿúòèÚ˹§”‚o^N?2& `ÿøÿþÿÿÿþþþþÿÿÿÿÿý÷íáÓ±ž‹ygVG8,! #äÿúþýÿÿÿÿÿÿúóèÚ˺§•‚p_O@2' køýÿÿý÷îâÓñžŒzhVG9,! _©À·§•‚p_O@3&  ;SYSF9,!  ic08î߉PNG  IHDR\r¨f$iCCPICC Profile8…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqxl+@IDATx콜eIY÷nÇÉ9ÇîIa$¸€¸‹$ *¨ÀòD‚¾ò¢¾à_ý(ˆ0Ê‹x•àß@pI‹Ê’óFXv– ³;9§žî¾ïïû«zÎ=÷öíîÛ=3 :·fnŸ:žªzê UO…S«×ëE×u1ÐÅÀ…‰ž ³ÙÝVw1ÐÅè €.t1pc +.àÎï6½‹®èÒ@0ºàîünÓ»è €. t1pc +.àÎï6½‹®èÒ@0ºàîünÓ»è €. t1pc +.àÎï6½‹®èÒ@0ºàîünÓ»è €. t1pc +.àÎï6½‹®èÒ@0ºàîünÓ»è €. t1pc ïn{·é] œ LwÍ^­V;/åÎhmºÊÎh7OZyg&ŒMÞ™¤?_øì €ó…Ù.Üÿ6het6óŽüÈÓš<===E__ߤùh¤uÀñnyßÕhÇ´í*LºÑÑÑb||ÜŒsÃØ½½½‘¼:Îoºz›¼###E¿ï“ ”v¾ž]p¾0Û…û]N™&f‡QùÁ¼™iKF?uêTýž{î)øÝzë­ÅÑ£Gí_°`A±xñâÚ¦M›êëÖ­+.»ì²bùòåÀ(…È´®x 1Þ-ïÇ@§ŒNº`ôÐÊht4»\Éè¼ìÝ»·~çwšÁ¿üå/_ýêW‹]»v ëÙ·o_¯„¼Å*ÚT¿1ýj‚Wª?ûÙÏ®¿èE/*6nÜXœ9sÆ%ÊTºÌuÀ†ênAç0P«ËZº5¸Ô¾hw\ ß«ZxŠ7£ß~ûí0wñùϾ¸ù曋={öôÜ{ï½½ÒúŒùc9`0;¿p5ÍûçÍ›7(ÛÀi1û˜„ ×( þÛ¿ýÛÅ‹_üâ:S‚ïÄH +¢›ºÏÿRheöÉtåÐì8ÒÅÜ›WêiŽ9R¿ãŽ;Šo|ãþ}ñ‹_,î¾ûn4{ïþýû{•†¡y`t4úý,u¶˜3gÞÜ¥K–¬\¸hѪ… ,š¿`þ"MŽÜõí»îÚ·ß. ‚9ÔGÏ“ H¶Œ# Æ^÷º×Õ_ýêW§OŸ.Ðé@W¨»î»2;Ú<†ð0z0{%³‹)ëbèfG›ßrË-Å×¾ö5´zí®»îê«hu3»ò¨0¼]OoOÏÒ%K—.\¸pýú ë·nÞ²MCùË6lØpñš5kÖ+|io_ßœÞޞޱѱÑ#‡Ü/aò‰¿}Ç;þâî»ïºW`Lu=*`#œ9qâÄØßøÆúË^ö²\t@îÔîã;NtÁèøaðÖ¹z„ßÿýuýl”»é¦›ÌðhxÍÓ{ŽFgÂ&ѯœKÌ;wÎÒ¥KW-Y²dhë–­;6mÞ!F~ÃËW,_;ÞüEb躺Æ0žŸê¦âë0y]õ’¸èÁØ#á²óÈÝwß}w(ø¨F‡ô<©t#+V¬ûÔ§>Uß¾}»G# @F] Þîº0g«ËZº5ØÌÀðœ<ü`ŒÊ:z0.†4ß1ÄaC³Ãè;wî¬:t¨WÃ{=˜Foš«‹I{Ť‹Åìë¤Å·oݺu‡¬ö—¬_¿þ2½¯UÔªþ™þ•ql´9mf¯«npû8õ æû}úõD{¨3þcÇŽXµjÕ¼OúÓ_ÐpÿwÔŽýÊ{¯êqHÃþþ<ýéO¯¿ÿý﯇Qp2ÎC@Wœ¤vA60T]0F5 ?éÐê0;ŽtÁì¼:P¤-ÑÞuææå¾ð…/£óÞ#Fë…aŽÂƒÑ“µOsäÐêË–-Û,·}xxø"iôËõÛ"ÃÜÚùóç/¦lÊ‚³fG£«ƒË)‰Lúª'?ê?¥±Ÿ'Nñu ­ÚÉ“'ÏhI°ÿÕ¿úê¿üÂç¿ð…ݯ6ߥ$‡e<©çØÇ>ö±ñÇ<æ1ØÊ@÷,=Ôuçí˜æhu0ŒÎ/Ã\þ•Ðêhq ™ëÌÓ?÷¹Ïßþö·Ñê,¿õ‰yúTfXàë‚Å\!¼\ŠV_´h‘–ß×m“Vß.&¿TšýÒÕ«W¯×°~Ï<@]2£×æ±–¸MéÉ{X¿Ó*fD¶‡ñ÷¼ç=5 ¦À:ï®+Î;ŠÿûA·:ˆ?3@„ñã'^„î!|0{„Ë(Wg©MŒ]ÿú׿^`g8/Mߣ5÷ÉæêÉ´¯¥ÔÅÐëôÛ$¾chhf°˜=´ú’ªVÇâ~üØñ±#ãGNSaê•y½OCò~Õµ?ÚKÉʆç¶êQátµq‘Fð{(÷’K.Ù¬ún“ÿ¸âö©œ£fŒF¯»î:V# 6á:ït³ýÓ³ÅÜ’/˜€æ1ƳŠ˜<<0LÎ|áo¤E«3t×z!£\FG»KË×ôë•Eš,µºü,µUµzMVvæê[57ߺeË–‹Ää¯]»v£þ 1ð åQŸ­sukuMé{jSju਽8{ù3NÀZ^õ]ÈtCïn…-óïÕï¨ü§¿ùÍoŽ 'õ«®ºê™tÀlzó¿až*£Ó¼Lðå³Úd«çë‘&˜)q5†Òu†ìÒâuæê昻ë[ßêÑR\Ÿ4`u®Îäf?0Ðêbè5ÌÕÑèÃCÃ;´ìv9Ko«V®Z«%´%0š¹ºµúñãc‚ÀW½Â3UïÍZÝ IO{ósVZ=êØé3„"BI¬^-°Dõ[,óôP[ØX4ú™Ï|¦@!z>]WœOì~—ÂnÇìÁÌÕ*à 0;OŒ.^š ÕI£5uöÁ×ÅÜÅg?ûÙ‚á¼´|MóõÞ £# `8†î¥VWÙÌÕ‰1¶J‹oÉsõK¤)/×;sõµ0°òTµz!ë>sõÐê¶À3WW2çhgüÔ† Œ<•Ý$´;_Ž¢¨x”X¦r`þ…úÍÕo@qŒ|z4"¢®Ø4ô8¿®+Î/~¿£Ð!¶VQµ#,˜8†ðÄK™P1ZÉyµˆpYÙëtA«£ÑÙ‹V×ð½g÷îÝ}b40(7´z9W¼A,ðúm’~‡¹úƒ´‘f›ÖÂ×hî» !CÝóð½8ž´zÌÕKÃ\hõh'‚ŠŸÞˆç¶êñpS+²[Þ©õ Žj/Ì¿H~&ûóõ~¹ñÆÝvð€;ŸUï £ø¿þŸ Í»1M+áâƒÙ#=iÚÍÕ¥µëZnóiñ:këì–“ר/A`M›1õjuæê‹¤½·h®¾e‹ sµ®Ž~íšu›–.]²rpîàÕ²ªÕ«x›hzÑꪧ¹zǶÈU™Ý‚GiCåê}çT‰z«=5¦+ëÖ­×£¹‹4äGû{ lá Žõ«sPˆ62b8_®+ÎfÏÜ`Ü´Ï'_¸¾‹¡J!Ýê"8Œq^vûÊW¾Â<+¼µºÒôêG~dø^jõ9ƒs-^´rÉâ%›µSnÛÐл崮¾qÛªU+×/X0ioo_Q×(üÌhZW?qòÄø±ãGOk [¯iÛŒêffÏZÝxꆃ ä¯2:Áj²›Q¶…ÀÒE•Zq?YHOhdS_±bù€ö,Ò´i®Â機ôJ×Xý`›2aÍ(Œ¼–3Yùí» V¾K‚À¢:@;"€AZµ:Cøü+‡ï ©Ñæ"°:LÎ;Z‚Ó¯­.ø=*¦‚áš,ðz¯i®¾P“õÍ«V¯’~ëv)ZýòµkÖ®×°~í  wâçbL{fFFÌìÒꇴ[®Ðººí0{Ÿ½§V ¦ÉZ]’hll£Ó~Õë;Æè”}Õàšüwâ€@££Ù7K Î\€`ô)¾‡‚VŠÇ=îq~Àžmš®˜-æÎa¾ ®Y%²ã™ÄZ?é (~h ¹’ÙÑêag© ‚b/¼ÖÔ{8Ù&aЧü± ¶VºˆA˜«/Y²x£|ûÐÐðvYß/Û°~ÃE+W®\­¹ú ídѾ3£¶ÀK«;qLZ]Œ.µÎ^uÓ~°OBA÷`!UôO#&­®vÀÝÔGC¾S.ÚÕˆg0;ñüYÑâÁ§ŽôäG8k sl(sÆ*Àý0tz ;x(…¡üçÅuÀyAëä@ƒÀ"Á¯Õ…V"#M»¹:ÃIi‘BMŠÛn»ÍËm0> ¯Óm}ZWçÜiP(ÅÐÍŽÝL§­¯ ¥Ù7i¯ú–¡á¡›6nºhýziõµk6éÐÛê9ƒƒsÑê£"ø3Eð;tøðqò8¬+.—aNçßúú{¥Ö“^ß¿q1 Äœ›)Ù ¯ZD£JWñ–aç×}ÕàŒNÉă~јŸ¦*fbÂ5︢Ž«UŽEÊ8_a0?{0¢2á¯qÉ®Zœã?]pŽàè誫Y5œth~øƒaöê\”„­ñâ±¶¸+ÓM㉾ȵ0,ðŽ>ˆ_¤%­Î4 †ç>Àf¢½…64{öî©ï¾·¦P{Šýû°]×ÇÙ^ðòW¼¬>´yˆ]~¥ ˆòªOêD™*«¦Ã…VG´ô¹P«-2½ÌÕ–†Ñv€šú¿ÆÞŠ+®¸Â4C½ÈíªÂ=WÌ{A0‘%:#žN:ˆŽ÷Ð$1W´\N¡Îöºú—¾ô%†ñ^z“–ï9°ÿ@»¹:Ã÷ÓQÁí_´hñ2ÝD³Q^4Wºhíúu—®_·î’+Wh®¾p¹(Ê0j üiõSãZ[AÕ3´ïµé©··_c´üʵƒ‡'¤ñ•Æö’ÈG9ìèã˜ñ®{wmÛºÍý lLµ^”ŽºW}1®%Ò>VTŽVz掎ŽcÈa.Õƒ0a*‡€Ž€{>Üùz>jú䣪Žmש¡Õ«Þn®N'²y†ùº¬ïu6ÐÀøyÇ\ŸŽŠråTÌÕ)‹sæÕ¹zÁ\]n£´ÆðÐÐÐU¿XLÏyõÍ"&kuæ×ÔÅZ]ìÈaYàõ*«œ´:§ÛÄî}½=ýµþ˜ÙÍ4ï‰ÙG5W—’Ò¿ÔVÅ»Õn¼ý ”8c0´²dÆæ|“}ó>~‡RqW˜ž)a#ŽÂ[…@ôEàßÕq)ñ´WÓÂ4ÌÕaZ˜Ž4l£K«¨k_ìÙ½íŽV¯qçÔ©“5à€GÌxmmKvaQ#9pÌ“ B ú5Z3ÑG:êBÀä\€„þ…y/€rp 1[ÓF«ÚSŸúTÞéÜ„t€ðH§„‹NŒg„󤳃Ȉ§#!²V­.B²Vg¹e6¬ð~ÑŽ/àœ_ð†´3"|ït£ÁìÓšúrÍÉ7jØÎuSÛ×­]{™~‡˜_ëê V*‰5õa¨zúô©qi1ÁH&FWõzû°À ¾ÆµŠa²™Ea©Ç̨j‹ÚC“Ìåzsí´B¯§¹Tù z͵N«0k5R)s.eOò#5º-Œ”‡Œ†M\ÞÔZJÓ09 …G_8qÒw°¡iÏžÝEŬÒêÇO¯ˆé{aÊý(Õ[Óù32$Áè' ðp”eò¤ÿ{\ñc x„Oåˆ'uݲeKl;0܈0Noª²¦‹»`ouØxFˆæ%+q±\â¨7Œ^«‡ÔI¥=|‡Ù¹÷¹:ÃikõœŸ~Ôí>H«S<£1»7* ¿á(/~!Xè÷p”-¤3zè9qò¤Wiªñ‘®õ™iÇ# uÀ<ÁbˆÁÏ‚ôì]¹á´ç~³ïÜýùo)Z;!:±m¤£Cº²ƒÈô y8´k¥6†ïÒäÞÏn9öÀëÃ÷£—Z½¿¿¯oÁÂEË`öµkÖlÛ$­¾fÝÚËÖ­]w wË¡ÕûûúÙ„£úH«c?yzüäñ“#b"F Þ-Ç|¾ßZ½°ÕÐä¨?X®Uh¦NR›`xЊôĪ˜”™Á5cuCsZ™¡ÉßÈ­ÐG*G5ÞT‰•ßð )ÊzI YÇ%mmM+A5&€0!ý%‘×ýlð¢©RqðÀ3ûiö}bøÌì5 \æÀ¡…v¿„¶v –Z]µ ¡Âµ^*0·Á-OåJ£Ué¨ê§.àd\å¨?,d4­×T¬wDS ègBzg"›0èúõº®6¬çÊð…jW€~Ñ£•†IMv€ºÎL˜CePçäñ_^´"z2f‡ÑÑ¡ ÀsõÌð‰†6A™Ù5óÁ†bì–C«KÓ°ÔZêoµÀ3WŸ/†^·léÒaíß.­~±¬ï—¯Zm­¾NCÕyÔ“:Å<òè‘£iίšH£K§c Â&W“aH™™¤§D¸£¼Â)ü×ÏŒD”œG‹kæÑf&UÒ¤‹S‹§odrQÔA.ùñå÷œ–|xÍQĺn •F÷?%§¯°š×µÐP÷Õø)Y²4ãÃXì58.­~P†¹ý1„ß»Æ/ŽJ«‹a|¨Æð`ľtÿsþT$Ü­Õeüt娠P•êcG­4Ôún€-€Á‚IŸêÍTCuß°~=ÖY·¾mÛ‚|ì²ê{m ^9¨ãÎ óŽ@Fœ dK0ŠÅû;()F>ä nK;zý/#ÚuJYkKACx^¿¦ÝrX{¥É=WÇÏn9¬¿bö8Ù–Ô”úMåqåT©Õ%<ú´fé‚ùó7¬^³vû¦Mw¬Y½úÒ5k×]¤½ÞhõÕ01õC{±®~zdd\ÄË®;÷ fëlí³¤þ¡Ò^ o0zâMœ§Êà‹]»~1•§è„(>½7GÄ(€`E›mƒYÉ$Å`èô¼»’*™ôNò2ñÄèÉŠ‚âI?>Š¥A/ò“/æÚ}}¼¤gŠrRCt–ÚØ/Ãܾbï¾=êƒýÅáC‡jZ­¦<í2Öh\Zþ¥¯©+?„;ïá¨Uòä"W8ÒºN®g¤žé“2•GÂWeöŠŽ°dØSâ|Ú"eSÏ[‚ãLÀ\€rs±¨+Ú,ûØÇº­SC]ìw¥HÔhPêÈJæ¨*D:ˆƒ¯üÁ‘NÃwÖÕu)ÅMõoL×Cƒ\i”^ýÈÃw²LÐê"¸ù‹.Ú¼xÉâ!màØ!ëûÝ+§¹úš!­·¯–V_¨òÕµõÚ™6Ñœa#‡FµõÓ¡´´‡ðbVݴg"T.¯ú”âÄ$¬¤f?Ò’Í„—^Œ©Q/ w‰ð‚gˆŒzËÌ›cÈKZ×èax”E^âP`\Þ© Â-;ªkóSy‚-¦€ÀûuÝ‹ eâ¬Õck¹m¿]Ãw~ûC«Ÿ:UÓ—2¨°‡îô#sìùÒ|F†ë™©ýus}T§Ì7ª­L¨Š¿p­mV€™0AvO{k5j4¢» <¨Hõ¢òPÚ¸uëÖ…yKpÙlÅ¡¥áÚóŸÿüóv7ÀwT´ctpæÎ® tUf'ÞÚ@ÈkµÀ‹élתÎоsçNßBÚ­ B0:È5ýê‰Õ§ÔêêÞ… .•~ƒ†ìÛ´~‡æv\"yÉŠåË×kp¿¦óÇd˜Kø‘úÉSš««šŒÙU7iu­«÷÷k[,‚%q-í`®Ù$:LŒD]r›•ÿ)½ÂMc<Ø$Îiã5O D!ž%$¸‰ÅBa†çBÍáxÒ8‘=0Ú‡xùg?uw?¤'óv]bMÃ`4³¦Sêòèú\–Ó4,>T? ‹ûÞýbt-¹Áô‡®Ù¯!>}£3a®¬ø<í$TÄON3Žp”6Cþ1æïrÐ@+ ©ŠjM8%" Éµ¾7ENùbPBš!èOª ª‡6isÏ)Ý<±NSuh•dž@µ;€·Ëo…~q”u>Ü&Z;еkDÑ:W·&’…è õÐêÌÍe-­s CÖ×{¥!âÆXS»ÊB3ô.ͼÒêó,˜¯{ä– ±Ô¶fÍê‹W¯^{™Ž°ih¿Vø…Ìa©;ß‘£GE}žøzhx×W“V7óBs íH¤’Âi/=É#zSJ’´zÒ$˜×‰‚ÈLnIƒ_¤'@ØÈfK¾KHáåðžÌ˜ HÁ0/iÙÛ®8d˜02ugÔ™á³B ¶ë@=Ь|ž§«µò3ÜÕPIÃXHk: kø>mMšÝsuå$e²H·ÿ MÖx<5=2=ƒ+¦ ßÀäËÀÀèÕW~KÐq%y]F^¦І§š“•CÝ~ДhÃ@ «¨ð&ËÆÞ\œû˾sóç¼€ÖŽ¡Òí*ŒÓã‚@Zçê Vsr/µq1Åm·}£¸ñƯkmý]N±+Œr–˜ÃQt)µºàöj®µ ÃÜŠ•+·mÒé¶•«Vi®¾æÒåË–éxÏÕ=€Èò™õqò\ý5_ðQu&Zêëojƒ½ÜVDVTT™))½ê¯ –‡1Ù) pÂ1¥e—¢ô’=z'¹–û*¹ZN#a ‘Œ-ðJ DŸè‘Fg© ¦gÈV?­¹úCû‹ºëo¿æè{4WçyèÐaí?ÆhÈDa3ª¤Õçš©'=¬ð FV‰.ÔG¦Oûsm]õÈljCò6œZVý›p‘r·Ò`5ÝÌüIh–\ß’YåÔPPA ½1 4ÀÁd޶R?Q”WV¯^3¨ý d{âh° ÂdÛ£b|®¬þà?Øö Ê"¯ûo²f~V ÉQ©xF=HcÁ(Qy˜\ ,µzÀ’Ä3³ã›ß¨ùK_öN9-½1Wì•¡ˆM0jÐ=ê I«k.>WCø ZCß¼VƸuë×îÐ)·ËW­\½e‘çê‹Ð,aö\ýر4W0:ŽUu4»,¼2»Ò Š“Gí`دWô§þ0á“Ïô«—œŒt¡aÉKéÔ8€Ã#ys¼“‚$vöEŽüÔÃåXΡúc#Ÿ˜Ê$¨¶¦ê$m›ûÀéU€ši­a±ôFZp¢åÇúî=‡köÉ0Çr›†ï´®ÎRÛ©“§jÖÖJË2[ŒÐ´ô‘êlT%ÍŽ‘OŸêG›ó¡’ëY *£8Õ7UЂgLV|7‘¤m­GlÆß”¸MÂY%Ô&ü¶f§-àš‘ðëÑêÑèE]d_ØÁ844´¨²%Øvˆ|å OxÂäÀÎ"fJfSgVqt ÀQW~’+Ò’Ž-±2Êq¸Ásu.•Ì;èzµÌÃùñ8Ù]‡V¥\ò£Õ¾k?¤SÛµÔvѪU«/_¹jå°¬A& ¼Œ°gT'¬ðÇt‘¤÷4tÁ^94:Ãx,ðâŸ`F3Õ¤(ªoÒMí JK>Þì噉ͩH±‘€w¥'-aMÁ ²t zɉ(*ÁöŒ"WÊ€œx!ËHfŒצڻÖÚê¯~Hwò«Ýd–¦Õ&šãêûìg©“µk­‚”]ÃëêîOàcãLý( ¼Ž£R^”…ñÏZ=÷{ÂR®“Ò•xp©ùäêEXÆE¼R&.ý¥)j“„IZB,S5<‹Äª2ã>аY=3`•ÑRë Т,žW6$‰'¸Ž¼ã-ÁgCCCEªü,ôtçé$(•jB¡Þωk+¢aÕ΄Ùùá2“[«K³—ëê\$ÉZ:s†íxÁ0ÇŽ&1|¯†;U­NÙ§³¶n¸ð¨†‘Kd˜Û¡SRÛ`vÝ>s‰†ð—-[ª¹ú‚ùkT¶ëŒàa¨ªµõú©ÓZWWo1—ÔØŸ.§€QI#­- .­.-Î}¯‡ïtæã±¶¤Ml”¢…Ê6*‘ˆæ=#áB]]_yôùzQ¿Ò)|Jç覆MžÈIýƒÎ&…EbÐèŒáÑ{ H‘“fž:  ©æXðBÁ£¶÷H¡ÕcÃÎtrxK°îOd%€»bGà€hœénFÆœ5pÀ,û‰—³t@•؃é¾C$ú¹ŸWcÍìhu®1æ(+yizÏÕU/W^OpŠVg|X^¢%Ÿ¹2Á¯×mð›e‘~ÍEÊ_¶bÕÊí‹.d]}1ĆÆA{aâSN"M DLÓ%3PëÉOaê<þy®.¢ è—¿¦cÔŒ?¯˜ võ`îL¸j/ R¸IW¯Nã8er"%!ÃðËñRæóÂØ”F”å$yˆŸ=¥pšû²[@Œ`ôËŒª™Ô2µA«ŸÔÆ™½u¶ÇîÓ 4‡r^ý¨O¶1"n0:O´:H0®TOʻۮ8Ê$ B"ðáBóãÏ­ÈJK›&uŠÇ•iìiÎÃjížÎ%Ì’*|<ÃUý6ƒ§û­óôGíäŠ-Áuíúô©Cpmœ¶ù„_ß¼~ýº9,J©?%júÕË-ÁR¢6nÙ²ÅýÜsåš•¥bhVü’dhS uæ!7Üpƒ/¨€áÑêbøÐêQ#d;ĬÊöˆàë äõbp>ü€V¿t%sõ¥K7H«¯–!I×ЈiEˆI«ÖO–%ß{à1Ná´°Î\=®œRGë?óOóy©ÙM¸™Î :"½ ^öÊ“ý0¥ýD꙽<ñ*×Kb"&uOQªÕh&|çï8Ç…l =:˜¹º™]“uª°ß@Kmu펓1f×^ ﹺN¶1í‘ÉŸ s‚¡m±sæjD™}j­.¡„Iú˜RP/FQn(þ¨$ /_Ÿü¨¤<Õgno ¢)‚(iý¨S5+þ¦âyQˆTÊJØì]‘ Î 8E°°oï¾1m3~Á§û$·¿6í þÒ*·/Ôj×õ¿o V¼·3]ã€YU·JG­°;}/@„ÐÐöz¯‰éëï}ï{‹üã åûElÕ‹$ÕXà«sõ9óç/ÐÇæq9…†î0ûƒÔ¸-‹-Ö±ƒ| ÉóV–ÚÐìhuÍõNC">ýgª®!|MëPGý¼‡œÅoú]¿ž¤Jå6¬J‰<›gRÛFFÁQ_ƒ<“é 'Vô/BƒäËéí!"w(pR$Ïp®K&[,BàŠ‘›Ù0j¶™ôiom!dj“‹®áòÅ=„OŒÎVÙ£GHãË $yô—´GY/ ´aŽå=¯ÁS·ÆÐ7_ب8ð¥Wלd׆xËØW¦<Õ§Ò4ǧ7ÿU›|hÏT®ìÕ|üÓß©òN'<™˜2´)ÓNi&WOµƒkÔÍÔÐÜtŽ4ôSg­ósKð"€x¤zK°G(Ý+¯¼Òe:¸3‰·H R³–aþÂZûÞð†ú>ðr"µºž¾HR”V_°xþüyÛ–.[¶U·ÏÀèë`ÃåË—/Ón9iu6| ± ÅÑêºc®~úÈi¦¶¸ ¬®dÓÊèN5ÎX+áF+C¢3P¬T™žz”–ääÃþ$ÎMi"ÞÉÉá^Žƒ6æß„‘(=(¤Ú¡ 2yƯ¤8ЛQI]†ühUš™ s¬«ëÛó*­±G)9œ†ð6Ê1Wg]ý8„QK+¬«+¿ˆ…þa¾Õ£^¡A Ke½TqáÙøk¥G¥j¸„Ùô^ñV¤r† 3WÒE’¦'Õqᨗ\"Ϙ@'Cþ”K¸ po8zD÷8`†R’él 4 MïÞ³›CJи xM8lNî7·Iƒߪ-ÁRºsFcŒ-Á5 Pwî*ëÒ¥DZ™ÿïxGñÒ—¾”]M®}ìµ MhüƒuÅÔ%ÌÕÅì^¾|Å6}ÎmÎTK«ëfD4œ:tD¿°ÀÓ8~B ƒøÞ~ âƒ(èˆÒC¤JÃH/Ç{x çÎGëãüH0Ò»ŒžŒ#âKt¥<Οàçì)IÁˆ! JfÒ+h/Ì8`ΤÕ@Nµ5ku†áøŒæLúÑc¼ÜÆÐŸîËG«³[N{àybkÉZ½í\á˜-ðºS~2 w-u§f©™òáH—|éUï)˜˜11MN¢GK\ÎÑô >Í~KaŒˆ0.6¦!MIý=ÂKª|jC£! ßÄÜÓ…8¯þœ Œ(#ø:F›³åY¦êø«J#Ò·>sÒó–`Ý Xg%!Òj×qôséÒÛ`Á1Ê·¼å-ÅK^òϸ¥eNkóÁc/ÚqÑ3U±ï×—_.Ñ<©d­>ª“mòÔOŸ>LOŽ1|×°ÇT]ZÝóu#™¥*JÇó0¥V _I/´îTt¾‡N›»GÊë4¶‹0½"+L‘ü7̬ŒôpDa¤#>=É¡ó&§¼tpÔX =æÔVKov2…Òf„{|bôƒÖêªÄû+Ì‹V—L,ù>†?’•¦!Œ€(ËCýÜ.¦ ”™ê— õSÕ–«)?!rJ˜kŸÞ Šö8„öå(yÂK`é'Z/­ï9WûG 4G·Àã„ãtCþ(1ÚæÍN—ÛÖ¾äCÕ×̹€F¡àUS®ºøƒ;{Žj窶’›?Äfî©*§4êZõâ `¶Ãüüú%ìáø«il¯ÖÑaÓFs_*Å,] ó¿óï„ùeië­oܰqÑ5×<ó׬[ý\èIÚ‹ó×ãºIÒÛk!vN¬«âj3;|jý`Z…pµFÙÄ r4¡Õ¨ðTã’©š –‰øR~‡%ˆò*Œ4<ìÛVñ—”¨,ËäÍÿÔžp0±Ž :ŠâÔÐ4ß–vF«“ -,¼H£”Õ]†9¬ðZ_g®~ŒÝrÂvÒÒÁh~2†º~.Oexä„‹Š\ÂÃöT§ôÞ¨íç?ŽöÚ ^’ÿLx'¼’¢_ú£’ÄʸÈÞRŽå?Õ´eP3@öÄÁžjÖvþèËÔF¿¥þm—xº°Lù›ë3]¶™Ä£õé uo ^¶|¹…=}?™3ŠÐD:Ht:ß¼R·ïµ@‚€¥@©ÓÞžlt¯# =¦ ÐsÐÉdeL®;ã¼)ä7~ã7ÀNMCüù/ø^ðÿkhÿYœOK¡‹ß5kÅß'k•ÐsೋcŒWÈÝ•þò¦ðœ´Lo)ˆLÿDÂH[Å)K± >ýR™(0væX´Q¿„`b¢Œ¬\&É­Õ>5-«5EïaO¦ 4² Z9zì8ZÝŒ³Ãè:Öšî–“Ãwäb\N|Ñy´€šR S¦‹VêѷȪ\ú݆”¶ #u%¼à†+Õ‰S\ò¶ICõlDµõ•0s¬Ó72E»£¶r ðãþ4m€ùä¾™ù3éÌ3N“ƒºÑ—(ŽšVÉOëö`.”Ñ·J¥ÝMýT n²“å[‚—…ð™%ëõr/‚¿xùå—— fÖ^ |µ¿ù›¿©ïܹ“凓Ozâÿ‡†ÿ‘Åÿˆæ ‹æÓBw^ð^ô--×?þ4:.ÕÅIá2âôƒ‹#ËïÕŸôßiœ$eÍF‘dÓ¿Hž2ºÀœ¼—€”wr6òJ««`BK%Ez®.fW›ý£$Ž™b‘=t81·¯ž£c×-4^s>Tš¤¶Öâ‘ø ãYj‹2éP~”³§jä:åºQ¹NAé®q~K*Ñ”þh›’”a-þÊ7 õ26J«úIZ}ô¢Ý³š¾5¿ÞÁÃôCþèYep·ƒÃv…Í$Œ^ŠÆŸ5°¶—u4Eä$:Æ;›-Áà ãîÐÐP܆@¦éžèx»o n[™YòAÈ:†?¹3Òþ‹4ߦŒxTf>;Æ„C¶Î¸_ðš„À'fx_ðHŸÉŸþ—„ rʃËñѳîÁuD%Þ!.Eœ‡üTºÓ EÄ(N`P-ù©ˆ$‰L6ì¶ K#£IO V&ص¥ã½Âsî™c¬òHÛ˜«Ó¦>ÝVÑê„»,5Ô<Á$lâÆ©"•‡+¨´áÈÓäôZaÑŒG¥¾RN#G»üMÊ|U­~àüV?ï­Î•Œ–¥Èj9 A†lÍÝüî5Z¨CÜ%Øœ¦ó7 Ñ„¬i³ó¬¥Lð]S×9h=´¹Kw3ÚL^úqxx˜s¿Ž-Áå5á\!®]ŸÎÎúañ?#?¬aë¦ ©EêÀ¯«ÉêïÄ‚˜Íôˆ—æ§ÿé$u`ÊË‹â”Óá™jóƒF§xg·7  Gœ šùyæŒJi-+[ûàIIŒwËeކv5µ yêô)ŒpÒìÜŸ˜ý0øcG½®~ftDIc®ÎŽÇ4Ww…rY.ÏZáœ@§?(`J¹S%rµSÞF}SÕ‘jåhJmvÕ6RPÄGx<«_B©†¥B Š.¡åúG¦j…5•iªÏ–ôÕzR¸Bë[WóMâ2põxiÂá$™ÚgBH8›-v€+aªxl…ÀÜ\†ß]zâ%Û’Æ+ Z½¤Î=ÊÖ&¢Ö[‚1²£¤Æ9*£VÜ´ýäTSÿécyAÏ8ÓòË–¹‡Æ®5-šË“D¦Ùjujxn>¹–P‚‰rœ+é49õ±7!Ñ9…€<¶ UúÌ™œBŠ94Ù=of.dƒ æP o,:~¢~Lf¶—Ì®¹»¾îbC D<ôÇ‚¯ãƒƒér WºègNã:1r ^¶é´0aWibÙ9•´e‰+á)3AŽ£³?ÒÅÓy•6ʌ̟j(My[Ò4ÅM·¥Œê+íh¸´±"í„ðéÜèw£®‚¿ÌøT•çlMR¦ÀR_ÓyKú:Åö£ ^kºùh|Ýúu½÷ µÉðá|¢3¥ñÝZ ”"^ ]…åJ€hÑ@¶ yô9•±¥z“¾öýçþg©£²§Å ÷ë#“('DÖ4Ô§á0YÒäÊ"¿ BÚ3ò¸d S~!ÅH3Á"=åüG==ÐÈý|–ÀÆóé6âYúÂ0g†e]]™ab{PàH†9ÍÓ¥ÙÙ+ä£ñ½{ ¤ƒ$†ï ÿ™cÅ8âüSýFÇ´?I…òä×@pª0õ±£¾ÙyrLzDBà¢? ¶vSêTvUÓ–ù¹¸V”QI“ H©áêšó8<çiGÜ®ZÌ\Ùj˜ ã>¿i‡üÂ;Ø0MT„|†x–Áδt–€Úf‡>§‚’è(ô‰tÎgŒoÚ¼Év#U(žv€ƒN5íÔ-Á+tKðò…RÊM[‚÷c_2ž­ø„Ï ýÚ®IÂ<Phë;©¯ŒŒž9©yKÌ „ˆÊ9™^Hè0{`"@Þ0” Büw"â«?Aˆh~ò¥M4Ú.—Ò(ÞËmÒÊ:ãc?møJ­¾;/­~Œnft1;²´e”,jiIÀ“VQAZhêBÝ(£œ~ Ìÿ$\ì—PPn‹«“^ÚÎyiN50"+á9€Ë”ò”þÈ2!>¥(áWã•§ /ó³ 5Þh[$rÆ”®N°‡äža7„^kÞæ÷xp¦ÞØ©õ,Ë7áT"ÎÆ EÉéës6 Úäí¤¦e¿¨² ù–à2¬ ÌjøCÁ!.\TÓgÙµ%ø.n*·‹®Ù^ûÊW¾R<ò‘´@©Â˜­¿ ä˜Ø÷ë¨èá“'ŽÑT`‰Öò1ñéCI`¢D\%B*{•Ø&½ó$¦òõÖŠ–u¸49„Æ=ðhfòfD;…êÆØÃ²ÇÚ:Z]ëê\]C€,­IjÍ5Yï¥Õm¤†ŠCÒÆ:;PåT;¥ê§náªááws2GEX¤OÏÃE|<‰¯ú¾R·ôžkJ¡Q÷¦x¿¤?­0ã=W3¸ñ×o |FBÆ!Ó \’©OC[¹’©>N¡?Þå÷Æíê›ÌÖê¨&Íì:Y–…Ó.;# ØçÖ•ð§åò„ÖöHS ð$ßK#[ìOÃÃ[ØÌ·#Êi€êaÖÑ1{Zª×(±ÐS$é{ÜãWûÔ§>5¦ýód(ÓÔùð®µëÖm:sê;ôM*U¢wB±®N.A~.×Hx†ûbtðrŒ.ÄÐEh jÑÚú>YÝý¡Fi÷ÃŒâØ ï=âÚ‡`£œ×ç´ßHÿ¨QüØX–ÃÁñ#,˜"âã™Ù,^Ëg¤Otž›‰žD_fHf’jžjºªßù¨c @¾ô¿»?y™ •ôQWÃÌ¥¨Ó<2Âf¢>€Y¹à¾}v'2Ÿì[àPi¿%dƒJð2ÔŽ†ü¤e4È7~:ó?´!êáÜç p®Š«[J®ê§ ô3SX´9Š•%e ÓÌš@@ºn’¾/!0¶³û mËŸ–“2Î…ëÓœ#Rø)Y0o“%òQj-q‡%DSÁ&”ëF$4‡ë%¼Ð`4 ÃmôòRð¹å¤Õ1?’Vçd[BPšçsŒ5Ý-Ÿª iÒ™zW× ©^­m„‘»êOЭhŽW% 'že†ä)aQYœ%>ªþÛ»ÌK¶œ?žNÞ&¿–õ$MÛ\ns ‘|óhx1;u!j±mëêbxËph ¸øèG?ZH!leM ¬QHn¡û»I'Vþ OéÌsèÎ1¸‰5›EuÁTš´‡Äê«ÍÆ9£„êTŽ4,O«ÐþM[‚Õopçö.àâšèe*à“ÄõqÙ .WmlÏÞ½ßhYYM²6¥2ÑUÛ"Iéé"´ž^×õÐfr**#æê't¾__wcV!Q&­žöÁëBJYMq¡qx†!)·ˆYn²F7…»$sД i˜‚Ÿˆ›²ÊRJÜFt ×ñ.ªÌ\‹ä<£‡•UÊ,ÃHÜ”ÚYZÃÊz5¥mÔ!eJµÇ£X¿aC¡ïê¹¾Xºt™û#*WYÝþÍÛ‹ÿøÿ`I¸X,âÔQ° §ôG”…¡ ¡=KZmPVIeº|SÆ P²Gµoã”y;Ž„–;NÜ”î? ãYY/Œ!X¥›è·)“^À-t/XÞ¬Ãv ´%x®èÞ_ RhðÖÃÅ \^çöa„yŒÖ¢ZaO÷ÞwÉ%—ºL“!‹­q÷íÚu;sˆZÙê#sHÇhd§ f8©³þ¾ ìÃþ0šÃ×Á´huU²æ/ªò€`œ4{Ë • dvàgVÊ%º¼ðWŸUP9)Ì^ÞR`5‹ýex%m#_ªok¦ yÚæ­äjßÔ¶J9Õ´%ˆJ|›X‡Œ«œÜ‚{˜÷¹Ïý™BŸW§‹%>}çýýîeä¦_Œ­ÀÓ–o_‰þˆG<¢ø•_yUñÿþæoø’ÂIÃ(,„sYµ&ÆOãþYòQÄê‹ Ë~5üœøseg[gè2¨é› búÙFᯈ£OÊ~k©4i {6-]ºD#óå‹%†ð4@ʲ‡ tG`q饗º/gãút´×Wiy±Þ¯)Àš»Ô5šK¥±…Ô“U9žºX©K¤%ˆÃÇ‚™GúÐQÃøáx†¿Ñ€fB×[#J~e™è€¡“ø'–cÙ \)g5¾ôWa|räJÄ“Jµ-?ç)Óñi•!r5Å—¡9s5O ƒ+KæÍ5ˆ æÚ]ßø‡÷÷ßwŸ?›pç¾þ…úÐÄB]ãÍ-3§¤¡ \´#…Oæ3Å]wßU<ãéÏ(ÞøÆ7Û·o×Èî JcÕiz–ô@mp9 )Ñ _"A9°Ú XF°®ñÌËHÙÉ]í ÕYCâûµ#PФ]ÑÕ0ú €À3¤-Áº<×#¥ó÷õtp2Gž³uœæCš°¼0ªuòAÝ%w¿ö½ï棗H#7œª$›rÜšF‹R b\G†}A%C£Cá8âK­>IÀŒÃjÞ ª9s3ó4Ò”áÔÚ1 ^.H/‘¶©LÕ·‘¢Qf™¶Ò®2¶MžHŸÒ$˜Õ°ª¿%@yš`*Y©Š_a@VŸÆG[h¾O¡!¸xD·˜Áé„Àq­¬p:﮺êªâÉO~²‡”¬3s¿ã Ÿº¡ø©ŸzŽ×±Ù SÆtDg-mqöęؒF V~TÑsnü¡Úf^ßÄ•ü8Âð½g÷n¨ží–`ÕÆrK°üÞÄ÷å÷ý³ÅÇzЃ€Ã§H8ÆzX‡`vê8ãÅ øó$4ÈOGD#U†yÀ‹0FeýŸ7w^1oþqE´dÖO³•É-nÖ š3“î,Vþð7§šöm2AHƒ3ÕGOÓ–`pNXÙÿ“@¦ðë-ÁÚÈöÔê-Á\€¯i€}n¶[ð5œ*ZNëk­·n¯Õžèwæ`cÌéü‡p¨ÿ©Ñ£¾ØB£€º,ý:©ÝOúkôŒ_ ¡·"¨õœ­añOzT}0ÑU§‘ÖMMaeîã5â]éœbbYtÀvmœ6Âã• ü$“§Q&Ëô-íj„Ó?ã…>„R\vé%ÅYòùØÇu×]g¢!yO:Ìþ°‡=¬Ø±c‡ïxdX³á _àc,ö{š å+. |øÃîÏvs¹ LÏ”ŽKFÓ-êX 9ðNÐY;Ñšô¬M ‘í,*œÛ:¿] ô ÌÎ4 #ªV¼ÆÕÞ Ë~nÉL>âqåÑ-ÁóuKð ®cIp`TŒ”ËxùÕYµ¡,àÎÖ•€m²²*ÒÄq@;’’W •‡uª§œþR?â!YÖ:Yó_²xIqçø6(ûÓ5¤Ÿèªl’7ÜœNþf6HáÕ<„Ä{<©VL†V¦«æ©2Z™?2¤„ V¥.eºJX5 0K'?oΓýއÀóøQùIêˆxÍ®,OJÐòø\‚ÂØ+¡9œ7J=ä!)ÿøÇÛâ Cÿðÿpñ¬g=Ëâ«KûtçàuùH¡Í$¶ pêèÑc…¾¹P|úÓŸö­E”‰¶gçío»§X›a~û àºÑ·²Ré¨ü Ÿ@0c‚$/çÊ8p`鉀Ξª–š<­£Ùo¡u=º%xtóæÍE1›j$€úð [‚ó-ÁÇ52÷Ž@ zß̈íN­Ö Ü7Z±!oƒ^¦­b™ÀwÊðSGSȸ€!°Wà[¬Ïpé@í€tGjyB@ àp*±DËSW¤BÌÊך6:TPu“ç‰üñ¬æ‚6*T€K¨ágS¦J*ñUøH9g¥~ÊZHp‚ ŒØUR3œ;¥Í8ìÌKÒ<ÃsùÉŸp¬¿‚…ÐHI9Okú07kÈüX"bÿGôGÅÍ7Ý̾tÝÕ8â!<+6|™—›eôu%Ðb›À18Ä…‚ÕiëÖ-gÄðC?ôÃÅ›Þôçþ®»2µ¡@ÕÊpgñ¡gha<K¯çäoîø³©)ýØ©sŸ ±êמûwßï~ï$?i°á°wF_ÁêY·níbm Ž[‚½À4>Fˆ?ö±uuZ¯véúètˆA›,$¥d&œ ¥à[Ûš}ÿ·1Ápýz®Z±R_ô9mAÀ×y 7ÑdÂC0@hžlæ Iw\stŒyŸü÷/¾þµ¯ëã,wsG½·ZÏ7·àÓÒú`ªí3AˆÞi©J³›Ñó|êH<~aQOˆm–E\{íµÅSžò”â]ïzW¡ÝjÚExÜõQ&ãiv!rBâY™²pÑn’J›2uS$ùr÷7…·yII#1<Ñã•õQæ¡éaÑô)ý¬iÛ}ö~ŽÂJC ú«ÝtÓMAvmjÒyPÚmôЇ>´öÉO~rLþ^mݧkÙ¼aT[‚µ ·G#µ( ømù³  ÔsAà æ/Ð'¡çxçYÚú›*c† ÜèYe0aª-ŽYº2Òæàx–i²§Ì×RN„dz)_ ¿Q·2] ˜Ä?Ð…i&)˜h@FxhwæË§ÄLû÷Wšz6’Î÷fœá¡!}èãHqÅC®ÐPnƒ´íHñ÷ÿ÷fÏ•1&[Ii.‚ƒ-»úŽBÒæ"¦mó5$G;³3Œ“ÌÙ!öv°*ƒ5š:ATŒ2ðÓ.F¸CÚ‰°ëüúÖ¢W 곆­/,K“üÇ\üÓ?ýSñ?ñÅÛÞú6¥5GÆìÿ€9x.ÀM¨HbÉè†oBÒ6B•œþt-µ$‡Ào01[‚¹;’þ4îÛRz£pÒÈ #u†ø¾@aåí@ò[Ä–à³™ÿSP¹‹ãK£†%Ø‚CsAiø¥®1Œ»Wó}m -®¿þúâV]è‚ðáÄ$›{ `€(éÛÁy•¬ý±äsøœ3wNñŸ}¡§ÔŸ¯?!,0þ!4ÄôvnZì°ê¿Q‹öëkÂ6Òþ~[;Å«&ã5±Ì‰ge‹~›ANZ¦/=SÔ@½=I2ø¼žÐ'ÖØ7¾rå ÷6 ,'&À—Ô]ýæ-Á²ÍõK),þË[‚5Ôà­·Gý?Ɔ Œ¿Œ6äi(_@l ÅøÞŒ!!¡ zŒø¤Ö QÕ–'¿+ øÅK[&hP® œÈE홸šNþ(³lT%¬ {e¾*Ã6üeþj¦€åBRIMéåG6¦4|žlõšÕÒäC¯)tCKñ}ß÷}6¬ÁˆŸÑ.:l*Ç¥Õ±œß'ÍÌú<{ëaΛo¾¹ü¡QùnLÍ)>*ùÚ×¾¶ÐÔËVd˜QýP|ñ‹_²öÅ0§%Z )OªšRÌ›_<ó™×ûèÇ´ú²Ø€]©…Ñ×}Ê€Y-¡#ÃRñ½ßû½Å%ÚFÊ)L˜œ8ÒA¬œ `DÁW©ç—¿ü•âþÝ÷y„Âæ!êÏ.A ‰M¸ Mñ„BŒÏà¯*M‘a6Q*ÄöDò&’ìJ™4êÖI.Êš$¸±2½H“ë’Ð=c—^zYbPaó“á/ „1ßèã{U "5í«1mƒ~ª`’êLì ¡`À–`U®WCÂúÌôAI£¥ª°66Ê õ¢ñd¦Ëºd¥8®Šs¸ìÀJÚ6\ù쓊ˊð2¬˹IžhçqxCT³•°TNÎÞ¶LÃr]H•¤ëˆˆÿÉOz’˜u½çÎ÷íºÏŒƒ¶…™phu4ø½÷ÜS|[Ë5ïcÝ©ÎÚ«'øø÷O~ÒC´+LÅ0Ž:±¤óÝ£|üXvC¨€K¦¤_©i€@±`á¢bŸ43ÃôM›6Û:¿M¶.8­«.'eõgyO×½›©²DK€À¹þŸsÙÚŸ––¸ –Ñ Ä…áz1šŸx#Ýõ×Òuf¤ÃžÓ9R0Ü‡Ô ßtù;zišê4“Ò™DÀ3«‘RCf†É ÔB\ðAn“f >ªkŠUJ[‚=P¦ê–àš¶ O{ÚÓ´;)ÔÉ#¬þúA:XûÚ×¾6*-ÂJÀîcGŽîÕ°r©†c"pYÔx^.òÊ\ÚFó…0Áâ,Z ¨Ë4mž„[pR²¤ò•9K”‘Ý$ñ æníˆ'ÐðWßéO~ŽSМ¹ýŨ˜k—˜ãXŸ¬ûK–.Ñ(à.Ã8Jûo~CLr½‡ÌGuÒŽ]wó|üVÌ žÙ´"1¤±Dè2¤±¢sã Kv0ùZ ýÙÕ‡P3ð£2Tÿ“?ù“âw_÷»Å#õ¨B}§iÃ:¯P£»}èC><² #F Ä3|Ä€9wÎ\Mc–§y=íVÝX½ l„6]U<ïyÏ->ú±ÊÎqÊvî¨â¼5\Ô6“G#âúÀ$É}6cÈ3ɧ´üÂÌtÒZ¤éGix2äGÈ ç³Ú<$ ø¬ðÃÈñYæÖ5)‹FÃ0WÉ,k2Ùÿß#B9tààÁÛ—,[ºC†(U^]óùÔö`|æ÷)$ÀÒÚƒ\Bd y‚€’’k" –'©šÒ´æ«äiJ[9 J&2Ì–¼h8z7®%#=Æ>ÞIdÌÕdœÆb莶f˜Î²ŒdáÇ<\#2®Õz6ºM3»…‰>©,G{2¥€Á\1ˆIåðE™ÆÝzÍu®â?8g7ß[Þü–â¯xEñ ÙØÀŠu÷$îId ÂðÍC³ È « Fn´%IV|ÙˆÑvFœ ÀPùŠ—¿¢øÕ_ýUÃ"ŒrLô dÛcB)‰BÌ;-)ÎîÖM´’sÆÐ„?`tâœ2ÇsŠŒÔ ánD+=à áßO­`H£>ªÞ\Ýܯ¾²!;Î4¤g•>ÑÁ €È¨ù!M‹ßˆ¦·nÛ¶íIš(LÿÑXf.ùÕ«$l ¹ÒÂÒ…5m6©Ã›ÏT*c‚œpQ> P†Vý‘PÏ©Ò&%„2W#ÕV¼ÿ§tÄѼ¹2Š!¤N‹9Oj+-±0kó¤A¨é¾¶âá|„çÏÿöoÿæÎ¥Sa ãÜÈc#,Ý( ÔX‚3öHåt®”¼aõå?Ç·ùŒË²ë.íÛÿøÇ>^üÜÏý\ñw÷wÅÕ?zµOúaK`i#u€ÉãÇ:?Bm\#úmŠF¦)Ç–-[5=\/ç*Û7þâ/þ¢Ð‡ddäÜl¸L{ ÀhçÚÅœ}ÂÊœ™K"=2=¥˜>QS5 E˰yÕÄ ã2¢ö2rƒaÍRM9ÒKÐ#¼²%X¼´@íÏ(@[‚Ó-ÁwÞygM†ÀúÖ­[ݯ“õA›bÊ € l-dh(bÁ8¦ÓLßʈRsQ—ËÊ?“ºâg ía ¡JæËE6¿‹ˆ“¯_Ë@Ç”œW *b¢~+³”ñe¹¹RDO.1a[™×ÈB6‘¡¡!38þÀÓ 7Ü iÀ.ˆÍ8¤¥³x¢Õ-™8õîr°†Ê5êt£ñJ#âpPÙÆ#¸X™YèËÂ2:./>ûùÏ_üÒmZ­#½·j”‚ÁŽmÁÔéÌ_ÕÖÜôЯ¯½1²c)rßñ½ÅÕW]] oÙâˆ/h„³Eĵ\£!ö ìh3ˆC!p¹i¨™¨cÒÞòM›Æ¶ 2Ð*åµI3i¸kÔªákŸÁ¥8}4]êøt}Z Ð-ÁÇŽÕ42«ú¦û€¾€^Ú9òÃÌê7߬Ë[ ·³%¸_ñÞŒ`gÄG_0zƒwSÙíá¶+«IHÚxKðÎ;=úÖùí£ú °*ª“H àÖ &CþšyS4i4¢ì&§#6;5>ÞJD8 B#!E(,7rQX\Ç{øã™:2Ù+îÂøOzÒ“}†!0sqd šð>YÞ1~ýË¿ü‹ eÞ@V:<fnÌ;·À€¯ »J ›BòKù ]£~eðDO‰·DÈÌ1Ysf8Ïí>ÿüÏÿ\¼ûÝï6³£á/»ì²âÏxFñ¿ÿ÷;=dç@„@"@™F<´u«˜~V †¥ñu!EšÒˆHY€É!.VX­ ™ö?-§j¦6ëon| ›1ëøƒpµè¬]JJϧ“|)Môy#üòqO÷¯ù'"&y’ªix]S¶šì:Õ-Á62BPöB˜[‚;Û®8Ÿ€ðÐ,_±!H`T®A}&ëuôniššbH㼉jp‰—FwC\‹MôáõƒÄÄQƒ b5!z2âðÄë µƒ”OsP€æyˆŒè2LñhèÐæÌó髾¾GÏ›o¹Õkü7_waÃ`Tc˜¿FÃêØEÓ.¤QVYn®\Ô¡ /+Û¨¿±'\ZhfüR禎­´Ç°ò`0d·ž6`•Sú“úBxŒ^žüä'ÿçÝÿG >lûqhsˆçÅ?ÿóîÆ;vîôJÁ㯾Úöæÿo¼ñFoÆ€ÈR%Ÿ‘;>ÙcPÖ¹¤…²çÈvrcËç @«^ êœ.ŸÓ¥Lñ¤WÝ4š*ÙBeŸË~0Š/0š‡ªôØ®œè{ho‹¶ky™SL8Ÿ Óñk×^{­ÈdvÈ/€0-Nà ê>&âîÕi¦}2äíÒº÷FÝ¿?Ö'uã’JUG¡©&V*Îp„{ô…Ἄ¥‘@…¨•ºÂ¤@¨¢‹X9pšÃ«È ¿s´f«0H¤3”J:ðOý b4ó´íB1¤g©Žcœ ­ç/˜¯¡ïri¾ÁÒ€Éô«=°}<²”¿ê"<ÂR=SšFJùÒ?AM&éæ$êHÝÀ~Ð˳Ì_i'åÐw¤§]8ò;˜aûëïõÅï½þ÷ŠÏîó…FuZ¢\évwö1üÖoÿ¶7"1 bgàg5u»ýh#¶Fçw~§¸[Ó;.¡Ì´è¢ÏùÚžÌîö _zfoG…Ñg%tª’´;ÌEzƒ|K!îᾉ5\¯iåD+´é֟骔ùE‹mÞÌ÷ã–`¯(܆@6á€;W € äïùžïNl >qðÀÁÛÖ­_ÿÈúø)™ò1^ (TX4˜©¤¨”F³†¹páüúÉ“'„€dôˆ2â E“7U>àÅÓ‘0]JUæoÊ,¹òO#}$à Ü™k¯ äÇ<æ1ú?ÉÖî¿{çßI#ÕêÅ<†è4ÞyŒrˆNíØQ®¾¯4LrUZ[œœ xt0# ˜ûAœÊƒñèF/%ùôù”§tòbi® ‹*n‡ii÷Ûßþ¶â^ú Åÿ|ÕÿÔæžÝšóër15óyF ÚÞ‹a<À`^I[)QÂ50çd×(†ÏÛn»Õ𹀩H§¬VÖq(ü€IþÚ•ž˜ü9ãúdØát®_ƒªµ!4uêѵ÷uVm]‚ÛÌäÕ,M~pϬºãažÒW·sˆޝ1Bc7+<¸jÿ;`š?— âÔá´odßþ}ùK4RÿªÏ**rjÕ„Òè^挋4Ý]V*ñf"àI+*¤åùé¢J»|eX™—:*_v M5 m±hÀk®¹ÆÓ·½ímÞHÆŠ?üÃ?,¶kúþy²øÓÐ^àUex€FS0 I0!eôô" dD ­¨øJ5üïœ š¦zÎsžÃÔË–v˜‹NåðÎ"M¥8TÄ¡ù© ;ò`̪«„`aúW¾òU1îWŠŸøÉŸãÞV\ýø«}8‰üXöËVôB!Ë€ kzáþµ_ûµâñeöÓ–j¹‘ײַ*ËL–ÿv <Þ´fl%ÓçEȶ³ô¦{”ß4¼ÐàïÀþÞlÇT z™ÌAsäSšÚÈ™ÓÚŹZw°%x‚øvç€úM`{{´Õ—ƒ0}‡ÆQ\ämG·íÊ“bK$EFs¼,¥OÖ4w¹‚P•²y:¤éØAZ ¡ñt„µ,ð)ÁÅä²¢L7éÊ´øST 9°Ì•ò@½ÍyËÌäLÒˆÌÑ1K[±Ù(ƒ¡ ÇRS€F) _À ,*‡ †ï,Ÿ±,§ýR2ްæ+enðØÂ¿óŽÅ?þã?úÒO €Êá‡8ÙË@]p©Ï5×<£Ð‡ddhü/^}õU¶02 >´çl]®F…ª:‡yÓ,ºDH{ÄFŠ™°RP”;‚ÚÙ‘”Ü Ð8˜ãÚçT½Ôwôƒ¶kªÆ÷;˜ ˜`ì—ðoµ¨×ÔwöÌàO)†(ŒNsÔ‡‡‡!„15 oÿþwJbÔðÔ=ÏÇ |~ Ïôž¤.Á‰9¤½hpæ„D툄°Û "ÂôÃù™ýp áDæg¤‹äÏ~ #0ï‡X¡`3Ì…•›0 el~aºb'o-’€¨Œ¢¶©ŒšçìîÎxäÖ­Û¼K8ÊMm‹ºð š·¡ ¨;ÿM×x½ð…/,viåAdz½úð‹¿ø‹Å¦›üaúˆr〉ŒÆ§§ÛŸëÂ>~Ï{ÞS¼õ­o-ôù)3ðððpñË¿üËÞðƒ0bÔ€=„‘ ÚžKCŸð„'[·móêÇœÁâ¦oò‚Ï•ƒ”¨3x+9³CàäÅ‘·dÐ4ù_2‘žò:qT«©næs1iK°òw”‰dÐý6(|kzÆŽ@ôÄÈ6~Oâhp‡ •µá¬ö£0ˆ‹ù†@Ýç-ÁÇŽ½_ÆÀÝbæ¥g´^¦C&¬äê >é]1TkÜVéù5Œh*Juôg0T³ÁhJ’‚yˆp¼ÿ®·J²€™clðŠ¿_ŒzÙe—Û‘ ¦gØýÕ¯~Õ«\‘ÅÖÞSšÓN @• ¶Y A˜À( ëú´ðýßÿX«9ðÚ׾ƛq8ÄP·0Hµ¤J¥‹Ù¢‹uþ_¥¡üäOþ¤ sØþæío7"(´”M¾pÑÖjXŠƒZs3ro±Ü‰VÇø‡C ò.K²Úðýºø§Š7¿ùÍÅUW_U<þêÇ—_~¹;ýçþG¡ aÎÃh€ÃMƒ†^hDz¶¦¥Wóv L”]_ÁËÔ`ú”ü¸”®ÓÔ bp Oúu{-»ÎjKððð—„Æv` Áµ×R (˜Õ-Á¥ U9ýÍv¶3ÄÐGyÞ±tÉRÝLåµôeñãa.m -J[k121ŸFK€kV§'ÿý'=SÑÊš»3ž9<ÏŽWžœ;’£f™ u¸©¸âŠ{i ÍÆÐ•:ý‘æÿh=„ÄÁ‡üL|7ÐÃoöpí6h¼êW~¥øà?d¦å+_iF`­ý¥/}iñÿðųŸýì‚‚€„«DÚJ5|‰8ú}Ñ#‘·¾õ¯=·fJsaÄã ÈÇu¬”63¬G0¯•ñ,d]åDàR’ü0-mÇñŽðá>€?û³?+~ÿ÷ßLÏÝ:ˆ¤#¿oÖã[n¹ÙB‚ÑÀ—¾ôår§"F'n B¸³ìTÔÌÿªÞ W3Ëêþ.xÒô©œ’™îœFü>U†çzM| 8ôô/ÔÃ….ó&^˜$/}¬>­±»V«3LÚm î¹ãŽ;DÉÖ¨™ô…%HkùÜ+G“ùiKðÁ[0Au–Ñžü§î¢`‰yBî4PK[5¾45VDG«ÿ”ÅOñ-ÿ8½òáÚ¥›GI$ ù0ÑÒeKŠëuï#×}ÄŸ¿¢^0ëçÜG'=üáß룽 ³½Bqº>Æ8Ç¥!ù–]¡AѪÃÃÃÅ'tÒ­Š¦Ü§[jE£A”©1ŠËuÕ³¯o ø³?ÿsMMv{î®ó:opÀ œM0 ÑŒÖ ¦¸/ÔôÇd´“ƒwð€0|“Ê}¹öù#°ÿ ¿_¼ï}ïÕéNO—>üá“°8æÑƒÛ®×¡'„Cr¦*x² ©®‰’&K0uxjs¢¿©SæØ*±vÁMšŸÓü²¢#¡ZÓW¯ëŒä¨7q“9âHƒ`%hݺõƒóE¨¶\æ¥@Mç¼(PÓÏ}Š0Æ‘·×$èD\ÜX#`@ß»gï·è$½Øî™ª­¿eòP  M®¼„+ee”%š C—/òÄ{;¤8,gLñJ]"¯êwõá¦WåK4à#ºhwæÝ´&`3 #iÁ‹^ôBO8@ƒa/öñ?ƒŸò0|†ðYbÓF ϧ2³. sÑÉš>¹ž%šrõ@‚¸WUïìÌc´1gp®Oé=Qsï_ø…_ð…6S&—zbyG0 ™9˜Äv¦>©BÍ…VôGô 8&Ë¢Ìû?ø¡hð Jzø#îÓ…´ b,‘Âð¤e•‚¼løjôE¥¼&*ÜŠ iò’Üyù3­£­QD'é`àh&y"oó\k®USµÝ{÷Ø-·è‡æé¸DŸl ^> ß"……`@~¶³ÍØt@.àÎÄYDB¸Š!u` A13³%ø[ÚivZéÒ-ÁªzBi‰Y¿‚ª„ì„4æË&+œÈ?œËË4ŠhDE¼å?Q7EZ§w|ÎÛœ!—¢@òä7†Îýy?ÂüÁߣ›TôW#ÃS†àïz÷»¼Íõi?öcÅw~Ûš]v v®´$wç3b@H²ŽK?¸•-Œ-¹2Ëf¾ct‹!{Tæåh-{*h“í 'dSxÞsŸ[\&AÂI¼efƒ?¦CCCÞŠL¹ZúñjÃË_þrŸÊ{”Ž?á OÔ¦ö\H°´qDÙ­Oú›~gk/Ìý‰¢øä'¯/t\mÝívaë žÏzÖ3KCÀ1jˆ•‚V¸Ó¾›DL›¶)ò@dJ(ÇyšMñBSDÏ$Êt.`ôóØxÏîûw{®Þ§s¤A ˆ%ôkZ¡‹•NžÅ–`ó0GÁq1ðKÊ@Tˆá%ó;MnTÝ«y¢n >¹G¿GŒ  @Cª&?åTa¦`ƃihG¦Š±‹ðƒ¡ÍšB ÎŒÕ)0¥E0()SÞ”G/ü¯¸;‚"‰@"CnöùsD™å³ááao²Ð°ÊHƒ ÐêXÜÿôOÿ´¸ê~ Ú,¦ÛeÆg-ž%Bæåÿ¢ýö¯zÕ«l¹çÐ ÂÂÎ8ÚüÎw¾Ó°¢^©BˆK?¸3ðÇt‘£ à1Š Þä½I{»ŸÿÜçÙÀH½¹Ú›{|¾‹]x?÷s/Ò:ü¯ëB}bÖOêV gú¦9ÀÀE¹~™æiÑæÔe¥„ e¡ý¯ºê¬é9 Ä–âË/ ”ú‚´p™¾”údš*Ѧ•—)¦3WSÞiÒåhag&\8ïL2M–V…§­IÓ3âÛ­¢4ÂgÓn:ü™nԧЧ”²ïPX¹%X ·rF®‘+GÃYhrT„Ñ+ °O§Ávqq„æÃcD(] n¯Ð ̉ñ­‰v„mGP^âLñöóÒâ” …ò”ÿΔÒáoÊÅ{€Ÿ—ôt°þDÌa¡/Ê.€ `y½­_D†ÉøN7ï²ã’Q‚ÉZe³éÁû¡~ÐC–Y©`¸Í^|öì³Üó³?û³fJ–òþPÂrú§Ú{ø©'#ÊÁUqæ€IþÀŒ'Ýþì;ì8ú Ã_óŒk¼g‚©Bá¯ÿú¯‹+¯|´w+²û/FŒ“€mCú™bZɦ‘ª½/ò–Ú'› çÑï"ÚX QÖ¹t*Ôú×îúB³¦ëÖëØrBXOW¤ú1ß à[‚ÙŒàÇŠœíXÙ–íëìϤ€»ãä<_ÑóÄC‡nííñöØr’a†Q‡&ÆI=•p¨¿"jv–é´\m¾î®£± ‚LÝÒxoT–0Çò”'½§ô rBžHˆœ'{Pǧ|ÖÀ’¤ìG›þÖoýVñ"¡çÌ?»þ@# Å:|Û7n3£3Ä=¤Q{õéM†×\¨ ÖŠÀ ’»ï¹Ç+ h|nÏ…‘a\Ò™Þk|°Ó¸°fßqÑíHÜã<Ä3"qG\Æt„º¼æ5¯)žþô§{ Árâø íÜûKï\©o °©éâ‹.öæž Y)J›„xÎd8ÈÈM(p}1\"Þü–7?¯ƒB,ŸÒ& “´ŸÑá~Í;™âD)¯½ƒŒ:EË? ×q.%„‘ÍÌ”ã÷© ¬BÕ÷©òuüÁÈwLýÀ”°GFÖzœý˜@Ï- ]Bº>¾uKp¿úØ#-g×°Ñ'ä™n3A„ánœ:†=p`ÿ7aC7gºq¼ëG§õÔÓe•—6‚0«•2SCmM.37 ˸Jš”§)CbøR†€80™wꉡ`L4)CgæêûØÇ,¨hu¤“0ŠqéÐÒц«a‚U†ðHræêCÃÃ>7ϼÆ3©~6€‹ ngŠí²°ÿ€rкf~å>èq¬ß»ë^ˆãMoz“™œv°W`¹î˜3†ºí h}ê ´hKC ¨õé6›Kè¿Ô~à0áP+l˜B°}xŽ® Ã"ÍT£ÒdJäÑ ¹ñpƒR1úR-§LM9oÌ‹ä9,ÅLþ<ñ3&OvÖ1i%I[‚uÂTUÖ»¼áL}îòÛ”='Zòå ¢9o }•†@ù½!:Ehã ?Üdp™ÿ”ÀÄ­@ˆ‡1ËsT}„w/nG‹‰J9¨ wZ $$–R´‚SΙÃÒþWÍ`Wa)˜É9ÌñÄEhŽŒðüšÒPJkx9O ¶!b¥}ÜTôº×½®xÃÞP|ô#×y٠鉀Í2 ÷ÃÂnA}ëÀö * T˜ûôéS*h}˜•›^LDÂMª/)£=„ɘÃèA°¶ÉÀú5 ƒ¦;aX‚pÁ(I}–´ø<[…íj ¼QL{_dkW±69('%í0©Õ1®_x³*‹^W1œ\¨œ•U££{AðÊfxx8+Þ¨§§ŒÖfêš@ B„ µöKkÆ$åûD`÷ëB̽¾˜šs ÒMt>:$äöCô8çÎÕ–àM¡tIk€’Ì´<‹ƒj¤Ók»< ^5ms~€öYöbW/ûšgcÍg¾ËZ?B«?xh¸FýÊþΑ»(£Ìã6¥£ŸhVF õWiæ'?1ÿ /#ù‘ù‘âÚ\«Q…¶ÙjÔE¾ú¡*¾ïÊG™á^ÿú×ûóߌØ{ðWõWÏþóýU`4÷ßøF‡!˜z°äˆ£íüµkmD -ÿrW8Æî={]WM‹uº™¥ÁT¸–š[’•0=¨öÁ4àËrJ2¸~d$I&±2ûTžÔî”§ì«©2Ì$Îõ¦îIã»nÊÍ <ðÂaé[‚Ó–`‡UqÖ®ØÈËshÈ[‚a~F€¸¤¦@ Á·ƒÖV¥î2&$K5½%X qX{Ýo·´gB#—šÊl46‡+€ £\6ˆi4àÆ*<±"i€cE¯?ÑrÎgOÃßÈ“ò;aJ\zKO L4˜PÃ2(‰ãÀÏúñ÷Ù|´º—ŽüžÌ—!ÍÅO¨w.“&RWà²ËŽy?Ãwã$“ ‚€ÇB}ÏOuÿø³~\#“­×éПk—Æ>¶é2×c÷!ߌU‰§>õ©¶Ôc4üÍßüÍâÕ¯~µ/ïD°p XÍB ÷RtVs &¼Qo9uãã¥\ò‚}<`¤ätᣴ:q±¾!x@S(„©N¯©±@MШS0é‰S”ê•%v›6µè³–ÎÓYêSEÕÝÁ©NÔk2=AWqKpŒœ&Káð£ú zK0G‚üúÅ›åJŠ ¸¸’güÖþO[/¾øâj«F4/¼bÐ µ’Gö¼C ã¿þˆèÝh­ð ­±Ô%M‚ÀåÀ$A0z¯Àô{$pœ±íðF<>9â[ò¬),§A†Ñnáå*î{u#Ї?üáâå¯x¥­ó˜'ʧT–Ù(£Ù¹×¹Ó ©ãc=çÌÆG>ãÅT$á*ÕqtD7)I0ì¼óNm)¾ÞgöùFÃpî~Cˮ߰¾`„Àa€Çråûßÿ~má}¹÷`ÀC(°a bƒÜ÷jÏæFLúF^ÚÀÆ$z&”p¡üéŸþ™O0r“2Sm)ÓL ´ÁærÁï”ù!77!žUX“ùsZòžËx3:¼¬ÔäÐÁc¦kÚI9ÎÈŽ¶7™ ü#=ªÏµ$Û´%Xtj€!0ì?”Õ‰k+B‚`D{KªmLÜ‘MGë_ @íh±ÂÝ@e^¨ 7)2‚Aôšò™±îÞ "QrøýÆ3Wã l¤.3),'xé ‰ðúÄè0çzÙ;> 5xÚsíµ×z·kßHT—£ô~¢#€rñ¥úÙ§t‘Ÿ9úC¿ç¡\™î­»€ˆÎ'-(¤„ ÷ ðI±m[¶ynÏé@ÁÐçÐöïÀìüè+–©3õ\¥ Ý&ëwªI»ÎÆUq }0…Z©o!Þ|ËÍŧo¸AljÉ—­Pv´yêò DS§kĺ ÉjÙœÔG{É‘þͬ¤É€ÒSr¹žãwˆÖ 7 ÎÓ§k²ÛÌrKðŠAíaY(Ú)Wä·!P×ÚÕ°áè46•kÑÉ5—¬CT’<¬ôjÏñ·d ã:6  `g4ËŸQd´§˜T ^l‰å*jRÅ?ÒPnäs½TC¢^e:âá p­ù ¯†ÙŸÒFd†Úáy®vѱyçÿÓ½úHQ¤-óÜÒ0>¡aR—ßTeºØT¶â8IG ³I ýìg>ç0à3”γ)eUà’~PÆHNÂht*=Ö3ÙË^fC £àR?F4¬Ðà°…Ùxÿ\:€”‹àܰ~Cñ>@(Ÿ) ‚Ž:ðnµ+X$À²1mN¿v‰R)è£ôÄŸÂ'ûé”…lÓ¦Ÿ N#¼R`†gØ€†| ;öIc—·w’ º o•Ï_Î[‚õ±ç'@0ânoGfæÏiÁO8DHr`†a¦ö¼J(ÌQçÞ-‚Ü£ýæ5ÄШ@$ Cƒ Ó%ÖU…Í%‚fÝœe£þ~Î/(SÌ¥ÍËŠ6€¤X'LiÊ0h»9¯8i%<Ò·„7åur!™¥:1÷çt>Âf'‚@ŸMó°ûío{±BÆäóçƒ+4Ž_ìÈC`ý—Xô™?ë[·7Yÿi`¹d±ü0Z”5÷8eÈ^„pÐðÜÝÇPŸ¹ý|}z |bS@8šªÓã‘eLˆrÎ…C계Aø¤–C¹r $þ(Þ›ð ©Ì°Ð’ótZw§s‡Î°¤É’‹Š']ÉÙž`º'f¦-JËÈZ ¨ Wã•pžÚT…xð MnÙ²u‘§°°ôe85­.¹ÂöuÓ Z.‰»âŠ+È™€šaÿá£GîÍ›·‹®œ2ÿÉF ‹…0» XÞÔ¸‰¢dk@7\”ϱ<åÁO|™ƒÀVçø®G™¾)x•¼•8ÂAÜz =´ûýa8æÞlÇòÕX̯Š™OI‹Ó6.Çs2Âa»4 ÀéB¾6D»Y¦cÉ¡Á.?`ºƒ(/·+=ËR!£%ŽÛòUÜbÙ™ÉîE–ùXµxÊSž¢;®³=à˜V3¸E¡Ày˜þáJ¿ëÞ]‰µ¯a3¶â®£wuhî_ªM÷²Š“q{ØÃ,ì„HZr$6â-…8¸ÝECCÓ¤j—szØ“äjì ¤ZS›Ôž3«ù /úþÙ³wOMý4£[‚•ß„»iS¹%˜€W×vîhÀAK¸I@.ËËLDE)ü„n¹5­+«% a] rGj­#Áˆ)„i]žÙê¢jÉf&Nþèþ¨59·â„pàK‡Úêi+ý½b>¬õ0så uݶî!„ ·*kúÏ;ÄÀ`ä…á:0®êâ†"–ü~÷wׯ>ânм›„¡»ô§â:·0<4伜aø™Ÿù™â5¯}Mñâÿ¼ñüD¼•öÏÔ›µ ;º©³Óœ“‘ ÷"¼ä%/±°cÔAßãbM¼%[û%¤ì(u†áLöÏ$Wû TBEB†§gÒláGÓÿâ5ý:º j>™jNl Ž‚¸$^®ñÉp6ºQÎtf_û?Ó ÎãDœ´ûŒn6Õ-Á“Þô‹ŽMDQ,AxÚÂÊ™'Ïl XW°¬$ ¢ír*ÂóøÊøHFX# œ$wX$oMS¦#uÎÌÉrŸ×bè}÷Ý÷èì³ld—à{uè•b0´:Ö|æçÜ‘³“xx¸øÁüAë}^ñ¿þ×ÿ*^©U®âþºŽkrKS µyµM;ç¸ãžøÄ'ú EŒ°¿ü˜Ž%³ÉÎ@)"ˆí̬Ç<æÑ>ƒð´§ýXñë¿þë¾ôäZ ®ëuaÇ»´“ée’÷ÿ²wöQ¶^u}?gfîû{îÍM€„œI‚$B@)ÒTc(PAX B}û£&¸Àò"º,-k¹º–±â²-ÔVjZEAÛe[”-@H%­ Ü·$÷%sgæ¾ß™¹óvúý|÷þ=gŸ3gÎ93wîMÀì™ç<ûÙÏ~ß¿·ýÛ¿½ŸÕº4ÜKÓ“'ÜSŽâã6f[3ÀÈ”l6ÌdÀ™Q®Ì%æ3hþýóÎÌLFŸ«ëŸ¶wŒè/¤5-6ATƦÂ.ÉyG:˜0Ó>Yèêl€=Û4öè° `O€õ(oÒ0eÄEüÐñ³D ÂaùðLç&#­¨ÂX©RI°)r¥Ó–„º'½¾Û(‹Ô•¿@à­+$-Jj s¾J›\[ÊVÞ¼Œü;ý)¡;‹¶Ÿr_ûÌkk÷~èÞÚ/hÓ{ÿiy޳þž££ÓATLbù®€,½»)“„&´&~H'éü¿¿ý&G5 8ÖÑ¥ñVÚ0Ì!œ¶Cà ÚòéíÄù#ùˆ¹:„dX®½æZÝÓMÑÑP¤…]š‹3uaé3n$„4ÑÑgJ‹íÀ@y½€‚:…© Úô,þn޼è3¦"7^ƒ “~ËŽ¨ö7ÚOÕ%OœîåbrÖ nÅ, sÔ²V¥iôÁBR]@x™ê¥FÎKÝ+ýžˆ¿9ùpiÝa¸›nyð.Ió‹’}J°VåX بô•I0ú*,9Öx <î–'aK@D¤0(ˆ¿ÉüN“àuZ†:8{anRš¼ÝR.1±(b ‰ô¼äðc€Ã¢ E•$¥R×*;õq +á㹞_;Ïð;BëAyTiK?1ÊçÒßJmÍJƒ…ð:¯µß¢z@Æ7ßvã³jù½ß³Èñ8P»ï¾û¼}—ÓYò¡ÑxDíÙ à¾QIÄASHŸa3¢‡‘Y×…‹B„o–±Íí·_­!`]kí|êëŸk'ãÿÔ1ßè4/t¾|Ê É';!€ˆ¶1¾=#›QžQìçÈ—):¦D(Ñ¡ñDšAJ N§Ëb"³ômgl=çHu]b¬*(Õƒ¤‚?ŠºÔwU™wOTÏR#&ÁÈvš`…1ƒX°4ßh4¶k(–ÑTŠ@à×­¿ý¢øéJH “My]'Ž,èxâM¢ò:%øüñ­Û¶ìÖ‡)T© ÿRŽÈÇHy°@&yuºß’) ,©Í­øU”y”þªÒJSvW'üq¯Ò´‘ª¬â}›WéQèÁÍAD¾¤ówð^%xä±GkO“H¢cnËWuQ2wGˈWŽ¥8ˆÕS%qíYûà”½CòC»ÏQ[p{~ìÂã´^,!$wÜñ†Ú=’H¾*…ä7¾þÚ_IÄg°)›]†ü mD,¾f ‡#p¢ÐÖîê!PŸŽö Vozy œ‡Äëž{î5ü0' ”†UŽò¤ª^Ù§wJàØ+HÒ?Sê‘2ä×uZãü©Càw¢$Ý]å)Á£Òf¬|­üÒ—¾ä&ô…seЕPÙÒÁ}äTÑáºÌ¤»8uPs»›ç.ÌQùŒ@Ô}­µ~¥‚Š µ}@F0pÀ>qvdXVPD- ºÃùi‘¥SZÑé@œpe+gº2_§-2ˆŒÊ{‘>(.R"5÷’ï~Ií/þ×_˜ËÁé(7…¢<Ïi#‘›aÑ 9YkHrH @â„­ŠB8ýOˆ£ÃýARìÅ!wß}·tŸÂΛë#)pÚ2µà¬Hg$§O™sÓÏ QGÚ"] @„!VÝœQ¿þÊÓ-ê’0†“vÒ •8-‰£Öñ{  ÕFÙ0!_Ê=—QŒýÜÕ)8HS×÷« ¤,ê$h†W•ÑÀ‰{ÆXãËÊš &̶‚áer¢_4–6 Ö´ Ë:L‚C¸N~ĺ:SBâ¸^ùDò—sè).~êïÑWÑ[ $óÑ($QRz2EÆGÎÕN»ºL]õk jZMHw•~ž³‹üýXÆ)üíqˆY‘"^Îré­Œ#?¥AT Åßónyž¸ûºÚïi€¨ B¦sø’i1æ½ Zâî‰8"! šŸ?VÈ‘>JJ4æpýF£a;Y) |J’ůÿú²ô@Ù{¯ÚYÛ¥ƒJX!X¿q½æù áÓœ>†‰õ-Ř ’Þ‚­Î| ©‚χ£ÓA?€žïð=CújYÄ[ÚSm!à«G\²3~êà㪼`W"Ÿ>ûWÿò_I$“pJ$$ËÚŠ¢·›ç>oK—¶ö¨_A(åSQ*‰í  •¦º3Ÿ·DQXn H—ÇÙ_Ø ‰o«ÆpƒÞ±¼Ví @¨s#mÄGYfÒË´«' ÂJbÄIÑøZSˆp€ÎSwò\*Á]¨ŽŒäÙs*yçÑ£S~\ÜÓƒží)~P 1 ª8­´ŽÔJTÄIù¶Ò´"¾¨KåJp£ÓYÛçO‘3Øwÿý÷{çû³Hâþ³òÏj~zæ´8±¾¯§ôdÔ³ d׃ ”bLàÒ´îÌñ_ù—i®×FIÈ縎kˆJ=õ÷¦7¿ Û  ¥hP,Î踲7¼á¦,~ïm·‰P<â2°ÚÃtø5¯ùçyTgîAAbSÏÕ»Œœ9 ÷™ˆöÀKªL‹’#¡´“w´ŸûȆØyÉÔ¥ýc#©jÃ<.ä¿&®ÊÆ#½&YöË„ö‚”´YRQ]zžE¿´)Þqïæˆ2kúÖ”9°Ù½]°`“$¬ìdÙ¾Þº`X6‘ø"ÿÎ|»€¨•ÄIÌôG <ÈvH`Ÿæÿ3Š·^‹K ¤þéÍ¢âÕc¦®0C5@GK7óÙ€J^Ä—¿x¢Ø6dO…´bTiÔ %MñlÛ[gÛö³¤Ü¢JÊypp¾ÒÊn7€úÃ:$sÜw¼ã§l߀‰0Ü‹Áa3'=÷–k ô¬ÿïÖ±a )ˆ€XÒ‚Ø¢(˜'#ÆÃåOè>NzͼV_ ú7¶>¤f(Öþ@úDx>×Å2!§½ìe/3QA'ÁbŸÿÂçk?ñæ7{UíÁ|bÁIHÜ!23fÜ&Ú¸çTË #ãC›¨'íÄÔ£ù©ÏC¤|ºú”é ~`d» Ÿ8O1“ƒVS„ŠÍd8ú¹‡¬â'çU-9®® VQp+‰ú“`[ÜÑî~Ž8à¤$RI Û†DT·©om Pzl§9µ}Ž£ß{¹®€F'#ʘP)€q£þ°Î8?®9ö˜©|Yi¦ô+p+¦&|ðÏÿüÏj_ùÛ¯˜8ÑNM^' ˜¤Wåœ,¥MÞU泪‹D*B&“`Œ¥ÂЮ/a£_Á#¦˜ZÚ.1&Á•E J€Ôuœ[ýÎ;ïd…¡(t©wYÐUëŠuOÍ)ÁC:×lBGCÝ»÷Êg Xõ½ÀaŽ Ë$#Rª…Q¸½©âp8./ I´^DJÓªrRÆ»¸GQÜSÔÒí}[ܲŒ*I‚à•Ô“ÖÌÔ{7/²ܹsWíe蛿ýfÛ €h â<À²£/` È¢C$äâñÌ•¬æTº('å<íiWëž÷jÚñ˵OúÓÖEpðèè¨9&–ˆÖ¿ó;¿ãºðÛýIöcF*êr‘7RûPNÒzöfЦ•9z&ÎI)'ˆ_%¾ýöÛ½z1xûÛßæv@!H|áÈÑcµ/|þsµûHЪ'½PŸSójïI‘ôYmÚ òà¢ñÓž¸â=ááR•ù¥f4 ®áúQg$Fài|b\ÓË)ÎÜ.ámù"^ƒÀf½k¼ <«=ò{%eò ®/ Â8 äªS‚Oël-‡½D @Užêpd/‰pîr$!) ÉüÇ›o$ÚUƒØ†¸Jyt†§,«½Šç¨mñªHíž%qŠr” soæMÑîöÄœ.ºD×ÁƒtÛ×j§?tÚáç%!À±ùÈ&G‡#5¡@„Ë1¸1ÀäÍE»Q†”S:,’éC„§‡¤[¨ÝsÏ=µw½ë]þ^ÁêÐ$ „@î½Wí5Q‰¸ ®ˆ×øÉŸò)`£’#ZªÃ¥˜äwÀ ?úEG±ÇnGÊçì>ÃΉõé—F£áEkÉó˜Îb`Kˆ .JPŠá4fÚ‚îåùÏÿK/H`Ø\0u¢_£´•´LµÆPAj§5`®6ÍåÒC‚jùŸG]cLÔœl ¶Ð†å`ªÒâ°*tÍ5×nÝ(¿ˆI° €–’mjS-Êìæú¸M.NÐ¥:%øÄÃ)ÓlÇS °# £¶á7rQùz}ó¦ÍÍÉæ„óóëV‘§iUw¹p¥T¤®ñZ9¾¹ŸômOn9G{,|³>ÐÁ&¡ÿóÀÿñ<é˜ç£¼CóŽROvÛÕҀϊ3?W¢}㺆4󪔷ièw8%ÏW_®‘èŽÒð‡~臌äH Ê<’J]"¡œ4QùC pÔ>’Û×Ñö¨W÷{F˜` =ÑhêÎ Fø©ûïjÛuH[uVU¡ ì0ä BÊá©(K±ƒ`Ê…’QVH›8m&/Ææ¬>jJ{Ó mWŸ3=Um\Ÿ¨T÷†^¶Pê͘вYÔôg˜© cÈ»nŽv1®j¯QÛ‹6Ò;®<†:´€€~£_(‹|É£t-ˆ,CåˆT‡èÊÁ¢èFuº?eXó)ÁНœUqêÞVÿÖ —E]›·Ê~!*¢{ús1OUÔ/ïxðE¬Â9]‘¦íeT9Ÿˆâòrz ¨o/ä'GÚ °Êzƒ,ôöïB±úi@IDATÛï|pºàF¬°€eà/•®âiˆùñ·=ë۬Лœœ°±J9Þ3hCH[®ôÓ=šî¨ý8ú I‰°¸øÞÀ'Çè­c×FGG=ÝaÚ°oß>KŒ‘€!±<mG҂в¬yÿg?Wûòƒ_vœ´Y­‚—ÿdúQû½yG}B‡õ­hŒ—aQz’ÑÑë·i¾ÏîÀPV&Ál cÛx/דPjË ¨®`rJ°L‚ω»oÛºm·–ÉdÛ?¢ÎNèÒ ‡òáøò Úîà˜*¤Õòåü´¢×»ÎV*®“´…å(NÓ‹::i5, Á‡eÁ€‚d|aèܹ³FDæÔéØ$ßóSÕ˜³c|C|”~´‚Q“SD]Œ@þVÓˆ­Ú(PCl™bP/úž.E`£ áG1aù»¯}]7=éyø\Ë|¤¿óÎ;¯|å+Ä-·j%áãæ–, òi/\ô{“;~@œvîˆP>:n—A/ãÈåÑ®´DšV)è èÚ ¢ÿ•ì ´ä†`ñ àMoz“§G!ü¯O}ªvP"/ölÉ~Ýë_W{äÐ#Ö9kI§Ò¿ŽU¾$ôCŒ-mb:)¢¶b“`L¯Eä‘0 •55}ðÁÛ;¸Kkz€ˆ§C-ÈЧ‹£I ;½O+¸ivN“™€BÃ4¶•£‘_‡%äžxWˆÀœ”聾BÊñI­øí¨JXRú«Ò O·÷e˜€å=¨h_ç& ×$G]4–áÐlãç‚kƒ´¸+\ö÷ÿ÷ ¼ V„h¼=Ó2èÆ‘Ñé[¸á;µïÿ3ŸùŒ· wZ†Ñ/ÔÀ‡òñÑŸÖ! w Ùßx×]þ[Þò÷ë½÷Üã–¾êû_¥ÍKxÚÀY (á(Ÿ¼©gHKÛßBȥ´ÈÄ`鈅š(ñ;NOB9ÊJÈê$‘]í¤n1uB¤Çѯô3}É{viB€ÑÐ,žü¿¬ö 슡Õ.­Ð¼ú­¯±|—¤ƒgXº"€egúÿÐVˆ&Á¬Ò0>Aø{U6¨t¢Ð"’M‚¶Ä$XËöÎ&ƺ¯"ó@$”i)ãÇæÌŠÒ~}t´ñhZ~¥[éíü.2bíˆÖx77µ”ѯé#¦ˆNV"*mÏÄs¬åÚâ§ôDŽdt:H8ˆ£æ47µ,‰ãˆò,ç’‰-_bA@»¸èè@?Ô)ú¶£ð:wþœ§ ÎéC8S,¤î% âøôF£ac>úö·¿½ö¾÷½Ïï(›2É ä£ûÕm»¿ö `Á9²¨çríWQ¹²~%Èœ %YHºÑX蓺¶¸?@nÔDRma¬‚ PáÌX/^£/9Ûôzdا½õmoõ” ëI$"¦?øƒÿÔ¶££iéÔÒ€ò}¢]Â…D4®6 FoC0ŽËõ/éx§~(L‚·mÓØ.1 –°.8m3Ñí^V XFøpt"¨ '&Ç÷ƒZl cœ[0ÄCõFQñ#þÔüÁPòÔº€Ì^^Ø“Êgüm/ˈòó²ŒÏëœ %KS™^ÈïzçÁóGš@žr±?ö±¡b°èPp¨l zÛÛÞf£ Þ½YVyá ¶£üâ”ßwþ‹wZùP³´â“G‘²… :}ò‹x¿ù›¿é/³< ‚så<]Üéê¹Zµa™P+.‡£‚\Ôw‰SÞä¿Ð-ŸBRo,yÛ5€î‹‹Af¹•v£ D[6œö…n€¥=À÷¸ªÌ5&”χ]‘æ&õÁ’÷ü»÷¸Ïµ×ĆE|шݔL¿P"2ÁÈë‰vÔþ¦}b*Cb^b',Þ-WGâÐwjKS’¦V®=€O F À$xX}‰™±áŠ|îI[ºž :*€¯‰x¥ù ,tx||"™ÕÙ,ŒñŸ&ýEyÐü^›åèkm U"Òé%ƒ\D/Ÿ©GÛ»2þü¾ŠSäGžŸÇ ¤»6”.ár\ý´x¾íbPЂ`pT®˜·³Ùå{õy1™>Âä–w¯Ð×s4óæ¡»î¼«vZÀI‚Œ s&ÂRßÓ®~šÏà¼}¸s°x&#Dù÷ê3]Xr<ÙÌôŒ ÁFÕ D:{欩>•è?Êëæ7ÚÞ»ƒsJE~_ Ò½[®ía†9"ãQ]Xå @FDü_üÅ_ôrD“‘H1ô-@0Øž£ž$Yòƒ!¦’E$2”Ÿ|#c,òÀLšcÕ¢ý܃¸,Éó иúsa˶µ£^êN ® Þv(JÛ)ÁÊ Ü®?ôÐCNÝ K‘eO@$R14¯Ìk9ÜRnAÉçÂëTX™ËpAŸ Š*¨tqK¾äQ ñ·ns9šâËÏ΢z“Ó—7½‹¸œ£û¦w(W4Ê\Η+¡‚`ˆM±© „À³£phÕY’‰YŽâO4®ˆq( I÷))ÿá­·šó°Ëï«÷ÕÚ[ßòÖÚg?óÙŠ|^K¾œ@%®”•!S„,Ê:“§)¿ÆâœÒøgUöVÕãŽ;^Ÿí’˜LzââH·h¦þ\[;Ú<½ê䨑_Zß—ªqå{ެ–]špúïÒY‰¤… à¨ÆŠ°nĵUÁËã‹ñˆ~„§W8׫&1¦RI”¶TXèb%€½F…(¯3Ͼ ŽŽ’!Ç„Il›¾ÁO™bLïxÃdÏ?-äy†íú·ësæL9 VÄ4øÛ\n#È·¿+#œ"!¿£·§¡ß ªphöU`ÒL{¹î¾ûn}íŸZÂ9uê´á$`ÊlΚ›“µf®=ïI áeÚÃjcDŸB н@Pˆ zœ'`l/ê.“àºê_MúI&^xÓÔ2Ø`ýµNï½ЩìÌw`€e•Ëæµ©“§N}§Z5$ {8$†½À'#)4‚FoܸIÒ )€ëåxÊ#!rgU‹gÅiâëÃR:J¿œÈïXQ¹<¿÷cÖ*+w´ó‚`ÑV Â<—sû^ò’—ˆ Jý‰Ú¸Phä:Îä|@vRŽEÇqú7´†ÍÖ^öͳæø •)^)u€`2mÚ!DDgþ1¯ekïC?d£ ÉÓôÑN™û!P×-Z9 È#Úçh.áŒo\ŽçÅQ¤2^ëÝ2>G¦u)Ïn±¢Oé% P}¢ûÿÐ'ì'XbNG$9•òߪåÍ-ê#ÊGž16HHhô…û@:¤Ä;ßùN¯à µÑ§”°y]®;åšxiš&IÒ¦»´wÐ:ƒwµm³Ú‰IpHÕÙìM)ÐV\g[WLòé@2õ‚:Z&ÁYÔô~ÊK.FN¯xPiþ¯ÃA`–•êH9¤»_&àª^(Œ^áø¢-€@ôt$PbQ=WªK‚èd¸ˆ21ÇÇÔNÃÜŸïý±Þ~Å®+öAÚy9 ÿ¿µ–MçS'ò 쯿ø×>D+@òö\ö„€ö§ú§jXúà…@¢é†è’¶O‡R&!¾^€ŽÂCJ8Z%NÄuá§´¦bð¥ßýÝCßÁšwb/Íû{Ü}CÞe~|?ÃN°@bCÒB§À¸1fL3ÞøÆ7º?é³¾pRVþø) ZJÚºÆÍ§F?-W·x§1õJ€¤ž Ú±§[¨ñT󆇨€ôƒ I°Ì·/ð+1” Çe“`äÊæ˜M‚ME‡A&Õ;’]N 6 $é™_ânâP,¯IÈ›eœ_ržEˆ±¿—£Üp‰öðˆKýè@èÇüÇP—¯ø^#¤„ëîÔá/k÷믄üayâ:”ƒ5Û†q9Æž€›¤_¹ùæo×®¸#Î"€¹°v‹yNûŸÿóoÕ>ðÁÖÞ¡€D¤ ÎàGÃÏÔRág¼à€œð=ßó¼áˆ:ð‘O‹9îÔ‡¸ « déHÞ- iõp£ÖƒxôÉyêNìù×6qiå×ÉyˆC>Ü©»ÖPܰ*òcû9{>/½ K¥„Ó¦á!¦šµÚ?ËOhÚðKêÃF~Ú@:$4ˆǯ³…B@þ¬À  c9–}ÄŽ‘žH) ú!ÃV=L‚é×~Î}ÚÝ¡VŸaäÃAt‡Ýk(FøøˆÏ$?Æ»Óõ%‘ÀÀ#€l4MÌ/•™–ïë#§Nž<(n™3:À$4#s+ES~ㆫ‘›¥ô)ÁÄwº°E¹¾û¢ùÙïÌ’u[·¦8Å/ø€ç:oºz££!|ì¿çL~ú€o÷ìëÖéóç²É§ÖÝâà|ÄrÀÆ;. _ïÚpôu‡€ð@Íä=a÷isí]:„ô ›‘PLR?™–Ñ`…Ðs¾„²•mÀÔÀç"_Î9@j@ɲõ¤ðKú  ueHOAt¤›!q2nbbÜF:p$œÓä‘/ù‘žÃM9A˜iŸ¨V{äÉÁ*X"%°ýúå/ÿÇN791é%PÒô7  OÉ>âA{ €œ‚ÄÔâE:¢œ2pôeC8ICÝhãéÔ'•Ipê÷Þµ‰úª›´¿¡S‚•¢ë)ÁÙ"°k», /-˜ÂbÐx+ÅÌ«7ÈaŒS‚5—³Iðp}˜‡Š$\uns«o´Ês&ÁÚ¾ §ëÚè„íEFÊMiq‘}²å×püÄ{H¬Îp6ÿP?Äc“y@”qÝ €€Gq€¬õÃu¸4ö¼Q’¹¹´àR¾é$]Ä^€y1ˆ‡Xá‚a  ƒlôßÀi‚4è#&„:-Fg¼GÜPÛl5æ{(ÀN©Ì˜Z (¤l$l1¨ï3¯»ÖyÂ9!r´•òˆ qYè~,ÐØŸ0¥wÜA ÞA PÂAùh(C¥þ÷Þ{¯ó½†®ú êæ+nvÿœ1ÂäÉ8±òĪÉ3eôóRíü/ê[Î?`ªÃ;ÄzÊ£-¤AÉÑá„—¹>K, þÜÏýœûŠòCOBý¢/HO>—ËE{¹ÓLUTŸ›SßF£"0t¡4ƒ¥Ànmˆtv{Þ% ‡IðíÛÞ'븛\RÇæØîGýpÙ¸rßRMÇ£00¢ªdˆœ$eÚ–Dr@_§² Hƒ‰Îü¨ˆ€#bÂYáîšpF vPšÌt9  §ö +¸G¦¹Ìq‘&'OQÉ+Ú ·A`4×8úûÞ÷ŸNDá+;ó³iI“ï*è„8ô!ÀÏ9‡9¤&4ôˆÓá VXÇ%â’¾7ˆF]Ä\Ç–í¶ù,yR?îS:bŒ9½$=O#`8àãk¯}–¥ Úé²EdHWÁ0m†#SOÆB’Ñæ~v(êt)ë90 M’™–;eŒòwðÐÁÚÿ÷´¹ 8!-ÊB¶ºBÐÈ“pÊæƒ-ŒýÈ8`µ çG¯€4ÄÆ+ÎR@:i4F<úƒöm0w‰ï”IýÕoCXkBx!Fôƒú’åCHåÙœ앤D`"ƒ ØÃèŠ`‡¼\ õL‚‡n~ #Cæ1ˆDªÄ0¹ T^Ê­º¶³6Ok¹§rÆøàï9TyâÒ¯²QZ80÷þ.âÄ]) oÿô)e¸t6f¸ó7c«>Ö˜ÿ™>ƒÅgÀè`DNV@*úà" Ë…­c»sAød÷ƒÒÀpé÷ÿÆoÔ^þŠWÙA$âIªršÅ™–i,@ƒÂ‹9.ÊGš‚!i`"Œ#-ˆÑþ'ßÿOÜg4˜ÊÂñcDfDgDc¦,3²q‹:ƒ<¡ÜÜ+.¤BQ<’ñK_”!Î7¼5-<ˆIÚúâ¿Øôœ9¦+ѧ(9«)™Fö«AÑßHU 2D’é ú‚ï–‚ð·û·´7ýdÄ H/|:0.ö8$”/~ñ‹>ˆúc!HŸ¡ÛAcNÔ™²/‡F¨#ãÄxH/ám¾ôaËÁ¸ñ,Á¤Ï^¯ºoUõn£ÒÅJÀ˜Ö¢ˆ`sttÔe•m[ ‚ÈÅJ»8>~œƒÈ!-¹×U3Îg®0¸å«»ùÈïÐâYï,òkÀ{;eé\S~P<¼Wt¸¸ÿNs¸í[·û{ì šeìòAæ«,cýÜÝw×öŠóÓ‚DÒç³;ËO@¹˜¦ˆÌÀÓ%¯ÓQ^'@‡€ƒ½à¼ÀŸ,çüˆÒ'tÎÆH\, ‚8cEü©óÓš’¬7ÃiÎh•…ãÃí«í?°ßÖ‹H8ädgp«6ÁR-5Œ¬*€ìè"àìYd5Á ^¯‡ØBd¤#Äq>£†þµ"†0%ŽËˆh„Ä)<Ü4ÒH!ã+)@!œ­ðÊW¾Ò'i7ª% t1|»¢IßÒ/Úñ¢®Hi´;šú‚èlâ;‹Hèh@|…LÕȤ‹ñ¦:—Ò¥±OÌD¨­„G âtsÄ¡Ÿ+2 ¾bƒ`o;@a›Åt|J°ú¸2 53"Mä?ˆ Ej4’"P"˜821>±_bâ´”L¨¨h¸jœ+Ý¥òâGƒ.ª­ì¡B“Ȉ0ßÓšf´×ý]NQ § ò1‚º+w¶ê‰Rꀀ;>V»åy·˜»€„¯~Õ«kŸ½ÿ3,ô¯Àsú/ñ˜‡Á]@쀶²½TB›\®©¡èb ÿ'òRüýk—OZ84ŠMEï}ï{eü^2üaM?žþŒ§û»·Ýv›¹>’Žòàvœ9€ ·Gº@[Î1f##é[ +skÊÁÿ`æ¤ Д/<ÁUáæhý·«] §øà>üá[â! °C»1öá{HFúÀ¬Â¶¦¾¨ïS‰ƒó“AF@"Á¾ —z#å@D@ ¦dèX€KÊaŠÁ#S3¦]Hc”Ïx€Ü =g5@4˜*–íÚ|Ð¥"„xôýv9`̧¾õ+˜„) tJð›kêÓvJ°ÚàF0 àÓòÀ}nàRà€¢2ï“ã”àa}ýå°Œ[ÆÕ™CRJ&“`a7 ö]?„‘o4†´uë´•À •cs‹´9>å2í먦ë ßGœÌ®òDÀàw²£™«2ÿï˜Ûd÷PøÚµ<ǹ÷ "5HÀ4@cZ@›VÜÒ¦®éOÍõÇF˜»cÛ~ÿýŸµ}R‚ÆŸAæpÔC7ÿÛû¯µÏÝÿ9/FCóè[¼q äqh+ÈÏ^†?ú£?Òí“Ùñ9Ï·ë·î±ñ $)—rDræà+ˆŠhNœ}èCæ¸|Gç¤ÓH&%ª~´fR!6iC‘…Ÿ~Yiõ ¬1!œÁ€âé€þõ”€ãÔCR`ù Ïô3Sò… A@ ½8oUÉ5ðD_'4ø,ª.²ªÍx¢{/G<ê ׸Ø"Pa(60¯ –œQ'ì L”‰]TXz2\é%ºLž>{æÜ@ƒéʨg !qî¬ÿc䂈ÆÕêpÞæ˜*%!€ËåvvF¤F”$äç÷b]BË´ Î Ð=,nþíõQv!’k%Äœ‰zÓ = Ä’tÌa0KÚ :vT¥Ñx“îÒ  Ìâ¼Aî÷Þs¯‰œÿOÿäOkÿZ+ÇÇǬÍGùÅz8êĉ;×J“~ã³nÔäg¸ uøqÄ1¶d@¸rÏ•µQY9~å+_5wäLB¸$Ä"æòŒˆÄ|¤¢Í !܉>@§‘ü¢ŽMO¯ÕGU9Åh§âmÒnʼnúe'¤HzäO¾~̦!”ªFÃâ:N4”ÎnÉLHÄ¡¬`ÚAX- ./¬/™Ž0]Ùi7}ÎÔ8-XtW\òÚ›ú~ÞªL‚©sVnV^˜pU&ÁH¸5#(•äÒ·kµ)“õõ›èØ?!7<œ5ðù± å½:žЫΧiaâvgäÕvÌ29*yåiKÒï!RñyÈäM]&羿¸Ïâ=À ²Æ~¥¸(Hƒ®ò«¿ò+æH¤H\´ÇÍ—U.Âáü0˜”…ò.†nq`¾ë®»´íõßY$f:€‰ë§?óéÚ_Êèèz÷ŸýùŸy™„›wMGm¥Ó³M6™›sèõƲÇà‚v–M¸¬H5¿W}S›çÍõYúdÊ1ahRH„…#«Ô©Ž~¢,ò‹öÀµ‘2Èó9ÏyníÝï~wíÅ/z‰ õ#.éð£3 ùgögmä'#¯kŠ…TÅÜbÄÔ£Ñhá‘@0Ó¾í¶Û¬sé©RÓ*ˆ|I‰>…óƒ<ˆ#σ"^g¿]Ì3eB¸ÄLl̸G¿qïæ¢OÕ—6 Ö—¤|J°ú/ …Èê~ÈŸ CZ%M0UòH Há$Ä108 G˜7Šª€¥u)ºö§X5²ª¯â[ŽoçoÊ#0l‡VèÚ"ÏÁJBG é_¦Ímgœw"8M ‹{޲º›21 SžHŽNxcZÂú9:ŸÒá›ë '«µ—Û\×9‘§ÚçÆ.ͺ­(Ê JÖöÉ›³îHËA¤¬.p‘@:îÍY§žŒ|Þ!£œK@_GÌã?þñdÐD9Ä£ÝL˜«Cèpp0Ú ±ƒÈýê¯þª÷DÀÅ9ó)Dƒu‚H1]ÁH ر XÔX㎤ðÃ?üÃV2r&‡òéÿèWàýnq\Õ·þŒú ⨧Ò-îܹ“àBt+•“`5{d8DB%ï`ºƒ”ã8 N7|J° ™Sذ–ªªâ’¦à¤€p€¨Ð#¬³» ÖlP%› •[NsRn)€‹k\ÊN•”§W¶€D? ì“8 RÀ™ L‘@ŽÇ¥Aß²e³Ú¥y¶¨–©b¯Ì‹¶PŽ‘fî‚ãl0væøÓ’6àdÌË‚[uöÀCZÒB̾ë®;½FÏ Í&D§ìü¢{S›Ýñ]êF=@ÚÆÔ!óm DCÓ2²™1ݵk§â³¶¯~TÖ‹ ét¶EßpÃõ²-Ø`$e=)y"I1þ”C¿‚˜úÐÏYálC+˜DÉÄýÃ?üCÏéYÎcš„F}Äç>÷9+Ô@~òdÞÏt ‚É4¸8ô (i D‚ò€AÚq9ß•(~Tn’Ê6(^uõF!2Ì… Ú"PpS)ÉS‰ë¡(3ZˆÂè S…‘±‘(ø¸WÇélÇüá.Û¿ÑO¼¢^äÚq §ËÀõè¦=sZúRõHùåB–Æh ¡Ãi+"8Ê:ÝÄ >ppB€ê±Ç[Ñ5/}ˉ¶eµÌƒê¡fXœ¡ÈÔ£¸'=ïyÏ7—à†EröàØcOŸb¯æ“I¿LAîW/úœ1gŒ@P˜¹8¤c*BŸˆòäÀ7”½ØðáÒ爀‘†Õ8-K{/1=+a¿ð ¿`¥« 2šý¯S˜~°Œ‰n€ƒVØpE^8tÔiÉÃEØ„^i%* @ˆ%Äå :8}õ}ß÷}¶ö¤-¢„;Îú’ýз ôŸ88Æ=|/ÐøÑ¯‘–{#í (O ŽÃAª•€²!+"‘0'g“`Ù•œÞåÐêû ̓ä#*R€ž¸ÕQ‘A‡¢—Aìp’ܧEŽgU÷„cÎÓeDAfF}0Ä+=€Œ"ê×~í×|.J8êÜo—Iÿ¤ QÀ€rƒ˜Ë.?æÝˆ¬ã‘ ‘ż<¸œ•´Ý¹“7× Žx &‡by?"<F7®_RV–¸³ˆ£Î˜IÓ&Ÿ¼ƒûc{€dñ#?ò#&4”A[ˆÇ<~§"ˆ ¾Ûo¿ÝýŒøÎª Š>òFbÂAÐÄG±øI"<::ê÷XÒ&Æ3Ï/.Óu¥T7N öÖ`ÂúÁN†0 æt - «V 6 ¦}ôeàÈ·;døõò?Q!]èa²rA"Ù× ð„)sã¹hñŒ?9 2Pél€Í¬È;âpW4’~ ¶+ã¬ÌŸò0PøC€^e¸Þj0ˆ$@'7 -¹=ÍS€^i»½£n /SÝHN÷¸–¹Ð3ðÑãÇÇjŸ”ôñ¼ç?Ï\‘ï ‚ JŸà¨ýšš½òv ?¦@гH÷è]FŽø +[š!\Ìíi Ó‰Ÿù™Ÿ© îNž‘Bei‹K86H ! ¯¹ƒÐpz>aD€¶ '¿}Z.Er@Š]Æm·ÝfâS úI‹6Qöåtô'mf¼h“ÚS€^õ uUÝm¬iθm›+­ºÛʘ`ñqëyíCø1›ðõ¯{½ÍpQpðïÿû].@í±( Omï( xßÏȱ/ógœ·~^|¸üÄÁà‡¾á Ê +~[™²‡öÑwˆïpb&»piÂPB@"¬ 9ñqô/q±þãëÉôæ½L˜n =@0ïÙGÀêöX.B4BpäG (1Íõ‹ËðS 2ȧƒ¨ôu¼[®™€‡>%XíC ˆ­Áë…ì#’°9¤Î” ƒÀ­ˆ EÅ4ó)Á*˜Ü†4¯; µûm0Ñá ®¸P;»ÊÎë!¿‰Æmñá þÊx¤0PÕ¸·Þ®Êç¼V•²w"¿jÊî¶ šoÔ.G¦CK0¹W6®œh™8Aà¼{d sェ=ð¥¼\‡h à2¯e~Í@ÃemÐWgù–)x¹`‡Úúò§gizcà™ÐIÀ}P"íñÈâb‡çEɉY5»*Éù=RBìk`ÉiNƒp€ü(é–ø°ûgN—CR‚ `;À‡ZŽXRdºÄ„iJ[ô8ìÁ`#’u°¤6¹¨Ëö£29%xàò¨#ý ~æ”`¦¡ì Œ¥@¢÷Æu$!\´kE LÀèP¹|Jð9<­S‚G8»­ØnÇ ÀHÈߢ<„!:J’Ð)Át8ÂDJ8UfÿÅþ$ÎqZsç,Y3Gû­?µ)urî€>:MJÙ3fÄ“BÀÝÄ>iýúuFŠg€`àó㪈[¬Û%ô,¾ËKÚ—ò¢À‘cˆ ‡óÎ;ï´HB³ŽOÑÙ\ÁµcšÐh4œÄE:€[Ãn€pö ëäÏ…’b‚T`c Zˆ”‹øOYô„•: Õ^n}ÆþâÈ3µÏVµÔ…°^Îx$‚GÛ¥ë@`“¾ÂÛn¬•gå­˜D%Pœ–jÈpARL‚ÏOÊý0@'¤^ĈDŽ• Z` 4n+@Í$Ô é7nÚ ÀMFЪ˜O:ÒüÐà@€5È®•EÊT»òÕzÛßgÂaÌì—Ä×Eo¢@…ÃQSÑ x®LôS¾Dpâôx1¿¹ÉUnäì¼]F÷œéêR³–8Ÿ¥<”}ÌýA<ÂÃy’™i#¢?É„‡ÐÁùc>KÏ 5~p:ò€«SáFÃK³£££î3jšˆçzç 1â9$Üî-¹t¡ 1ýÄÒ­ú¡®ý5>%8æë½JÎíS‚EÐ|6€ÂB8¢<GëH8¸€U€ H(Zä*“à“'Nø”`'êKª¥;οÉË«†‡•€‘uu 5V©zSJÙÿ¾ä¿5È«ki‚üdÙ‡§kŒžT+Õ¯g´ÖË.e ª21DNÏZ@’KÑ|/Päú§mUs9õð@^Dx´õ¬þÀ½!X¬Ï£àÃ(Űp—LŸ\g0rÊHŽr9ySlÌ@'iVä”·¸¢DŠœÓ ’6Š(î½KSDœãƒéñbÉ"äiŽ3ç¹ÉÞ%œ _ˆèÌËY“G³!kþ|Ñ›~@rà)ŽÅüž|XÃGz@@\ˆÌ´×t„ƒð”#=דÕQ_êÇ]í²ý>uORqÿZWÀ§K)Š@o Rê®§¯˜D5  ˆm˜W¢yV%9%Ø&ÁêüqU !&  ¤Ë £È¥g‡Ÿ9?®t’ú?D=Ê{Ú®eøZúü¬¹H›Ò·ÂÎúµZÐòõN9$JˆaO£D ’d1€¬Ä¼€´ÌóáúœOxàÀïøûô§?íì€'.Þ1ïg{ïí2ðAœgµþåúÞ"ŠBÓFàÐðTTdÀ=Ù‘¾¨r§×@õ_©IpKÌFc°Iý^šƒïu-‘zHé›Uâ ¾H2¾ Ãy îˆD®±sçΣ&/x:`B Bô%œCY ½”nÅX¦Q93ß"Í2Q[y­À§¼ŒðÜ#ÿ$¨¤)á̈òlòa©Ž%7ž#ÍX ‘9ž‹øâ4ÀCQè¡oÂøìçþç! >ˆJ'—¼˜ºF/÷:Ó~îà˦’š¬_‹w½êi•E­Ñ¸Îß T|ºNë6¾³õGüU§.~P´ÈÉ$ØRÁ™S§NîçpVÌüõÒˆ/ n‚ ¤€ÔhMoH4ºŸ8É3~ûÅ_ùûÄïREû×§[þƒ´£•.Ú3PiÑ¡9ž[®ÊGv´Ü­wÞI–¬RÝ‹¤ ö08:åK{LØFDÀ—–0bþŽõSÆ=Hˆÿ,Ùa÷4è&t¯Å“?ø‡ˆ¸ Ñ~ü½jŸû7L‚½)HéBÈJ€%L±‰ A^pÓM7S/òT0 þëá„a‡3\æÜ‡ŸÄZþ¨'Eàʦ¤\/…#k[´­"£Ï ªå¬âWž.ÍÊïtKm'J+¬K‚‘i/†¨5LipWQרÔ"€²Š äÀGGG½u—ù=3à<۬D“Ïn6t¸˜ãsÿVràF!]¸T­ôj'érßÚ$X߉Ä$x»ˆm˜¯G¨<†tìX£)úý¢@̳nºéÙž¿k@m<6vü€'KFvCÓRÄÂ, P3=lÕöÚœÉÀŸá~ 4FêõUåpÂARw–ا¢Ò¬‚?øò S/Í<ª˜ïÕ£<á_šhõ!A€ü\(‘pœo€…:L8܃ó9üƒc¿QìAD8܉BÂó·‚+źOô-%Ãü2 ~U4÷ìÙ½!›cˆAM‚ÕwCHPaœTùËd¸\p lD9ZÞ “à}s>%xhC‚ ´5 ÌÀÅy%€;L÷-[¶rV½ÚÒmýŽ)o—:U®WG§ËýªRFÐåÞá?ÔÑíXacrô‹F~ªC—’ŸºÅóšä«¬z9ÆœéH̼”õ~ûÃ:í‡cÕY"Ä,ø¾ûîóT3`8Ò{XÎbU€<qz•÷Íö`Ýž¶qõsÀ,8)¡S‚·×µr²C}ÆRàFqÿ0 &#–ݪÉ&…Q)Ör¥ÔifÑŒS‚¥<}xfj긌{ØÐ,sÆVÕ]ºrXö“¶C›7o©¯“YkäßJ‰/‰9¼3 ¶¿\›' #׊2¤Büû6`´}E ¡ÝäÍEâµp Õ£Æ&ÌQÄZd¿L´`MûöØÞÿìPø±Å™ŽèX` nÏ ¦»L˜Ç²jñÀ ‚ ËTåIL;¢-H5L‡¬ ëŽíÕ'^L!„“V*¬R*¶çæÚ€eZ•PIa8)ëZíN >yúô‘kž±õ:‰vX p\8K‚|É'n‰¯©âœÎŠ]ûïtK"bÊßJ¾YŒy€óW+dWœEqüEMšÂŸEð誫¯j^}ÕÕõ=»÷4wëGÙ¸ä™1¥w•aÊè ´„Ê)ÁÛK ”Þ@?ó!”U€¨ …A¹FGG›˜mê È5jDë—¨ Qî=ôjîÊ·~è¥| ÀíÍŽoâIúЄ²wkWòDÊì/Áüê0kŽYåLã©c0h…•@ã]Õ )—Æ£È9™1ééI…üÔxZ›6“ÛÚ¸€õ¨÷®îm» h/Þ /|^puµmQú #ºlõÙCæ%!}]È?¤eÐaq}–̤3szëG(Ÿku¤L¦£££Û4ßïjÌ¡®«&T†Â¨…!¢©°º2S#6`|ö̹ã:"zÏììœ:.<ä–Tm’ü /a}m³QUãsô‹¿% ȸ¸bŒ\Q:¥ƒxüæyy$ITj°¤m±¢¼Ô¯ ;Y¦zDæm ž4ÀOD…É¢ÜÃO}xW×eD'Œ÷‚ßÀA\Å3WB7µ¢7At^yHœyH„@ô ÍŸIÇ…^# ›(K— ‹ÊHÃG8Ò†“¹t(Ñ  ¨N –½Eý¢@ÄqNýèGQ©SNŸ8ybß•Wîùv}°’^Qô`òÈS«ª©ƒ™Ã¬×Á R5µ‚ S‚3ƒŒºt»§RsiH) [Ô®aŽÞúégI ñ+y{ÉÛ%–¢ ß—DYA@«WS¯È‘¼òDÀßË{ IÀ.÷àêtˆ@ØŠ8Åù‚«ƒ¨øI#ø\VAt¸:Ü\v1Íàê2y†«{ÓÙ±xŒ²É_åyº¼‡Ó{ðσÞÉWùÙ$XuÁºªü^`u8¶­ÒͽK¼è öxgÇÚÝ\:dèµ€§-@ÈÒ¿£¹_æOô±ôIª:Ô“Ã##ïœïŠo-pW-,8#æÀ±‰¨Óÿ€„†Þ¡ñ—ÎÑ¿+oÇ¥«ÏåÌ9à'{ø©G ÒÆ{¤Ú˜«ƒ¸Š·(D^\r ÉÜ<‹ð²ºK\]Êk˜::/ÏñK®Nž”¡|,A€èeÝôÞÈNY¸xç‡Uüž¼$m¬W6É÷· ¶¹Ž6^EÞK’dIƦ›4LЊY1íãʨ@õ­ÿÓ$©?çèg…C,¶mEr¹xLjø•ïJ]¢)‡þiS)MÿØŽ¡$+›" /P•}ƒÂ®¨Bäÿ$ŽHÎ=Šj +ñ=âò^ðêƒ4@X¥a9n®.ÄnŠ«ƒìõkön 媯ˆN cÔ‰µÑÑQR»YŠÀâŠÇ7nÚxÝ¢¾I­«T …Ó@á~ÈʉB›·l®Ó¡AQSüÁ~ .&ÇOp2XbÅ2bš&cþ Ñ+28h‚k€¼*q ÊYA•.:j´8Ãu"XÆêÈôœÎ†˜^¼% 2²‹ŠäÓPj9?1>¾/¿ÓMˆ Þq è91·ð¨ê{öˆeµ£Ú Õ×1XΠÕ1}ÓäN¡ô®Ò‰(©ªëÀÅLd>p‚Þ5!›¨0ݱ+O<ñwÆ<6î%BñäÙqÄñ\{^ŸŠ¢ã 4׋ƒ‰«/îÜy5Š9 hš²˜«íݳ·¾cçŽ!½Ñ.R‰uÏÕC1wîì9çI90%]VÊñåÅ=êÅs¼ïôó|9]ôeR§ÜŽª~Ô™8 ;8G_"9‹»×õ%åñ‡~hLS3êÓJ;¥¸tŸ×-Ã/P!œ ñSFͱ8ÎÈ&Á:|`´@ñ4¾ӌÀN‘~&¯sÓʬmÛ·qKqÃÛŽT+€þ@ 2Êþ”Wä¼Ì} H)­³Õ ÂÊÑ’â± _©§Ê‡VšøÒÄ8qÜÃÏ3WÄxApŒ_@Xâ‹[/Ji½(}Rs÷»5Wß[¿êª«½®.«Øº`bHsyñôáú¢Ø D‚´ä\=—ƒ¨kƒ2ÊÇ)ÿKªO¥¬î·ì+r ¸h wÞsÑ_ôÈN¼\Di«õ?ôðܽºw\ç.Vúãê¸è„®3ºfЇhŠÐdj´fS*Ê@\ýõÍF£ÁYmó ['À¡ ³3ãZÛ¿Ruö ¨èÀpw¢‹^ ”á²Ú½PTÈà\ü¡ïZœ©'9*OAƒ» ï=L9]é<«ö˜Êc…UiO¿OdPâJ\\+ʲßqx|p™«+)suLcÅ4àêBv¬åöÖ™«ïÚ¹³®«Žˆó‹rH]¯•åù9¥_˜÷¡œ"͈ Æ{#²¢º\'#{.Ka©nötø#ìrÝ£Ï(/úˆ6”ýý¢Ÿw ;HÎyúxˆ’¹¾¾ÆÕÔæžY™6­}þgu¼úIÄŠ?®ö?¢bÕ8¥kFyyÀ9ŒkB¢‚t6’€Žrª?ðÀ ªìFi!?{úìø»¯¸RÎ\Т„M‚¡okg4’±£3øÎÈæÍ›êØ3óÉk¿Síóà¶p6ÁŸß ú“æÊ½òÖ=,LN0>`|GSš Z­ÞñT ×›>¢õùÖ;ÑŽ>€å~ræ½ÆÊbuÄp• <¬”67jË–Õ°ƒ7Âc)âk®>,›ú¦×)ÞÚ$úÃÕuLØÌ suŠ„{NŠÒY“õ‘ué0Ë<"Pr Ÿ´-zÅóå¼wöeç>ó=ú¼¡Ÿè;ð(“†wH8b¬ G?|äð…C‡Í‹ð离*Sà/€° ׆5æ4[Oî"½†KÜ‘HQ^BO┎|™ʾ‹>‘ñÇ;ú Hwupu!<Ì“pæóZýjê´ä]sº¦÷ï?páðáǦE¦ÄTQèA9Õw•5£~eŽVeœV“*{BÏãºsPØ9MætÄúâþèú˜õ5‘¢¯©a ° ©i¶_GüÑÂRÀ õìtÝÂ:ã\ìsôWäC™ÑgÜyÏEª¯ªÜðWŸx®Î3q8 U&ï Ò•ì3:çð‚ é¦eD7­ði‰øè =?£±™á•K|\SºÎsé=×Y½?£z øƒëŸ%žÊ¾ äŸ×}›ï~÷» MkJh k@‰.P; ªyìèãû LÙ$Z’»t }Å€{êD¢oß¾UT„'ŒÜWè8-4&—å2Q8@¦O+]¯2AüÜ–-•°\9½òŠw¹.ªCÔBÝ´lÍ#Uç €;È‹ã®eçê :—œMcY’Å4V"»µðpv)å†vîÚQß¼™m¬ëshà½\gdçcÔšVÈÂÆS‹á$…kÂP/!:ýîºQrª#>‚OöúÙáÕ®­‹>#×Ü_&VñÌ{!–û dç™x´Åœ ©ÀÕµ¤ÝÔü9.Ùá_@|ÂÑõDÉ㺠½ |Œè ŸV ºïòC¸, ¨\âÙ¯z˜0ä÷Ôß\óšB,€üò'ÂX6Ö„ÐhK'è\+up#ʆaQ³ýs³óçÅ t6™¸‡ºÉj½‹ôn‚ng#³Ø·mÛv¸ küO%QZG]Ú!% ì–6P-ÞõŠqTmGKqKÑJÛÓG—¤Ì­ðöLÆËHpâ“°êK÷wÜ6k9ÅaÃKSÜÛZx€DˆîUi䇶¢—µœº–ÉáèßÌÍÍÊðæ Â[1W_7"JÎÂo²U,ÑKÁ®—!_y °êYyö§ˆ]!ô~¤èiÙÀ诈@å>ó÷\¹Ï:çêLŠÕª‘8ÌÕµ ¶(®>/d/çê û”$© ÉU¦ý"Ô÷gd7Â+N‰ìFtÕï‚êĺ>÷9üÜõìKõ™WžsÊgAÄgAõjþØýXS§,û[žLEÀ×5!*ÔD§AéX¿×:m Šl:}æô‘©©ó7o²IððL‚«ñÊ­±KÃÇ/›D¤mÛ¶jþ¿ÞOþƒºÂôGKW%ôúyÐ çx)Gõ‰+¥@ÃV&ôº ÀϼãÒÀÙ#n ;ƒ.x mlxÁ`fÅÜž=W2oçYëêhà7™«KûFz§Õ|}*›Æ2>Úã*ÎÎÙu²¹—_…§z!©ƒÌÕYÆgdyå(~r=Sän¿RñÖ¹D«{-º¦LŸRV!Ëz¢¯ˆý%Âg¼Ëýež°Ü§æêÒoTsuúD'7Atqô9)æf88#?sõ)S";\¹zÉÕ-Âk\àì%¢O«Üàê ·]ùÑõ sÙ„Ȳ¼f`¹TýÅEÕmQ¸ØTYÍ¿øÅÍw½ë]Í×½îuÚòãÖŒ87ýÐy8,u¤3•–IðäÉS§»nÇöëfd ©<4Ô dü›†5†™A[lÚ´¹¦½•I0ùçT.§íÇ@#ЋLÚ^v{y®øNÚ-Jg˜":{@|àD™´?ƒ,ûœ_T?M-R ƒ†+ÛOðFŽ ¸æ6†!®Þ›«³½-<"<œ]ç4ÈTV6ðÛ·Õ7nØè/ǪŒdD£<ægõåÍù©™•rpv1þõÚ>‚F†ŽÌ$—–ÛT?Æ%õMjA9Ny Sç1@$Õ- =žÔ‚”cÎ'59EL¯óoŽ\…åþ«ž•}18QîÑ_¼ç¢è3Ý!šnÈ\øÄa®W×WÄ÷Y]3š«£·¯÷!Ž{ž®ª\˜3W7"+‹åºÃÕ! %²ƒèę̀N 8œ==¸:{i„оë½èksQuÙ›\ óE;´5¿yë­·6ï¸ãŽš€ObɶÑ&ÚN¼5'ª„]>%˜y•š>1yâë7\ý­êvŸqp{˜«±LšÞÄúŒ$l.Ag6¥ùTP9—ÒºQH%ÄóÐÓ1ø9/n}ã·2óD„ø+HÓJÝÝçv¹. .Cmæ=ƒÆ…Ÿ÷%€ ÂOp‹lx‰å6#º}×»eµ¬t¶¤2!ͼLÃQÎ%£z*Kˆ.1_þ¤…ªPˆ¹ºÒ¦œ4NîÉ\OâàFÉcþMmrÿ8JŠàÈ)]$¤í9nñañŠwÎX¯r=¢¯ü¦è/õ™º/¿ú+¸:ˆá\éO4ð:ñdŸa¹ ñ]pXÎÕAv#®ÒÙ•7f·Fr•åùºâX´ç®úÙI§¸Èn®®8«gÎÎP).Üdo ‰‡Uƒõ®ÉRá 7Üà)·Ù›£££(âýÝÚJ›@~ôrá”ÖÞ5't<ŽÊàÔ Ïüñãcû¤ÒØ©è@–£¥rzI$RÉÀc›LÔšH縷2 zŠßÖ‹å|ŠmÛ‰–‹T…¾xR9ké®\ù^+ËòyodÕ 2hÅÅí0µþŠ+Wß³Dß%ê­²–Ó\]²¨/„‚kVÓ³ 8Z;!ŠÌ­]ÖПÚJ=Ñʨ¡9AÕÿ"GÕt=IŽEÌäªN‚Ô*-!­ØòEûåMá9®¨L~Ás~Œ4Ädu XA*ÁÑW\´7Þ g'W§}pu­ŸÃÕ祿 …ÜŒ jÌÕ%ÂOë} nW[„רÀÑCä·4 z²ƒèå\D÷•£9stÅ«„W<_"ìlf¯šBøšló;¾ã;üÕF£adWÜÊ1gÕ†¾ ħÍ<—nÍ@dLG㨠$u$ ­=zl_SbZZÌaÖXÔ…ÁlòÆN›­?Rh]+;\ñêWm?­ð–¯-BÛC§ð¶E)ˆ­ j‘j©—ÎOÎ9*SsõÖ\]/±v[X˜¯Ïf„U\#šæÎ;›;we^Å^±{W}ÇöõM:ðk9ºâ`ûyqvA¯+M'[„² é883:õªûÓXJ¡ÜT;‰?œ}&!­JÉÒÛÍmq‚øÉMô£”D¢mÐs6é–ʈ^2’S@Ö ‹ª¯_ý)˜zÃ[° Ñ£?]6¢‘t¦ÁÕAtquši‰WŸÆˆFéC„ég…å\Ý\]Ù©D· tËqõyµ›³ý=W—ßÈ®z{ž.îìQPzß5M³âdç È:j¯ G—^Í_I¢¿J§lŒìôA糧‰¿¤ï¶f *„@‡s.ŸqÒ _òä‰CÊqq¥+5zSHê µ‡Ãh”©0"çöíÛ¬Ø"Y”“02‹ÍU`?·_œxOÄiÙ7`p1ø‘|Äm« M’çjs2¢Éœ ¦íÒ뚘Æúˆè]Wp$´•r;w‰«oÝZÐBʰWHÙÙI:p¥v^â޾Ù¥‰o*/wl«Ã@%ý!Aƒ¨Xzë›~ø ‡ß½­æ8T?)º<æÈ)M™¶ÈÆÄ3ÊIáÑ›$nõ•CUŒÜ EúËp 7î/} DÒ¯ôB†8?ÈÎ\]Ž}üîs˜¶ÌÏÍÕÅÑg…ìÓûöí›òOk?-}T zWáÕ/& ºªœ«‡$`Ž®xý5ÆáuG Ï\½âê'suÅÏcžî{n8ÒW­Ñhø’[n¹¥vÓM75¹+ÌÜ^S¹68¦àìÊÎái¼S?`1[:ârá<ÞåË¿¦€)  ¦Bœ ðå/yAþ!ÍŽë›cc®”i§ïA®hü讼h KM¬§"…H ¨h_j£<=á×5H‚ˆ¥¸9I·TÑÁQ2m§ÎÜ£Ó,õ‚.û…€Ò‹VF4Ò\!dß³çŠÚÎ]ÒÀïØÎ)4¬|$®®ºÓŸ\Ö3QÊAôÕ\ËJ/æD/ÒVñMj*ˆ z’F‘øwÜ” êé¸)(šã¦§”#X* LÏ9ÈÕÊÑÊlÚØãÀÛ'Ñ_d’ê‘€Ö| TŠOec®¾ øuë=pqîü¹ÚáÇÏ9zk¹ ‡š9ôÈ!4ðFvõ7È^!ºÊ€«Ã­AtnSêW®^sõR1gDWº ÙK®®²¬}d©¹ºÁFå±´Š}L“ï¾à/h>ûÙ϶%63Z…A¡è-Grà=`Œ>ÈýЊTø"^¥þŒ§åïkJ¢˜¨ sŒØƒIð Ì>IÏ™¹°Xgz*‘×dÔ­;kÊò&gõöFDåÈZ)–ú€¡–k{hwñ0Ž Ð¶gâØt0M édÍi4Wç|¹Í@“}ëœ>ò›Dzή»ƒ»I¤•8.î®eÓTŽŠ)½ÊÑ\=Ê‹*S5‘sZE‘##]éß”?½Jéâezâ—88ÚìÊø1âšÞ'ù§7 pzƒÇmwRýä¤Ô[öÎ…êN%Ž–D;¬G†×a^ß&ñ]⎢5põ}ccˆï³ÌÕ%ÂÏhùÍëêRbÂ¡Ë Fp•‡½|©7PÝL”GÉÑñWˆ®1°ø®|½Ô¦wMåUqöÔ"/¯úëÅú¬yS °ö¢½ÈJ9tb|îœù8ãNÙdâ>ã±¥Ÿ€+®N®^¦ ?wÒp­Æ]•¡ÑÙ³““_GÖèó ¬´WœçÐxe™:‚åªæØñ±ÚzýP‘GOçRø¡süÐ3:qÌxŠX´¥+Wð¢YÍÈêÙdÅb‡æëš£ËDö ”r|ø2quö«#단! Æ'=“j(Ù®.¾ÉY²¶)jAõE`ÌÕ3'W­òàSõä9º¾‹&›”)ïâµß9…µÒ9V&$O¥8gC\ê”Æ"©˜¹ º“ÊS·3å‘%Š]KU´Añpæèh±µ2álèËsç¦jGŽŠ«³áEsu´ïÌÕOH?©¹:H¬Œ[\}¨ÎöV›Æ*Üs',_ˆï¡”ëäê {¥˜ƒ«kÌY­*×ÕAx_Ê`ò~úF£QÙ±°cé›i/J:æë ·¦È¸`Ü ®˜ÆÄ•bµ~I_ºÈ+îå»Õú; lµÙ´§cpq(0 bê8wä±£G÷Ó$Ú® ?é7ø9~>‚i°^@Çûeïê8s™œ·„­ÎNNÌZ·;XåB Zƒ†΀j[‚4ðLI°˜cž¶K"ç!îܱƒã̃«»ê>€¸º`,+µüÊCOt‘q·ïög$$}‘Ý90Çt Z…>€Žp\w<¯rdßr gW(gTU…Ç+úTqHyF½õäÔÄp-èÀL°^á4 ß°~ƒæêÉZŽxˆ·gNY;Žbî(sukàáê(効:œÝsnÁ"|ÉÕ“~q¾W7²kœÃZÎ]ÏWWýYj뜫ÃÕiExÅQxk½–æé•RÏžzÄûÒ_0ï¾ÀO?ÑàEhäËøø‰Žø¸¸Gø¥¸¯)ˆ ÓX„"ðÚk¯Õ¹dûèÑ!MPÇè”àluKñãáJÝHÉç@Mô§¹1£lj+j›sUF)}ÙöÎ%õù¸»¯•¥¶m$¥Ȫ §86¢ñinß±]ëë»j»¯¢³Ô&mW6÷‚m Ñ~Ò¦¹å(æê*ËJ@¶¬S¦òöx˓ګ_¦CB–ô6×˵Hið¦wÜK×z*}öWý‘Ý\]0¤¡JxÁ£]éq(akF£)®^c ‹ŽŽ4 ±ïËsÆÛ‰5¨AÔÕëü/JçþT@ÜËw—ÿ¦€ Ó@…+Ò‘uȦӧÏ‘é䨖-[Zî’˜U×ifÖJb”/€Û (sSu²öô>%Xý ÂõKG¾PÞ~êÇ Å\?Ek~¸úÖ­‹2…uÝ©¿– ½©CëêCRÞy “4ÖÀK„× G9ã…$ЧòŒÍTJ£KåáSß8ˆø¤„@øžžíçY.Â[ö-É£[?<Ë}`±?^¨ ~§¤zMF[GMnCn‡ýŠJéS™¡ÐoþÀ í”é a}æê‰à3%Ò/Ž[8,®~äÈcÓ¥˜CÏr›Èn¤ÕØ´ÍÕU†çëŸ@rî\ »¿âuZËY„WЀðЧê7­˜ñhr)Ì-1ð*LŠoZ~×w}Jë&ótž™šÐဥoMÙô¸‚Ùu…2Mø¹»O‹<ËwO”Í @4„΂ JãY—Ið¢ü2 >?©CB‹’6æçEyeª÷(;Ú-H~†7(3—vM¹ÓAÂpŒ(èC>ÁÙyG.“»Ñ–‰Ã<Óò¢çëßwî€È éü¯«£‚Wê4W§#´\Û*ÇÜÕ6W`1l™ Ý÷~åö¤XÔ+ÍZÏ„µ@M>?ˆ*…×ï[1ˆï§†Ç“ï~“;Ïý*À­rÇO6ù=}åºF49}&k¹ Œæ)Ëmä ñ“ˆ^c]ý×Ñ£Þðòè£ÑOøp ¢+\oDsõÐÀ’s/çꬫ{m]áž§ëž‹ó&,Âãç’Ã$Ökëpv•ɳTÈtÔ\¥6)æ¼c ÂŽ|÷dó/mÍÕ0ÏëV„0€¯…Æ DžÅ°N> /TMº´Á R\]ž¯+s8T5×F,U|2ÓšÒ(7·n‘bNb¼ ijp÷Û·k®¾E§ y]™riÓRÝ4fÝà eè-«:‚Ɉ#˜¢=àJ¾Çà§;i”@Å·á0ÅŽ;ˆ@.Ç" É[IÈ"9Ý ¯óæEõÞþ"’òA"ˆá¡`LéWáÂKA"»næfBr9ÅŽ?× ÂwN¦±>2>ô˜æêˆðMËïÍ.ݸº¦ÚÆ*䨽àê&*¶BvÅë7W·y¬úPÛ6»èÖ”øõá1 ±öNþüç?ߊ9¤P]K®4µÍ! ‚ìáàêqEXyï†ì1®e¼oÿ%'Ì£pâ ÔüØã2 zõ“$&¿¢föG,:]ƒRß®5ó¦>hˆ3…¾ "8sBsñ¦YÔÜ\Ê8YÍ Ñß4’˜>X¹ÎtbÁ‰C7•¢T#:3]!Ì:-Eµ9ªCLÕœûܧô#΋tn¹heŠ K¨_Ü é=5Ééñª¬2/Ê{úD¦Eø/¥´®ÁD‹ô¼S[9Œ£©µiâ)_§–Ûê[ôVIÑ7Ù[¨O¦µôx|üøÂãÇàìÇ0æÒ,Ó'OœÎ òZ|W=b®ÎüÛˆ.¤ôV݈N:Ò€ì\zÅâûœÞUKm""í lTóÌÕ‡ÞÇz²)ÛkÚáèFƒÍgMæéèœ@øNN­údÝ Y0ÞLÕžX ¼+òÿ¬9Ðà¸I1,‡`¬9 ƒ\ÙÇ&‰ÏÉ$8O ê)©7!DêRÀÀi3 _Kb߈´í‹Pô];wi¶ú–ÍâêÉ^9aæŠRNËmlÁ6µ™oÁÕ=M® Kîå¶ŒzQ%êöðÜ Kõ‹¿ËíçMôE¤rºü“¦ •9ß*N®«+íbÔÂ`ú—”‹Ê9?Ó6€ަxºàò‡ÕFD÷uš¯ÃÙÈoN;ý´áeñðáÇPÌÍ7Lj†¹º4ðSÒÓXWd#ºî(ä‚«²Ûˆ&½äê1WŸUÈÃûÕóÝsu\õ1WW¸ExåÅ<ÝHOßiÌYq±è®{ØJ$ÇD‡ËÀFôµòr$El §Ý–n$Evs¤/y•ù•ï¾ÕükN¢ƒ °£ɦŽ-“à“ÌLÏ×yo{…  ÌLGRAwB) ŸÃÐ.k ™U…á×¼öµèš›t`¨¬åXV|XSÑÙð¢SDsI„Oh˜ŠaÈá¢H-œUyé?…e)ÄaøqÜÂïçÞ0PBݶp…UÏT@#œŸÓMíxØ1 I•SD·×SEIqéoqóÚúMBviâ™¶@f8Hrr‚µÎi‰í‘ÃGf=zˆÝ™¶–ËÜâê5qõaiàe»¥¼­W>Ëqõ Ñ·œ«wjà™¯{¹M-íäêÕ\]Dnä–ähŽ®õuÕGcï%´h/]Æ\=4ð<ÓìÁ€GÚÒÅXĽ|÷÷ÅI@ ÄÜ]ƒX×QŘk?vúô©qQô½<¸€N ö<4c·„ ~aä’Ù¬¶M¥y~IåÄ4WõïYDF/Ï…óØûfÄ#Ã4Ì kõ`_¼Ph¼Ë÷x$m®pJ›ªìl'çØòƒ¨Iü'ÌõÈi’(OY6Jù:RZ9ààLÙ©~áø:*Ý¢;œmEKŽ>À…ž±à‚›;OqõÔOkù{Y U:®9âP ûn Qhž}©„+%HοUÆv…Ip)Ý CnzGžZ°Îê6ùSÒ**ã²(ÇÑœ“×Î/‡'šñ"Ñ(ǵt© 5¡JwWDµÐ™®Ì i¨755W×”f³5ð½˜W×||Qóô}"mNb¼ h˜«ÃÕ5¹z |9§6¢«¬)í@H÷àê¤e®n¥~¥ááêFv!^e«pÛ¿Ç\]qÜõOi†ÃB9 F›]0åC1æò(í”¶"°ø;¹z º$eÛîˆÏUº eØSþ•õÀ%%Pm\£ÑðZ¬(;¢á¢ödï#\PÿB°Š«r<ó {åž~ƒ€='ñ Ð/9ç¥÷»”–üy¥ŸˆCYá·Ï%…a [¹" Á~ÔD‘ '8)æ*­¦³A9Dzºæãn«€¾iý&}àB^TQ!Ÿ Làêããcsá%Æ«ö«Ÿ>uzZU)‘ÝÊ9õoe/ä°Y¬ò²6^…W"¼ÊQëBß9W·ø®øpt¦dËÍÕ-¾«œ&ëê’êÂZÎËnlc…Ó£ôå=Èê±PÆLÃN.¸JîOx8Ò–ÎýVŽKùò)ÿEõÀ%!1ð:ƒ‰øÇÒ̶aq°ŸœŸ•SƒÏøVqÏþ6H)$$O”é'Oµò9N˜´’Q¬ã“g~íì/ÂxNVÇ-`tµ”)ù2_Ow=€ßºt­YÉ—ø¿¬ %º¯«oÖÞü˜«Ãõ´vÞ“Rîñ±1Ý"ü1¯«Ÿ²^}RqtUÃH®¾[\=[Ì1gWœŠ8(N·¹:¢{(æåê ¼Wp´…µ9::Z{á _è¹:‡S0ž(íãÒ•\±å=ßͧt”Éõ”»<=Ð>zkXfFlÏç°´CÉÕßtúÔ©ÃmÇ·lÝÒЙtú\˜L‚+ñìJiÂ"Üž„d‰!ç—™““ÚQ3 ¤ü—Ó-ÿVqõÀHZ$’«j¶ x…«ë°eE7Ið{™ÿÚZŽ9;ÀŽ} §?Ÿ:yJ\}b^û .=zX'ƶY¬Dø)IDmˆ®ìùèƒÅxù˹ºµð„åËéÔ? ;"{ÉÕÑ"Î[„gŽ.ôr–«,凸BD‡ƒ ±}ú Ó6–Ù˜«Þ‰ÀÊÇc»™Ò²sïæH.Æ6îþÔýòö@÷‘ZÃ: Þâ4'¬êSŸâTÓ¡óSS'&&&ahœŸ›ZQʰ6ã$l".a ¢ÁOTÎØin!Ôu hnÄ(Ü$§ øSF R˜P~Ñ…³Úà¹ú¼ëæ¢YWÑ‹@ôt8?\}|ü(†NâìÏÖÑÐ2“ѪÇ}PMÚ]c#•­wˆï>œÂvð™«ßé'¸z¬«ƒà¡˜ÑmD“e5+æÄ­—´åÞS<ßæ«§Ñ™«ƒäÌ×1 *ýDûʈmï6Ww¢óìþ-î„=åž=pÉ @4S»ªðú$ݧÇÇí¦›žý=`"’˜7(,ç<á-ˆBAþô¨ß<H©R”›`ßy“—tb§UTDö¦ µÜ&2”5ðŠãuuÐ Æ3¿@!ôÂøÄ8È~áñcÇf•^ûÕ§91VïÙ½d¦ì§3Ww¸òˆ¹zÉÕKdï5W·®.TˆÎ’››Coh®’ŽŽŽZl×݇Sp ót–à”‡¢·ĺ\j£ŸÈ#®VÌä£?JG|\ÜËwOùŸœ=pÉ ¢!.¸ P3/£”od@F*H°ÓÄ{\Rý%¸ÊèJ<¿¡s˜žÿÈã éá#_– ŽÆ\Ý‚ƒâÄ6Ö‘õ#u[*-kïSÓSâêãóÇÇÇgÇÆXn;2rNbýôÙsg-¢+ªrÜUާÐwÒ€ä冗Rïø¤S<ÄøN®Ž2ÑÃ$c]ÝKmÊxÂŒzÏICµQ!;;ÙØÕ¦ùº‘1ž)XôÒØu›«ÃÙŸZWúûq¿d .æŽXrñÕ‰Äúºƒ~yæÂ…3Þm^ÍS‹òú­¾ x‹uóx¤ßš¤7HaIŸâ;Dˆn^vÞð¢@ÖÕApi©¥Ñ Tj§Ÿ,Ïœ=»0™ç것ŸyLTp Í)ÙÀÏÎΕ\n}K9¥G4/çê±ÜFüHcñ]ñ¼¦ÞèôÛVCsu¶±v]W—ɳϓ¸î¹ºrááêFcÉ\®Þm]}P®®º™x0:O¹o½¸d º ·‘ñ¦õ/|á sš;n’°o|ìøCO{úÓ_8;;·“E Œ\&‰ àÒ,ÔK½KøDXaãW—‡Ùº^›« È¥˜ó6N2µ‘¶±6''&çeD3{|llæÈÑ£¶ašf®.¼qƒ«Û^ùÑ^}ôµuÑ1  ±"Ñ•«+Ü]ýbDWÿØœbýº V̱Ówô±JÊ,€ìÇÇYn›ÁbnrÒßWg®’–—?å¤r—puqQ½ßI§xáÕFkáËlÌÓ½¶Ž/âa#…ä>œ„Yåqšôˆãÿoïüuê8¢0~ïåBdÙ1J'Q ”†)p tHyçè¨éPÞ€‚‰&%-%/€¨"òÇ‘‡?²n¾ßs5Yîµc{¹xÃ7ÒzÖ»3³s¿å;çÌ™3³AxrhuÆêÌœ`Ú³B™À5Çêœë9½q:š½š(S¦$yæå=Ÿß.®þµ\ãï_XXènmmud’B¨vvv~|ôÍ£o¥é>ýãéé8ljÄaºB°…qÌAt–±jN=ï™WgNŸ]tÿÖX°Øã£ãså',x‘'žh¹çDˉIôÐìj+Çêå‚—¿DÐÔèäQ‡²²)DöÐþ˜ìWÆê*&¼ÈGw1é{Z]‚­NÂ)Ë”‰‹@«ã‡èxß§¦¦b^2— á Ù!ñŽ/ññùÛ!À–)o×ÂKjç-Ę¢ûûû“tdjkÆ­sG$¿+2|ýøñ÷?|úɃÏOÏϺÚ),ú„&gZ¢³+VþÇXýÙ³?_üúÛ//ŽŽNŸ<ù™±zxà1áE”qÕ­ »ž4Yýé·ª-5;=Lxrõó ¹ÌC«cºs¨]ˆ­eô1ðj;´¹êrÑr˜ðÌ«%ÑYáF ±ðh}ª¨¼š‘ “ÀÃ* '!ðÒçý¸XüCÝ2 *W–ñ¹¨"p­€‡å¹4aŒEçççÛÛÛÛ#"À¨;©"“š{þjvvö»éé/Þ»w÷¾H?"Ç\÷ää¹¾Ýö»¾+x,ïûOgìËTZ]DI­Næ¸HCMŒãõܘn#×}Ž$:æ{Ô¡‡Ê Õ!xæ½O9©l.x ­á•‚¥ÜÓyìBÃ<:x‘=´;ãuÆê¬n«’¢#3!9ªåò>Ï(Ó reŸÿ‚ÀÐf,ZOC€Öââ"QscŠ"›Y<)R=Ðñ±H0­ C¿PþáùÙÙ„êŒi™+d í«ïÜZ__omll´µø¦uxxˆ ÞÚ•òÌ ˆÔ±Ã°4zDΑ£Ñùæ:Z=ÛÍg”Z¢ã”ãè—¨[&žëdþï܈Ô$+DO- aµ/}K[ˆ·´F|T’ûhsÙÙ1¶ê˜Ã!Çx=S}‰MöDÊùmGàÆÀ§ 'NâVÉ]}A ýãr òAÉd„Œ¯9ت6()ò¹ümNž}C“s¼L8dÙlgöÏû΀x@¾„$𫈛å²Þ«Êg9çFÀ\EàÆ-€«]ºô»n²÷CÅ׌À›#ðN €7ÿ9®iŒÀë 0Ø{ö:­¸¬0DÀ ‘¯Í6õ `PŽnÅ4 €F¾6wÚÔƒ€@=8º#ÐH,ùÚÜi#PõàèVŒ@#°häks§@=XÔƒ£[1DÀ ‘¯Í6õ `PŽnÅ4 €F¾6wÚÔƒ€@=8º#ÐH,ùÚÜi#PõàèVŒ@#°häks§@=XÔƒ£[1Dà¨O\Ó¼ƒ6IEND®B`‚ic09׉PNG  IHDRôxÔú$iCCPICC Profile8…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqxl+@IDATxì½YfKU÷ý<5WwUwuwõX=Ï}F†ÃðEx޼ᄆÜh†7ò~„SFÞ~~ ʤÀAò1¨ €(/ƒ2 2‰œ±çñtwÕóýÿ•k?»ª«ÏésNWÓU•YµŸÌ¹r­•kçεrÜÝ^¯×©®J J J J J J`uI``u·–¶J J J J J J T Öƒ*****U(j¬Â‡^‹\%P%P%P%P%P €ZªªªªªV¡ª° z-r•@•@•@•@•@5j¨¨¨¨¨X…¨À*|èµÈUUUUUÕ¨u J J J J J`J «ð¡×"W T T T T T Ö*****U(j¬Â‡^‹\%P%P%P%P%P €ZªªªªªV¡ª° z-r•@•@•@•@•@5j¨¨¨¨¨X…¨À*|èµÈUUUUUÕ¨u J J J J J`J «ð¡×"W T T T T T Ö*****U(j¬Â‡^‹\%P%P%P%P%P €ZªªªªªV¡ª° z-r•@•@•@•@•@5j¨¨¨¨¨X…¨À*|èµÈUUUUUÕ¨u J J J J J`J «ð¡×"W T T T T T Ö*****U(j¬Â‡^‹\%P%P%P%P%P €ZªªªªªV¡ª° z-r•@•@•@•@•@5j¨¨¨¨¨X…¨À*|èµÈUUUUUÕ¨u J J J J J`J «ð¡×"W T T T T T Ö*****U(j¬Â‡^‹\%P%P%P%P%P €ZªªªªªV¡ª° z-r•@•@•@•@•@5j¨¨¨¨¨X…¨À*|èµÈUUUUUÕ¨u J J J J J`J «ð¡×"W T T T T UT T T T T , ôz½f³ÛíÞ0ìjì>®V!ÕrW T T T Ü: ´õÒÍPäà»xnn ¥jÜ9W*UUUU‹HàF•ý•+W:\©Èñ‡††70³Ùsssð?88hØLƒt5æ?€jÌ—G½«¨¨¨¸‰h+øD›J<ïú—/_¶bG‘;™ØÅX€†p°ô¿«©.nÝEÑ÷t H‰ãFtHìÀ£ ÄØÎ¾}û:¿ø‹¿Øû™Ÿù™ÎwÞià CÀ­6W €ÕöÄky«ªªž@¡oç,TŽÀ àq„¥hfž=aS©>úè£îusÿÚ×¾–^w÷þá:ÿþïÿÞ™œœì¨WÒÊEÞM£B =ár/`jìôÍ?â¡—F‡¦æèé+µ‡î¼øÅ/îüÒ/ýRïÈ‘#!’üº «ä'ºJŠ[‹Y%P%P%P%€PxéRiç}ÛG¹§²Ïxàé9/tÌ¿“vâĉÎë^÷º.Cñï~÷»éÑ{~_xÚÊÚÙ5BÐÅ(€FÒ)…{õ…†Ðv»Rê\ƒŠCwáPìX†5è+~Ή‘™´#2,zYèaTìܹ³ó{¿÷{ŸÿùŸï1"ñ>áˆ\«à·«à!×"V T ¬n  ØÒ=‘‚cØ<‡ÞË+Wâ§‚DþÛ¿ý[gbb¢óÕ¯~µóÖ·¾µQö%ÿ5ºE¸º({pÒÏž½øJæÐ¼¤¨×>,E?$zÆ#X+|ÒuÅÐC§ƒ! °!åa¨Vp™¢4 ð>2^zŒÀë+^ñŠÞ¯üʯxàÚµkW•pÍC’ ª«¨¨¨Xf@9ãÒ',刷¨Ë·¥WÅK8óÐ '|æÌ™ÎÇ?þñΖ-[:ýèGY çáyÂÀ‹^Óef¨8]i4лÎ)1’ÊƘ¿”²çDÚ!2pºPÖëºáÐHÂèøØø0÷7mœÆü¥‹/^ÕèÂé‚PñãB‰!pYùq³­kNé! ²ÍÉ é±3àÿð{¿ök¿¶ê¦ªà:Rªªª–ÚJ>¹–rË`ãG|ö¸ ·çé3=”÷÷¿ÿýÎÇ>ö±ÎÌÌLçïxG÷³Ÿý¬ ¶àa HÑšù¤à3̾•={zåcêø¯=xðà”FŽJéï¹ë®»öjÀó7oÞ¼eãÆ;”¾Ne©ž×P>Ê€‚ÇQxcK!þ•ËWN}ãßøøß½ÿýïйÿ.Ö•ÇÆ…À™È ðaiüñÿqïe/{™e^èAg¥ºj¬Ô'[ËU%P%°¬$€²YÌ-T@ÀÑcÇ1‡Í½4®{ö ó³ožyí÷¼ç=¯ýëuëÖyqÞÙ³g;çÎcx_èQ1Œ/¥ÛÍmqÄZEé¶”ÎBÓËgè}Pо+ØvOeoZì?¹þè‘£Ó›·l¾gÏî={Ž;rpjýÔs4œ¯þüºi c˜ ä)“.xbTÀÛøPð0 >èá€/Þ†¢†à]e8ÿ×ý®×ý韾Îs€éÂ`j€ c#àªÐ°KtsLs|ñ‹_ìჾèÊtÕX™Ïµ–ªJ Jà6–Êe¡[LÙ |³çK˜|Rp׬À'ívôZÙWÿØc¡»o|ãMFÊÞ½è6MzõŒ€Xü¤'¸dPluéÒ3ÿ޲gNe/¯‡"Eùr]AÙjè|ƒzï›î¸ãŽmÓ›¦Ÿ½oÿ¾]<"àîõSë'5"±>•<~™š`d€üÐb•?ô|O¸…¾#ËÀ‚!ñ¡Ó}à^óú׿þÝB)Rsg„ArQ†€×ÈgÁ,YÅ;»z¿ýÛ¿ÝùÝßýÝ£!Œ @[0]y®+ï™ÖU T ÜF@,t‹)”ìK.4 ?ãÈGÏe/E×yÕ«^…Âì<ôÐCw¾ó6¤¸®ÑVRn]ðH6Ãé(`Ñh3gÝ+8ß§WæÌ!|Ý¥,³24Æ4²°YÇìn¹ûî»wmذṘٽ{÷QÅ™X;±fdtd„2ѣ׌øWg¯Š ÞŠžp–¿ðå(~Ò >ƒóüR„@Y³ßN;æ4¯ÿÿêp¡V™ædäœRÚEÁ_Œ€`¤ÁF‹%¿ÞË_þòÎoþæo®øíÕ˜W•êM•@•@•ÀÓ—@êÓë)«Äl¥(Žî–|(û¢ ­ ÿð‡?ì<òÈ#“'Ov^ýêWw§¦¦:_ûÚ×ö?¿öë¿öÿÈ`zX¸Ï)ž‘®óºr4à²Ò˜ À°™emÃOüÄO0mÒãÉÈü¶x{"–UZ5–ÕãªÌV T Ü.Â0+O¦R £H¤”œG:±V¦'ÏýW¾òo¹ûæ7¿Ù¹ÿþû»,Îc¯=‡ë CÃA¯\]zöÄ‘–k”½`QôB1ˆ²Ð¼Øïå¼8kCÛ·oŸ’²ß/¿õ¨œ†óŸ½wïÞÍZœw‡¦ ¦…‡9ù.Ãã9b!\³Âyµ”¯QöðˆŒRNЕ[¨è‰{ZÊžŒ‹9 ¦²p‚à¬øà»Þõ®¿×Gƒþ?•ÿ’X=®<gtaähS6Ê‚ÀÞ/ÿò/³^bEOÄØ’¤P]•@•@•@•@_©¸ú1¡|ó×vÀ£q,FKe/%Ý€¡‰g½T瓟üdç½ï}¯•=«ò?Nº¿lG&)-o·ƒ–z§&H>FpÚÃVH(QÏÑk$ƒq†¥ì¬èEsNÊ—+þFÆFÇFvïÙ½M ð=vt«þ=Ròw©—¿Yóç‡Dw\|ЋïbX(/óõ Â ñѺº8´ÇJŸò+Ý|A[nž²Oð?_h†¾¹?…Ž-øþ±û±ÿë¼ãs§NžzPibÓlÁ FËT| -ó¨ÑbجTWGVꓭ媨¸a ¥0>ôÕ¼(+8âQp©„Y(¶,9ÁûWõWÞGѳíNCèîí3d®|M,Åíù|òaà£ÀPøÅ¥²gþ\º·ˆŽà¼Nph`V¸?Œè¯‘b_³ÿþ]ëׯ?¦àlÕ<ýs6lÜpdû¶í›ÔÛÝ)Xö5£àRJN Pìø´=ØU”"¥èSfÅ7o%}É•¼™x’ñŒüæTÆMŸüƒäÿQ•å¼äÉtÀ)ñ}J( `—€×(žÕ³z¦s¬øƒ?øƒÎoüÆo¬ØQ€•kÚ;-šT& `Dgö³Îà ò)Ç€àXÐèdÁUz÷mE/0óhŸŸÛÅÁo:M˜tî{î}Ge|Ie l,´‘¤0‹s7–Ï(¯‹-qm|ŽX!?Må[!å©Å¨¨¨h$°Xâk;Jžx”>—”é¢ûê¢Gq3/Ϫ{¼¶šuY™O~m¿›\„ãž½h¸½…'èÉO-å<ô²Ë%o`P0ºè‰£¬²g?+%½e®aû {÷î=*ÝNÏ~‡Ðy®zù;´hoƒ–÷]¾ryž²W91r_½‡ Ôg#zöȦĵ•ý5åîvv<•¹'yuO?qñÿßÿû¯O:õÅ?¦ò="ÞÓuB×i]Œ0ƒ1[}.€]ödPY&à\I®±òVR¡jYªªVŸÚŠ,K¿°Á&‡îQü\ôÞ™³Ç& šž:Ãõÿú¯ÿÚáóµŠïjqžzë"F $­HçМÒ=½².¸„Eù2NoÔÃùþªø±R¼Çýel¬ÎÇŽ›Vïþm»;¬OØî_ÏÑ\ý´¶ºM€ƒÞ<ËS0-®«ÐF V T Üþ N×nˆÛaÒQp(F\¦á§²'] ÂC÷¬ÀWº£ãÝÏþóÞk¯!cRÖ†FT~¤Dºè^ñbå .ø*‹òE/ðÑc_=m-x؇OÏüŠ®`N¬jþPsõÓôàºß±}Çs·mߦ“r¿[Šg½zýœjgEÄ(Fˆ†¨!@Ù«hVöZtˆQ1 ?y/×9àÈäÀ ü¡ì<_ù==ƒî}÷݇ð-• '¦OØ €õÇÅóÀ(CXLÈó3³ÜÀ·Ò\5VÚ­å©XAh7º©«Òo‡²§Á§ç‹.Wàƒ‡{àXˆ§­nÞj÷½ï}¯ó?ÿó?Ï|æ3ΧôF!OšÅyR¾Þ†Ç|?¸À£a4—÷Ö‹v£ìQÔºÈ3§(Šå’ð1€á0*e?£aå÷Þ{ïõ꟯³ðµ6o÷õöJY2mèá3Å c}=4­òAJÞ _Ü£°,ö[TÙS´ñ|³Ê~(;ÏãСC›Tt¾/À‚?zÿ,è-WiyN€žÓ.½¿þë¿î¾ô¥/íÉ8³ŒC”JY®+à!Ö"T ,W  ¸Òe˜6ÙôŸž/—” W×só8{Ò8Ÿá{†m9DGCãnÀùÚ]qVˆä-Fƒ=ÊòÅz(àQÞú&8†ÔEÑãd„ ìÏ 'ß²Ôüü„FJÉïºçž{vëŒùHÙïÐ ü½£c£{  ¯LK@K_¦§å1Mož3îåuQRìå—'Í$ÙaäGéx«ZÙ[åy #ÉѧÊè×óØ u§•†ÀþL.zÿi`L!sd; ºÓÓY ½·¿ýí~>+i ¥²T¯J J`i%@c¼Ð¥Ò"¾NX# X °ºW¯·™«Gù¢D¿«/Ù}âŸ0}ÑÍšÞðð _£ìQ¦ÐC1 |Ó  |Òá0 Œ?tƒ–ó!:‚õgd¥øæ<ÃÇhãñ0¶gÏžRö‡wîܹ[Ãøû6mÜô‚­Û¶rˆÎnñ<%8ãEÉS®Ëg/£ènžƒÑÁ1–A©ìá«äoËI`Q,«»VÈú¡g:§ƒ•FöîÝ‹ðCÉy\ÏrLò“œçÂb#O~XZ hèZä+ ¦+à!Ö"T ÜnHÞæ«(«v”\¢ˆQt({”<ކ7_'Cúôêù>=Ûî^óš×t5Gî³ñ~øáyÊ^J•“ò’ž5% åÛr(e¼³) xH¼0|O·~Vðh_VŠã4аfâðáÃÓRìwîÛ·o§—ÑÊûg«w¿QÃÄ;UÎåó!: h]]uhõPHºPö(z”M#dÀñSd&¯*zäñtr•È;šva•&ÚœŠòÇGRé¼0S>gê€ç3÷…/|ÁÏCm%¹j¬¤§YËR%ð#@*ð6颰ÚQVî ‹²GÑ¡ Qˆ¸ôÖæì{æ\µ(¯óýï¿£=õ]†a¥t;Rô]”*4Ÿòz_=÷Âëívà—Ñ@Ãmíi"Rö‚¥gïn½â†¤àQÖ(ht>ÖÁYáFC¯—ÂØ ¿M;ëžuèÐÁ™C›\7y·†’§dL‹ž÷ÔZðÍgË›?HÉ ¡€M[ æ³'EoµÒñÖ<Áà”µ*ûÅÍþíu´ƒbêCúPöúÓ@ñcx=…|´¼‚ꃟЇ?üaî™’‘ç‡d¹ÿ4•r¹¤ò_%P%°ô@q-tEaÍ‹FÁ7Š.z´îÉK!Ÿ|ÌÓ3TÏö9¶[¡Øµ ¯ûÿøÞ‚'…êÅw‰xx»ŠcÁÊT44wžÌá£HËgléi Þ_¶S£Î üfoýðÐðØØøØ& oÐgl÷¨7ÿõð·kQÞ]Z,xH# “…X-F”× E£!¿lÇÖ>VàS@ßÃ3¼Oœx _¡bšD„cëÏRH@2·Q¸wï^Vÿ³CÂ=ù¹]ÈÕ6ÜûWœªŽ¿Ÿàõº_1®+æQÖ‚T Ü\  ¼p©°†¹&Ö½q÷ø Ûg>`ÿà?ðžxîÿäOþÄŸ§ýà?èyzV•}õd·ã›öÂÓUš=F_ÌYÑË÷¾zÚÙ€óÁòÌ ŽEydD ÷ô™ÚµkÖ®aÉý´zöÙO¯^áV)ÿ»Õ£gþ¸zyƒ(úTö(:@Æ_¶ƒÊÂ"@öÖ[iPž¼0 ÃŽrëBÁW%o‰ÜÚDϳÑcó‚Is#ªOkT×xv9÷Ÿ~S”‡çLò—ô¦£Q/yÉK¼‘+ðÆ£½µeº™Ô(puUU«X4déÚ Z;L:½ ”"Ž´¼rŽÞ åç?þã?âä¼×¾öµžÿÛ¿ý[©qcŒ‚nÃsXŠ^½hn±’'ã‚\ æ°l¬Àôgl¤z=B |W•eï tñ6 aúõÚr§ón>|èð›6mxÖÁC‡6kqÞ]êñoÓ÷p»Bû8‹ò¤¸çÔSo¢ƒ²—”¢:¯À· à ™µ•=²Àˆç›ús[H€gE½R=êi樌¿Éo|ãLñŒê2BÄŽÜ@=˺fþ[ÏÖ÷í÷å¶(à3`¢Ï@x5k•Àr“@»ñZذµË‚rCÃp½¡Ã¹¨<¤Ãp=ûê9LGgá[ÙGO]0z78À%ç^=÷,ì+CäŒÌëÕ+«÷Õ nH0,Èâžxã|Và㤠‡Gfföp*Þ¾;ŽÛ¶oÿþ{7êËvûô[õøŽ L  ÊV˜ë^½+W®v.\¼Ð;wî¬>ÿÚ…'Þû¼ýñ±q†å¯{ˆe.Ž¢l"2¡ú·—¨«Ô5 XŒU­ç`ØÅÒÏùÿìýã·ŸÝ@‰þû¿ÿÛ–r«½¬]5–õã«ÌW \+¶’ÏÔl´Ò'¾­Ä‹²næéQŠwvNPzïZ ÕÑjw+ý|à ƒûð _£ YÅÓïê^•…SEÙÓˆò=ùv ±9V–öˆÏØZÑ ‡è0äÀ¾zögËÐX£ív»×¯[P_»Ùºk÷®çkŸÝ¡™;7‹ßý hpv×]²gàŹ ³Z™§!‡._¶Ó×u´×n˜óq‡4€ Þ_œâ‡<ôy‘‹!ü"+yUÑ#”åîx¾ÖyÑ‹^ä©/ŒfÞ,[QU`Ù>ºÊøJ•ÊBG#³°¡Aù¦²Ç'Ÿt ‡ñÉŸCï„õU3oµÓ¹æ^uâÃÞàÏØj˜¼«-mÆŸ´*gk÷¢“ íý²`‡Ä—·Û‰àù²«ï) ]éi¤`Ýš5ã[9ºQGáÞ½mûöl»Û0µþ¾Éuë6MNNLiQžá¹,š=!—Ù&ØS?ÿò ÎËáÈ™]mÛãО~Ûº4αèÑ‹ Ͳà¤ù-O$¨˜ÅmøµR_¶Æ./ ¨ ØPջѽtéñÎÞ½{4º´cíø?þ*c*Uÿ羫Ǝi,\¾'¾YÆ?ý—h¢²^%°\%°XCBƒµÐ©‘jË¡øÉ‡‚§g‚#L>z+|Æ–ÅNRðž·G!¿ùÍo6œzëóöÕ©žL~ÙÎg¦'­òe;@ÐBï}õ(ú&ÔHå)=÷ÕÏj„P‡ålÐ<ýî;ŽÝ±EÇá>{çÌÌþƒ‡îœXw¯Œ)­Â_#ÍÞ¹ôø%7Î0=v\“­ÝÇuJº¬ËS9X}8¢á†XÞ?Ëœ¬´ÍETúʽûþ¯pŒEX4:}»KcÀ†A@G˜8°¶à"cý] }*ƒùJOõ¯«óÆdP—=÷/ŸPYñå¯05µ¢|J·+ÃU`e<ÇZŠe TöjlnÛáŒdø…HùPô9O@„CqØ[Âf_=q=ôP‡ívŒ(¾O¨ ×€Wàƒ#çé¡WæéѬîý_š£qDÙ{%4Ê^‹òø²|ÍIAêàœ-ÚO¿íî»îÚ¡!üçÍìÚ¹kïž=û×®]s‡VÕ¯Öb;mɽXñÏhƒöÖ_UgþªŒ:õ¬ËÓ‡W†D;>c+Š·×剎ndønÐÑ*[hv Ô*R®Ø)þ-aÒp(ÿb¿ óÁ «?+HTªïÆ®]»&¾üå/çHõ<¯Æ¸Uœßù¥‚uüQ©ŸýÙŸŠ·dS €ðkn? Xg‰­¶‚o‡“c”0 œF N¾vÏ>Ó¾ûÝïv|ðA‘ËÇn¤p;,ÈÓ—Ê®Qö‰G«âE2>…ÊÐ%¸Ëf6`nàDOäYåyOÑäh\Và3ÞÉwÑ/škuñe»wÞyçžéMÓ/²ß>³cû‘‘±ýÃ#Ãì¥ë\–AAÏ^Ëú:§Ïœ×eñ4§­xêÚ É®PÏ~dHL 1 €f5Ÿ¦ù­™­èÑïrÒîÍ9¹JÆ‘RÔ·Â%’¬˜Üàx3]‘R‰rŠN»!nüi†kGtý}úà9¨5Úáæ5©7?4äsœoWSO“ÿ÷ŸJ?ýH#€÷#™Æïñn­$W €•ô4kYn™²A`†ÛC»K”/=o:Ö(yò1TŸ.•ýç?ÿy+úÿüÏÿìüùŸÿyW ·ÃÁ:Ú‡Œ‘ào›“à!X”½GÊ¢<ŽÆ%-U"óó>De/>Š¢gŸ/ÛÌ€‡Egff8ÿ^ù;Ž;¶£¾l§ð–ééMû‡‡G¶èÓ9kïêp•ËI¸¨cxÏŸŸ›U™˜è±"o€ €£¢ê/Û!§˜º@Ì×Û•=M+PæT>mná:ô·î c8‘×0ð÷½r•h§¦­–ÏÚn1Œ[á¦Y'Œs^ˆ*8ptýyjÈw§ˆKŸw#Óð©ëyñ{«œøñûÃB@Ñä£M¼@¹#€0̤gpˆ¢;O~ò“o}ë[ƒú]Ë÷8Ëi eôS €eô°*«? dCÕ¦Þ~á3œpø¹XˆU÷4~Àä zð iøÞÿþ÷{Å= ËûÞ÷¾FÙ3¼ßVö‚õž{òF‘]¹ê#q‰rc$5&R]†69X꽫UôZ'×›ÓþU]gÉ#§Y…‘ñýû÷oVƒxtïž½3:÷èú©õÏÑ"½ò÷‹–ýS$- Ò¾ú‹—:/\Ô±ºhÝÞ¬6ôÁÏ>£SõDWÛíP´2œI»û CT(k`Îß³K5alÖÊÒè(u«b(”0ÊÝa‘#A œÎô:Ç+x]„_n`¤Ÿ+òæ/ÈD¤1$ˆo$PõS®å §ºæºN˜4.ê9WÂC½Çð%ŒS}tºo–èZðÀ»ƒ2ß·oßM]­ÑÏÆmà#@é6˜‚c çaà(×rwÕXîO°òS%@#±ÐÑx,tÙ¨áÓ(ƒ‚ÇçÊCt˜Ë§·œNÉsïÿ=ïyO—-E ãÓ› TëKq{»]áÅÄNqfR”¤Ÿã;5lôZøŒ-CîôÄçÔб0ív¤MˆÞ¤ö@oŸšZ×wHñß©Õ÷÷lݼyjÍÚµÛ4?¨ïßjE½æë¥ìϜ־únïJ(Ön¯ñ{°Ÿ¶zZ8ECˆ*†%5ˆš²7ÃÈõé›–0ù ­€œÈ*^4¼Âj¬…  9ЀßïÅjc0`6Çi,m—€I"ãAØ_J!¥Ø4›`B¯jŸgÏœçUݳLHãÊ^=aÒ¸è!s&‹Å¥R¼9¢®jdiPëÿR 9ùºª…€úªä°Þ‡1ñÁ >å“ÃtÀ¼QÝ»ÀäÇ¥ï›eþS €eþ+ûO_‹½ÈÙ¸µ±fÖ ùèÁа¡wÒÇñ}zîiÜÞô¦7yÛG㲯ž‘€þð‡Ñrä,ØcQ= án†ö1PäÌZI”Ï °b™}õ(û+4¢ÊƒuÀkèÕOé°œõ‡Ú=µ~êžÃRú;wÍÜ;1¹îðÆ Ö‹÷©9-ÊÓé;^dÇ0þ…ãiÅ`7>c«iàwGFõÛ®G…JWÃ×ßW¯(Ù¡ßÅS)—ÒT߯'4.ê1ïq¬\úšc:éè>øàCs>úÈÀéÓg´€õ2dýìÿø_ùÉŸüÉq¾A~h,cK`O¼uØ ¨3%=taöþÓo¦”æïTP&-¸í¼ímo›KÉçÒI ¹miÔðŠ•Àb/k6níBg/;9ÒPö(ölœÈÇ0 8ÿë¿þ‹#BÝã¿ÿþû›ïÔk•;*fžÓWêKY[Ù“¿µ(ÖÄjI´ü[µ¤Þ‡q :6ºY§õmÃöú$h—ãqÿîïþ®Ã"=Áû¤°6ÁúÅ9-Qz8rÙj¸aQ#Èd68ôþÕ@áPòÀ^sô¢³_C÷Óûöí»C×wcÛ Óg>áö!:øô À=5„€À Ñó—íä³8äÉCtlƒ@{é7M¬]{ç‘£G¶è,ü{¥äïØ»oï6Í×ß­^ÿ”†/»œ|Ç©f4¢ì¯¿pá¼–Uw×êûŽT½µýØØ(Ûî´Ò-VÔŽ‰f„´g.DfÅw ë7”=œcÈ'+?ý”r§(ÇÆO>cU`4L>+“qÌ‚èÈ…â…4QôЙ~Í @ ÀÈ&¸È°(8gÎÉ>Aḉ[¢És/Gò/·PÆÈ:¯LÃwȇ¥‚ñN¨ÚÙ'L¦—¨Ã:ø¦+Eoeϧ9Q’)® 2fUïºlã,ŠÅÝåÝI­…ôòù§²×n•®F æ´7ßðä'_Â$¾gꃼðÉ—£÷íÛ»Vü˜Ú”=†ú0GÒ(§–x4€÷91¥Çù¼L.¿¢»ä®K.âJàfH€,]6 ég<>=ûlÔˆ.¦|Q™ËûÈG>âyú7¿ùÍݯýëó[Œåi†#i¤ÊEoÆjƒÞ€^~8$d`†B¤›Ct8ßü²Ý¡f_ý zE£Û¶mÛ)žǶªôÜéÍÓ‡ffvn_»fü¨†ïG¤Ê]&Œ‹YõìÏê›ærZ5ØÑgl‡Ðô|ñ†C{Ôˆi¾)´(ÌpøN§Ër|Ô˜‚^ð&âÜ*"T›ShqPQxyKñºGé¢ @¦&Ò$& ¨úª¶–kn3Š5€vE±ûV´ìCË H¸æ¯Ÿt§þ”ò+Ö¼õù7Ž‚ªÏ{A`âü8g$à Ì„|#æGï,ã?<ê<Ž4 ‹«í¨Ç¾À’XÕ­žæê;gÔ³ø¡‡æ¤Œ»ÇO¨‡ÿÈ£]õöµ ôqÎvä8£"ÞÙ˜Ý5ãñµÈ¤.Þ‡Åxs}i3¢0pð¡<Ç;Îw!®É» Ë3¾-4e\a À¨FÖÆdàˆô†y*ÿöH€•¿Û'?Ž‘BÜbårÂ2ù©À2yP+Í|±–3_°ôI–{5Š<5ÒhDr¸‘Æ{†)?ô¡9þÕ¯~u—ÆŽ4zûÅU!ó_+ðy¹•O$"Z=†6¡I @é"-5,M­ôA5d,ʳS6Ÿ öF§§§×ìØ¾ã¨>nsà®»îÚ¾yóæçoÚä/ÛmÝ™:†”¬çÏ_PßJ߿ѾziìžæèÅ’Öá ³­}Xðl]R“¬Ñ¸ã3tÔž[AbhŒ\Žâ…§°o•Ñ@™£JÉÃÓ¯­vm,Òð ‘F,.'âÎ1ð¼ý4¢ˆTnzÙ%XDÜ` ó"r™‚&¨ *¸„âQP×`D…œÁq‘W!çu„Ãaè—†œ´Â@êú¸-Èm€(šÿÄ¥l·ÊñŒqåY6aê5Îu@0‹õêU3¥ìûLÃ}éÅw5t²àýÂï\8QïÓeF¦bñ [<¥ðõUE„- %UrÓ„‡ä ?/âoÄÁ?y´v@‰ºÊ‚<Œãçàxª0ÐS{¼ëzÇe,<¸þnMcàò“9ê|ŽÎË_þrwX®nùr¾\%^ùö‹´P ¼`   ErÔ ØXß(jîÉK:áo|ãé‹]Äqb>C™ßÕIz„…Ó„HÕpeõ/i(x\áÅ­¿@ÕÞòq;»æËvcõ}~ÙFGÇ÷ê7èðžCRúµÐh—†ðŸ·aãÆú”í65¦h|ätî¾”½zWšWUWݺ­§=nôèÕ©ËþŒ-,ùRãCnÅ[áÁ'Í.¥ÊÒ™ýFF@Ð¥tž_oÂÆ"2£ C?ŠhÊHq’Ÿqë‡|7´Q’(I03 é(çò Ÿ}2FIðq&žÏ8¼À¯ oØä;ò@'²ëž(ãV°(·‘D~ã#´Ki®Œ%#(ô¹ù.Ê.6ÊÄÏËÏž2ëâàÊ4ŒÞ…TD¤ñ>œ:u²§ó$ºRð=í@±!Œñ«xÔ¨(µ0ÔCøCìú`GË€w¥€ÙÄ®mbLj>8ðöL¤tb@†ˆ> ý¸OÚK9<Ü×Ë näÅ;¸nݺ®¹Z÷Õ¯~•—›÷}˜£„10xø¾²ü¬À-%¯&°Ä?ÕXb¯vô‹½ ùµeƒU°4^4b©àcØ’ ¶ÛéåíüÓ?ýSç _ø‚ÏÄÿ³?û³®V½{q=šÒ¸ðÒº7Ÿ‡ð¯ãðu\--}´öá£é9—…yR¾Ã,¨oè\–ásˆŽ¿l§äµÂ¹N'‚mÔ°ýÛ¶nÛäð‘½:<ç¾ ¦¦''×mQþQòÓcRϪsæÜ)í«G£ˆ ˜§ós†µ™ív46.eT³k¥#Pš]Z^’Kˆî¹`‰Æ­¬T–U¢ %õÑWvÀ9 _¹²ÔŒå" cà°iøG‰á¬Xà`/SœGˆLÃÙ¤ IbìRç}ú µË@âeD§Û"—A¨ß(Ê•º\¨Dø¢ü‚1x‘X$E^ýFý1ˆåÉMÉ Â§ïe]‡.äqå;A˜4Õ¹œŠ²²ç)#Fž£—r÷â¼rdt—¹ú³zW¾GÑó‡‘ÀÈÀȰ†°ù(®è²žÄ»>ãƒ<‚Cüøüßl§²yõ¿¶jÍ…«z¯yÝxý(÷R8J2•‘ÎB ”~^m#À½¥5FòÆ1eŽ\G’tÒ²ú©À²z\·7³‹½°‹½¼D ›a^¤ìÁH»ÁcÕ<Õ,¶yÛÛÞæÅ7êÉwxàDZ·˜i€tÀ ‡Wà—ÆÑMá²?Añ™Ïçð†ÿâãËvì«ç¢C¼ýúu“ë¶>rx‹Î¿öö™í{uˆÎþɉÉ{×­_7Eº¶âw/ëܶα%ÿÄÉãú}—3ðU–о«F×{Ž›f†Wãð±þÞ*K\¹©…=¸2Ÿãý¤¾ïë¹ÀhÅèÆ H9eo`IDAJQÚ`ЭšX¡ ÂÉÃ6qÆ í8ã! p†×ÓP[•È'1 þ¦<Šn2öA€žŸ Üà#V´LÓwúo]õ¡Ì #`‹D!åôèÍ·\䊦 Ç¹Ì ]$çÒéü»Œùô|=Ug¤^ਛ\¼y¥¢Çæ]àž÷„ºÎ×èè}Ò“—Ïv»î)í©?§­vç4ÒE=¯*ßò³0OÑ*ƒ•=uŽõ!Špù‹ Íš~dІQIêÒ9dA™á‘éî³6ÆÂº¥£JÙb! ïûÞ½{'D Cœiµö@Ž`Œ W¾–)¶»½O}êSÞ¤fÀ†eo>ߥäÿfâ®ÀÍ”æ*ÂEe_è«ü4Z ›> [6€(}òiÐß Ýë^çïÔ³ÝæŸøD‡o׳¹Me/<^¯ƒ?c ~zMÌsX|”»†ÔG¤ìÝËæeÎÏØ2OÏܬN¹‘BŸÞ¸a㈻Cþ}Z™¼s箇´®à]¢9ªAÏÓs˜ŽÎÀçËvì{ºÊÂ(>m§Eƃ£#c¨ï‘`DZKíÇ£„Ĉ<Ô—=·¡ŠÉcËØªL%Yìþµâ xš(dѸr@*E£+y‰DýjÄA÷žöŸ³ÁbzàAEÀFÃs’–Rt›h¾S¡aã7ÝÈäÞ;麢¤AÙ8:ÀD1]f–ä²g™÷röPÔÅ@ˆh¸ïÓ‚šq4"&TfÅ)ü(Òú_a&ò§‘=áÏB™eýÄO—Ê>=yxgX¢zÕlµS}gîÞ‹òX˜§…{p'ðþÈ€v}eÔÐà¸Pµ“ š–e±q©¼ídCè' ã×ÉKø£Ñ±.ëWµ`HmÀœFÑ:ç.zë ¼/”á3e|ÈErwçaß¾½ã:.côìÙsaœ÷? ŒAbâ²ÌÉßžŠTü²uÕX¶îÖ1N…ǵ_Æv˜4`X©ž.ÓQö†0Çßò¡î_ùÊW²’ÎÃùßùÎwÜ@¡'|VÙk„€Åy¼´({3DC©‹0—_P½ØqˆŽ^^á÷¶=áÓøÚ÷Ê^^§³vbíøº‰u»4W¿M=û=S6I6y#D /ƱFL.ñäâ·Ü(Wäóp=IÖ|q[\P/ì]â—•ÏÆL4ÀÂ^È%LÁ”ÇwÓ)C“½MGá’¥@ ª8<'·4¢Q^\®’zÎû€Òç"w†5*š«Oe¯óôJ|=#WÔy\æÃhÎ…®Þ ÅÙùœ(|ÅPòHŽVyHúQ9³TžN¶<~ü ph0x——Ì!wä‚ÌdÏNMm—ÀHà­€iàÓ‘ óàŽmÛƒ_úÒ—z! Ïv9ºj,ǧ¶DÚÑ({zDºèߥ%Þþ²Ê\¬ÂŸoX" ;¸izzbýºõ‡fvìØ¦ãqêļçéhÜ-úÂÝ5È;5 /E= z—T.)|Ù Úç ²Çy±µBH¬uGFÙW¯¹Bu gšøjxiôcÍRUy(íÙm5Ÿ¸†e­[|7Òñ øuÓÒ‹|†qÓO„´3–æêÆ_î‹V ÜâÁ 0 0¼$ì¡óy8Ji‚~!g&„Ò*á)NQ?‡á ¢ÿ@Wp•ˆBÏÙs ï‘‘—«añ$¯a ɸH#é‘G÷%ŸQ˜;2ô]“]ôÏÓˆ„+:Î ”,¥ÞY™$d’¦î¸HÙóÎÈèÍEy:W'æ•a|æîQô2Ü+UÕ·rðÐÛÄeÃçCP沑¨zõ厘p…u˲Doù—û,KÞ.¥_Ä<72äu;?üvÒ\AÓº¬Ä-…C~<-:œÓ>²N_Úd! ·Š.;wr*€ö&ÛòèíŸs x¶ËÕU`¹>¹§É7•¡Ë-ýv:s(_ÒhˆrÈ^JÚ`à#žÌ>ð ñ¾üå/wþò/ÿÒÊž!üò‚4o38„Ë÷2”Ýù}0HÕÂd2ŠåM¯Þ[u˜c—ŽGÑûñÇ&|p íШVàOkÊàÐî={¶:xèØºÉ‰çlÛ¾}“¦êIO R,÷üE0z÷4šejt¾Ôð²PSöÚv×éŽÊ pc7¥ [â‡ÂúÕŸKR~öI@ÙãP&ºSË;§^¶³ \H¥5Ž›-m…ã¬%„)@bu¦’ZšþÐjpi¼@˜>? NR ‹²ÁHG~ÑÁyd >K¦F! VfV€‹b–ÃÈõcéNè“ă_äÒp0F¼‚Hq7,7H·(ꆾ" ­Hæ7øã¾ý©Á'õ‘ì 6('•„ã‘ýHÐ0“ ï~:êÕ™3g9HGÜ<2÷ˆöÓ£ì9=Uù¶R îM*Ÿ´=óÇñuȦg/ªã~w  OékªÉ|e\Ûw™CjЦL™·Uⶳݲ0u)ÉÙÞ1v¿°€qP»®ð«ÌQŒ%â êÅ÷³Ó( ‹$h_ЇyÍëý+¾1Rá—o{ôh7–«[¾œ/W‰ßB¾ãšO°Ýd ñXµY¹Y”G£FåÎ Npôæþâ;õþð‡;üà»ÀéK_rºèf‹ãá²’ßC˜Ð¤DÎá|…ºËê{öÕóòñe;àXÏ!:,Ê;/ö KɳÝn÷ÄÄä1ƒ¿m÷î=÷Èø¸kËÖ-Ók׬٥惽ò 6`Ξ?«V\Ò¿ç¦áÕ¥—~È>´irhˆYâ—TÔz ‰œŠÍhzVL߉&‹0ø¥†@ÁOÓö18¤$KÏ̘hz&[õSOy{$ÑÐê^I‘Zh›÷ˆL题7c“.ø”+ù c:ýø1„ˆ°W`œ¹(+åmøFÎ^f)Ùû È„ëÉGð®G!ŒÑÙ…Œ'Ú¢,£‰Õ@RJp©gÏ™ä Bˆy'¨;F ûJÒ‰Í#cÃ2U=…”:rñ⥻N®gžþ1ÎÂ?yÊûêÏ;ßS½ÈwŠ,ñN©ŽÛ8'tÚïï¬ùþ“÷æï:?Qv%°çBÆ žå“oDÒ­þ… ×ÉÂ(õ2s‚% OŸ:=»uÛÖQd‚¬H[ gšztp´Ìg­hŒè9ÑîäBÀ Ž…Áû6Þä÷þæoþÆm¡ÎðsdÔf¹¹j,·'v~{Qk8²1¢—Bャ7,J<„éõó~å+_qÏžóïßñŽwt9<‡ŠÎq˜øÂá–…<ôæ {öyaô"Ëk^b·S‚Åàdï¿U:Ê^½ðž>P§]dz³Ìן«ô'ô‚­ß·wß® )øÃ‡mݾ}ûsµÿàFm°×Ѹ[fõùÚ9õÌè]Ö0þ‰“§(˜–ë¢o´òOö#>)ÏŸ±å…v9éö3g/0Z[ÿ¨ðÑìÒhlœ‚åÎÅ!LÀÑ4b¢$’¡Íï#èx+®}({AdïÙ°€‹ÁÀ… †n!@4aœÚó@ÝB:œø!¬G1ÇO"ô´.Ê-ü¤(Ò¢-ª@žH ›¬bz°Y©ï¼ú.`¸_HBÁ`>òVq!aEPõøÏv×ò†_Ñ5³e¤Åx©!r·ä¾G‡±½mHH'HZA¯º?¨Euô´ygxWX\zòA˜§¯Ù=üðýãÇëž:yºsRûê5jåâÔu†âÙjÏù‹/$BÆ%>мQ@Jð.—¾ožìGxBü¶Â” œ%¿Áœ®ˆ¸y2ÌK“ná‹TH¨Ü´!œC ùŽäˆ?| €¶€8S¤ *Q#?<ßå쪰 Ÿ•w¡[ØpCåÆÑØpLݧuM=Vß37ÿÏÿüÏ-„ë¼YÇãj^Ì ÖÀ%]òj¨Ò///#ie Ì%ƒ(z³Õ½ËDú `YXG¯žív¢Ã¡ùWÕë× µqfffJ=ûƒëÖ­¿‹ÏØnžž~ŽìíÖ¾ú)¢³F/©†þõe;5ž,$¬DØsû¦«x%D0Æ>49¸+…(ƒq%=2èVýŸJ.ð„5˜|S!+.ã1l”ă XÒåÁwÄ .bâ×ÈŸ•ÿ9H9œåA¯O$r(ä|Tqá£ÔSί’ü#߸PÐÊar©w××S=ê*ÏEõÅJ`X£\Ôiï ïÍc®gØžÞü#HÙŸ8¡ÏØžbhß#XRä.ùl,¨Æ© [p°ã‘$Œ ”¼î);ŽúÆ3ò“Þ›ˆOÌ“ÿRhåqfÂ!?ð‹3˜ó³¶HÆyŠ,éVÿXbù¸à?ðãÓ³Ó§Êøï2àw“gæwt x…øõ‘­!?0vâÄñÜ ÐVü9¾GÔ^±#£÷éOºó¿þ×ÿr½Á n-¿K [:K·â¼  2-tT®…ŒJÌñ(FòÑ0Ñ£Ça©âˆ§ç޲WoÞ‡Y(ÜåÛõ¬´W^σ'i3| ÷jeòe¹x•Yãy4å÷Ë>]³â=Öˆ'Ñe„LŽïØ»wÏm³»kÃú©;ø²Ýº ëŸ3>¾fûÚµk&ÀA™h9…ìÔ™SŒ{YúCBÔ¶ëô2)z-ÜåâB]˜¡ÇࡸȊ~š‰)£Hùµ¤Ì„ã¾?o €œâQ€À0:äó—0ñC#,@í_ò©{'—<…ÃÈ_ò®H¡¶pÑ»Žû  œàM!³`f lòŒV"éŽRnÉ,pHQ*Dù(§X5Œ?àÝ(£‚IØI7b2ǽi).d—ñ™ À ýÇD|qV0ê$7âRòuAä[·p+Çûàž=a唚×BNzõRô£º×®Y»oÿÁý[tþ³4jdÏÞÝÛ5w¯ö-oÔÊúQ?c«£q91ïøq­Àïõ§gŤ) „ÄÛ€Tÿ 袥SÃ+Þ -·ƒnbÕ^d³›M-8êQ¢q㨡àGÿÄÈÅ AuKEëF–4ýÓ¸PZyk|Q¢y@Ä(.bø„8ØQºQ(zΚ¿ œ¸¹4gVFš×Ò VÊXÿ4ø,%+rÁ¹l”?Ž JQN Ø¾gþ äî‹´KŽôœ,Ü!0nÓƒ% ]Љ§Í·y†ó2O!àU ½}EªÞ P£· J/ÛE¯q'¿Ø¢TKŽ\>«9f½¶›iÔëxçQ¾l§Ñ­sçÏu.]ÐÇ–tˆŽÊž÷ÊÆs<ѸŽ]0YNU:üöDNó[~ŸžæIÓD?h–GÅûy”Ìóßk2À˜3ˆ[艬9ˆŠÓ"\ø5]â¹§©¾ 8¤vDgj ÐkqÖV¦›DFzÆ<ž:$]M+²ªÙ#òÑ‹\í‘Ú9·uòÝ’‘háŠ_n—«Àà‘å Ê‹›®θìS¹¨¬ä£QÊívô~‡ì…5~á´’^GðzE½ ©ž“5£)NßUk-7 ¡~½M¤gª†ƒró¹z'H5ó¢ÑÕ¿ £åX˜<Î…¦qäÆ%"S+‘Ì «X lZÀ"¡ä'Q(ÀÉÈ;.ÂJõ}*cðC—<*‰R¡I6Å¡ÌdÔ ¼*ΉŠ/ŽP(ÎÂ'éd+  Š#õéÄ¢‹*`-S‰€€ð•€3qì#^¦dÂxñ[aH'F^îJÊ|OɩȒù-[Ý0­c\úAæJrГMÓ=a-ÐÞúAEH–Rô½óÎéT¼s~/NHÙkø¾sü±Çz:Bz@u½Ç"TPðn”wË»ÉòÃwC/80A2&ƶ¦Yœˆ¥”NÓH Oá:Ñ+â"þ¬ÓóPÃéÞgüÍö wÁšåÓPn³SȺÞ+Œ¼1Ü4Ý8«¡õ9µ#Ãt>x>¤-…¯ž§Û@}OêÓÙs©øSùsŸÃÿ,@¦8ÍBÀûï¿¿ó;¿ó;U-ø–‚Õ%ÃY €%m»Âf˜†Ãµ§i@úÄé±SáQð\(dz 5áHC~ó›ßì|W¶a~òU¯zUWûX;ßþö·;ú …_–TöÐ_ÊYïQì7–ëµæë¹G«6ûêų‡á„‹/àå¢<”=ûíõ Í5Ó›7šZ¿~ÏÑ£ÇfôU»JùïÚ²eóN-Ê; áVŽ_V£G¹.^¼ £>Yöß»*å×dä^Û톺ÃIÐÒjYÛ(FÞsæF;qÜ6o§•¡ç÷­áPIÑæZ9ø¦™Cð^ʵڊVldj'¸(\²¹•â’P˜ºétS~ ˜nHE+pâÄ­ñc´¢WŒ2ÙÂ(T‹q#Ô½aa´Â wÈE11oO’âëzålüÃ?úÞ9à¢8x Ä OÙóy$¹Œ / Sò•Ø`¾À%|É¢Zyƒî ½‚¹ø?˜*,èŽ?s.<² ;£z¨Çdá½b> òNŸ=ÝyDÇâž<~Âgák´KçÊŸwÝ“â•Xü.¨Ê Ï>c«³(pàÈ‹÷‹°e¨4|_MÉœe‘ŸàQ¥j £DFâ²°›€/6ö!As½(Ëñˆp¸ÔûÎw¾ÓÑÑáÆ“íy»~ÝòçðVà)‹ ³Ð-ö ihÜØžauòQ1²1RE3âI§¡â7ôÎ?ùÉOvÞÿþ÷óêæÈ\Ñð0;súÂÓ%áÅï½á‰Nk0£¼PVò(a¡às—ÌÓ3¿ÎiyXgu;.Þ&öhQžÎ¿¿cë–-{ô•»}†{þÔ†›&'&f¤¾Ç•_£˜úŒ­Oiõ½x ¯.•¡w #ÄÊ~X-/-9Í”¼ E¢ó/Í–:sîϕ؊Dî"¸p¡ÈV4Þnþ ÌÝG£ °àÜøP`A‚sëIl(< P¾øý½úºÎ%!Oë*°ÍP=ì9Ža~Œ•€¸"D"¼7´¯ýD^s¡t#‘üð V#€&±Ž,t¢ç®²¸¼‘d`ý¾`µó“ $“¸¼ëÔêE¿[’ƒÅ¦v§ëžºè³ÔEP ø´QŒRôhhíÈ'$ª/·lŸxÞ™+zNêóµgΞíêõs<üˆ÷ÕŸ:y¢£8­á{õHK²,c¾_uOÓLÉGüÂôðÍ oÔÕë:ËöÁõÎÉ‹@‰hÎétH —§ãT´>õæqð¤ú<Ås2\”<ïn•ßâÔ¬èÇÏ>â%*Ç 1“uH> ›ç¶ðùݲ·ê‚·*oÞ<=²{÷î }NœfŒ3ع”g '©4¾ïö˜‘$-†îê,”m9íürrË‹Û[(Ù¬m’í†$㳑¡ñ’ruÅE¡{ñ€²BÆa!à}ãßh¥¯ƒ$º|ðFCê¶Ü5 ¤^#>éI¯žJVŒ ¿ýš{çØÐèZ&àK•vT>[í¨¤,¤a„€Eyì­Ç÷‰yâG‡ãMnØ·ßV}¶öî;fthÞžÃk×Þ«­we\LKi^¿ ]rþÎ }W\Ä9\hb8UßÍÑ"@ÊDÓãwö<Åë/}aŽ•…&Ø`úm∧¹ƒÛsßçíÝ4ü“Eqýç¡H·~Ñ<| meU>7>(0ý[¨†#þDã{ÿ «UÀŒ‘ávÁ¤˜‡T·à2 G¾ HÉS9æÄVDhK‰4ÍuÃB-9‘xÁáÄ‚Œ ‚Uœ-5…Ó¡Xl£™%~H)4«F©z‹žÒÀ-,3û¢o$‰†’™ÆÁðcák¨’î‘k”+Vàkռׂ\ì=rê4§ãqüÜÃ<ìOØò¹çó¬À×Z0ê>t1¸FF4 ÐÑ2èy;hÍjò‰Š¼Îû,óâ¾ @Šk3*Ò ®Ìƒãш_Þc¦1ÎyžÂOâõóÖMÔ­ˆE¾Á,=*7´UO º"î’¯FMÄâtËsª«•˜ÿgE&=ï%sÔê#¥Z¬ÜU[¸¦ÐG7reµy<¥M’…»±º& ·‘«€F>ÀösYìa¦‚§Q*JÙ½úTò(}ò1TI#Æ÷¸_ÿú×[ÁëxÜî{Þó/Ñ‘—Y‰L’ù|Ñaq_QÜÄû|Y•ó^¼èñ%ozõÌɳ¯ž¹z+{åSËÓ¹¢Š=,ãA#öSµÅnfjjý³gvîœÑyøÇÖ¬]{§VæOŽL2L©üj´æ¼8ïüÅóÚàÜ}\dÔIÓ¿ÆTµ¾O͸>”W49´íh;j(ù.Wް’È!вq¯hÚ¬Ðsvź5ɬ†”4a¤+œÊFdSs™ÚÒ¸q~gɯ Ãøá".ÒàÜœ™†`àÝ#Í|dæ‚Ú)møŒp\È&x.8t“eU)v°kÜ8 [x&ä ’I ¨"GE˜O|!$=¡"ŸÕI‰/i0e@ø\0ðb°dzPP#뎎Þ{¬ˆ×{ ø”Н³mø2çsEÊPÃóú\ퟘÇV;MkõÓYø§õŽœ=w¶{ñÂE¦-pð>áçbW¸ £B¾ê©ÔkSäØ\nŸÍºF+¦‡®¨7Ï\=Ê^ ogîÌÜ5Ò³Òñ¡êµÒJF Ôü›~åÔÇŠÞLŒ¹‹ þ-»â)«åDCyø uC~±~|4\Чávt_6NK$$*|.öÔú¼ %ÞéÀ)‰,޳¯"‚¶‘€IÐ-.(9“+Û ílÀ&¾ä‘8¹¨# Of$‘_4Œ×ó ƒsÇ\Î<^!¤ ‚Vø6âhÑ¢€Û™¬nšr9)¾pÀ¾-zóp á@Io^“?1´®œlÏ£¡Öç 9@GÛíd$†¯0½ñǵ^åÌéKŒréüûãLi«Ý£=Ãìø—”ÎhŽw‡-{ÌÙ¯ø`¬qž¬õr‚)b03íä&²ono<Ïér@¸Ò#nö*¡˜ï„´_·JS´Úná};íf†“βS ƒ»‘€O“¸ÞQoaÖS§N_Ô!a(ákÈ>Mô‹d ÔÔ5Ú[MhË•>¶øVÀ4𭀂ÛsFq•ßíŒëî"ÔnǨaDãâm ¿&•‡œÊK3ÓsèpÏb<í1Oÿñ¼Ã¢¼Öglç­À§£G/xeõGu<|=¶#V•Eî€F8D‡y&= Ž}õ,Êc>°ÒÕƒCRòt î=»wíÖÇnvß±nrݳvÌl××îÖß¡!Ù:âž&T# kñ ÿ‚Ê( >7pu`X .ã÷ºØú¤ÕÕ¼L¥Ñeõ5ëÐ7bKW¼ H"Nš—Z/»µDáž)ùÉm¸[óŒR*‰‘+CDE³Þ(DÀœG¤Î Î p9€qD;1Ó+Å ˆïºaÍ4‚Wà’|‚/üÁå„/@ŒhËBÚùž’träŹ\ygZ€éN¥h1€FäC±!Q²8Íäú4á”E ÑSWzÚN/‹äV„œ•´ë¾à¥¹Qâ=†cYì¤FNŸ±}L+ïc»½4®j÷‡ßÕ67àLèÜõì՞ˆu‹µ%8HR÷òrdû'Žb ‚všr–çÅ>•òƒùºxJB¦§4t§ Fðž²3á>õåoPò/2‹[‘ ½8âZ·½T~²@½Š÷JQßMó&ñ’m/íâ#?<×½çn£§Žv³UŒ6š¶›^¼Žnß¾mÖ_ÑnæHÀ¢Sâ‰õ)³Z3ÕÓw!Ð_ø…_ðqè¹H¾ow·, €ë=üpúmaób¢ìõ ›Õ÷¤óppYÙ€á3¶ôÔßò–·t¿þõ¯;ŒÀܸp[I“£A=lßKA zþêak³à娩=kÕ‘íñ…0ƌθñ4²}ÛöRö‡öï?°mÇŽíÏÒB½;ù²Î©>$&´ê +U‹òt¢ÙEt¢ˆ¢ûŒ³ƒ:”OzžSÃCÃb@ÌEƒ‹ YæMÝ–¸NZ‹²8K: n Çɸb"Ž•$½Blc6ˆ…P4Øù»t­—74`&\ëƒ@ù6zà/ŒÈÃä?Œ”xµnÑÖ²(:’àL~cd8®ä!Y@.›Ê½p7Ü>âÁårŠÑda¸<²–‰ºA @áËhx4ëe”S©Ä;QÜ ÿÉý´ë6u¶ÏHä@n/ž½z\¿ß¬2*ßV¤Ë7}ý ¤5 ä¡üÄ©jé}õœn¦u*sjèžmw:H§§£q»:­Q#YW\ Um¶Ü9ÿøø˜ùDšªfúǸ`Ê Fj\”[uNv™Ìlû'Ø÷c´HÚi„ÑÂØ¼GÐ}ÐV0"‰@ž…Æ5醢ø*Ÿìu¿‘óÉ·€ q<­~¶ù÷ÞNÀfDDnÒ È’zI >ZïK¡¹쨾<ôðCŒLòFÓã^²‚›¶œº?=== i‡µ2h¸1Ø ÀšŒ|.Z?‘â[àXŽî¶3®÷°6À¡t‰Gñrñ²7²æÂIA;M«Ký[Œ€W¿úÕ^qL:ÛëŠËëøŒ§JBO‡J‰s­T2½zm=m/¾XoZ}/•­ w‚=ŒÒÆuîZŽwtbíäÑúŒíæÍ[œ8¨½ö›d\ì=eƒgŒ-”R„¶Û©¸Â¡CtDŠãÏTQûbcˆ×„¡[C«v {µ"¬¨nƒÝvgûTqhŠš CË~tC8pƤ~EÕÃÎ 0¿¡"€7£úUù ÓwN,¯ЊÁÌ0…Ü@QZÈ+¥Çc‡ÒøŒK”_<µÄ´å&ò*"þ ¼nuËá"ƒãAÉœF´ïAçØDk|yc0x¾X* Ž„€º`ÞLGaʯ?Ú!1Žtàˆöpz s~.¦áèà˜ >ÆI¨+Zð©i¨gOP¿tbžæéù²èq?A=u>cï—vvvµò”÷©«-™&ô¸PösúVBIYÀ7r/¶ˆáû?ÀúQ¼ãéj 8>bšøÌw#¾3ä‰n^¾ÄjáÍKinÄJߣÈû):²@Å\$9Ý7A£äy—Hî[tJ2©·È™Ó†–ëa¹‹:HY²D ØÓ”úÎ4%[?¯ªýSÐçÌgäiS¸~F¿gz¾›6M{!  ³çÉ+ €Æ –ëÞÿýŸû¹Ÿë¥Î!r9¸©àFk”¬Ä‡R% EÐ¥,½(Pçqár§7ÿÅ/~±ó‘|Äy81¼ e²Ç”°pÆ{¦›PØï¢÷† ÆïœÐºR¥èu(½Ñ_ì«W›p•/ÛqÌž>CÛSE˜Ô‚Àu²(¬_·îØþvhýó&&'viý& L ^í‰÷æ›oÑgë‹.Õ(évͽj JÝ{·ö4>”×B~ÿèí‘G7xrq×¼›D*‹‡› Ä5oT–ÔÚNð!žÒ:yU"­@uPÖ­…káÄ·N•8á±ú^ô”£Ç²7"ÐWÜæøÍô¸Ë¼sR@ÐZ­üA’”ü/<ýGÎ=¼ Dé5ál•,$XD!ùvxˆ$?‡=' Ÿ É~þ‰øH#Aÿª sWy¨'uóôz/8R’²Ã.³gõõÓ§uîý)+{‡ßå^;U8’ïÕ{”KµÚ†2†´NtTLZEÙë½£æ!ó¢äx„’µA‰ð”•B-tJ"žyΌ؅Éó`ŸäÆÏS0‹âÈHÑ#(Š}WÒ0œfc”¯Ÿv!pQ £±ìJ&'jå­ˆ»ˆ*€? ¯Å€ƒú¡ò’Ïx7 …+Á§Ëm¶ (Q}«aHõ³Ë¼ºÚIä¶ßͧKã‰òAÿî»ïšüЇ>˜Ê?ÃèÊ4(­¯äI#fFï(¢"ùöw·ÌHAµE²˜Pî¼h8=…™Ç¼¦êŠŽçé•m?(z4”˜{—å1ñ‡²ï‰¯5âo£æé7lݾõØÆ©G÷îÛ;³~ýºçi«ÝÖñµk¦Ô¤ŒÚpÑ0,«…OëøRió+ÂŒF¤g¦£ù4Q¯%WÂéÂe×ð²Á2¬ëU´QŒE…ºV]s£\^Mð»G,$n²å‘‘:)ÄE§Ä~I*%¸Ô¤Nç‡4òâ%Þ ’0<„)¦µ€ 0%C–* `u*Æ¢|-LŠ‹´6òBK™¾¡jþ£²óášœ²è’N)øŒ?Â!C…qÆÓ„ÁM´¯ [JWb‰+§@ñS<Ñ/ <ÁPÝU ÖçÉG6 ÿðÇ·CÑ£˜y4¤Þ½^aÁ]ÑoØnwâäÉÞiõâ9!ïÑGñ‰ygΞñÖTF°¨ï°£ñ* ƒÝ¶!ͳÉËï`9ÇyåE!,—«),ôoÚÁ”#é‹:!*¸Mv¤Y¾~ò¥ú ²(©0À¶á çd»”¸nØ·p Ò6â¨ü’"&i‹§xUZ 7Lðf¶%È{bVôãû›AãZȘº­¶{XÀe ˨ÞÚ¸úæÅP¿¡½eËÖ1aeøÝÈ4>W¶Íø9€$,¬MÛ¢„åà(ØMw¼0 Ýb‚A)&,$ÜVöX‚äãïêü{”ý[ßúÖÎ÷¾÷=î»ï}ï{;êMSYšEyÐ^yýe;áõâ k„æòò¬O}R<÷>_Jž }†ïe9óÀÄÚ‰©ñ5ã3û÷ïߤïÔ?K£ö‡víÞ½K#ÏÖÔÃÍ©®åM¹¤¡{z_ ^<~Bù»k†€²H×óe»fÅ¿Pæé­ ôžEsG6ÖbK wLØ“Ãl‹±€é¿˜Êìž7HÀ aS˜y_s+éJqð’Ø9¤ìÊŒ*\™˜™4¶B1d þÊ Š‚ Å“d¾Á†—€…éÒÍ#ÀFmv4ð„ägÜA"ebݪ¼IÞˆòG„Èo×L%Q"%ÊíXáÏr&]52+<>¢¬ð]¤Ç³)L¿0Í¿°‰ž•½êGOuœž=Ÿ±•—}8«/Ò]Ö‘Ë4L¯mvZuÏq¸'z|ü‰/Û?wÞß^ÁŠP˜Ÿ*ÆBLQp¦'ZaÓ:Ê?‘`?-â>‹Ø¤ ïbq¤_ßdê'^Sø¼&¾÷záÌÔâ=£æeqäü”ùw!':~îó2ßøM)Jd(<…'jü»®A9býë L\?þÆ)>CHÙà&ù œpCBðqþMàVÔÓ 2Åô§êôUHj4ÔËgò ®ÇKâ¥sˆ>b! tʸŒ½:Þ••@Û`]é> €©â¯|å+÷½ï}¿øÅ^ÈT4ü‚ÿvv7ÍȇC+4´ ƒPPö ›Âb_=½x†îÒ§wÿùÏÞ£zHÊÒ¯ zPàás±,Ækο§a“aª&O|lc|”ùx÷†x¹u¡èý•àµnhjjÃæu““;ö<°Uóö÷MožÞ7³mûžÑ±±»´ºyB½§!”<ÊžyW¦ÎΞcøþ*½+µ¼¬$cšs­…#$æ÷¡ã&Óœ9I Š31Y:iæ<^4ýΫGqÊÆ(Pz¶ç,‚ ½«€Ðƒ7b陨~FF臢m”•”šõ\:O’p9yõ‡³Ú¦Sòv¯_?5#ks‡NÎ{¡¶üíܲyëžá‘á£T†\™ûãc7Ê/ÿ’:Ú=,‘Y¥kó§óñe»2„/ÃFhtg¯ iÕÚyeW6®* ô³tÔoýûU8J¢íCÔý×@Y‘aƒ@yœ¥äƒ–€ãÕ•8ÈlXˆˆ€sLЉ|°8+/¾±À¹ ž>V:Yœ#G„ù5ï.„@U|(\ø%GñÌI$Ü˰fC‰È À„l” ˆ®G,œM Ü‹–Ä€ŒúYŠx±‰“3Rù¾Ep¾œ^À.?È =ßvÔõ˜1ŠXðxø]SZÔw.©nõ.ÈØ=«ÏØêX\¾[ße8ů9|¶—¨ÿpé÷D[@•W½ú²?ym˜ ÈÛ×Þ€ —áy¾bã^lÄ-’ãºx”½€/JÉi°Öù´¯w‡€í‚ŠË±Mà‰h(MÏ cIÍE zÊ¿…{Ôó¾3{ŽP¢ëôHoAµ‚óâûh– Ñ6ß¼[âÝ/–ÒÌÓ<Æ–€q`š¢*§º?«)Ó«4åzZ Þ|Ò…®ŽëCgž•\Ð^À ›SSl¹ø¤×Ÿú©ŸZV†ÀÓ2òňÆ+û‰§WŸ‹ê"EuGb=BfÞþ5¯yϸÿÔ§>å^z¾kCÿVxÜØ¡èé©Ëµ?c›Â”žÏ}›ÌÓCO‹ëæøà Šž™LK±OHÁÓÐý®îY¿nò§§õe»©}Z8µƒ|"!ãâªO ºrþq½ò÷f¥ä{2 ± µZgöt8D‡9¢˜ºèi_}yÊ[B$0Ü@j^¨H.)N~ù•—Êß/ž¢¬´‹Ò­çEò~ÒÄh‹€mŒx_äI3-p¨× ~°„+¬–;¼à¸„q$ŒA>p9?xòžœÅ”™PJ3có `8G÷C¾U"¼˜>áD¼ˆ¹·œ2ÕyË ‹"þ-Å´‘DrA|š˜"²É"XþÃS,=úAÑ £ ,Å™–zåC:Òv˜Ý$XÈp®sAkNÎkžþÌ™³>÷„öÕ3Œ¯#P9T„ºçÑ,U~í«§g#22…=s]Ôw\”Ôºd0c rýà-‹E@œþ: ¢|{½øv‘\ŽÒò_$¹ÉúDÄQ`MúÝ¿#´ Æ„çC[“ïiA÷¼k±-âE“2h*lÄõ#s……lK¸µÑl†n=èt€ŽŒ`#÷é?'—jâ–¯UüƒÝ;ï¼cݧ?ý)Ì¦Ü €\€À£LÀ_j…Ú¼¶“ˆÛØ=% •ŠŸž> Ž¡õö; NöÎw¾Ósó_úÒ—:oûÛ½ðŽ!üb8¸þ#“2Ti!¢øÉ_”½k]Qú€¢ ÔÓîjG{’|ˆŽhóÌÔ9×§·âc7äQåŸÙ13½~jý‘­[·íÜ»gïAmµ{Þ†§õ%œ=µN¼×ëJÕ‹¯¥Ðò¤S4×Ú!M¼Òý^=së4lRHdxƒ›‡­^EpB ãÎîx;‹ £[”R€GZûל0`2ÿ8[iQ”.¢ò‡,*Œõ.­Žã#=z»…w¥ùŧ‹¬2º&G†ÀëÎM¾£ ²@^ÀJºr±4Z8£XSÁ_ ¾ƒŠp²‡ü(chr u²jV” ž&{É7]âíÈT2l¦=2/¸‡g üg.ÞˆQ‹ò $ >{4 uVóòl¯Ó‘¸½ã'µ_áÓ§õe;õêUÇõ±=€feŠ>Æ…+ÕQ漦D†}ˆ ŸfzÁ)íŸ(A;fѰ˸®M‡ÂGYDÅ­Z<­Éæ–Œ…¾qÌK¬7ôK>=Ïâ]Ë„$“~Òf¡_T7D·•ö  V\"W˜ÛpðtÉèDu ÁÐbéa­çšÕù(ÃŒòç÷aéXòS›™ÙÉVÀìõ§®Dù§¬/ñŒ¿ì¶ŠgÿI‚χƒUÆÃÈ…d~Ë[ÞâðÝï~·‡BPî ÙgM°hPÿ@Ù oÿý Q0 ùÈwo[þxèÑÓ¿,_`¯‡6¾víÄäî]»¦µpãNÍÝìÔ¢¼cú²Ý³¤ü7¬ß¡Š<‡ð̹W¯…RP¼juÇjj5¼l­Wó­‡+ÖôŸ_£½£L\øPù¼ÃâŸJ«Á=w—„!)á°¤Eñ¢ÔéF~•QýJgoÐq²3Xü8Õ8A& ¡Óú …4I- ¦âU¾H—o Ô7<БÇò*7–™ø5®Ä­›À+ßEuÇT‡ù'Š\JX…³DË}Ã<éŽ!Ö,F:7º § ±Ý(yÿ?uo­ÙQÖ{ï·ûô¶]'æé¤¼];c¾Ždö¬9¼—ŸÆ—:OŸCtz–#Yì)aOh¹b­bè=ÉjJÔââHPfá&s8äÏ‚M(4£ÌAIVÒ…a!³ÓyHŸHsÃ)ã”›ØÆ^ä=iòëµ™z¶÷¡´Q––N&J ~Ú u**àl¹/ žÕ°*¡á“9ë/SIÞa_j€¬×ëë¨óÕÀ–ÒÁŸ‰-“γÎ:s•ì×jÙ >ò*@6þØž|$0vÌúò ˜üãÕÓŸþtÛ>l |“Ý[JõçÍû¸+eÆçgû,ñ“Yo{ÛÛ¼#_ß²± 2%ÔK÷h¤B¬wçcìÊ¥èú&êK—ñe;Ý–ñ¬žCtÔçz=]ƒqŸƒDqSêpõ˜þ´³·nÙzþ†®×9ü›Ïß|þµÚ•žãoÔ£‡3½ë¤2½²§òm×gsÕ8ó ŸÍ`¬§®Ð¦¤Hn:x,B5µÏÜé¹ÝŠÔê S*œt ã«NÌ¢Ùç`ŠJñ™6ábˆLÁ=³J)ÜŒC\¦MÊ:h Nò„H5ÅŠâx-_Ð ™ÅÁĆù®»ãrš4+×~3! Á …aa»ZÇ¥hÝŒ_‰¢qè¯I¯ün0˜[}%“TÁ¯zð ù¡¿IÌÁ ë‡fJŸÒ¢ü ß‘óÈ0ª8@ݰ9 _uGâ¨fˆ±„¿[I¢3Ò†<Ñá@Ñ^½}¢0zø©Þš^ƒÌfÃ+òÒ ‚ºW—¤R6þÉï²ãî²']:™XF 7ý· ½€Ñ&ñ™Ä£;Ûa꺔2³'¤teÁ+•=lJÔ¹øÉ¯Ùâኘ² Óg…oö̆„æ| F© ¸®yr À®ëÀ넺$?Ú: +™€´ܬsÔØKqQÛñÛ+`N¼~ôu´O5 M T^ÜÓÁöŠ½Â˜oÙ²uí¹çž»V{ј„æO—³üt„Lj•cö¥yõzœÛ¶}§ö¥6„Cj’)d‰aÎŒŸ¼ño¬zè!ý.eÏý±âÆÓ~J(›üœÎ3vTrÏŸ±‡ã•;îG5jZ£%г6yÖ™úfý– :ÿþ¢‹.8Ó¦³Ÿ¨/Û]ºvíêõbµ}xV?­½Z‘ÐY¥Úâ¼LÏêqسŒÏëRP:_W]ÔÅë}j=«O-2W#(@QR3Hèáͳ\‡¸ qjàò¥F#jý«™‰Â]<3RÜE opé£,³*xéêA 1.sŒ U†Ðݺ+–ˆ˜íÃ+ô‡çç>{Vå–Ìê³Su“ŒøC×Vv”Žà´\ w F颶èrÀ„Hp°ñ&_ûôµ.©.ôXŠ(þ‹˜s9L¢+Ї¼I3Oñb×Nº¹¢715YÍ3ú5ÎN°ë#Ô˜³ñD;¦å*Ñ‚‘Öhˆ!Šß‰t¹/w2•?õ @ŠÔºX¹ÊŠžH% YI‹eÚëUÕd3ÚDA³P/íMƒA}ÖwÕH{ÅÖh÷øLåa^À®äA9•Õ?øÁêÙÏ~v¥ Õi©é'r…áÙ ~ŒûÛßþvÞuñ¾£:G¿»ÎÊ›åH8ß«w†áç§Î/¢“½íÚÚµëÖëñ‹Î;oó¦-O¸ø Ïì/¼à<­Þ?QïÊ_¤×íV«3^®3È=³§ÕW¢Ðç°ôÑ‘‘*2ů˜šÒ„Mk©* * J 3#{•ŒZž¯.&†–Š¢¬å¢ ×Òe(FÊ4j:ê(o]Ai€ÑP á"¼;±0º0ë*óá†ÇäfÛ¸–)aBn¢!àÆ càÁ!®?<ÔXièIHÒBv(­ÿ"µ¶DÃd*UA'éªp-dK5Y x0•-p#OÁ0£DÁ-`朄 @—ø¹ HIü”)­Åž –Ò½|/: ;_·ã$eµl¿_:u\uxÌ ž÷ê}þýöíc vý[ =ó„«ê;÷õÔ¨Ò+¡–†:8äPGs¹TÚX7 âž¾ @ î@!ar$ˆ ìòl¢º>0w݇'ȸ'·“ŽV¼-H_š¢ƒÑ§‘Ë»I³ƒÛLuI8™$GûN´âµ½|³´–T±¶“ù»‰ùªäÄ"w†0ùR]R‡'ñ¡+×–Ñ/»ÒŸa'莮êKÆØ–mmö“_/Õº”[ú.l“]ðW\qŽ¥æW% ;Yþ?:ÝvÛmÜþ˸Á™A!0biƒeo¼qDâx®¡²`i$ïÈ'ãØ‰Ï´‡óرϖxv໥(~ÙY›6©gòW]xáE›.¼ðÂë´)ïI›Ï?ÿ\½ï:Ó³ÅY‰tôüGß§/=ä¥X6㉠G&œY=•$ºZ/·hó¿Å)’Ž–Ò@eq…)ìŽ@©Ò"‰…—±r¨m<{M üÑÀÖìåwRʸ40óÖ=T ¬$4(jÙÑ$a §ÒeÃmuSÚœF2rN0ñˆAAà žs#“€˜²6‰µµ?³$án£Æp1@‚¿‰áO”_E”¿ÖWÑfŽÜ,Á@Ñ$Å^3Ä#œˆãF,u’W,ßdzzÃăY=FzYúf=•†AŽ:“ñ>zŽÂݱƒCt÷»õ kþ ´1oZ «ÀTݼ„Oýc£+ŽüÊ? äTGçr&Ü8àM¨ö)CJz§ZxmÔ6FC¾6nÛöÂûøCºVZëðêê—¢kÆ¡o*冶СÎÖW3ï /b¨(Ÿ€­8D € ¡{¢ æJú”ÛR¬’Â)ÑB….hajÌ’ºV£ðÔÞYò8QhTúvlÂãÛ·¯Ô¡WãÓÏ8ÝåF›\xÙ §„¶+Þxlݺ•Ÿ'²y@ÞØävÏ*9n©t4óE¼ô(Nb˜Ñó¬ŸÏ¾æ5¯Ýÿý¼Ë¯¨3~ÈhÃóŸ˜ev¯¾u|P¿cÂY©×íÎY³fí¥—\²õ<=Ky²>c{í¹ò)s®V·ºV½«öÜó»Íta‹Ž.ó!:Nði;¾-ª™½¾„GÇmc¯;‡s½êáKC¬Ö–̆t³”r)FW*ŸQe¸š€[AÜ#¸d&â[A"f6´°È$ö›©$¡ªYQ±§Ž—¿ãí •0Üžg"<áB«Œœ¡º+¦„(tOX&˜âƒ*ðuµu&ŸµhcÄ¿È ùQ:}]fDÚÌ%ñÐÍÁüLø‡^ŽÊI0¢žéÁ™Io—’üjëraüY¬ÇQ?Ù¬åú`¶Ìäeì5«çļÄRo¤ìß¿OF~—žÓo×Çndðuzž^¿Òª«XðS§_¶[¦OØê |ÕrñGšfôè¤:§)jGGyPƒú'vk¨ŽE¾l0‹Ôx'Ç48ø&ñ óœÈ.ºÂÔ ø—2>P•1Á  ©C$Ju8çvMęǀ֡Q¯-Dgy°‡C;ýççÊT—šÈ¯Ê’Ûlè–`‚†u@\¨Ô51¢BSŸPýÄ(±€ðx&6­Ñ ýžûsæ `z\ÒÜ0@ÔY\³J~l$¹ó+—ÿý([0&ÃÎÙ÷¿ÿý¶rëÖ­Þà‰­ò~¨½‹î¤»Ö€Y'3ŽÚ½é¦›¼ÁU}VHˆµ£¯Ýõú~ýxtÑEO8ëú¯»þ™çžwÎ N?ítŽÈ½hŪ•—+u¼·áFljf{õQ5Veyü|LVž½¼iGÕÔvè±>°#*a±»Ú½pLCrõWJÛt`MUOµZ·ä3y„rçø& md1èÍÏ„‚Ù ÔPD§è+¤"‚Î$ÄÊ“U lÂø²ƒobGDÍ:sHÞ:drîКˆ{ŠÀk³hXD´ôHœ MD†A šg€mè"WMd=C£p:øN­JÍÜ2­1M™È…¡j8"×Á^$-˜ãMyœë€ú!+6Ô± ÅL Ähy~¼3w¯wê9)o¤gö>Ÿgõ,ß«¾ÚØ«¾Qç<»`€‹ UThiXKø´øµd´bœ¼z—¿;€ãJœˆPæþºãÈy˜ê}?¿Œ=‘ï’EÔY§Ñ!ƒÈ’i°ÆIK•­Ö–—ëTLð25ô|gŒg$¥ŠÐçȾׯ_¿ü´ÓN[¥@~ €­Ìð£ ?”µÂiP2ÒçåÇ×_½ºšS;—¥w¼‡¢(¯e /û³ÉïÅ/~±7ù æÑVVé‹c‡¶lÙ²ö¥/}éOj–ÿ£zìÿ$ÞoÖ³zfùœfr˜5{–·L‹÷úø1_dðcúO\WDú?¢["R'n©E ›'êrm\à"+’ ^æÊHž®ø¾ûâ`¹ˆ ºàÏÕN¨ÑÅ×&"Áètœ‚È·DéøÀP<ÕÕÙ “>5fÍ«-+uÎf’Ì1~±È®Æ<–ÉWè$,ç d‰0ç¶îÁ.®¨ˆž$Çİ(t8qrJ»ec»á#Üš›hÅê͈W !‚ÕþÄ(7×!rG,»çék'§¾Y‡Aaè9Ûi÷ž=c½nçµ–ð½)=ñ­FñŠ©5÷Iy<PãåÈé,–—wà ;ëC¢ÙÐr`;."¡ŸÑ)zÃte„d—Aó@Y Ÿž¸ÆŸj"ï ºd s]ért&Ñv‘»áœz*Ðp^ÖP×;×Ü.‡ç{°O—™ëºÔr‹ÌmÉu‡:L 4ot¨°Ä[M«Ñè¾F˥ά堠‹_ò[v‚Óß¾¶íÑcÚ¦Mß~þ¯nÏ™?k¶sA„5«€|R~Ë–­ôá9-:úà90Ný ƒ€ò1@=ž3W+ç¤íø%@IDAT£ïÿþïרÓ=ì\ÄŸp\>Šã“Ðl`xÏ{ÞcãÏÌ_«Øs6E¬–±?ô½ßó}O¹áé7üïÇ=Ÿ÷÷ØwLOOL-_±\_+#SVÒHb7´B*Gl…ËÔYS÷Ñ;PÎtÒêăFñæF1ýŒŸ§ƒ|Œ’75=B6@C ru§ý5D¼vh…ãbpÂõ`ƒx‡\Çœx¢S”y¤4ƒl¸:ç”nôÍ|ÍpUœAMD&Ïe›u_¡9oD h­€‘‚Î!ÅkÛFD¤Ç¦à"8šñõþAìgõ0T˜†EÆà³ ?é÷±Ë:Çž|ÍÎ'æñÁvàsà?.jÚ}¬ °¬ÆŒž~ÖCüilÝGެ®K¹ÙCPÀÌݰZ 4^W¬6uDвGÜXOð›†o’¥d5¢ãf@È•¢E@™vs"x ê‘ik^ÚZ|íɳ¼‹.‘v8·éSyR¶h%¨WÚLfŠº5:+'˜ÀÞhF†ÍV¢àYŸ$™ÂK^ßZJ¥ˆEº˜L¤—+]èGùÓÐÖÛ¶}µöŠW­^¥2¥<SnÃ+÷—êGÆìwÓ·aÖàÿÆ«€ÝÙ?aìK= ÃýWÚÈò†•æNgûk¿ök(¸ëHÜ©UzWvÿ+_ùÊ]sÍ5oyðÁ¯lîQíŒé|¼›ÉóÕ7ŒšÅg–:wÔV %Fÿò ˈ–š2v( žÑ'Rócè¬ ñ‰&NràáŠÀY¯&’´5:‹>!ÏqC›\J¨ÃV8ðƒ3ð .öq±  Fç›q3vetò5Ç[Xk]¥œYç8tÅtJ+5ÆáBÝF:VôËåO³zEX°ØY­³ëB1…©K4\Þ á™=F_³úñ¡ÃGªúØÎ¼?¾k'Ÿ³íЇoØÏ£'~©Þ‰E¼“ϳþ5SzÝN#Îáî,Hù}@?½9›òö´Ô“é¢h#¡yã¾#…O¦n“dçüó=e_êšÜÆéGxLüŽœ·î¼©ééÃîOr'ñ/¾jÏìÒFÀ3ØØ}þŸ?üd³«¡_V–óV*ù¢mâ'”SÓ‘€zÓß›Þô&OÏ?üþ3»üÕ˜þÈüÈ·oÙrñŸßwß}Ö­[{T+3StúÇÂ𺎩òaJšflÛ‘‹7µL„ª-·É(öÖ@×Z‡”«Ñ¤êÂvEv^'ŠOM&Ž…<Ђ¥ÅpAˆ"r|¾'pÄ(PÁ1^ ·Û°†~t—H!n‘ä˧[Øìà ût!ìàÀF!ã„7$᨟½bZ¤ZHWüƒRû½|^yÀd9”lBÁæê |hâ1 ¯É…¡Ö·c¦-d:`Þa3©fòcŽÄÕ»õÌêu.¾¾l§³l(U¹²ÁÆ;ð9mϳúTž<§G¯zp¡Ž´ù—r' Wðº`ÒÕ&q]LïøQʳ’Câ×f;€—iŒØÆÎQÍýxñÂJ«vOˆ#eT—©©sÁfîW£¬Ñt˜ n,3p KþžŒ´é DD¹6'œð[‡$?ÁæñX@ÁÆå{„NÒU*åd“‹è=Ê)¡Ý`¦ÔšÙ:“³Îzy˜íóm õ#SúˆÜøÂ‹.ô+é´ʹîç¹Ï?l ƒŽÃzýÊ+¯X¯•€5ê«bu»98ï@Ý|$° ¬6~þóŸ¯}ôQH0:U°d¡//UéKþÓq+8–wúE/úöËoxÚÓ~K'ÿmÔ»ûêÛ‹FæWhìrÖ›*b´%¡I-M^î¹æ(ó-ÃM—*¸  €m¢øE…"$0H£áZ¹ÄÓ~7a˜š‰½º€,»Ü¢tºIÜ ÖèYjŠ3¼A3G‚8w$)‹%Ášqâ ]Hð5«àìL†Þ, ›¥b!’-~ä›åˆ†™}ã4¸Ó3¾wÏ^ÀcVÏodè½Ožè=›£¾è“µþt­^³Óëv:9O6íÛ·×;ðyÝNüùàGï4°5«µ?‰$]6ôùY=üû—з̔FÙãû Ò[ºA~Èìà•4öK\×{qÚbj@ l9CÔÑÂB–ú¸Á£@Iºp(UˆNOBºMÊ÷š|æéLô3sib_#S^²Qh ³õ•Ü n.(·ç;mIq´C¼'Ìea’M»A T¤Ê®ñeÈ)~Oùˆ–îô/>ÛÐõm ¾ý®dÒÁ-#™”ðý˜3Ïö±U:[t`ÿÖVWnX·~ïÓžzÃÍmß~ÅŠ•«©‘iId¤]ýlãNÕOåa›C8 ³CžÙ»ƒM°¨ªà@eu§4Ì6q¾¥P¯'Fh„]Ù3"’¸ãÐI¦5ùMš äg_Ò@Šé  šp‚]ÆJ÷”§«f’xC˜É¥Omì‘QõXn6+ÈRzËABªÀ°Ô¬;|pI¿œ‚À!$Ÿ2•Ò²¼â/@”“̽ŽH¶Pdz9ŽÃox·Þø¢ãü…zw`ÿn«#:½„¯å{½W¿{¤÷uGGÖ5ZfõÉØ3ú3¢Çæ?ÉÓE/‘¢L(¡kÈ‘¢èXC“ǰ´‹áA\R\:…Û€:²‹YGž í0 H^—à"Ѐå£nv4Êì ’ špŽ ßŒÿð×qxººÕè5V†´ïRhcØ&=n¨Hì ;€t ñ?ÀÎFá:5€0ˆV"Æé†‡R±SýL>ß]gS,ê˜Dê² NÌŪ2âVèDes_›•­Õ8‘ZÕBgï‘z‘Џ»Ÿ¢.jGß- U2e„UÌG™r*JåSÔÙ ž&¼y@vq™¾9³®(Ž}så@€ÞU`ë5Ò*&3Çú§:zÖ³ž5¦nòÒ©ê¦0þœëÿÛ¿ýÛT#Œ?›þô¬eúðåW^q‘Þ…|éöé«e+¦ô—Á n ê”OÝ:"Î…žpܸ,]ÜQqa“\ð¤`)tUp¶ ¤Ê^‹7u‡o„3­ã(*<ˆ‡‡þënÌdÄà!£Ã†Æ%mm4Å–DšÖ-P(® k¤ào¶ÀÐ ËMQ“ŒH&º€ Åg|¢€É¥[‰Pä(‘‘J¨E(†j°ÖŸt•"ùìX/ÛûËt2Ô'mºïÛ·‡Y=ŸäkSž–òwŽöìÙ=Ö|fõ¼ j>z¾ï×í0ø¢_äø' /ÉÊðg½‰·žÜ{®ÈŸgüÞÀì"ýŽMìóà2S$´lîƒú4ѵo/É-“Tø¯ð .µÂ]P¡ ¯Hg¾.«„ßã_È+¼·.£v¡aºo&oA\xŠœÏƒ‘ÆÛ"ÔC·Á†r–¾ÆnË®žÑÄ)ʪ(1UQ(ÝTg)i1в<4±æµúò ·ÝÉÐlŽ©s+ R¹î·`Q§!ø‘¢Ü—ð–fÔ«µmšgyßã]©KÈ@–l߈#ï¸ãuozƳÿÒø³ à€îu‰ ƒ·‘pó«›&=!ã™ÿwÞé•F/ÊxŽõÝ÷Ìg>óëµ|¹:ñiMú•XÍÚÂ^º¼l”H6;ÃugS#`ªŒ©nº°)u½Šƒ²±†6!y6J')ƒ¬ÀF¾®4Tx&—ásg¿GSÉõ ùFS¼yƒkg@$zc &'¦‚!3Ðà×aG&xRÂqȃOb FJ/¼É³ŒÍ=Fô–BìZ®1}@0ƒÖä>ýÃÃÆWÏÏXV7„xh–àW¬ÔÆ<¢Ã,|šsð½\/ãÎ|½W¿CF'{@4àËvGô^½5ƒN‡3j¿^Ùãy=.âú;ðQ†ü¦[GK?áÚø¥›µñ‘Ë©KŸò¤á)„ŽÃ.‡«ç«iŠ´”Hu|Ø+”m¸hš¨’AÛo¢ ìу™2¯7¤óL|±}^d„Ḇv²O”‰x2Ũʑ¤¨y}nñ‰ïùžêWð³!…UG|Ѫð%ç¼U\1cÉï­¼’Î)ÔÖ¥Zr¥æ Íè¯r=Í}~ô‹¤nXwõe>šW›êŽi“úa½›Ï!t¼è•€9¨0kTúOú&/éD@N!ÄV2(½ÇÒ͉á븸<˜K_fÂtñàöÛo·8%ØõLw¦×µV<åð!íº-ŸO FÐyýn©uRÝŤÖÁ\»žžPêòGáºPˆ·ñÏpôSÙâùY?ˆ®6™+‰d›­ Cümœ“NP:NkB†]f.I¡Ä,£$Ynb Ê6„”X„G“g] ¿ÈÀìÓ}­O Õl8™0(’ü¤OæJ$_~ÓŠêÍrÜõÇ@LíÂÏÙãh\½n'Y¾ŸÖRƒ;ÐáÝzmÌÓÌ~ïÚöíݧM{˜M¹è˜ÍÛØëhÝ©å<õA‡ÌXE`Žèº‚+R™£ë{p©ƒÉ#ün„ytñ†ÃAÛaСwlOHæ7 ?G¥;)ê¹êÇuø¤…7Ø%zð Â&âuÒkr#w´›˜I h ˆÚÚS¢®1³¡8[ÆqЭ{à^Ëçcfýt΋åT¥£„³0ðÒFs§AžœLòS_‹"(ý_ÂIOwÎ(«º¥ 5ÌY›®ž $'afä,×>µé³6åoÔÐG-•£c€Á·pXŽÆ&æ#´Œ¿hH«£ºUÕG>ò‘J«sÎ9Çõ5¯\Ôý¤±NþÅ€[n¹Åʧ¬Ó‘¾…x †A›¿4'gVNáÑÁQ6*\þiŒ°ÐÃm¿-¼ „€ ¶¢MAä¦Jb€™"x ‚—eCй%Þ†éšðj~Qƒ“öÆNȉ2!¦*§W" LòQ%f ënV°†')n\îTƒ°è°#3K(Å‹ÿ`Ž€–>Ìæ1ö¤1;6ã1#§1ð£\dèõºÝa}Ÿ~¯Ûùfö:"WèìÓ#žýÌú%†…žxÖÏÊÀT1«·ÉA^t´”yH…†ßÌ®èmXâVóÏ$¥Ñ©Äê©ÖÛª„>CZÕüD;_Ð׸xºøÂäèy·&]ë[[¤«Åç8¼[¸ ·–î-œãð+YLô'†3åE¦mÉîYòg³ßü\nÒ‚ .AMKŠöjÙux™&$ßÐÌO‹YS%A©›hê!í?gÒ SfÖZ÷Ñ‘>4e8Õ–$Ø n'py£Ÿ¢oÓ[E+tØQ例¾éø}QÉíøþÌÏïÏ?ó*½·J+¢œy5 ¸S*ù‡ ïÀs*;ò2…¥(°Ü£ÕkVk`êLŽõCýˆâGUp¹PñOa*ŽF#¯ý…Ìl8îX¼OpÕŠ¨×ˆ}HÈyi$8‹' @ K܆-`»„b¥ !ŒÃ£Ù1· qV8¤šOB°µ@‚v¡dò†Bƒ‹‹¨Ë:>Óëî†-fè `@ÅF^Ã-¯n†dò‡Fà¯Û©àg Àò½wàk¹^¯Ù±ûÞËøºûM¾¿ A°F¡ü|PP±'¬j°”¯Ãq¥rºy¯§è$à¯Âë!ö uÉ4²kô†Ÿpsã5nb6€fúa¸)ÓeRºJû¸¨0ûºO¦o8”òº~aÅ7Bá†Cã­ †ÉPlLЕDÍ©\Bbsmd7°Â‡BÙÂÉ;Q?é°ðY‘Æ$(Ëór´dà¬RòG à\3¸,¦îY£ÆëÞ§È#$ÒŸ4SÐ99ôsèšõ“‡´ØÍ- ôwÛ¾¶M§wk ZŽp«½g‹pϼ©sÚ#·\³øµ Ôï® ›É/¬™I¯‘ŽÒ§ÿ¿å-oá\¿º˜¿&ºê-*‹)[\}âŸ0S–<”HŸ¥®Ê¸J†aU†Îp2Kå½]]®.SB˜UYTùTر6 8þÑQ/h”T„¨¾e<¯µƒG<ÿ8W‹ÑEpâ7P-;¢mØÍ_t J2 ò%+<ù­#á„“|Ä”1n 'c|‘ îY4èÊò¾îZNQ´Sä62MÅ{ùÞ3{váKmmÜ;xèàxÏžšÙïö»õ»dìùè‡èhtì¥'}‹^6;Þ«g¤Ì€aeÚjÂ#*vé0ôñXAÂpí[ÀŽwM4 šÒÙƒ¥XÁ»Q³mÌ=<ò³¾!1FÀŸ-=,JaYN “'þ»ëר}Œb¤¨§ °ð%&-^Y—ÍÞ!ÜÎ@~Œ[émÑÍ"Pò™„^è—Û@ƒªV§Y3±Ü.›¸9ú æny´…:qä àÔ®®#–ÈSd–$„ºèà¥r¥‰´Y ¶ÖõË>¹Ö½•ÙÅåö.³4zäÑGVÊFÅÒåDŠ…GPט(i#à±ÓO?cÙå—_¾á¾ûîÓ‹QËW¨ïÌG—§²+Y:·@ðÍéiEœÄÀ‡(¡Þ¬ ;Ë-<ašž’]ˆO£éá² ‰Sš U¢\IÃD:.[(èÄ ÊùCD@£ˆ]tBÆN´†©Ì4¿¾Øšâ݈&9¹MØXÁ#ŒoM­õ«oD$JÇ#7¾j`1ElÆT|$È)Æ f=Hò0¼±Œ CF–í5ŒÔî{ uvtvÚ|§™=Ÿ±Ý©wë—Ñß5Ò³{ öØÐ ‡Ã'\I©düV®ÒѸ֖|ˆ|‹r,òX‰mU@‰&ËwÄçÔ“<â™Ø ÔùÚ€ì€m—A‡Ž`OWÚˆ=œ"z@v›¼ÁS×7Na9«°‡@½¼Dš€e¥B³¶~íPÍ2áOˆšbâ¿&±'ѵsAïÆcF®NP·ò©Æiø¶â«¼Ø·Ò¬6>Ë…¶ˆÌ]U‚©e(:#YàžÞPÝfãyJè6%"‡3enÎã|Ÿ ›‡Y?v‰G™:ø°Ž^­>n¹ ìÅñÒO"Bb«³ÎÚ´Z\óæ¿¼0‡»+ù%ã¯|å+èç7ЪÕ÷8ÜÇÎÏÿ^©a{öï;¸kŪ)5D¦–,y¨p•$×I.ÉQ䎨ÃUaQjr”Ù!Fæ#£ZfHp‹+(u5(ø¹r?J€tGºÉHA¤cpë†Na†2‚‰›U0cù“žðÈ:â5ïÀˆ,óMéÈiÐ"=œa’¾W?ذÄÏÎ{Þ‰çÛõÈ¡riƒåx÷ÎÝÕÞÝ{½t¯çôzmÌÛ=Þ¯øzÞ©òЮRÉÒè³õu;xÃ#ÿ¦y_:£6½¬›aqùêtä€ï@¤·ÓÖŠèN›s„Ú°LÚ—Êcgª¸àÔ‚:Ђ$8Ó’1)=ª7=ZòVÄQ²˜ôÕQ=-Ñu`†|÷>”›¤‡à­¨¤_Í·ëL«Ì'×ñ.ÑlÃ2¥N¥ßœŠ´¶â(c9M’ìœ\ÉÈ…ÃEÉj:-Wí€Æ5r.÷ s’¶ÈÈÒÇzæD¤zXÙ’u^dÑ‹ÉÎ*zÞùˆ¡££ïä¼>÷}ÑEyÒÊ,¸¥pðeÐÁ„ìòË/[/,ÿcìË}¥ñg•œbª7òQ==:¨´‡Àzf[±úΗçÔÛßþvÓ*qV>% OOÝ©/¯ãW1ð Ze¶2†Ç¬f—Yïåyˆâ`æø\@.HD¥Š-^¹k·f&¢Ü졯ãpûbfé; dS'ÆBgwh¥I0.Ý5Š9¤W/vï_³þ`ÊÔHÀö$VhR’m0Œeu*lŠs¸-î˜Ô•}9„¡ÃÚ™¥*"¨H®uxÙ#„0!:äúáz#ÆAqë´Q¨â/‡dô›‚<”·‹ÍxÌØãëwÖÄt`F>‰•ub÷¼¾|,ƒ¯z T^c梑ê1ú§äéu;žÙëËv{õQ‹ýcÍú¥®3Á[lïš§ŒÓäkø ¾JÐ1Ͷ´ØXçáãÈ$ÐÃÎjDïãnÉ‘ô+ј'È:6Âè¤d¡4ÙVÔSÎ'-s¥L G»pí“MRßxl´ý±Ç)éú:Xd@¯M.b¾ˆ·Ö¾)}h^CœÒªÀ :0üùQ@k ƒm´i°R½ímo¿êU¯b’çsv²=[D5Äj굯}íøÖ[oe45ÎÏÛä_®¥ïz|ï^PfÒÕ?¶øã^¼M¨-Ì6B MÄëÊ~”W›ÍÄ|ÒµM!«ØÏ£:Òz„E’ /-¼&4EôãÒ‡×ÄÇñˆ² Vs)ƒAK<rej 2GOÏgÉ?ض¯]Æjãä~ +ÙŒ²zm>K²ÒÌw4ï# on8Õ®Ö=´Ìeë<^l=ë¾úÕ‡Wê3•ž,ùµDŽ>™ÉoZmÚtöòK.¹d½Þ¨86æ#[¤Ú2¹³f|a·”ºZÀÓqAW˦šj©‘TZ°·_Mücù^£vÑ£¼vàè3¶»÷îæ0 Œ|ý±›=ÚœÇøl¢T¥Ð*|¼®GÅaÉJïQZiÒàäèžY’lMþeØŒ÷”ßáÕvM¸ñ‘e¨M1D‹.‡;Ès“Õ娗árDÉ>ªò™ú8ƒSäDŒŽÞ™µî9ЕðI±5¶äPE')ÚSTãw8;8155ÿUL…¯Q¬Z·œrÛsdïÒæJÈu¼Ä#!3¤T¢ÙìÇ;þmmˆ=¾£e9’pß’2ôKÞ;"’:öÇåø#é`–ÖEúqÏ™üú.i1å.*¯&#ë7®ÌøR9Û%mô±±êÈ¡#Gd`9¯ÌÑEN{P¿>^¹rÅhÓ¦Múz™æŒ: @wfýyæŸï 0waÞàÛ kþ øÔsS¯{ÝëÆoxÃFú`Á˜W,¤bÖt¤Ç}óžEã ˜ó›`¸\y- Û]bÁNF/3dFM&¦ÜÌpB^Bâ< G”Ç{xÌ6<ùŠó€Žþ(9øH)Ïæeá=϶lá°|¡æÑ†üèvôÈôøà¡Õ¾½ûýÁ›Zºß½{×1^µÛ»w ýaŸ%ýmì¡g¤·R³z$¢?jzñ&EÈèV„nòÉ.ò%®CXÝä à ð%ÝËØ‰:[VW`7\rjûK¾P¹_tÎ%¼Ä¿ÇQ€€õb:ÀÀ1¨“ò¨…-X– à <Çû¾v‘° ²A¨¢::gY‰Áe.ê†bi? RgY‰Ò/—u;ûAiœèâ¿ÉW˪=$h%¶dëµU¿âà’¨DœÙ_ç€È•ª«žãOÉ4xfnK‹nµ’‘#k'¿WJû¹U£œTO©_dô Q‡lãœÞ˜ÒëÏc½uL_êsÝ¡ŽÆ8`ñU/ƒúòK.¹t$¬TûÀàçåîå fÀƒ€|"àýÑU¿ø‹¿èåÅMhOÄœ7õ¼ç=¯ÒÀ†,©Àè…ã¶VÈð=ªgr;Ô œ)+ÊV@šU­©ë².y›J‹‡ uÀ¯ojމ-<‰ÁH©‰'9Ð{@ž—ï‰W@xzŒ¼—ý™œY9ç×ó|_¯Ê‰=Ö{õ:-O§ãwîz¼ÒëvÞ”Ç.|m6ÁÐ{cž¸s„p_¥O'; èã3}”IJtñ]Tµn¼:1ƒ1Ã@eJÊV¼Ùôx¥|±¶ ú}Ûñå¼/À”× À­Ën %@°¶®9=]í¤TBHü‡± CiéhS‹Æ3ˆßˆÀ€¨ŒÕNk†êÞÍðÄc"¾I)‹ n%Š¥ÞêªK6ö4kê6gF°r…#žЭ,fJãËÜ®×GÖ!y,[*ífÁŽ´ˆgZXp'½'Ûe( †\.?¹äX¼…ÿd+]ÊOjÑgãÚ³ÿqñýÔϱކâui]¾J{ªŽrÄ.F6ýf²XZð8–v¢³ü&€üüòM€<¨)›I"?ê¼Így ø§òH¥Ð…M ´ÌµÊè‡4âz`íúugÆ«€ËèX±ò†z*nŒX3µ*‡ë×tÝ¢ºÙ›ª=4¹sRT&…\þ¨pŒÄp$Cõ}?GwcRöSX,ݳ9Y=Žì€ÑÙùø>/ákVÏ+w#^µÛ»gŸfõÚϤ‡7úf}šÕó G>xc9Èâ§Qè1>c›\(gÙãd? vtájOL¼;±ƒ•м2nÁ¿† 0é‚D–9ä¨Ð¹à—#tïê@8c5ìíó•䎘†/"¥s˜wí¦F1f5ïÀ&áeæR¶£UŽiî a"^7¿jü!Š!¢¤Qú¡‘kŸ:.îÌì©»´ :LÚ‡MMé•7›*ž~@¸ø^„ë:x: Ümȯ¯"&UëtÙ5p(OBïE;Ø'ËÕÔZ´.õ Z~òƒ>ää:t‹üHZZÒrõ›I:™åæùÛx‚°Uî3ñšC\›Ë.•#ýƒÒÛ·ó¼z• W7àYnÒsbfB…o2Ú^X¿~Ý m\¥Éa^È÷r€É3:yòȧ|ðÁñ»ßýîê;¾ã;êóvߙ𰸩üU·$íIø´ !_„Û¿s×îí§©#8|øÈ±ÚñîWÞ¨D¦»‘Éˬ=.‰Ñ Ïq¾å’¥¢‘`²®(еúÂ|ÞÁ§ˆõeBt¤ƒòѸêÈ`E¦ªr虋vÛïÝÉyÞÏÆ¼}zÕnï¾}£#:_ƒ÷ŽêÐjc¿ÈD©ÜµL‰ÂS¸HcÆ+" ¯‰‹ðÌ^Ëî L?„zw aJ¹vây‚3¤DdLG‡en× ÑU&#O‚çx“ i^¼^ ã•üºÉ[†`¦¸Ë<ͺ„þV’ QMŽË‡zm3î´{ígY¥Y=ßz`&Ã`—oEðú)ÆÞ{U4Ø=묳ª«¯¾ººôÒK«k®¹FKž—Øÿ+¿ò+Õ?¿÷½ÕêÔùñYpóÍ3ÁHJR¼Ð¿Hbí¥MM3€Ž¦_Ãçæ â0ªj¯.3åä“ÙÞ :á÷lü³`ëD¡Ÿ Êe¥&ÞÝU6m‚òm²7¨ºá‰¼æAö€îeà¦%PÖªÃËúêW§°1âå†b‹ï¨KLÙì½yóæ•zp½NÎeÃü Ùš)ÉÍ 0h­o¬õè‘Gqrh§šãµëT4œ²H§e@ïØ²eË Ô»8—Á£H¨MåNÍÑÖø£X„)¸5•Dºu $ßà :*Ÿü¤pyÕŽŽ‡™ 3™£êD<¬ÏÕîÕ2~¼n·ãñzn¿K§èéËvÚ…ÏÙEâ'òx/Ÿt®X¡GI „ 4üæê  —&R:nblG:t@9hø@d—Àᦔ2ùäû€Ì.ÏDìü!³ºS+fçä¬2‰et:®´I½4YùB{ÂòÍ ƒìŒ[ƒ¾ä¾¬ÕuH}ÖIwç׉×l>Ig`…ºYÛ|Ÿ¯™h² p(>\«™JpîÐõz‡¤UÄ—¤A¸HWXc7TçÇ:0otöÙg¯Ñß÷ ­XuÔÇþè~êYý"¦žÿüçW7ÜpC¥Ok·ãJ/*ˉâã/ùK÷?å©OQ¡(HrRó&RçÑFÛ‘rHñ.?]|Çò;t/ýŽq°mu¹‚­^½ÊŽŒúXKöÕn¾nÇÌ^›óÒr¥ÏÁ×Ê€ÔŨ¨d _?f=„Ñ+ÿôúˆ…Cl¦É°ãÞ­+rú˜¡C?Ê€OŠm™Ë$TÁ[R^–²62¸Í0ÔÓ=÷Õ°Á¢ŽlId_ ò £j—¼“8˜5Ég>ÉióP(þ 6©Bðe›¾‡”²|2V¨QÄ㥼Ê|¨Ù*²@­Á-3£±—ðy#ÃÏÆT};½ºà‚ ª+¯¼²ºþúëëYýÚµìgªdì÷TŸúÔ§ªw½ë]G‚á _¨yøàÀ@óÛ,GŽ®n?TmÐ @HQ»Ôj\ñè+%¡§*æƒ/ø¹hé<‡@*xEVPº´kò†Hb¸e-¿áÄ0Z§PJ’ºœxætTMYšs>åô¼YN"̹æxxP¨ÞkÔ`ITÿL6aZõÀ$–‹ ǘW]t1 'ÿ|ÏÊ;²9EdÞô¦7U¯xÅ+l_1ØÎ‰9ñŽLÙñ›9G½¯M™ýˆfÝG„4¥G4Å“ëEëñ ÑMAâ5Ò %¤èŒÂÝ´BteÓ]³c÷ßÿ€^»{ÜË•lÌSA¨ŸLË›1h±6æm<*h»„/š…ä{Ý9[I'#. ¨Ñà„ÜÉñfèÙÔ€k_ä{”·3„ËläÁ©Ÿ/uZ‰.Ü œ|-p½ ¡‡9HÛÃrêº4(!€’3@­8Gtô€¥X½ûÝÿTqæú@• "pžøÔyä VíŠHãÎ|É fÌÎ X$m¾ü!%K‡c£ýÀIsVLÿK«rõ™kFdUé·SÁyÀ5W>sÂGh#%¬Œ@Y 6yÄÅ¡kZ•^ÉÛcÏ@•¯¥ä~ïšk®âÜ|û¼üÏ@ |@éDzzÒOUçÀ _øÂñÇ?þqí²ÞÎr5Þ#RzíŽ;îÛ³wÏ—õ Æ¥še0( ñQZ¤ŠäʹªÔ¥GpÉ‹ 4`Q-lFJ§UÈ+ô\Çöãÿ÷+ó–ñüR߸‹ÏØ ŸÂŽ›ü‚¹ûÅQXîÐËþ® ,pö÷Ì»OPDq)o†ãûпCWÃk!$œjê$kÄãzz¼{€Ä¢ŸKúòIüZºwÃYóRn‹ #4ú Fwù©#Û,‚ºÇ#ÉïÁ;â]±]ófÂ,ä-p[E ð¶¤±™}+ÕNx.žÝÿÑ[ßê }ú†Dõ•¬îºëîêïÿþï=«ÿâ¿X©ûÙ?›ðx“…“'1úÌæWkµ€øh¯Lz/ŸvÅ@{TÑÑòh€7dÞøÆ7T}õ!ñ¿«Z·v­ÄbխݳgZ€´â6)!­T•† ö%c„ñO]…û2iBƒK`ám?³žÕ=‹+ § èIPeVúv(ÃlìœÇN}K—“ÁÞü)Û2«,>먀ôÓ¾­e}¾ pð _ÌYcÉîä Ù7®”\%?vSç´×ç´è©8Þ$Ó¼s4ÍÊÚwÜáU8Vçhwe^/™â³`ì˃ɑ›L±½óŒ…ã wi¹}Ǧ³ÎºTÇØÓóøå,7¶Š*u’±\Cڛ˥(UÊŠ.Ðe¼)LU·Y–õÕ±,i rœ6òì1;s‘Üöü›y!0ô)cfí‡Ôe9@¡¸™8Çk3a<Íknnλ‚^ÊmÖN¸-ìn83J=âËß°ƒ&h‡ã;ÐI¼€û×ÁGnGtàu€]2Â‰Ôøe¼u(ÉŸñ[Q3¥½…ØèŸUƒŸdµ\Jg F¼Iz%äœî.KGÓ±”¢’ìäühã`*” žßL{ÐÀ8˜7¾„ê4çØ‚v5UneÔpÆ:= 6³ó[ßÿ~ò„;Ïÿ×¥M{Ä?¦sÉu”)©xÙ&tNàñºßÙçœMWwÞy‡¬ð!*úÎ0g‰uýú Þ„û–·¼¥Ú²eKõ¼ç>Oûö&©¼)?Æ?wÔE æä¥°]Hý‰{]¢çVà„Ë÷9‰Xäl¼².VT›TòÂʀőºh\¢ß•–Ö›>6å{¬wJ梃 FÁÕb]›Ã‡—Þ%…f’¹lÛ¶mËUÏô•Úh3!/$ŽºÌʸêøXí„€kųalø%?/ÿç;6•R÷z\çm;ÃN…‹/zÑ‹ü¼05vél­§•H´?ò•¿r/fþ v$ªNã—š/Ž.1ˆsØ30°ûÕ´3_ `³ÞšµkZŸQD%“[¨*ªî™“AébøPD‰tæÑc#€Î½‘©¾³s> ˆKÞn úÌÞ ·…/ž r0¼3·«d-9„ùoóëáÔ|³ƒ]ÇÏ¢Kiø;܆ôÉŒI{=GÕwâÍ÷žˆp‡ZƘoO“Ähªø!®C+ ­‚Ò0Ú¼)ÃlƒåþíúñåI–öós} ½>j↟øñœ~÷®]ÞHˆÊ[¶l©¾õ[¿µzùËÔí¾Gÿ¦=¼FxÓM/ö90KbÅ@te¢çãÔš²ðÒI§©7é3÷¸z – ' –nM/•`M§u4›ƒˆT§êNUê69{Â2ÒBm;TÃ=¬ê§…þÛÄ€Tuü¨ñººa}ìŇ _+ 0öyæ?cSó €¶AfŽt" 3}O%7Å’›~˜ à0ú‚Q”Þ‘âé LÇŽß±F]îtœ˜º;R(™²n£f$PŠ^ZEÏ%\ˆ'È ŸN‹z}M•Èx\¾;0p1'w‘³>²5ȉéG’Ôœ[€ÅŒ!L¤ª€g¯"Ê8ûKxÆé3ƒ»”ëa÷¹» wA"2¨+©[nÄÓw²Ò33Î÷q‚kæÝ•m“èÇeZ&^º©Ìˆ‚× j˜þ5†¢b˺&„è)œ[Pñ†Î!hžï3Ó`ÆBº¹óÃåŽÍ€ Â#õU~$píµ×V/þ®ïÒWUW\yEáÿèG?ZÝ«%ÌÓ6nô*Âg>ýéêë¿þëy&Zq6;÷†§ÅÍëÆ3å³Qq‰+Ù§:ãp°ÆßsƒÀÖ"R¾£e&3g+~”ÉRguG+k‹âj„1† ¨AÎåY±šR’]*]`ÑffIðc/Õ_=š^©GÓ#ί`ð™33X@,µ¥Ñµ×^·ñï|g6ú ò¯Åõ ±Z±àvʹe pO}êS}O†ËI™}X@½¸óóz·þkÊäåœî*F”\xÔ±Dcõ(Íl&p•‡ÊM@vèÂ)¼f+‰+m§‘e¾GòRõ¶o.Õ-w2“Å¡Ï2gÖ/‘%“Rc¸Zã \éàÓÆ*cûþ.OaИ:\aÚ—•@=ܾÓ·qNQÄG|ü·á)®¤î!˜v‚Þbê4™Api©’ø÷ò²M®}5pÀ“ä ÄÀ»/3!ºþAÓçtèÎc.µ–Ö97¿v¦Éøs²ŸûÑo…ÌÔùê$ƒ~:ÁÌwfúÌü}œµxsF¾úկ꧋ªïÔ€^ýÍßþMõó?ÿóÕóŸÿüêÉO~²7üù!v3+l*¤Ã…ôld`1/'² äyA~ذ‚¯ïÙßÎ-AOŒC‡äxEÍ:Zú°™W2â©p/²ur¾æää0ù\§c‰ôFf-/ÉÈzÌV$õ ¥•®ÑÎÇw^jßõRßÂ!rz\v›ÿø&SùòH`Ây€Ç®"Zs-ѾJùÑ6|Úýd–râï^@¬¾ 8þ³?û³úÈcûöîÛ½zíšs¦jMƒÇM³¬ñN'¬ìÜ,Rå‹.· <•:%T1thmž6Å3~7XN¸Â„Ù–?¹ N$ñYÙ¨þ-.°žÄ7ÓNŠoKJ 5ÃnL„;–Ãr[Êd´àG£µµ“èÛ¸°œU%Mz÷¹Š_œ”gŒð Ô~jÙ×/t¤ª´eÁ¬‡=¨gnd7¾ž¦Ÿ4@èòIÔY¦{½‚c† ðª h6¯PºþƒFÇ«v#í~f?ŒÓ&8Köt$¥áw• >$?Êœx´7¥C²öWð€€åÿóÎÛ\]yÅçªÿõ_ÿuõÿøZ 8¬ÁÂ*½Rxuõ\}'ä¹ÏyNuË¿ÜR½ùެDŽ—V5h€þt,ýsg2'—ú ¡Ä­™²ÈÙ4;9Žž®î¡²õ²JV5é›Õ>9ª¶¥ZWå¤tªÓ rsûP½,Õn.$”3 eN-tyƒ×v‘–ßVÓ+¨Ëyô‘ꪫ¯rÈu}V}Ö ça ühcj[#ºz°Zvi­^Eô—W®ä © #ãk¿ oðX `ð…ÿÉtu‹åÙ!Jw”ñ& )¼_/Ü»ný†ËŽŽŽuš¸+T ç‚Óÿ\–™ÑFQ‡%˜G­?ÅÕ’ÑÛØÏW¬ðaO:æ?3l44ûq Ö > u˜¼4òe¦}©Z4¸6rˆ4$\h¥†mNè{\CX1‚íJhAƒx“€-Yƒ²[›Yä³°{©IìâVÆ ÿ³ÑC,h /B¢röõmMR|¸|/}ã(uy&Ï«~42:ƒ‡ÚÈ®ÑLžNƒ¶çùëõØdè)üi/e«V­öæ¾;¯žñõÏð2ÿfmöãp ^„Ž×ûþõ_ÿÕ_-ûæoþf:àKGE¿pë­·ÚÀ9ªAÉçюøt #gÕ¡‘—9Ò›³XýÔ±Œ”å ”nZb,?Éö­Öغ.ÌEàœÔ®ó`yHµX?…+ƒIŸˆÍùØ„m¯û©4{ÖŠØr=ÆC\Jh-BˆzM{P=k°¼bÓ¦³×hÀ›+5øõÉ€ÂÁøçÇyù¿¥FÿTsõ·n¼ñF–ôÆ|ú–LÅIY6Òøêüå»/¸ðÂo;pàØ˜NŠçu¶—E™ÿ[i7̃¿® Ñô%JDŠcå„ÎïØôQ6)׫³Ù½{Ïí÷·@ʬs‡1Ÿ\5›Ì¨dPð/Á¥"m‰$¿Û„Ë­²A00ð‚•4'jLÐÂà2n.²‚®¤¶þ-u†p2Âñe…Úm ™š{ÌH?™3ÈÛÉœO#â ®öám™­ø`Õ(\ú¨þª÷’!ß%ƒ¯çšjggyVµùüÍÕ…\X}ò“ŸRû8æeDŒ.Æ™Ù7³|~lò{žàÓÿ.»ìr-ß__é;æ>Ûÿ×ý×=sÇÀ?øÐCÕ: ¯'é³ßK”£ýOÿôOÕ‡nûPußï«tì©÷àðXaÆ^`öÏã‚Ï~ö³>`ˆG èPÖ1ºŽ2ÉTSnáÃÅŒ_™’K?á“ì"-(óê°SLÍs©ék…fÅO€öˆ òëî£àñöÄöšìr½ÒÝÏãµPo´òŽ|`ªsH\¬,gÅl;ðùüì?ß³ñÏwè“ÕßýÝßUÏ{Þóæ–è%IMÃT›ûã-[¶ø™žíÈè£(­ÁÖô1mbxÔ¸ù›æ‘ºà"Û)dºEšH€£™p®xŒ—R±£9àG³—e:‘l¼SG{yÑKÁ=­gY‹¹_¬É²®YiÐL5Ë:6d2§ázÚ6Æ•¬™4Íüê»»øÃ²DÑâT³LÄnú$ô`«Ú; ©›'øµ¬¹fÅ'q¯ý0^ÈìǼæ‘=§vaõ=ÚJ̸ʸ^X=ãϨؔlj~Zrô’=ÿGþû¯>-£M[`ã>QêÙý“žô$ú7¿ùÍÕþáVzUÉD|ùË_®n»í¶êKºò?þ£Ò_6ør~oø1øø‰ŸøIõ/§ ãÎ&+pÏó~Þ"øº¯ûºŠïœ³âÀ÷ò@}° ?ia@â’³hòJgŠ7€r6NyGûϤ–åÊK{]C†µAëLi°®K«ÃB¹§n4ØHÿœ½\Ü#v‰®M.Fe¿ a K×-¾f¹ík­Ò[(£µëÖz…*öÌ,HÊ 1y†ã-8}OctÝu×ö‘|˜ÕŒ=€òÎì¿\pu¬ºçž{¸RÅ¡÷-[¶¸ÃH³~g¹2'ЬÔq¢ÿ©N`¯6B®W†¤â óÂecOIéU£ñÈO¨ô¥ †ÑƒJ5¸+¨iã.±Ü¢W<µ¼¸’Aɱ‡zˆÑ”]p×5<<«;$¼Ç8Dš;«‰ŒL4DÙ§˜htû¨ "é]Ö wA3“‹½èA=Òß“ÝãTºôzæeR¯¯eÁ;{'! (:¸ØÕ±ÃwûŒÆ=jöLÛ1)ԃèÁl|Y’rJ]_ºd9~¯–Ô1ü¯}ík=ófsÞŸÿùŸWûØÇÜ.1æ/}éwW?öc¯²!f)CK{ÝþØöê÷ÿ÷«?ù“?ñÒ=3t6qHžßùAd°™åzê+ è7­¥~Úñ† ë½¼O' ²ÂÀ2?Í °¢ÀÙæœ2È&@pòÒ&t´h}:\òX%Wý lxÎ5·z€¸Ü•€HÐ×ì!^ ͱKr¯¥Ø“z,ÒD,ë¼$ÒÈÔúP3¸¡<ÿ9Ë(j&ò$ÕÅ–?›&­ÆL„3Ä™gÒ´±ú̹4Ú–¶L߈9²aã†)¡Úù"9 ‘4ƒåÃ}Ôxe®Üˆå‡â×híJÌ9´!Ö¸ÁþÙ1'îâ£{v¿ìe/ðƒäs‡cEAu0¿·R›¾ª3Á÷è,æõ‚E9×*%ƒâEÈk,5ôÖ Ô<€— tNùÓŒÃtIQ7ŸëÇ/ˆYÊ–‚“1ÙOC/Qè'¥—|/ƒ3jQbS Ûá™BBíb÷% ‰goXÐ`Y$¡=Ù=ÝCv¯‘t-¨™˜ºÙufŸ:‘ŽëÂw˜"¢žû _µ¿ê¿ñm¸yµoË–-^øÞïý^Ïä÷îÝgã¯c²½lÿi½’÷Àx“Ƙƒz($RJgˆÆs@üØà7=­ã~µiŽ%~~œõA“Îo`Ø1üLøq8ØÿñÛèSV >€sDZ?xã§ù ‚±Vñ–i¦Æ %òÕ Þþä3M¢lúøPAÙb_]N©ŸJ™è< Ë)=·ØR‰Ÿ•§¿K¨¹\KX⬴l²É…ÝÈžŸØœ—„R%g–Ôk}HKñz\6Ò>€iIQo©Q×RfÔ _˜¾ð§ ðQ¬ .8_§g¯ZÍãqÐô­ŠÃ%#!Œ&J[Ñ$uJ€ÔKÕñB“yfÝ d´!ÉÑ‘À‡Ù³FÆÖh…Î5ÆŽæ½ÝU€×¼Z֞Ā~¾.%xö(7Ö@ÀeI¢åŽ)ᜰ÷k>òÙ3Ï8ý‡é­ˆhÌ9Û…Z+H´ìhïpÂE„<aPÀšê‚X:>(ÂF@½~ÈìE ,,Èfs…¤Yp&vîîg#Î8Æ!ÉêËAü×Ú„'„ŵÕ àJÐ$ÚAÄs~_\)o Ô™d÷±{ìAéñ4Ö@šRbjün¸Ç]<:ú¥zmÄŸúÁTŒð9MÇ’bíja âp[Q4µ­©í4¹N ŽÁ^®™:ÏÕó™áo}ë[«ÏéË}ÿ¡g÷,ÿÖ,~£^ßcuŽgóà2(@Wf&<ÇÇà³r†Á_»f­VÖú5B>¢²|™’‘^&¿æîÖ_­—¼ €¦µ—vù &2ŠNyŒŸüB&޼â1ý‡g^bÄ$â·~ó7«?–î¯zõ«ªßùßñ)…ÀÁ‹åôÆ@‘[–oïÜÍ‘Fë KÒ%ד¯Ñ|$¢7u½VIóUb\–®ÍM¦ šfq) 瓚Æi#dD+M2T`ž| A+R‡Tÿý<^åå)wÍ`‘=´Õó±Ú­ÕÀoHÌ Å寖Y¥¦¯±ýÛ¿ý[õ´§= UY»ù±k žò”§xyQÏûÙü§G-ê ô&€:FyùÚ×¶}íºëž¨LÐÒáH_4¢¥¸Òéžkž*@¯‰4'’Z™p\sÅÝôøN<€ðñAb²líš5ãšÍÔM?Óµîѵ¸‹6ÂèÖŠ©©gÅÞÔÃôÁHqCÑ]p­O-~fÏ~NQ°‡‡ÔêÑJùV>˜hXÒ ¿žì¾2¨%#£$`oç€>=–´ÛïËÓù1såó¢´M:Œ'Ͼ©–œ—k/jõtéÂfÈŸ NºúÑ ¨]IvœŽ9}ŒƒvÆÕOþäOÉðq¾GóÎpè³R|,ß“.éÀàÓ>¸óc0“Ó[Ìä¥9Ÿ£ë;z0˜ŸC?缑Áãõµ¬ö{sâ‡>t›w<¿êU¯ò[÷ÝwŸ7 ¢³ùJbtèIt™Ñµ6Kȼ'I—…¥6)í¾Wœ(`@KX:Çä)ëP†-TlWå(„‘&îQUyG+88b`›ëëÂòr˜ÞÔuÕa>C<ºúêk6ÜyçiTÏÿË{9pÖÐvp<ºÃѦNç@V޲±‡ï‡'Z2²a#à”N^º[0­áŒž{eáŠf³¯DNÊ"ÙÅˆßøuT9Bžêª}æc:ÊYl&¢£Q†ó£<8×%Ñ=<Ã]‰ðõy¹B÷Á=>oHÕžþâq6µìà×Á6}–(z²Ò©Pz„ØåÚƒL”íˆ}ɾöw…‘”,£ìï(Oú\”HÒ? 4~+ØÈˆ©>ãÏ?ÇM³ŒÍò:cÆkt_|±못î¾+  ²-.® è@äNi9 #ê¼"eêe´ÁŠúN{Ãhócönݤé`gózÍö9ÏŸ7:¢74ÌÎWkχþ@G:#m,çG°žH³>«I‰”ÃIÙøc¨Ñ—=÷€£Ï_¦¼ƒîHµFù·RX=X»~mõñŽê»õÅ@ö.üÜÏýœóýc`¼-à¤]TiÉ’¤Î]9«Nš^³lm…w®QÉJZCKÀ¢úu®#ekX¸L¸—T>f¯‹dQgÝr(/…©K»vîZ®v|äŒ3ÏXNý¥}亻¨ 3Ú¼‘±yóykÊËþùŽ=íRÀ~o¸É«gÑs’ÝTîT˜ùpdèÍ7ß<~ýë_ÏéEcφ¤ p¼ðÁ‡|@ËŽ{Ô®÷‘)‘ÔtHEdNÔɘÑPXÑéP`x› B8wB4D/ … PÍ’Œ:S¿(âŽç¢³ë`Õ„µ§Š´a3…’žƒ(½¸Ùá ú 0vÅÏpÈœ•ÃôTÔ–S0r¶ôôZ— ni$‘ÉÃ2 ÿ">({ôÈNòsI§ŽN>•ý6¨Ì€5«§^Ó!P0V,—ƒ‡Áç6Fìº'>±ºáiOó{ò¼rljx´Þ‰Çpatq‘ŸÝ£—£S¼w´DÝUáðk>·zô˜Z³t¤ýؘÇó|Œ+?ä3a€Âª×~Œ3ôºœ4½fÎ-m3˜ÎuÉå&Aµˆä©Ãs i¨N$@(Ù„‚]ˆlêõuÿýãǶ?vtÓٛܶs.ÈÍKÿ¡v8¢Mè«™ V« cðóFÀÞ@@4nTê8Ëfüž÷¼§ºûî»ÝçÀ‡ÉIî¿MÑ90âF ²pòÇ^b_Âý÷ßïüæM/NgS¬|ôÑGÝ~€ÑNbYÖv(æàË€YmÑGkƒîÚÓO?cõÎkn٠ɤ±Íþ{‚1ú8xžlçG(A‡€ãˆP \.Šb<>*e§4 x\›.>«ÎôªƒM«¡«¡£ sšÝbT”TrÜÊ´ÖþÀDPYÎІ â1ÀƧY^TG+PMl2_JPéWd'ØÐ$™ã ô$w_À¦a$ááê_ˆ©½&îsPïóM¸-ì¡|ª™xDÜåÜbÜTœmêÚ’ÝFˆù·#È‹¦®Ð¨eäY<’ÑFKÛ6€ªfÙÐSÏhàŒž1`ÌžñOM­¨N?ãôê²Ë.sgΧtÚgÜchqÐrêÝíŸø„—ÿyŸÃsØ`Gê/¹dkµe˽kÿÒêýïÿWѲڤCu¦µÄÍ«t1kƒÎ,ýhSÌÌSû9ª%pžÛïÚÃÒý~ç)3N?ÃË.»´ºìÒË|˜Îdüõx«š–^¼³ÿeéÆiaœÀ·š=‚ózn P£‹Ì ¿Í¥¦ÒTgüøAÏŒžG ä]ðy³•—¼ä%ÕÓŸþtç#ùÁÊùÏì…³ÞýOï®n¹õl¢3:|f#ø¶'xƒ²Ý¦Ž—Ï p™ ®¡‘á'îiÎÕ×ùA¾8/œ›®o'NŸ¹JJš{¥4•&7sšÓ6WγÅ7œ¢>-¦¼¦_!Aô ©LRùtuìô¡£íÛw îÙv'¾K>ï0êÀ›¾E«aËõa ËÆŸ;•›}´¿Ø³h&±#Ú’Ú÷˜C¼às²]Ýó¨ä…/|!‰ãMtSáRЮÿåc i¦ôèÖ­[«ýÓûǹSt¤ Ù”—*Õ< ¨{ ¦h#ÝyÄ×Ë:*•ÙGeÖ­_7âu#N"££ •¢Ô$€}ª¨Ã5ÞñâKDWÒ üš.6Qˆñ*•gvnöôÁ±Ï·™ ¹««ûÒ·!¦ÆŸÀ;îBåÇoZ €™,›J©-,/Û ªŒ)g–ÑiVÉîw¤Á°¬Ðkl¬Í26;uj%õõÛ¿ýÛmø·lÙâ+Ïԙſü¯¨þìmo«þS'p±“^Ÿµöþ–²Ï=÷\ËøéŸþéê†nð+w¨‹‘¢-°ûþÖ÷?nÍŒÛ5³E/øÓxчG œž©“h@°¼Z³vµYåó5×\ãÓúTs€<èîÑòø]wÝU½ûÝï®>sçÕ£2þé Ÿ½ûöºÞð\fÑÍ2?Ý@ã‹Lnêxn¸^‘¢u{ɆÝ9-·~èˆÐóꫯöLçö/zÑ‹<àÁ}èCÕG>ò‘êÎ;?ÑÜN7KúW]u¥èÿ›Òùd=xRµuëÖêþáªü¡ôÞò†&Œ#Í8òŠü;ñŽ J’ê¼i×ðuâõšDw„©sUš d¹b±dúgѨi?µŽ–ºXŽ~žáJî3É ï ¾s§N?úèÃSªol\¯ëz湘wäQ‘¥IÅHízã<À ÀJÕq < ȃz p¾Žû—w½ë]£ïüÎïäc{‹©Þ¼xÕ€LM瀢¸œÉ)Ž%å»víþO‡5¢– s¯ÐÅä©^ÍOñ` ‰%ø IB¸AC_ŒÃD4Ð)ÃiYÖ™ÈL ÝìJ€4q)ܺÕd„-ÄÌ,é6€^ëPÓR Uz¶Â5î°Ç¸]‚I<†‘wÃÜÛМ… TºÒò:ò‡ðèúéo8Õ¾DÌò<.7"žÁ¯”Ae…gù*½š¦Á;†ÞU†¬ó´ÓO«Îß¼ÙCбºìÒKµ¤Qõ³?û³Õ%òóÎ<Æô½ï{ŸÕgîøtµs÷N¿þöæ?øƒêÚë®­¾CFí‰zæ¯c<½äÎIy7ß|sõÌg>³zàKTÿò/ÿâƒ:>ýéÏèP¯º¡"—8NÆ>xPïÕk@ÂàØºiÃ,ÏÁy¬€nSV Î<óL?B ­,}cHPÜsï½ÕC>XíÚ½K§óí×&¾UÚ0·Î‡ô ã mB¤S€¿Ý’Œx¿~ÙòU^íÈyZ<Ô.Úû ¢­E¹ÐQ±BAå °%ŸÓoêU=ò˜'jGsõ·û·^þÅÿøÞ›@ Ï3Xb†“ ù†‡­\±Ê|éGôpø‘‡½~ä'ù2«º“<Ÿ{Y‘§?LW¾Ã”SßEi׺º&­kàb§"ùERná€gÿ|e‹Þ,¸¿¹rTÝ«Nô¡«å,O«nñºÚ yPíftÁ®•ò¬“éôµ:6»)¢:}£ŒýçW—ʈþ7-AïÑŠÏßÉ(½óÿÑñŒð1V¿ýãÕ½÷Üëq4·Á¡Ëb™ý©O}ªg³ßtã7yóÙM/¾©zùË_n£Ê Ò‡oû° ñç4óþ¬–ùßïCžÍ£‡äpd.~öwŽV Ø È’ýå°GyGö"›üZÉAçxvÎ)w•9«éHh~¬¢°9¼ÅèӶЉ¶Ã?+ë´²@ûFgfíŸüä'­sÆÛºu«y`¸ßð†7xp“¿üû$^üâ+/έ´ëºº]§š1 Ÿ €»^=²óã…¿ú«¿òã—çÓ7ùwì)`…WÖ‘œ¦…Ýë&:›\y•Ôv\\³[˜´¥¦vj¤»ŠUeŠæ‚¤Û¢ËFXdŽë™ù‡Çài¾2 Ö5Ûz8FvúæÅݬÕVþØýØ´öª¬S󠠬̋ï rX¯ŒÉ†fõ vc,¿[ÏœôGÔÏð9¼&7Š~ô£Õ[e`^ýã?Q©ÁxÍ®f­à3eLXÊþÍò™…3+Ç1ƒÆØ¯Y½Æ³Uf¦·âöJ¯±Êèî•QïqŸvÚé6®~Nz3æ‡Ã°}×w}Wõ½ß÷}Õ…^è™=ÆÞl’»ãÓwTÿüÞ÷útãs»Ú‘ìˆè—7nðF»C2Â:A³Ú¿SûTŸ÷îÝãG¼mð¿ñÎ{ x‚QgÀÞ†ôh³()¨B ½¼ˆñ=(½É[Žü¥}œqÆ™šk@¥/ ²*ÁÊÇùú 0« àû}dŸ¼ò•¯ô £Ï~„¿üË¿t~2¸øÓÿóªûõ(åÓJëç?ÿç åÆãte“%Ÿ(†L ü ˜Ø[p†öcðfÅoýÖoÑà§àð£ý“ÎÅv6òô0öEu*!kò@0O¢Ž|¹3$¿¬lR¸Ö{q‘Ùæl+3h¡Ã%óLÉŠÌÎÒ²]ÈáˆíUõÈ+¼¯Ðkâ£K.¹Äí—vCý¥®-¦+ê®7jÕo½Úú* 0˜y›šW€£D­óÍî奄ø…/zfAÃÐÜzË­•>âÆ ÄÌ>fÉlÚ‹çÕ1ž­¬;?.¸íƒªþò/þƒ^äœ èqÌècv?U¶b£Û |YÕØ#ƒœy²aqù(föl df¯—jøþ† ïÿ|íÿôÌ# OrÚ%!º^®SÊ[%hõŸ×d= b0Ä# (·}ø¶êþŽz0E[fÃÞ‡?üaÇó€e|VTÈÇw¼ã¾óy`~ßð ßà™ Æ^GŸK?­Thƒ#ùÊÀ„G£òX„m :´Jý´Y+¬¿ ÕÉ!“H•/Àð(†H\ ¨Â~Æä¸eºäŽEÈø½šq©ƒD/!âtÿ¶®D¤ÊÖ‚O˜.C.ÇeÁɰ?ÔšÀ£À ¯Ò=€jP/"þ0}OL4yVì)Yê ¹¬&ñÎðRF”Û”–žù~ü…Þ9Nƒåktwè6" =3ÌÇeüqjIìâ-[¼9%êç>÷¹Õ÷iÎfµ×¼æ56P¬|à^bg÷>»ú³qA&Æ•=õCŒN,{#›0?ü+fêaÜš]üàócI#®¯ËýŸ“ym.bð 1;F‡¤Ù=³w6zC£ø0£_¦£³YƇ¯ˆ=°aó ƒ –ÊFûxŽŽçX_ ,x]iD·ƒÕiÃÝ·éyþ9¢áóÀÙXó<ÿg~ægÿCÞƒÀ`мÒ½<Ø"}¼ÚÇJ qùÕDKpÞšX­Õ^<¢ÇmûµzÃÀ„|zò‚û4œ}œK@žºÂH}–û)sdÀ=‰‡Çb:çTjŸ\ê…ì3à”¿DBýHCÎ¥-E0Á!Åk V°<M-\r ÂÄS KœU?"¼Ñi'Ô­§<ù){øÿúáµjß<®–¨…ë=I7ê®ìàXõy¤ ±wÝ~ûí÷¨¿Ù.ØCŠ{D²y °M¿ÇõÛ­ß~Á ~DíaZúŽÕ>1GwÚú.v›ÜãºÖ @Ʀc(¸+èeÛâhÏ®=÷XÙѱz/ Y±)ß}«+P.Œ0d~žåš«\…“Ñ #°2›ŽÇ¦Ö¬k‰ÖË>¡_à ]£IL†J˜'a¶ ¥Fêàð’íLþЯÄHLj^E\†‘*âgò¤­•&hÅ«“¢à˜„WÔ, 1;æSµ7Þøo®ã92F€M|OÖ»å,Ûý»–úß§Á†Ç2;³Ò÷þó?{‡= …¥i¦4˜Ò€33å=Ïí™mó®=ÆŠ¥|:Œ/FŸA†‡ÆÆYøa¬deÐÀsúI¨Ó‚G{ ô¬üœsbç.ƒ +°9oZÆžú‡1äýš•k, ãOØqÜÅ/Œ¦ §Z rc¬7k“!¯üýÞïý^õ+¿üËÕGuL(ûx 2ÖªW^ú'O¬—Ôš>ªÁ‹ ía .У …ð†Ëòþû´éÐ wí®^ÿú×[Ϭ+åže³)άþtmfäñùJ^‘w B(;íÁåõ[¿}¡r‰žc€ãÈaÒ.êc¤SfDyCý«¼¹ÁJwà½ú—¸,ôæzê>¤\67t¡¬—˜¥Ñ§kT¿ò})/YrR ÍÌ‘ÍO¶,I)ÚSæãäÙœdÈ<ï²h÷ÿh´í±Çôý*>RÇ1 Ñ{f]Šº=V_2bß’ºŒ™žýç; YÛÉÌ]†¢”3ôÄß½€XFaÑÐ1h³ÏH¯õp"à2u¨ Ôv—o Q?ñºë¾Qï ÿÕî½{©“XÆsYj­›šx¸äaÚuŠ2׊‹qöÁ‡Nê,ÝM­äß?rL3–åtú<îHÂÀ"ñN¯ÆB5›QÆ'Ýú 2Q-‘-l&éÛKã ¸-©Ðá*Ù-¹‰ TŒÉê¶X·CéB]n2"ÏoÒF0Þ¯g?êòl•eû›nºÉ{X^¿ó³wVõam8Û&C´ß‡áØh«¬_¿Á3m6̱”«ø.Åȳ~ P®Ç¤a€áÇÐç¼ä~;y†A¤¾ÑR7ƒ6.bЧÄCˆ fúæ-þYiVYåÛvÈC #›ÿBh{/Ñkx_ô„ê¨ê7†¶n(µnñ³ÊUèÈypD>ÀòšÁ ¸À1'_Hr‰C+ÀéÀAOhˆüÿ™{pÝ®ªÞûݧ—ôB ´s /  è…‚ WDQú…GÚ'UôÐ¥IQªrA¥£ E?à”¢äDHéᤞœ²¿ÿï?æXk®õ®w×wŸœ¹÷»Ö\³Œ1æ˜cÎ1ûd#•SÃ[úý^Ó,é"'Õî?4sÔæÍ{ïÉOžÕZ–M’e¶6ºmЏ\(÷Ò‰‡ttøª÷½ïýW½ímoý†ÊÌ5*gŒ\¡òÂ"@~×êÇBÀ]úé¢ÑM¢K³¢‡i]Ѭá³9%éúG· BÀÐKÈ`²0~Úº-ûjUÎרǰ[¢»Y£06¬QŽ•ª8 ÔüÒNp‹ ¯"8ÛT…€ï¦4—â¡oµìft6ºk¹˜E%±xÏmæ„ý†UÁrZ¾Ô6-ØVUXm$$œ› _œhW8X\¼ú3×hpƒa_Ám!µ6üõÿjòJIÉeBügÝÃsΟ×mX?øÁ¼^¾çÓ%sZMëÞ9áÉ¥¡è¬x¥œPF{öèì~)o)z¤7ªg©8ü(˜¡¬¤$ICQúØmp ›qëÄôäHjD¹bP~üàJ1À ¶ÓîGz’Š—3ÿ9€­ŒOÔPMÅèÎì“ßÿ^N‘_DÒúZÒûW_«%×ëqCþR—ƒª¸PÞ´…w­F(׫±ë«…›N5?”þ(lDÌŸeŸŽÑÍmVoÛ¶­¡!G+}Ë–-Þ„§Iz=·"oá»ïxÆéçjOïé:©í€”òê(Ì…; ‘6þ£ÚåéËŵ|š-)ÿŽ ›Š±•h {*Ð~ôÙBCØ_hó/ãM|—°cþDúùëÜpjœùŽ_'ÜÐ‡ã•øé/7¹ø/šwÂM\UXÓж]µ_Ð ¶ÆØÚq‘—9]M¸Êbj mÑã ¸!ßQ65ýMÏ™•ìLÕp¤-Š(•=+™G‡B„¡5 £‘=†¾Y„F똰ÔËgK_4âB+C‚Ã/ó¤} hIk¾+.pËt„‘‹ÿ’ö€-\4Š[ÆXð;‘)>†…‚¤áqÔÙ²eËèq{Üè/þâ/<¿8CÃeOï?¼ƒBxAƒ^Á3¦LøNžÃ÷èá•×?´ôGªŒdÈŸt“6ò"˜½zFèá“g.¸z’àáÇÔ~1U¢Ù’ F&˜ž ,æüÌg>ãňÐíдP£* ébØB þ…+ @ñm*³¹ÒÐ[ù5nS³˜{Á6KLdoa[dórq AYÑ„¾éß%UÃtkVN<ñ„5ÅHo\íåhà.7Y“âSF$Ã,\­r{­v\/y¾Qr¿K~ì%Öá&#ŽÓEË3$·_îRa³³*§¾hOS³÷½ï}]f(K”—=>\†–Ê éBöú'ƪœ:¨ŠèBz%Zƒá7ñð¼dNÝ'bD/þä›þBTâé ÉÖì仜£üU¹è TßR¨ùL]+±©¨*wà9W×u}(Cp#àô!§À8ŽwÜÅ…FεOƒªvBƒ›ãööé Sஈ_ç;yʼ§ñ…²À8¯õ&ÿ­°¥P,ä~ß‹¢Š¹zÍ-+£,Ô£Õ›½U„åeÅÎtÒCÏC££aN?]p°B?ß 7¤Í^%·&Ž,öèÅÁ¿Dà2ãbM+ü"ýð…áËm{‘N4üÔèu¯{Wò£Pi àwÛÛè ¢3N÷ÂɳÏ>Ûç"p2 –øÀ©M—µû¸=hŠtåÓÍuç?Ê}½`üaÝ |vHܨ]Œb—ôî¹ÜˆÆÌùºº‰ÃÁ~ô£}ÇG s72µcªôЪa’–O<친‰…“~ðƒÍ7O25ÂI¶CrÚ qÈLÂF^»f ki°f /†· ,vÖYÇ;÷± P "•ÏŒ4ÐØ8ýtب† ;9ô‡] Œ@0:Ýlÿ£qÂVC¦8ØÎ ½,HdÔÀrVò´ƒ&ÅXD5ÔÊ-ºŠ!; v¤šè !ç¢Ð¡,¶¯,Å-ëÀJ>™&ÈY Šì#ÝIŒÓス,àA˜s]p|èðÇC#>ýOpÔô"«óWüH`êº(o³œnÉݹ¡Oid#€ïTþÙà:aR0óñ|ôüç?ŸQ}Êa¾²àPÓ}4 Àf¢h¹3ÈQ…TÜ*ì³ÙP/Aºòª+¯hÆ{j Z–dÓ´ÆŽÌÛðNçâÔ5a›€k]×­Y7C…’töã}Oæi)ýH%©Àø=Hê=#x W©Vû¡J¡LL­÷‚Ñ)`7öxš€5Èò‚¤Ÿ»à׫q¥F †Ö¸êÕ•¿zó9o"(q=ÓŸ¾ç=G·Ó•¶4¹6VC[VX×è˜Û˵ ì‚ÿ¼@‹þ¾l%AÙÓ°VâïãOò£åmvžì×ñ©>ZŒ}x 4ĨÂ'BW`z‘çøt¤Œ™J,¿#ò ?˜Ó?F½ãïè|„sÏ=׋訸·àßuƒáÅ_ìí~ «3Š‚2ed…x*Ôy‡>)`¤) š­Rúfë!,Àߣ=ø©qq›[k»áín;:SWsÃýu÷ _øB÷äŸóœçø &ÄâÛµ%Ê‹<™¦ ‘€a1 ;<8…< ä‡@†qÀ¡GŪ$™Œj.ÅQœÖ}ÀÍ컋ä¸Þ*äš[Ö‘¿ú*(‚‡Ó0I°¦®! pÀæ‚£&]é±hj y’Ì­Õ:€Cyû$nð|¥Œê,¯8óÌŸ`Åü:É3Ÿ t+ß9À@' ¹Ç°u—º”©º›Ët}"¨XúF‰`>c“ ñ¥{÷í½HC¿§i/&{ò¢´›ß8%Õ™§Àú’½ýBX\§x1Ã$Ö’y™‰úTÀ·> ÎHÍ»ÅÙ8…Ehº˜Â¡ë¦ vsí«?…±.ûdÆÓÛQ‚5ؾ}€®q'#wLûU0æÂѶ(*f” ½ù3Õ“G±#(Ÿ»Ë~g]~³uëV÷ð˜Óå@ö–sXÓ·tÐÏ$ÜìGçT:”>BNï;ër_EÖ€5(ïÓq­äª ÔX ¼þ÷D4ÎïNèòÑqˆ>§SUeàEÌ™êPYÒ¾Ö;¨òB™³0Þå*~”>ùÂ^¦2¥"qãX•!#faÆe¬uE²ÂKh}xÑ*Må(.•&§ümÚ|Ôèý:!ð5ò¨´ çb5B8¢™Þ=×øÃö¼>£Èç:p¼ñ¿éžÿᆣÐN¥ ÝÈÒpÅ×§¹(/S¬teO¶ð¬JÈ‘eÍd4ùAöÊŸh-SâU`*D4hËx¦¸•L»Ïú9y PûQR‚).å&Y®~ëÑðUNR¬ÔWª·V_{ݵûO[ušÝkäv®ú®w!ßÀ£ŒðF¶O9åš![Í€èS´9ïú×4äÞ$²0oƒ]VÒ 6’¨§>õ©³Ÿüä'YtÛ=g!û%\w\»ýºk¯»â¤“O:MGZ½Š…€Ô>Eº±“Hä’ ½©ý TYJpcH)BÈ^üqçG¯ôXõ –Ì ó¸Qà‚aÀoÀ‡–¤CÆ3­!Çá ôVfR|‡­Âa¶l‚0;ÁmP f•’ùÝÁOaÏ9ç~ºPç,Ï5ßùNwvž>8§ÉqëÝ¥Rì]t‘÷®Ó;e[ !È¥¢çGOƒ‚¢'˜B‚#ç#g Q)˜”BwSÙý hÝØÝ¯‚GdOïNö9ðÌoA/1œæÕÆ*ð!·OT*.F"ˆ†&Ê# “õü°óÃÛÉ#NKdû$‡±’2¦âs¡ÇUž!íñ{㻚I(ç=£|ðC:ÌçRoÛ¤ñGÏYa®ø¿«m‹|Ç;ÞÑÆìÑüñÿ±à§’dTù qIzh}Ic!¬0,Ê~úE*œC¥^éåV8rÞ™%$SÁÔOÚW’PãhðƒišXXÿ΃lžéá¹ LvaÿÀ_-NºiFgjŒ÷ZW€Ùà”{+ FÖjzn³¦¹´YiìHàTþž  ì¨<°–mFágßóž÷Œó˜Ç¸\ÓÈî~X$ä` JBîŠãR"¹Ëø¦Ý»výˆÞÁ졽j‚)@Y×ÙQ¢åjÑ/P¢ÄGV±d®3V¨lçM‚Ö J­¹M›7ͬÕíh,0gTÆ!Þ¸I\Ÿ@Òuò—‘wÜ?¿ ™½+×&Ú8½xÍMs9Â6ßÅb<‰×A†0ËÃ4õcÃòh%£°æçxYætéÁ}L·ð5½y)J‰á^.¾aA§Å¡,Pì ½!;TîTúä£c¢ÿ ÇA:Á‹šð&AAì8©NCy´<'Ü@:@Šà¬*^F75…$¸r<)ò<îI‹ÅÕ2Ÿ)já¡ 9K¿}Ræð“ž <%Ÿ¨(àüäûCúcì"à@!.IºI ŽEfñf¦Ì™¦°ËO¸ÈSO½õè4õÞYûsÝü³÷¾÷èÅ/}©.Sú3ß/À] ÏÌ0þ–-[|x— ÝSÓ?4 Þö¶·þ¯¦.˜2äô?h¥1BƒiÐh¤€=°¡)a~©–ÈïT„U p>âM$L´*ANéÁ2}êÍ&?‚+æ‘qM_N@Yi¦äe Y®1šÀ,#ŸÌ[²µ¬’£™+¯¼RGÓÌ ìZÙê„\þü`ÔA‹ogO>ù«·nÝJ@›«×ª¬úŠ`…A¿ÒÈFìâç¸ØÕ)rj(ß7‡é4² FëäÞë(Ð(} ±üXp誫¯:ÿާŸþ(ñ‰Âý19¸ ãP{f.9ÝÓn–„@SÄ—¢’2Y§ƒQtêÓ¡íîA©À8Â40ÀÓ7†ŸHäY¬}Uéï*XLÿ;ù•î-šÞg„Ÿ‡æÊ[ñû´’à1°ƒn 6ó‰/ò%øš+ü™ë¿Qy¼zôô§?ݽ4Vñ3"€,¬“2âMŽPÙÇ plåÒyø*æT>z~—±;`ݺMqŸà¢Ôø7¶¢Ñ ®Œ3&'>$«“Þ*Ã;î€,~U ‘4ßcq+Nû5Ñæ¶$þI¡˜”öËK·§d]ç(¨¸1ÔAÎQüóP¼d%KcÝÛ¶m±ÊžwŒ „™jqr!VVT^ûG·ÕÜ>mRø” F¸ÆøJÁy²nb|úÓŸfEÎw8pwG3½Ã!?ä˜Ð˜õî,jd´€Å Ð‡ €Ÿ©†~ùax¿T%Mšv!–@R_™ÊB^©ÇÚáO;L‡ö[¤`ßQ_f€å¢ Àùt^P‚sù¸ SezS*ŒËägòM˜qSê2Ÿþ§?Ðè”,r@2ME¬/: ÄÃþõ@ô+¿±Fe£ò:£³2tÑ¿¸ŽÉJ€mE¬:¦àÒ³r£™"~ÏðžUEs•ç ËÀ½œ¢¿_Øîz°Î»Ú €è,2r°,Ä—+%¬ôT¨ÐÖ¯_7£…O«Žt¢À~—ðÝWTxcnrè‘RâZcïÆl¾”°~¨É4«¾è‡Üœ–1\i‚}Š 0JUãCÅKþR #€Ð¼Z þÖÓ#Wp»ÓË\³F7ç3ºQ‰ÂDo¡ÛŒ‹†ðüèiRñ£ø—Æé$ß¶#é ÷® ‡1ç&P/uÀ`øâ8ègJªgÂwàˆ1/Î÷Vìøà’xN’4Öp¢_–Ô¼ÎoxÌýäôw¿ûÝ>u«…üûÐ$T‹ù4wgž78E ÷4sçÎ]£/}ùËžÖùÏÿ¼@7~Ïë9PèÀ¾ð u>ÁW½‘#‹i ;TXŒøÐÐ@á³õð4sÄ‚Ñ"¾i¤üíßþíˆUÏL qÒZMYŒøc>%à 5VbÓãf×j†|k #þ¬ÜÏeXg>% åq‘ø;þnoã@‚ÂPQΘÆ5=#È¢ž¼ÒPͪ1š{½ÏDHY n£C¨5kÔI™aí²G}ÔÉ“Œ4­·Øü»Üù.Gë2¯µ²£Sû;ú#>ËFáfµÃ@;†´N3ÖHäILÄÔL”æËÚ];wþP…}»/¤pžv< ò*…ùŒ4F‹™ð6ÄÆX ÊGS€äîˆDéèÔ£h€ˆ©`Ç&G›¾¿‹cãW›ïŒ<ôîÇ-a’WcQ”–>Üøî»ŽÅ4ÆBÉ¡ë_]·„%Ü•ù‡A+8'êÑÃÜ«J{玽v§â¦Òf‘ÓL³Ðè"ÎÍ)s-½÷Tô©”xcòm~äyv@RÕy‹¾quBô\ÿ…ѳŸõl0/¿Oy¸^#8äa‘ò‘ņ*@jøíTýiêá“×ûöjZ­ôÌS¦YØÉ9þ(n¦Qø䂺7r|*aâ±YCNhЈx‘.;ÂÍtˆfL!A“kÑSX¤wQ öé§úÈú†Î×Ò¸ë7]ìL˜išJˆàg+T¢Êº8Ô%¢3&JY$-Ü— ¶G„“ÀC•8W€óJ¹°PdÜ9‹^¨zkFöŸzê©ÈZÅ©2Ý7Bõér3Z´Œ²§!P7ê€ÜhBr´Lá•æ'w,ñ„Ñ•¢³_þò—E›³'<ÈN€ºéòvì¸B•ÂIì?¨ÞÞ)±¤Ô¹ sÆ*bÛ‚”‹½\}vYy—áÛªAn¢Ksˆ3:AMÞômÆM8ö|ôIáìºö¿Çaõ]:1,ÔÕEäpe¡f,$¸zÔó9N.ÉÖ‚ ž¡œQ Ûs~þvÝзQ½vn”;]Š‚ÑÎmÿà?8úô§?í½@h¦"F|C ÈËv±‚'Ò'Ÿ1¢&¤šò91쇭lÛÔX^⫇oš¡I üZx^¼‘èJf»4€ š»t·a¸ÈeºXCžÐhàÔÅk®Ùî)N¤!ðõo|Cùªë…5MƒòÍ PÔd_4æŽ;6æäw®ÙéE…©ÐÂG¡‡Þú¡Ü™ž@‘ó&lš”“t#,ñ´pØ ‚ApãP2ß“/¥Ú1(ÜŽ(“DЍ°Vrié¥îÒWë°üd$, iÀöÈVü’‰ËÇdx–צFz¦„ “Ž 6éO/\k9XH’²Ì"[¾é'þÇOlH7ÞÓ6ÔÀ•Œk!à~†³V#bµXzµü²!€~í(ÅqŠNnµáB vË<àpƒšAÒ=mš‡àÍÛ`þN&tzi±“…€,€Ø»g÷9úè»î—âWç0Œ˜åJªÅ¦ä0§xÙÝ5+JÛÃÁUBå瀊ãb¥ÖÖæM›g¼À©ô8 V¿†*î¨bêP² ~EÏ{ìSÞ„·¥|7ŽCîcnÂ5ä˜QzïNØ‚« "‡øoҖ0S:^©­¡y­Ý½ñÏÞ¨[µ/ûØØUAMeþ…/|!PÑùFq`’¦xO¢! p”¹5?û!ÇüZ|ˆN›¼bë¾ZhvoC·©ò³ãÃqT$™æŽ·ÀeÌVŒÉó¨:aù(xÚ°UÁbÅ‚]Ša‘y´oßÞÑÉ'Ÿ¬ÆÛ§Fïþ›¿½ý/Þîƒwr&8"?ã†DðñC.È{ÒK* œÎ.éâ‡9JyÂ: |׆o‚“5÷¹Ï}ÜÈüÑÆH°ÚíŠf“¢K͸áŸÜª!ö*‰aå4#¥Ö«ÞS¤YàÙ¯xÔrªÆ¿¼Eº•wì¶H–8â:ˆ„d52¢kÙr¯E²¸4™[}ù—{þ_ßX1“eAehV‹h×q5°®äöB@•§µBŸgÐ@;º÷]¥lÌRîØA…YJÀ—ñH•="+~][è~™÷ÝHƈU–¼è®÷o0ßËÜ%¢c_‹ª¼U§Å7à³…LÆëGìæ'‹‚ÜÙ#¬ ØõcÎþÔ%36®g¨šE‰®œ‘Çó[t´cp+bÞqü ºÃ×¾=€éE¸žߦ!ÃÌõvü ß…ÒÆµ±ôñ¸'¼£²E¸ÞúÖ·ŽðÀxñÖ©·ºµ‡v¿óß1 —½üe£ŸÐA/÷wçÊ~§*mg®«¢7Ri ž“6 Ϩ±ü9õGÀ,ÈõsÕË'ö"U…–¥!nÆÄRRcçø®dÀ…¿ ˆ„d©uånT†ƒß¸vÜàäf všØÓ~¶«# 2x·m¯?˜]·n-£¦¬Òõ¥@¼õ«Ö7J¹ŸáDO eçp›1Œ…i®P¨Ôî~÷»{û„Ñš/†]–—\véeÌ%v*1ɤ¹ž‚š‚«fšò$åÖða…Å’È1Ù¿¨@9RÙRgèŠÔ M²¢d|@) Ƀ˜aâm4ÄÅ{ÒËÑ ¡<{‘äU‡thãê»öâ9àýŠÛ 8ÜúîĘ;ü!ϸF÷ íß?áøFŸûÜç¬ÀÎ;ï‘#¶q½å-o1A`C10÷ÏV­=š.à‚ eHÉ˂ܡ«tÐZ…+ÄO¢Þ^PÀ_I_ei¬P–ð•sX‰PLe5àäaS+È!{¾¬Xÿƒ?øƒÑßøFw£¹.DÖÍRŽGkÎ]jOWóÆéy\^„Ÿ ½›bÒ–ït?¸ÿ óa:õS–§hÀÐà{ÊSžâyž­“ú.Õ"^H;õÖ§ŽüË¿ðþh1Þ‹Gçê(_ÖƒpIÏÓžö4ïÝÏí{(~äf’ 9l}Ío¥yv$0:Àð><ƒ {vë)xhâÈè÷èÐø N])nÚ¢TÃÉ#Õ4\v9¤á?ÑÛÔQ+G{™2*ê:¤7e¸E¾î5±Y™U¢a½ˆxP NF t÷àœsQÎÈ! %ª†ü:ÍÅ»0ö¼¤ûŒNÁÜÊ Ùz'@6xçZÞT?ùk¶÷&­ùV˜76f †RX©ÔSœÕ܆ւ­"˨V©R¤Û¬Jò"í¾ríê5[5ߨ…€$T‚Ž©ŒŒÇ†yØ7Nn Š…þÈ !êx‡Á3âïØcŽͬ† …±¥}¤³+£ ¤q¶(ÍC&\‡üÆ}2T¾‡à…›Ò× ¤øïD u–¤ÀŸ¹+gB‰K÷:û^£ohQ‹ÿŽ?þ8ïç§Ò¿ð¸·{Wò‚ÌÞ°‚\ZµºOgâœäžþ¼ç Ð^á?ªuñA6¯Â¬Ö§Æ“¨,v]¬Ž´†õâITi ¤P`’óѶmÛ¼Šþ‹_ü¢O9˜-ƒ?ºä’ÑG>ò‘ѯÿú¯tƒšO–äA¦B {ˆg}×·Ùjd’Òâ£îm¸N e}˜È;8JÇÚ5Òåc Ú¡UpèhYi æ…hÓ"\ìñØj¿ÌÌ0'¯Q€›t,5k\6VR¶ÜP¹>öØãÖ©ìlP¹BÉgC ¯ü¹;κÎáÍZü˜‚¥LRþ’nüWÒ Ž$Âì 0 “gðÃd<È[ÃÅ»vïÙs §‰)¼rº(uÇP$2Û®G±[ʧµ¾ÝyCK×ù¯Zo;ÌQ%£0ŠB¢0°”wHým¿øšçIܦ ñïr6N£KG :°¤ãð›p¸%X7šʧë:–Æa *U†ñµBÕ7;~å+_QÅÐ3=Y>•öEª 9ÛŸýääy,Ó €:#€9èï„ã#“à(­¯Ã¸’Fà ¦|Öiû!gM¸2¬#Öv3ÓjWÙ»n| ä‰BG¯˜íXñÿø#öÔ3*Âylƒd1ÇíþÜÏýÜhëÖ­> ÿŒ3ÎÝCw#0·Íœ6ÔÓhfcDŠòÀ8,©q_‚ÅE¥Je‰^ òSx Ù›¯ýÉ^}ÏqÁ_ÿú×ÝðËù~æüiô°ºŸú;ßùN7PâTj4•Sþ€ÓÛç–γæló€ŸøÄ'FŸýìgGï{ÿûGç=ò‘ÞbÈÙð†E¦nä !àóH3 ‹Åðäƒß΀ ¶Êá)ïZÑU¤ËW%ð±xº ®åj‰XIÐ"‘Ц¾­UÛƒ«ú7Ón‰åc1ç ‹,*]tR‘§Õ:»fm‘a'3óp^@‹NäWWÓÏh”|V‹7ªe€…€Ü ÀBÀz€ÊÔ?¹C× -ÊßŪƒ1‡»,ôjwÓÐ

ôEJºáqèºPa깃{ÿž#^¤¿Ç°^c~ 2Á*•w¬ÀÞí–%Êþ+ºÄ…žJ^*þðÿÕyþze vÜ1<úXXJIO3 =@ð‹0ˆÌ~|éƒ(ÉÄ nòüFõfYÉîF޵Ž~Ímolx+<¿ù t ïFçýÑqÍçèyÏ{Þè2õŒ!ÞýÌÏüÌè¹Ï}®×OÐHàžW¼â£¿ú«¿Òñ¸Wšwì©O£$øàÒ¶0J2f÷ J…ÓEBv¾å"Úàip(½(ä%Êœô¨7äž9t0ÍÃÝ4x¦ زe‹¯!&JåÙä#ùIe…ñ£aÝ Ÿèv@G\ÅH›ßòfO£¼éMo­W›–€Ÿ8À×äfУ 1hIø:cÚŠ‘c‘ûØÇŽøÀzè÷§<õ)n­³~âwŸøÄÑ#ÔÃ% ;,82™£’á!‹áíÙ»²9ˆznÇ&9æšÂ– Õ™9âäê!ä¯2×kÇ rü£L3OO£€†=£”#zòüãÝX|Ò“žä© ÜøBZXJ¯Y¢¡DCàÞº3àøãŽ=îq“œýÌè.º9ò‘xäè£ÿQãÿß¿ø¿6­2qŒ¢`hL`Ì+åí²ydhÓxÀÏà)û«všŠy`Xe gÉeY’žy"Îáj Yþ,1аq]–^$×ðÙã¯è©ƒÕö*Ȳ­Y~‘û"£‡¨OVR¶jØ4š·lÙr”Rï À(@=€Þ%TLcx[£oÎÒp8 DÍi’ je2éÖhÅåÎ?Á³U°ShwÒ¨§5¬%xŠ„gAïàK#–‰ÎÑ[\»f €ÙæH`¹'­ø¼/«SÐVf"ÿåQpµK¤oÖ…FgPvŸäÙG9…aõšU£ûê€΋߱ó†Ñ‰'œhåž0—Îp›½B„A¥ïÆøÌHÁ8­ã8ƒÎqÉ.‘Ý»˜#¾Ñ 7þ4t&EyÀ=l”'ÓÙظy“†ØÿQ½Èÿgô§ú§HÕ4XÔ¼&³Ç‰¨Ü|ÇÃ÷\’V†ü9¾öK_ú²/¹yó›Þä qpçT<øAîÑ:zÀ(R |GqÒXP yÑ2Ù#)>˜(+.$ßÄ#*tûêa»òˆ/*&h"}˜|C+?ÌÑÓxyÖ³žå]ÿôOÿä‹ ¡ìÓHàÖ?FPòL âÆïU¯z•‡öá¶È-[¶¸Á^Žþ°¦T/]ªFuaŒШkhÚ÷p?àKW¶ƒ“ÉÑ• ‰R¥«àq]ùÚæærq‡Œ4iDEz‰éŽM¤«Dª‘±ð;á *8M'iq"†EO4B‘5ð˜o“I_aŸ"1¢&Æ–æceð<°úx¹OÔä4¢B-LšÀDÒ¦gÌ6€"‡S¾(2‘#êæäÕ¸‘rz8dKei†ò¯ŽscÜHè€póÊ?è]7T¾œñtÂ]ˆz–ÍE%~ !lNC¥‚¸ßýî7ûáØÛ,Ô#`þŸŠÁ­Í^/†ïذ~ý)ú,‹-~–³PMÑ.™Å$e$d&h í ¸ŽPQ&ì—ÁùŽ…€¹Hh 2€/EÜáûß5!?!Z(*ÒÒ;–±“ˆ[“ÖÚ»8€O¯š}é×kÈ–ã}éþ«FXðÅœ/ ŽBqÌ_q›ß¬*ÿ\ISáSž)8pÁ7ë;‡Iû ¾öAÏ›3ïÌb´[ÞòVR ;}2ÜÿyÇ;Ü[~æÒO;í4+ÜGjXýb-Š¡®c¨Gl]äÞùwižý†7Œ6é”/…ÛFÄöùÜòg6W`!~Ä Búiˆ<ãÏðñÈ/xÁ LŸÎý6~&†pÇiœ ÊÎüõ×Y.È¥Žô§5vi?Qéöe¸È š#¡_¨Ù'uFÀK_úRÏëoÙ×ÿ².‚¡Õ‹.ºP£7x²Az©À>¨[oÐ(Â]a¬K»¼8m¨„!¯v^¿Ó׃©llÂcÜútU‰;,V8ŠÍæ8–•4£Ð£È_ [&^ÀHà³Y؇Øÿ^j2¯L~< ¨†›K½øx°S³Ð,¾iÿM:ðŠ5\o-Ù’hÅèÀ´e xLqª¼k÷Á¾ÑV] ¬Q³MRæªBVq50J=Ûišh4ÌP~.ÑâÄLFÜWC Ô “yMEˆ /ºÃ"ƒF§!°J„Ýâû6CºJ˜5=e'Ë…›!}#1|óâI!>¥“¾Ž€_ ÖPD($* kÑõB*‰©2‹¿Æ¸€Tß^XÇìÄnBYWú€¨ü:N¯Cƒ-Â8= 0ß@Ó-Ê7oìïgåõåq££Ý² Kœɤ)<)Nh£¡JŒ9Û¶Ç]2ƒX™è5”öõä Ç5ïÓö°­[¶hKØ™^YO+s­Z»Ïyö³½²þ¬Ÿ¼Çè£û¨W¡³€ìa{˜o $}7ܰëÊi œ¥d®¾êj+F­°O„±ÌóhâÉÒØ#r­()F"8X‡QNCQ2”ÍÞwÊ?VÞóf! fh_ªq9¡P`A¶))áX¬ò¢r]ª5é¥á‚ý©O}êè¼óÎóöF†ñé­ÓÓÿÖ·¾¥FÀunHrÿiFÎÍFna»ÝíoÇ–(ç?KlM„/ü^ùÊWº!¯ÿRé_N<8™üM=uÐr .0n©ÿÀg:m0XG$$7únê]"`ƒ€á¨†mlRT3T¸T0Л…°#?À64å¯qK ~öO‡x;~ £ëÝ|n™¼ ¼6z`o"U|&›dúúÁø6^)^Uâôô?áøÑ5œûT ÛÒ Ø³g¯5Ù!°}ƒRÓî ÏmsQ›mn(_.¼ˆ#Ÿ•Âct ìỤœLCœqÆŠ!.òèÚk¯ÑÇzNù5¯}íèÜûŸ;úç/þ³çúÙ³®í4V*ŒpÁ7¿ùMÇ¿ûÝï¦-yºµNi˃tñ;ô|*²æWÆ‚NdûFµÆY,Ç Š¯ýëUªÅG ³™c„ƒ償ÚÃvO8s¾-Ì"äÜ_zI®`Å=cMëé¥÷ÁÁoþèURÔ¯{Ýë4Õv¬w p~GFäÃh ‹ûØöÈ–\G{u'n ÑÏ Jâ— w½ë]v£á€û,N+]8‹wÑ,Uýe(Lx:–@¡'ÿñ ÀËÍÛŒü(U<§š ÐxY0…Tn)²ö.aŒþp>À«2©YhÝK³j¤ËêI_åBÀjºxúDQ ‡çÛÞö6¬v^#¹Îŵò§âÍ9¦~— ŽŒÎñ8‡ËŒk ˜© ²÷V‚˜J%œ.ÝìŽv\Jå¨YcVñ#=) ùNÁl}B‚€a`¦­f‡xÊH%)ˆªØÑ¬æ¦u”è £Ùˆ0Ý'°jöuC£Ž/ÂuCË…øÐ³:!;ø‹ÿ8¸€??*«$ÆØ¥ºI :CûÔ³_« ò²Ò­ñÑûGYˆâÛ¨J›•øÚòž÷¾×½]·ôljï¤7ø¥œRFQ±sf>‡Ë`XEN^±ØŒÆ t\tÑ…^}NÏ’ÆsʈAÏ›—åäeºpà @jGy,­q/¾ÕXÉIÞShÎ-‹”‡}`Ø›Æ -øZ™9ï{üÊ\Ò x5£«–y[–%ŸP§«•o}ZKUß—÷~zåŒpœªu ozó›G\ÌåBŒqu4=zxpÔæ£F'hÚã5Ù¥ÁVBÜŽ9:î ÿŽSƒiüX,H<Ê+~¤“ïij’º¼$Ì»b›’j~“¤[OÿÏ `i¾@OÓ¢"k…è}fœùÞ†YÂ'Òê†@;e¯uY¸Íp˜úâ_™–,µÿÂÁM5$¸Ó@uQ­M[O™¤>“¼©8&µz:ï(¿n°5] aï|Œ çNùËis²`oÈ/ééµ@( jPXéÝÐ3ÔJ΄ËÏ Uþ§æ]vª—¸FÃóȤ¹©ãYÒlPä­ÀË1¥˜·íñv!‘5›˜q‘‚è¥uÌÑÇà;nŒÎ$tüÙa9PØÚ£|ŽCè€+À4äŽg+p@‰¡ZSÜôjö¾´Õô¥§At¡. kÙ©xÄh€ ƒ•&={*Þ_‰¸Hƒ$WþìegíÀk^ý+¹mÛþØ œ»åµÁ¶o:[ÆOÒxûþ†2 ‡ ± ú@JP°(V×óÍ"4”½E /²ýìÈÞ ÿÓ°à{ñ&å š‡ŒÜ-Q‘&.Ÿâ  ”;ðe€† d9è—~é—œ>øGZ2Žá•¼óÝò[§ÑÒ¾Qk5È­ýj¨¹¦3°/ëï.¥7,òC©Y¬›ÐšÇð–´>ã÷߯ŸÔôËuúߨ·õÖŽ>æhmÖn ”:L”9/J¾ðÍü¥rC>hðÐ(…GT–ü°K(KêâÂ'ËH Läî ãìQ˜$y¡£d Ÿ‚J2/àóÔøáÐÀÌÃ",Á©¤ŽåÀ\úÁ uòÒNY¢qͨœÎž˜U'âFdOå1ƒ ÂZ®#à%ß¾ŸFu ÿ˜ÿG°ëQÖä¯P™0{óXöœ£¼¬´™³<£G€ÑÜ,LÔÍGëü¬ ð 'W^uåvÚ² Æ«jtçÅ÷C ñ[^ªÕ°Òþµàê-ÖÉEýxÕ†1—åXjy uôQc\B⯂¢PfèXèpïðZü-Ôtã¯àJ€Â-¿óípù1ÇÛô ÅÀ-ÜèïÂDÖJ0ÜþtÒò«¿ú«æ•nX!”¶0ä"|ø[ÙjAá3ŸùÌÑ/þâ/Žòà‡Œ.Ó-rTêͺ'–8]úiœyhX•û•å‹[ëfI”9 uû·Ë~“Ï—`ÁÙoüÆoø÷ä'?ÅŠ‡5(\ðÐpÀpb!ÊåÄ"@ÙE:éË´ñù!}=rñª~áKã娣bW•CÙN(ô†Ù÷©O}ÊgpfÀCòó%„G‰"­¦W(ÖoˆÆaëšë®^-hÕYä•®×6¤ÌR.RRÚåtŒ+2çrrÝõ×îÿû¾¢-‘ð€F=,v”¬^«éœò¯ÈÖB0rèMVd5Ñðw`ß jLgÅ Yjy¡ptå¸ÚJeà@ê¢.\ :¦‘âÀäƒgð!»!àž$Tm* XŸnò^¼éGJ:xGÉrȉ€Ú °wߪ+®¼R*)Î;ÉzmÚ”$\ááb-f¾ƒÎ¼Ú´Qu—׈žœÈ7J2f ëµÿ÷÷Ž,èÅ rcëŠ<Uò¨Ôd’ï&H²`•~ƒÎÿ/í¤"S@+ÔûŧcðÀVR Š“¥Lv>1Ý:>.ꦕ4Ƶ „fñK ƒuÁ> †´‡I WÑ«OfÕ5R¹F á=V”zêÊ>e\;iÖkô”^‹`½ §x[ùëîMýÛÐf9‘Çá2IÀœø²ÆÞ^Uʳ ãÂÔR‘²pF ߥJûûî¡1¦áÂ&¾+i¤1¢¥jÁ$;Z‹+d;*ý¶ížx2òæÁÙ¨Œ4$©› J a¥Cºà3¢P U`è5Í•[€xfØô"NÀkbÛ)Ü3”ßÅݨ:½ ×sÊå¤À ÑL‹J@(àµ#Ž™üÑ~4:M ìÈK”*½¸¼q„±yËp.y}òI'û@œóµ0Œ}ñ4½ß6¦˜*ß%—^:úâ?ÿóè:kàŽR’ô"OÐDïxÇ;Fw»ëÝFÏ—‚Eù1tÌÅœ%ÏP9²~Nâƒ~Ö f¿$¢ÈeuŽ¥¢v ; –5Ч#fZᜀÂ7àsÌíÛ´hí—u…î¯k„>¢˜iåÓ{åÅgk'Ãûuæý\àÅ’Àf=‹Ÿ¬ldQ&JŸC˜Øî¹çŽóèÇŒ^«[¶li{íè×4:ó˜Ç<Æ•H·õtÕ)YQ{°É(Ì#äHe‹ä%ùrÉ¥—X~Háki¤$Ïž¨S9"¯á <íð\‘ûßÓOW›˜AŒzÈUÏô‘DP–,K«/ò‰ŠmùX4TrÔ•ªÔ“mr—Ç€iÌcá]°êsšh–C(å¿¥&h žË® ŠE©?ÞþãûoÚÏ©µÖ3+)sÀ–œÏ"ï§œrK/”›§ôÎÞ?ïlÈ9R¡ºÎŒÖùNçÃaælÚ:¨ô¨eàsós8(Åp9+É5ô«D(J^„Îå3¾Üp‰2ig¶DL?yà³Å# ©®R£d赩ã©Z Þ¡1VÓDo\dQ8GÁZ»Ù [ÇÇ^~¼ñ—.åmà«çS}fÜ~¸@°ëà ^…öN_u«ô¢‹.*Ç¿žè&ó°\Õ:1Å•ÑRV÷üXÈÅ07'À±/þG?ü¡{ÁÌ]3Üoä ŽhŽ‹Ó,>|‹”a8fEÊÜ1û^ÅésÐ÷×ý×#nàãÖÂ_Ò” Nòb]ÛÒhÐÂfî{nc dÕ3i0c“ƒšvXï;èŸ%…ý{O~²a3—í |Ž(Ž&zsOüÃ?Œ>ó™ÏŒžûœçx‹ Éè  ßFÓL Ð8Â0 À¶¹'üÎÌ/ŽÑ&>£·8å-øcŸwð]–óªW½Ú îx».Ña¤„Ët˜6`Ÿ=ùçÁ4C>L쾪œQÔàqãÌÖеZxêèå/{™n@¼¥çò©X³Á„LA;ÛN·mÛ6z”FœhìpÏ[BáÙP™\©”¡¼¬¸¨XêÞñJ!.Bï`ž±ç“ïå›ÖySP¨Ý— ƒvใ§„ÀºúWJʲ±- € L.¹A; ±Òó”c•ÅõìL¡Câôd”)¿«ºv–ú@S˜,TñhF²€ÍúâU," 4˜1+I«”Çœ € ˜ÄQáQÀ1ÅÍs"– ‹5×]{ípƒÒ²VYàP„%¯Jîè]2ËnáœÖðSèøç´«MœŠ¶(øƒék8C^Kª&ú¿¯< †âßàË°Šº £øÐÐw\äE¥3lˆÝÝ ™ô ’[›úêÑãh%nËÞde ®ÛÜæÖšŸ½Z‡µìñ¾öCšãoMÀ…Œ•;­QzTä(ëç>÷9>Ð…ïµ:ð…^u‡E&—Þ¥ÀêðoûÛ>b–ž!gü_~Ùå^(öY)Ç_ø…_ð(õ‹5ÏÏ©®“èXHFƒ“ÁÅ¥Á²aø°à4Ñþ /eJŠ4 »|ÀF«±Áü;½¦$† °9P‰¸£UðÐ] õ#wÀãG#…ÂÁ°ƒók¿ökîýs¿Â×¾öož*x×»Þ5úª.dúó?ÿóÑ‹^ô" x+/°d!; P˜;5ê°G[ì¸^…y¸*‚¶”†üÆ….H2¿àóf}¼sÇÎѽîu/ô2§¾'ìð‚]4j˜Æù}-"„Ï£ŒYÑô”‚5D¡ÚCÙ 6ú•}‡ÓW76&ˆèb |ÒšØújËébá …7èÕ)(V°úGìù´õæz˜¯pJõkD áŽSoy›Õ¶Ô›°+oVt+`ÍŠN8žƒsê+³P4 H#~6¨w‡™ MeȰgŸsF !å‚…€Ô«tòÒ•Z½WÌžQYQ|¬ü7™ß¤Gñ Ž.@xðQâ–7.†‡E ø¤ûÚ YùîÌ·Wﮈ@­Csvì{´AÂæÈua#BýíÏP‚d ÂÊsùÔ~ Ö¸A\¸e8षÌͦ‚:M§í!\ë×m­Ópözͳ7&PuøD6¢l©Øo¡ùÿPøïþîþç`Ž#b¬H+¢L±â¦R`Uÿ[ßú6ßšÇé\ %#ì›ÔZ¾òŠ+­,þð_÷–ÀÏ«¹‰•ö¤[?7«Ì†àY@ct¬8áÁ ð3"]„ݹs—#Ηtº § "Óˆ®¢B™íÕ|6»&8*ÅÏ*ð3œò‡6Zû~C¯Ã94–þæ<ýO:Q‹á]/yÉK|œ.=iO×\s­pìñÔ 2àqÆóèŒÎdjH[A ¼%Ý6z¹l„£è¢hêCÿl|üãïû8Ú™ƒ›ÖÑTc…ü0?–‘Ž–†wÿÉ»›TÂÄ'S7ÐWLêßpjÝÓªoÀÜÑh*Ÿ$Q~Y•- gÐøTÈ à x„h\—e¡ÌÊf€,t, út#EÐ o’ÙA*òåÓù¼&eϪ«Tv©ÃBM‘?ÓäZ¤ œÀW}7ÃHØÖ­wØ,· *ôöix*@öNï_înP¿R~˜¤®¦ž¡LEZ¦OoP-¥–…¾ET‡šB jßøµêm^ì¡ÙC³Z`ÑiÂS,²~ cɈ¨ä˜%bäGD~d/—hñ…*o*a1>"dàˆ¢ #¨<°âV9eðñw YåCÔŒk8„I‡~¸÷*ˆ­“‚v—LŒÿ„Ób¾I èé"L ±cè‘¢ø.»ìÒÑÕê¡mßþc»Ã£.;ûA6Q€˜ûFÙmÓð.…ˆ=û?¾úÇ¢‘ùþzΪ Áf^ûØc½XJðÏÔf €Æ0¹±Ž fî|ç;Ya«é ‘•‰( .vv×üPê­)-Nl¤Ù€¹ç=ïÉá £K´žCï=a[‘ð¸y„ Ä…NF!PfŒJø \50Ì÷óCáa˜² ðéOÚ 5ÿhz)د~õ«îz7 ÈøÂQ¹ðþX¶C>‘.~(UÞ!»½¢–{¦á_á 9øÂÍüM‰Ð»gJÀ?ð|éK_20î`a$£A¹bZ‰—xh…¥Oêˆ0™Šò9í—ÁóŸ;L då‹}*A®ÔœœHSó°~ñ½XÀ„Wä$®À‚—aÕ»q#ìÒ±{j¦Ð”ðø #›H„æ "»–è ²o\£)3e@ÅiåÒÿT¦g('·»Ým7ê­ rc!`Þ@«ÓÐ7D5„Q–— ™¬p9§ÅKTÜ2JŸ³AÃþ3«5×r½Êßæ6·½«*ÍCk´M(¼…ÚHîY8†²Š7½yX2&ËÊ'G¥¨WBŒÈbcvæp7kU²æxguÁX7\Íèàly]¹XED7>„ù¿ ÜõOçpöË0za 7ѽ‹ÛJØ jcÍ07ÓÑC¥f¨™‹˜«fÛæ£6^ú’—:NÉˈQe„$Sãü>²‰^ çÆ#ôˆé•Óêž4/ïmÊ+(xa楮òØg%¯¹;+”<‹x¸%ÅÏ2ô¡Ì1mA®¹'{ùô+­ ÿ³?û³ÚÑð-+kÎ8 Õ¢Jx,v£gà'?°ÓÓŰ‚-n(}ø1·Ïü?Ó+¢9=0{ÀäþòƒÆƒÓ(åÏTJßi­Œ °³¼T‡«"ˆr(â;R£t6e2yϨ k#>úÑŽî{ßûzQ蹚ç§> ðŠô"WhË(YcA(üf=HÜb¯e?„®1ÑÁàÓ)ÒÏJðš–¡˜a(i™l}L Ÿ€åÔA(dgNPoÜů%>3 Š.«eÞp츶‡ËÍñ4‹qáA¼Ä#FC,¥ÎNaP¢4Úv“äo¬l½s:Ì´ß)ÿ*Û«N<ñ„ Úí¤ËK›€}åïÞ¿ü¥}ë eä½:xM;f©G²¾›6 oÁ z+¶Ao©Ü˜Sí³‡tÂܬh¹Iû†¯Ú²uëèÐ){5vT\QP\^K¹táµl)Sô¶µ”h26¬v-0ô*Ÿ™ñ0N‹¹V±àFÌÿˆ®66—Ÿž[7Dï«RqõW}.xöë›ðYƒ¬ƒŒ¹÷ÓC`¹…“KTøÃb*n™uÖYºf÷ÿk”Ë7¥¼è…2Í~løJ>j³­%žjo-Ê‹Þ; ùX•O\.Á`ÇS nÛ–Í«IÞÐ ÄГDQ‡ßj­•ÑVÈÐÌt°Ÿ7eo(OSWÍä%ŠrBQßîö·}àƒôåCÑ€[ -ü† ²NCCëžð¼ipGÀCúPãùüç?ï£ni ÑØ¢³^=y¦È(xÇ–Ìý¯iܰN‚tFÚPú•¼Ë£NÏmKu ,â±1ð%LðÝ“†|Ë’”<¼£ñGˆiŽ—¿üå£'ka%#$Ù¨r^‹GTb4²È o"‘·ËOYRgik˜é´OýI¦B¿À_ã^<6@Çùàèi¯ò§)šl³ <-„‚©˜2ªåQ]XÑÒÖRnñM2"S¨Õ]¡C¢:GuÕzF±#{+e€]ê›Cê`¬Ò‰€Ç^xá…|X½NuËZÑ´FaйüèæSѺ ·úH¡c©[1ÙðÇ =ÜHü™H 6¦a¨:qú\­aÕó©H”îþË?ê6‡Žì‰Z†J>³÷bÏü¡¢ÀµÉT…‘[™U&«Ç¤V+/ ·:»ªPÁ_ðùåŽKíÛ³#<•Sç£rïbh<:‰m\{–³F㢉-ñ-ÌPøNØþw^¡:^H°(¬Fçb.uù¶æµ9 !£' ,E绨ÜÕ8ОKUê}2äuFçd>”'°â†D+yœè¢ôØ-â…÷î %ž!ÂŽÉ8þ¨éìø¯}m4mÐôCý÷UÇ3#¾ñõ¯{DE…¬ÐÀHYRHÓIúß«[îPìð%Ï7S(8†Á/ÖF¦¨à#/«WëÄ?½3/‰«®ˆÓ ¯ ®þ7θo%LÂÞÓü …´%(~ø€lq( iÁƒµkb±&‹OùqP¼d]ÆŒü—d`C“ÿÁ“–3­mI°ç‹Tá¶UåµÍ–¥ãI¢~3@ÞvÀq>¢áo¢3|â ÙÌHß#ã]†µéð$•I³ å_Fr8£cêgµžg¿F;¹¦…Ô‡XC_–Д)êM2¼H¯Ÿ €wþ²@!€ÿš²X„jÉÊ0ó62Ah*M¶=±Z™-[ªøfåF׈a¯¸ìÒË.Ñ<ß~ÅÓNåBá5cýÖ°¾¤»$¶húB–^Dh^„ÅÁPpn .ºjtF'¶)Ð@…jÞ6Áç´Xé5ôT.”F1 QéìDˆi(\ÂEõc`aç’Ý“üFy¡àPXïyÏ{<ô¾{÷.÷âPÆ,ì$_Égî wϰtÇ”„5!Ü(öã³5”^= !{ÓX×£É:ù#OÒ<HsŸdT=Ø`2[9Јyè‹´â’K.i¦-è¡Ó¡!:©°áÿX¸xþùßôÐ? %‡aw+ÜYÄGæÑ;&<*Žû E¨Vä·²» pªKòÀ• âòã;+ŠI4€é9©!ç†òF£N¤û»‘¾^øöܤ‰%Ó_ûÚ×|‰Ó›µÍó¬³~ÊëXð‰L°ÀÃvO qI,Пiq€I&B …Òº…PdàÚ}va½ä›’¡7xø¦d1CJ£›Ì‰TàÖše§¬TfAyàƒÿˆے8› •z3,äA7—M½Ãts"e‹Æ·¦(g¶_³ýбÇë²™åh:Äv¡ÀOÁ×¹8ûG·¿ýí)ôþѳýÞެVRÀð¿É®#Cc”-;U],ÓûŠ1‡ÂËÂêÊŠCX-?òcütµzHÛ5Ôw%½N¹1ïÿ(0²;t"Ô‡“^;ÖvÂu À ÌRyDx—ø.yà›‚©?èþ\Æø‡Â–¸uüâÔg`›Ï À+Qj2 'øÚ…Yáéàlå7‘ …CqÝZû¸™Æa.›‚Àb4ª¡dÖ®£gçØŽà| N}Sèhá²·Þ óXƒ¡¡nއ-2áx4=ø®‹4Ê_"·µñÓ½ÐÈ'2Ë4ÅÙgŸí) ÷ॄ²ëô9^ þð‚Æw`À3æ½ÁLú3ÞF%@C‚ÝrVCkƒ/:‚¿œ3ÀôÆMn²bdhoÏÞÝž’éb‹¯–w­/n4ÞÈ+|cÏ2؆œls%Y¼]†E'¥¤©LùX„¼Avèñëðï”x×»ÞéÛYpuƒÖ…üÏÿùsæã—tŒ0ü ÑÄ ’äßPš'‘’dšÿ(ÀqÈé9íwá$ÕŒ@ó\ÆŒlÅ´R}9üIY‹š3ƒ.5E®]ø»ùZ*ÔЧIVõD{ äá׸ò&#›Øâc<\!ª 7„À€^£qo°DbÀ]“ïž[Oį t|Ûèɲ¢Š—*sÓl±c! 4CùÌÓ’ÏQ@Æ¡šSy€2ZµF?Íi÷‰ ŽTðÀåƒ[ñ&o**‰¹ioצSI2ïËTÜŠ\ŽülcÍgsOÇt2 ôÌg>Ã<~€NmädøÃ †/Õ¨ £J¤ žcH 2ˆÛ¼é¡ýúwþê!‹éN²ó=ÙKñ¶~ ¾iá"äÒbEo¸<"}F â)hÏŒi[ò~ VD&·øDŽ[…È^¸T¸“lj°lÉûší×ì¯'º$P€“r­ÎÀj-˜eŸu}5p= €¦òOqÈ¢• 0M‹É‘Æ•"}Þ)SQTö˜»Þõ®¼r! ÷,ÂÛƒ*ܬ\ܧÀOÑðž÷Í®U%ÇÆA*²0„ZÂç ! ×Ä"ø>× „—Á™¬sîG¬¸³K€uÚ7¾ŠãJ9@%N}"â=c†×ùqÓ«^õªÑµ{µ7ÜÆa\ìÃG‰fC­S¡FQ¹GžÎÈ!$À¬*©n\æàÂ|^÷ëI¨üÈ/ÖB0rüñÇ5ü& i£‘Àn®QΑò¤cD¹jú•¶óÈÉÊWÊXÙ˜_A…©Y6«‚ÿÐlPU²]14¶Ïô–ƒG{†€¹­S'À5½ÅªM¹ˆÏúŠŠ¾É…¸Ž3¬U~YÈÖß­:P+–jê Ê¢äy–ï-nq #l¬{þ(þœHLùÙ÷p˜D>'.DÂ(ÀÞ»Ýín#*3Z'*ÐðØù¡—ç´ÒüB»XîJvº©hð«3;BšgÄ~àFß—ßúÀIÙê¶yóQ E82ÄØÛ¥AÑVË¢ZÁ(Îc‘å@Ø6òPˆŒ>Ÿxݸw^„›z îXHà rÇ<ñÒ¸IñgŽúF)ÿãO8~ô—ù—î%3T½OÃäÀÈ~Ú<èÕ$<Å}bܨΧ êãÙOKbm¡g8àFF3ÖªEý½ÿú¯æšMTü¨ ºùÑR è*ÄZ¡øl¡ü9!ðÙÏ|vt).âlÜĹÈZ¶ôÿñ·¾ûÝï6SnyŠËÊ!Mp´ï·µe’ˆœònʱ#ƒ©ýü³.KâÒ!ÂÿÿÕõÍ(zâþVÝJȶ;VÚsÌðçµåÞ‚{ÜÂ-qa²£¨Híݸãׄ^¶…Q¸44`¨¼òì,.eº åÏÆ&[YH̹u#¾·FDºÞ(ŽÐ¿cH¥>"¿d ó²L6´FìiÁ_ó…êRCã$DSî†ÔÅó‰rDÃ’òÆ”¶¨3Jm·Iå~>Êâ_tÐ gz¨±¯=À£u¢…φ@*ÿàmáRyñ[õˆ¯¦º—rÃuºPÊí/ÿòí£g‹wœø‡¹ÓwòÀŽ;¢7¬¡ÂsvFCƒÞRøÜç>×ðÞ÷¾÷^ùÊWzªà!yˆÏ`ÈŸvàe•ý¯üʯ˜æ7¾ñ¾>™Êa§à»„YÃSà{4Ø;<¡†Í 1Ó{”òçô¡ìuçÉg8Ú Å‘L ü™Æ Ñí¯yÍkœ&òúH‹-"ÞVÞ¸t3=ÚÇ ™G~Äuˆâ^;ÍkWœ†÷ÔS!º™SΫya,<@S2 K!yáè–’Ì’61k¬QMáUt_‹Â)yò°ºÖ¦­Õtà*Ê n”ýµE›7pÂE/ÔnŸ3ϼ‹.Ï™a! J>ÎÑÜP t\óm4–Ãÿ+A§‘äi_л(|o«"B!ÎY$; ׊ÙWìØ±ë{ÑÚâH`Ä’ì&™]rTàõ'Nú&±¢eŽà ¡ÉÌ‹ˆlib@s³HD8p6»¿+7y]*Âtâ5^Å/¿‡Þ-zk¼„Ã]nöÎx|wܨç–#~@å×±–®ŽÓqïX½Ÿ =ÛÌW?UÜœu{øBÚqô4;Ië|T‹{¤¨r_ˆÕ‘æ‹YùW¸úà)<¤‰‹ŠXßýÈ#Cæ("¶å5Ûû‘Ë7yò6b=ËhÛ‹¶8AÃ( Ägß?«c?GÌÿsL.'#ÞéNw2N†÷1 çÓ˜ºXg`Çpt0ÃüÜÀ¥@ôöá?=þ}ìcV”¤ºÿå_þÅë^¡éÒÖ3`wÙ°¨L”òT^úÏ“e£&ð:GXHw~c§À§mÛ¶y„F''-Æ£w;=fAššÔØyz€›h`a°kZø ÏYpê>×OM–‰§‰ÓžxÚÊÓ’‘()A7›IzEhÒQ(7IÔúGqY­ð£24£2›Ç×.ä‚âªîЀ¯«_sÔQ›}$°œ²÷Ÿ#ù¶òà5„½s£Å³³îLË‚X` wßÖÁ¨1÷¿ÿýá, ýÆ]TŸQe·ãú×]KX$(±Ê”Àn;– 6‰Â Þ2Q„°`“ÁC$±@=¢Uô@Ü›ÀOr¡8¨èÉtØÇßU"bJ¸Nüðé> Ç_ƒÄ‘#¾}2x@ê‹xݸ%<ŽÅ£'ÁÕo…sðÚ-íöƒÂ47ø cÅü^-@ãòš}üãîÉr5-†é„ÙYm$«gp¦Â7˜G³µ¿|ñ’ðøU\‹X¨1ì³§Ð>Ž­åâáçaèܲ˜p›˜]‹×–H¡qÂ$p¾ÿßß÷ÿ‡Íö7ŒŒpÊÛ Qò4Ø÷ž[qCIC÷sÚi§y¨ü·~ë·|2·rí1Ç37N€Æ² lœÙÀÐ9ÓÀeèœaÆ4Á—ƒ†g ƒK_±wÈUɳ–èÅΦVž¦kžó7sôóšR¼üÊ+|:"{¨f¥é£àQ~¡Eõ4Rý<öØüò]^‹†H„Œëú1É­® åé!u}Wú¿‰SÇ_òeF‚öüÁ^ìÔäæ4JùžŽQ·JÌÕè+d‹:¯•±éàH(À. ÝÙ“N:qíío¿…U»>Pï\P+7Dl˜QcßoÖ a²à)?ÝHüÌía*&f¾R#Úµs×w(ìrtÞ"N•œÏþ¨³Û®†éGV»u·°DX¼(Ð@%ÌѪzÿqSÒ‚Ÿ×øj%ˆ³ã?ÂÔÏIî0T¶}˜%ÀX|Â’ÆX˜ÚCž2<ÃæÏñ0æ !xЋFœž¥ç†R9ù¤“F/~ñ‹‚Þéeê±·›žñúqÓeܽ‡dè3ó¨¤!áw¥¯ôébi¾d!ßQ¶ët äž*å¢3µ­z³¦:˜‚Ê[™¾I¹š:±; '˜F^ûF¢Â}9È-?‘FYá]XS(XŒ|b7åJv§Á.ÔŒ˜:=v8  ¢F”lîR#š´ Ýù¨£/Ùîr!è"´Z£e±5}ÉçeÔS³4ÚÕY`"ŸKèä4€!SP@IDATò÷:6°P?¬´Yp 0Ò•Dq³ÛÆP *Ðeõ=Køg<&zÙe—7â´% %³­”(|X"Ú~Šm‘^B‡±¢@Xˆ‡ DœûöàÏõÊÏûFzoðê×ÈÆÊhЧ2).!Æüz€vz°ôŒý‚®ßáÀ=Wbžê¡€Sp·&Š7"‰µ(X÷Œg<Ã+Ï®Eg(%„ÃÔqÃeqÏÆpz1íÕ€„ë^r™ˆ,y«)ûz7Ž.¸ Nµã<àÑ‹…§ôÒ¯¹f»(z »)hP=èA}YW³H…o˜Ï}îsnÙ#Ëüà-Å^Z¸¡ 7Òs”Ö1­ …é†cŽ>ftô1G³ýÕÛ:¡²£ü8€;" ée ŸSÅ£×¼ú5£ïÿû#Ö6lß[¹/!Ålº‰ÞÀ§°•:ÉHZ..g‹Ã¡j“’¶< Qö”ßJi!|ä/á—ùyXÞ¤±›Nv~%zêß¾V }%ßS¢•rJÃÿ†ëo8¨Æö 90%c`¬£”é¼u‰ÊN¯?Ù RÎVzsà#ùˆßY7¤C¶ ‡7À‰ŠãN©¨¸Ù seÊX¤Î\{í5Ô‚”Ù¾ÞDs`¡U-/5" »+` )ééîwJ:~µ‘§Õ—üWͬžáf@bšs—J¯R|ų “墂:îžþzãé0C¡Z\#à§ 6ž­[„‡yð”Êx•¨Í ;ö}’›MÈq‹xCWquï7¾ùÍÑÞø†ÑëµµíDõÖ¶K±Ñ’öQ¶ ¢>€¦œŒ#¨]"~æÕ8¹”¶c¦s< ±¹IPwh#xQ, ßáw°"ýêW¿ê–4½lT“8»Qš4= BW^ZcÂŽ à€ïV·¼•yA€V>óò,Ò{Ò“žäUú¤”Q æ\¬Qæ½QtóÉ?ñ²Aßù¦KËÿM9èxkoÔ)—œqár&þ³8q­ÖQ1p¦ü™”&p„=‚VÄ¡òŒEƒŒÖÜï~÷=ö±óŠ›´h0y3Mò­(ÉWetS×4–ÇE%Å/=-?Eˆì ¢åáˆø #1M:Ž,KPI}¥Ò*a j³Þ×…Ç:YSJJSeÞ 5š¶^£j¾/·)¡˜¦àVGù£@k„EÉB@ù«•?4±@¯‘ë ìÔ¹+e bɆyL.)ÆÙ§Ä±pó®;¨ŠøBÅ~ƬVJ‰4|þOFè¿Cm+ñ@¢V“¡Ü4œœšB‹w`,rƒp•…€«¼Ð’VÀ–bçùa»~þrt˜Ýz”`Mh,N$4®UøpðiÃÛ|aºþú2ÓúX#T7,ün×pƒÞ[ÞòÖÑ}ïsßÑÿyç;½2ýh Ó¢ˆ8c¿òú|xcÆŒfô©jÂ\A2O ëo¸È6½Rü'Cü¬;¡ÎÑ¿ôÊ/¸àoIcF+q4 Ww¡”!s‚ê¾!AUA9¤Ê!kMhHÐJ^1:Âv=VïÓ8ÀŸðسÿíßþmtÎ9çxÁè Zâ<óSŠÚIØëômhT#œƒ[n¤8ÄÙâpØŽd“Üv_U­Ñé“l…dÇ !_ýêWþõ_ÿÕ &ÖLä´Í -2±_õ„,æ'é|4® ±X•Ñ P`çMŽð[”y˜õJù&ÆPk DK&4š(ó£yøfÈåtL‰Ž”¶±¦gKRyãD@¦laòí)>À©2=Ã(ÖÉ'Ÿ´^ë6K™ûD@Õ‹C ºùZS,~(ƒ™näð"û1û»¿û»®¿rÐÉô0Ä’áåÜjù{H-]xð€@ùÞÉ'x/*ÎYê7…p KCù*¼"‰˜7•py‡8QAÊA §8ámN·ÓÅ4³ªxgPbÎüÈë¶|V¨€U¼;®*ãŽCùã˜O¬NpGîAh>ÃÒ|v"Ös…£Â,p@¹ND&ø÷Þ¡4éIûLµ¢éá"¤4vgXÜ<dÞ̯ñc~¥ÆqºT€3‡¹©`-a­­æ8X˶·hh¤/¸Á‡FáßC[ÙC’…f þ¬ !¬yc’2TdÉy ù]³6nÃdu?†-:‘¾8u#‡¹ì‡2>üPþøEE_xãO# ÞâFÖýPed2 -ñŠ\¥º4;›·ÃûH1&JÄD¡;MmL•Y93A¾ÑHbK [#ár— ¡àSÊÙÂ’(n% ²dc§Æ}a&…JX¼]ê!ò(rfR¬Eº8q" [ŽFŽsZÂçð?C*ƒ ˜ _ãð¤È(DãÇ /ÏÃA·Ê׌Žå]#ÝDåA{ÅÐf}¤úàνXU^(üy$p½w’{Ð6›òÏÇJ.ØdEÃ"À“´bœJO~J³9 Wù¼âò+¾Ãêqœ#Uáõn¦³ˆGôæ7½] ø¶‚Èxö#FÃ8z¢6¥r R"lˆ ¶y‘ƒl]Çl3æ*âvòÊ2°F˜ ׸•; tý xè—tއ³gð¸ñ?z®ôPÝXñEå{+m{Ëùiæ¶|õÕR^qï}@¥Íï½ï}ïè1yŒçÀ9nXï4IYd,Þàéb®}míäïò‡?(zöö3'—»ÜÅŠƒ¡dd7£BìQÏÝ!ÔSˆCª­|Ù%(Afõ Uœo…ÌïܹK÷ œãQNîc;Š e8 |Ð’ûÿ)Àð w=‡àPfp‡/ëä†;iÀøYìA!ޤ]kžÆƒù©Äa”¦ß2 #á‰i(ÉêÁ<ä†_±ÃcÒÆÂMJðáiò("Íó,ÕC泇› ž5ù½8qB>$'²D}Uû.îXèB¿Ó\ìˆÆ‚ßü-W)X‘×¢ªâ¹­ò«B²á¡èñ‘À×_wýÁ} 4ÞEÍŠ'WZ_ $l©ô‡¦ëŸäÝïÏþó޽+aÕ€2–JžÂÉ k {bTxa¦b¸'fµ¢÷ªU(sí ŒZÈNŒ+\¹¢¤šÊ×év ƒq@ÂDkÁ¡Á퟾0ñ´UÁR»NGÏp2á&ôb2CÆ{+Ìp…C¼¾z%lɹD|‡L‡|—€ù9ç@©Mù.‡pŒÅq >œ.̱8àåßxf¬D¹ sÞyç57ÚeÏÌ XJÆçp¨ÍOÞã'­³b–Ié <™Ì1ÿ–!ÿýš/&_û¸¸³-Ž^ãÙ÷:Ûx9v—Sèöë4?n§Ô4”ÓCê‚âÞI¯Ó[)Â,oîK@!qÀ—¾ô/£ßþíßöʘtSÀŸ=”–+3ÍßÚO:9äçb­è§GÏ7 ØrŸJFcµø£Ì ;#¬§`g‡>ô¡ÑË_þrOUàðµù(6€ÔSð]Y©uËzæ0QŠ(H5ÚÚ4Ú‡‚ô¨Ù°È7I9ì–¨þÍÅ$mž,'½¤þ’g,4fGGŽ´ß“ >­o jƒ·>“âÏë.Àó¯^.Ô:~Ø Ï\ß•r[ê¾–›óRzø˜è “²$Q§ÆÌT^¶¶‚ïa3’Ÿ°§Æä*uRXHÝ14.Ÿ<Ê>õÏI'È‚)nDÙgC  r2÷x+œi£N¥LYX ³ä@TP£ÑŸøDç­Y­k#“®«5põ®Ý»|" TE”<¦‘YPè¢È{¦³§ÄoÂf yŠÙT\ Äå@! œ*“LÀóq¿Š;ö-¿¾[—{$ ŸéÑ{—äŒÑà`éšïˆkв6®XpôãóI¥AÚx_X’³ð”C%ŒÂû‚oAyqd-sâ wãA`OÒ. ¡ôžûÏÑ7?jŽnóC+Ò°VŸæ5sï¬3èÚy‹ÜA?܇ҥ§Íp:—~ú飯ªå M(c„áíüWºò•)50a±~*ø­¸Ê—B‰’GãN¥¡ÂüõïýÞïy›ßÇu¢âK^òÓ‰'ÊžÀ>ðAÃG¹íÙ»Û ¥á¸\ëöhƒÞþ¡ƒ³¾¨‰[áåk´BþsŸûìè>÷¹!â„Æ§=ýi£ÓË…:Ð-G„I2”© I¸¥û"É3ÒA€´p*"|¤!ÿÈÇÌ÷.ÖÑ• ¢¾\uã,òKÀ³ÓAÌZ^ © ^ÃÀ{‡¾”~TiZyUÕ´ TVuµ¿‚ÎkèvJö: @0õ ÈeYõÇŒÖêh,:tE¾§0áJ^g¨«T/¬×”á&Én}`Ž Ý= :YÈ1œèËà ufše|É S¢‰Ã`™ MÊ…±wÏž½³@ǪâWD°]!±ŸcËÝ™Àp7T¿[1*úKaå¦xÄ!1œÌ¦kHgTárL±è’£A@&´2.•žœ€Yч•Kº5o<"l¾ñëYL@·ö†q¤cÀ„õã¦ÉøðéÇ)pMkøÕñá/3 Û˜öy¿µA‘±m‹Ê0ðƒ°>ëYÏ=ê¼Gye÷¥—^âøÈ‹çá ÷L‰ÓFúâG|Âј@£ô‹L¡…@áÓ ÆyzÇßýîV„ùŠÞatxøß gÕdqô7®ð£1•¼Lk@ô‘N”9&q+ !†ó¡]OúÿÏÞ›ØVTç¿»û}æ *Ú-“4G4>ƒŒcL4£‰Æñ%Æ A%‰ãýGÅ«ÑD’ Fù#ЍDQà\PæñŽ\îØïû}«ÖÞûœ>§ïéÓݨHuï³k×°jÕªUµVÍÿ_õ¨G=Ê×þ²=µÀ`qâûÞ÷¾J»gªSOýˆÃ£@ݶac¥aI çUÇsLu?­­á,p¶ÉMLLx*á¹þÜê±ZÿƒüP[3?P½ôe/ÕÖÃû{÷A©{Æ2øUpðÚ K­™áC\ÊÔŠ¤ÖJ0RrÆgTïz×»œ-¦I ¿O×ÿàY—oI’W>ÃÑÄ€k NR<`ðèÔX-@5ëÙMyÅàý«7‰*JÁT¯°!PA´ó)¡æŽVá A=ïŒ^ýõ á¢v½ìŽâÀ§(¬j&µËeÑ=ï¹OûH`/Œþˆ¯¤^hÚ›ù2C+d CBRa1Ê4lÀùÿ¼7ÝxÃõ?fèX#˜ú¦†3¦TØäâ$pAÉ¥„­Ãè»8ñ"%SL?vŽVOpñ$ÛµŒ Ö(9¾?É —èÙ´dùðMºá«Ó%ü¹§O—¨„‹ø=¡¿Ž8å£;|~ç»#Ž÷©þ¸tç«#¶éI㌀på˜]î¶çv ä‚Ï-†»ï}﻾Ŏƒ„‚ÜyO9qÆ>p 9eÄœ7‚u‹V÷û)J%0O/œ°ô¸¹F—G+z ƒ‹wƯ)—Ê}ôQ>••Žâü ÷‘OsKd®e­Ë°åæž·n¬ã l„<#œÛòsœ¶ÿq±4ÇË/¿Ük$~ï÷~ÏÓ ¬ÀN¡2ï·ß~VšÈgûk׊Yb´€+W®\Y/Úþä‚ ª§?íiÕ‰'èpÕY äóµ¯}­ÏÏÿä'?Yñœ¯›ÀÚôäãÎbœ—¯šd²ÞÐyÈ®+üý88 àœ€k5ÂtüRçÕ½'XçM_BÀ¿µÛP×Í&ѼM­=CÁÎv)Á•o°õ¢Q2æ 'C¡ØIˆDLZá[gÁjWQ J¸_ ¼…Dik|$°êâ–M·oÚ ©<çE’ ­+öàlß…Â%‡þ»ßÈã¶"gŒ°(Só»¿ææfd 2zEì·æNïKtçºÜ¶«ÒBP´+º‚Ûo¸áÆëØæ³Ý—²ðB®Ê–ˆì™üü¤#nå[ïæä Ó"#è&ÄOF•Ué0<¢!ÄI­øôܨfˆÃ¿ÇoægŠ—`¨W/¹MqvŒðèíW@Ú3Bô GãÓŠ}š8™—&VÆ&^qíöÄ=Éß ÞÏ #Óø"œéu¿úÕ¯QôO °ïžƒo`xzÞœ–G—ÞÞ%%à裎ªvÛu7 B„2ø"˜±ç7×ïnÞ‚–‘†}I“Þ>J+üÆðÜÁ÷=¸ºû^wwÏ™[ù.¹ø’ê´Ïý'g~;™›Cÿ¼yèM#øyCf+à‹ÑÀˆ:õˆ…çègÆ @¯t©¤Å€<†<{! æI¦ËRÖj`å玜KE„­(†@ÍHh%J‰Þå€À £Ž6¢ƒ–õŠÏ”—a× ´¼åÖíl§žŽS‚P­ÂZÀuC­={ø‡S)ħ$2ÕaJlH7Åqj¼t¡)o<ÛÙ¾öõ¯UŸü·OzÏ=‹^.½QÀn#_®!ñ/ý÷WÏ?öX_úÂ}„?<“Þ3B“¸Ü‚Ç*zæòøô’øŒ*Г¦G}饗Vçžóê"-ÊCù¤7Àf…=0Àa8:ʽô‹cGù,½B^à™›?õÃyDX3” §gÏGÜ–F 'À”aTЇu¤}á…$ Ë'>ñ ÷h—h[$4Nä€|¢ œ¤ž>×1¯ZuEuØa‡Uó7Sýçi§UŸø×5¼[¥pÑ+F"}¦`È/° gŽ’d>î˜wéñ‘˜$X³%nv©·ù ~8묳Ì;ïyÏ{ªGI)ÛȺœäÂR— ëAgY΋:¦,Q¥J …d.|3xýÃ*Á4X*­¢ÝÇÌÙ«µëq®} E6 a/øÜ„¬ÿýyôqxÿºê•z©vfêêVµ_ ©Ow€1)5 ÀVÀÅâm=— 8yøN% Gää"¨ÉIæÚÔ’{&€©œ CãMc¤ûÑ'Ùö¥ÆqReøŸk¡ì˜†i¯Vã~«¶`í"7–6êD@˜gœÅdœfX `Sg=,Qa¦#‚ÂQÐbÒvZΪO¡*Å)3‡Å‰…Kížþ ÕíØí ÿT[êhi)a»A¤·ß„‡BÃ?}8nOMƒ1“8°À͈­Dz&•áú¼)ÿ:€ëƒ÷VOì­ZíÏqÁoûÛ«ç>÷¹ž§²¡]/“€ºFGå²(ð4_~©„õ¹çžka¥Åšº~xê>ûß§Úÿ>û»gÏ":„>o„8AùŸr§·{±„1Gï"sH¿X½|††S# é /X #v%´]fd6X©¼zçÞ&ÄèCê•ÿàBc¢‚€ghÜÜàK/%!ñb”C¯}Lgù³ æÖÕR`4º€²C>0,pûêW¿ªí“ö‚ZÃâ)•?;êÏ´p+ˆšÒ€‚…8”)çWï¹7®4`Ã…š,Z(Àc!:Îâƒ|¦"ÆõËoӔˣ¥0ýó{ß[=ûOŸ]ß{¼º]ÊϘ>Âk"f(2þU–2'ùN¾6Îx…ï”°áói$JÚöΈwØWÁ° FÉNmCL+ѽ¿q›E1Ü!y£žP—µ`+ ø†úNÝâ=—&Ûê,m‡íÚ]²Dé#ì»wÔŠ€pRÔ‘QÉ×ítf8Jœ…×th[RÑŸ |‡Rº‰De@>ñ£L¸®†zý¦Í›¯Ùyùò{oÙºÕs0®¬4 ¥=møàæšP~ãÓ'¶•ð„Â8Õl÷à@5´RL|[Kuyõ$š“büN ;ƒÈo*„6´´ÃEþÒ-߂РH/Ø3c7ïN8 ù ºvº7±wlS^SL­ `¢=M½U.Ãá ·1EÄ0-Â’!l„†súÿú¯ÿÚ#jV¶2ŸÍE9—¯ZUýì²Ë솈ÊÀ¥8ìíϵ¸£hlÔŠx€Â‹ m=uÏ߇ÿp–~a“A‡v~áâ“&ëXãÂp< –´ðàlpìïhq#((ø!ˆ^Ô…XÆŸ¶xÉ$š’í„‚ Xˆ ÜÚ~¥£Âu|Û=\:ÝùRÂzuº' ö›ŠÔþî²÷ô ÀS¢µÂNñëB¦Ã¿þè•¿.|ú~艰A#¸.úéE xöŸþiõ9)l‘ctF`Øû_ÿõãêÙþÂJüßøFuõUW[pþB[QfÀFÐQ~c„n›•Ö6-\·~“‡~MÙÒË_²$®ÅeÁ)x± ÔÂ_[ÿjËØÔ–tð;q%]ðg»øüä'?阿7†¥ÊL? °ñ?øAõÈG>ÒZúÕ×è‚ CïgÁÏHÀò–W ás6BŒÑ3à|îsŸóUÁ¤¹zÍšj…¶12¢A~¡u Úµh’ ì‡BºTë2îÈÚPI%.C —‹ÿK"EÚg8iÛ‡J´+¢’2Ý"Åh]ŒÂuü뎯þQ 3Ïùι^¸‡LŠªëyŒþŸ`K{£ßR§È™Ho×ÈKüö‡1¸eJ:³À:]‡:·!›’sáêo•¿]T޸ıÙ]éþz ß…Tó í1zÓ Õmµ·¨éÚ"Ö]ˆ›Ê% ¢‰4‡6ê/Š»Ú ¢|PiýVòÈa4÷|h´À'ŽŸ ¥$­h´0OyÊSÜ[Ò<,‹&i¸d 4[ñ¶\ý ×|ð}Õhk•²{—š¦<êß¹S!¥>–¹…Á½ÓZ{Š9]s91L÷‹q¡Â$½'Õ:§Õ P…ÁkSBD\‚ÖaZ9ºql9õ¶0|¦ m÷n<v n äªqhÛŠ¶Þ¦¤͆fsGû:+¦)‚V‡=U{í¹—ö¶ªúÈG>½d;5Übn rxbO…Y¾|g/æâ)ø‡AH¯™^0á©,^†ê°ãÏÑÀs¤ï’%Z4(»4; Ò=,bý /S´¼»ú[ÎC¿Ò"æôQØÝÀMu(,ôÔü„Ñ¢§!pÃ0Z®ø“O>Ù‚Š…jTz†ïP(˜6yÙË^®é’GùXßË/_¥;~dA OUHaþhÐŽ4qãé0Îc—[G€á? ¦-*{vábS^ñ1׿ °Qîð4ý¤zþ}ìc«ücÕãÿx)¡œõ Ü„W¾wˆ€f;f^q^Nñç  ÔÇ^Ò®ŽZûÔ.¿Kæj„ÀwQ Þv‰Â¯ÑKÿÚá×ÜBySG©WÜ Àˆõ¾™/“õVéNª^Ü÷¾ÿÏ.Z,Ý> …¾!+:•£¶råÊÀ:爥t ¢ò´L"Ê:€…ëׯ»Lûw·‰|^°ÜÈ$5Яæi/QåW\"ŒåBaÙ#ý C+´Âpš‚#åF¡%¬­ðé'§N×øêt+¿žž-€²f6qí^<:Ü>* ákÓ'lí%qêtÔ—FûwxÌà#0̆¡ÑÔ—Ðb1ÖrõTrk׬õÈåJckß„s»z¾›|:+ã1Œ l:Ï<…q©¬<)ü(K zòš4)o,Ä,S¡†ƒ™Veõè‹÷Þà˜<ΨÆ;Ôûdk‚ù(ílÀ ( ¸™Ëg1$sÖßûþ÷ª3¾t†· ²-•^ÿ•W^Q}J£Ðk‹â/‘ļiÓ³ÏüšgKÄÛL °2/3‰×;lÔ/S±³¡§moØ}\#Éð”Ý©hF:@s”°ã]u衇˜/hÈ™bÁÏüÑ­$u'cº ÿ‚~L+(8¼8wÇê»Ôº\êÔméßé[³#[µ,}ÒHæëÄ'¾:ܺ`ñ9ÅßS\Û1°7ñ´š:GKs2g- Ûsãp`õéÏ|ÚB4/µ¡§œ-LœB ÈÐ éФ„_PTýÛ¦Ÿì½%­)»QßQ€H“ÁN%ãàfxŸ•ýä­|)ø.(»¯zÕ«¬ÔPùË«þZç…ΚÂbG™à>Çû’oâ))û§ÀLJx˜¤8µ îЋ?âà†=üPÌÉ Hºg¸6¼¾ö’5¡‹.túFŸ©G&gÂ(2Å•iš¹S?ò½ß~ûz!&åHþsq&åÕ×ÔôÊ]ÜbÿôþJÂ?ø H¶rîbš°â!DmÁ¸1®Ý£1½iê˜öŠàÃÑ~ã~Ä'ìCyg!àäïŽþ.¼£ªAé̽.õQüÊB@vü,Ón€%:„õ‹å‡ N%; €‡ÿA ÜhÜÙP‡¼¹2³V’p4d*"/~d¶ÉT Ð:)?¾ÛÝî~ÐÖ­·o1¸(Bø;LŒ˜5ÅE’AÂKöøäW¦Uvá"ÆUoK81ïBOHÉV ˆÕŽÖ×¥x8À°vémQ:™R¾Û“^µ[+|ã¶^ñícƷæ–'¾×îL,…^½¡tºFYD1?¦²fÕ»†Ú¼Ø¡[*w¨5²@ÓKHòmY3,)À6ƒh´² ‘ðoðƒÏ¨0!‹á›¾ baçAˆ @Ö¬îò“Ÿì½ÿ(¹Òž^:¸#\/ÓzøäÅçvMop!öM:ÈøÀ]¾l¹"*òú…\€>à›î˜jàˆáòàcÀ…°¤E˜ápÖ+° í“àŽ;a˜Þ$Ñ ‘3p®|åÓkNßN>ÊÎÅ…µîž7H$­ÈOÒü³ó„³)è)A«0j«ùZë+|‹€.!ëWF­f`!ÝÈ‚^MJ@˜ Ø`Ð3(iZàWtÈb—³ñ+(·íøçž°cÛÙn¾åæ-`ñS="=_ygU'—-[:ª:i@nTb ,~Ş¿½¬9£s eȆæùÏ>Û½&þWeT~\·•ÍFÎX´X'2ªü›Þ[;Ga×/À×`ZZVówþTÊÐiðµel„^ó­à›©u~Jœ˜ìvˆSÂÆ>S?€1ÕÕàxÛ—ô#p;Oá<Ûá `;…{ï½]Kì_ üÜ Z?4Ê%™`)+„ÿ]oKï“UþL q@[*Bƒà ±M¾õ!k+^Àæ› M9êƒ=žc…µÝ´âbèi«—,a‰'„#BÁÉI†Ü®w…n÷ˆسÏ6E¶-¾óï4>Fð"hxàûT89‹ˆ _£Ë—-uoŸp¬ þÎ;í¬Gk$' þ|ó$ ̧Ê+œÉ7 î„­ öƒÊ7áPV¸}m˜Ÿÿüç} #iqˆè°¨‘Q ðF!È4 ¥2T(u:J½¥¡m‡éàˆŸY}l¦{…àDZ?Tòt‚œ:ùáØô€fæ™_äqáæXf:ðýîáÉ$g·Ð²GØ_…SSŒi ¡n\D°õSèÄi>Òö«À}ÎÒT&àyduN#£È+ìðÅ|`—t]÷tþ÷ª3ÐÝó§qȇ‚raFuØßðö\™¦+6KˆdF¥e’¢¾Ps§?¡6¹ù{UOÅ ?%/ê'±ÊE¡Ym/Å´Á¶ŒÂ¢Õ ¨±ôB@wðãpbæ•1u<Àü.C¨^®Å³y)Pïp¸fÆZaêÀ=à×~ øÚVüzIšÔ‡±rðŽOZh;tâ]‡‘eÛÖhx™+Gè#ŒX±ý¶·½­zÊSŸjFxÝÖä2icÙP*\KRúˆ Ä·ÃèG©H±ÓЯõIC” ¥g¯}ò’ƒŠ—CgôÖáO*SàÆ ~Ì©qô.sþÌáÓsæ¨]ÎägÅ9•Ͻ|½±ÃGn,8Œ,q/ ²3-ˆ t(J7Ùq’ iéPŸ'À¶?z©ñvÓö®_p"½Ä>p_­{8w€Kr8PèðïtÒ˜¯ÆýÑUì´àÔB?êC–Þô¦7YqùhLÚ£@ãÚt|Ô®sj‰$ôëp¡¾GYO—ë4t/JôàP%” ‹ÿ÷bBiìÇëR ÓÀ>iò̉ ¤ 5#Ô€}Ι)¦$œXuÅ?a²:g©×ÜwÇGøÿ†þfý¥¾I.,TÛ®NÁzçÈ ¹ÏKÎHÅCJëˆÚš”HÞ àQ}§2€´ï0NYgçÇY) R ÅÑ2lÊ‘§hæ9\¡0( o¸áúK´økƒ‹-§ñ6sšÖÁ¤ò0l›gåï JÇL*Ž-1M~ªzú°hBÈk öe‚u¡¸£Ñç€_­ß.TZ>VãÛFºÓ›4§úövË€Sà fÁ}ªŸ\È8Aü;ÄO]¦ÀérèúŒ#/õÁŒ^1sæ_ùÊWªWèh[Fh¤ÌôDÛÌœpM"Ðuòö‘’`«7¬ ¼h±öþëA°Ã‡º~Úé&o"Ð'&&œ&óúb‚•i .B€žy晨œãÏq¼íA€G2<ØI‹FÖo\o¾wZÂår«FtEµfõšêÿð}ó (x h\Á›z<Ü 4£×Ï4ÄÁ$¼ïãQÂï¼óN™ÓW‹†oÑ·Yس8ˆû¸$ˆgïÿJ¨>çèçp vµq÷t‹ß”p$ßK5 °råÊêSŸú”a}ñ‹_¬OGD1"M”#¦H;# ã?ðp\ŽJf{!i\xáE>*øÛßþ–iý—ñn èåŸsÎ9V~^ð‚XaàäEæÃ¡;'3’”Ö0@žX¯°hTS*ð(ûÞ%oÂÌÉOÃ]NSŸÔÏ&mü1ùޝA~QÉ#Êf||\JÔºj£òkeQ<´P£CÊt€ï‘D»Î'ÒÈò`€aˆ œÈD¸?ðçÚ,§€ š añrM Û»)ßÊß(¿Ù*S®‹§²ÐmÆÆíë“cÛ¼09<%a÷Š”û$—–lØp›ôïv!ôR( ?%®;+L[¶üfƒï¬€î„iøºD*,PC}‹†//ÔHÁÞ ·M  ¸P&ÅlüËFŽƒ±Ñ@„‹]¦3M;DÜ-x9âA5ÞÛUØ#j\먵…8m㤚ôÚ^v…)Á¦„îç€&Z€«#·sÙ™Ò”8N¨AtEø³Tþ°ud ‹Æå·_Z”{6”LxÑž3ÂŽ!ï/ùËÕ¿ÿû¿WþÈGª‡ëIÎÓe.ôÚ)z¢œè·`óâz«ÑÞ"¥BIù˜ßÛnÛ¨°±€É98ìÕAê)Ó³g·Á:E-wÕýèüê¼óÎóB8.óAУ=#xiÌixP\sNœ| ø‰Nä´G^0:Ã\þ÷¾÷]_‡üš×¾¦zåß¾’«>­pÞ´X¬©—¤ £(%ÀD¨ÿ©NLdøž…zŒŠüß3ÿ¯Ï·g £—\riõçþçÕGOý¨é†pcáÓŸùŒŽ\þOŸv îÏzÖ³¼fa}æú`º’6t"M”&¦eþœØQõZ<àLÎËOÃ=¶Ö î.AòE~¶©Á}W^q¥ÝO£<”ñVñϲ±eUÑ6L•+á»ë>nЉwú“øÊ€Êá÷!æ>ëð|E=T‡dáÎ;ï2&ÀÉ/zÿØsœüŒ¹4³RP =ú§¢‘[ál¤YÈÐdžn¼ñ*15V:Xy´v «"õKps¥,ñJ¡‘‚B™sÃn±é8|˸å +‡CÅn£zt"àUhmõÒßãxD/–)ÚÀn'ÚöÃÞ Cß ßvo×"™èk¦óë©å^S±­ð}1”?ë9·i(¼'Mˆ²¢¥ñDkeO=×ëòþË¿üKiÞJIÈŽIгJ}“„×m ¿ÉsÞœý¾“†¾ÇÇÇ%èöq»ôð:xœ' -Aw©Vä³à-{¬Îga½tÒ%ýôsžô('ŧ®\T0âÐø§’À7 J «ùh1ëÍ7ßRwì±¾¤èìož]ýÇgÿ£º›„ííX¨Ñ`‡©1Žæ2¾F¯‹‘ÎøÒ—ªÕKe]À _øÂê˜cŽ1>Ÿÿüé¢ÞˆùŸ}TõLÍç3½Æ:ŠU—¯2^›”7޼fä€ p6Jé‚;yÀð¦.àF±.Öð¿OR„5@ÝëQ+wn~€œä”²ú€ŒžEêÊ+|¸@ÃüšfýÖVxàëÑ•mÛ¶[éÛm·]U¾ÍY>”wÒ B'øÞA©Ú¨éF÷Øc7ÑQÍeâ^(F¾Â´hXçkn¨7”º7•58ñkѺe…ZŸC%ù›)Ë7eOÝÔzzþŸº3_Øâ­IÆî·ß½vVÚ …Ã"ñ;r$€JËãur÷ºµw#ð$£¨ï~÷»9vßu~¶¸Î‰HЯ¾³ `g*ÀS¹ë×®»‚žŒcÁ~«úè#OX6€èWÂ^®N‡tWaúCßnh쎲àFoDþ$ ½.),Z|@ëüM`®_*ÀÕ¶¤—akßbÉXé/Dl­ÃÕXäjòÔdÑö‹&§ä8œgô[Rí¸S ¯l0zgO?L¸#£²Íc•°ÌIs—ýwÏý®¯¶@Ô‚9ÍÃy¨þPÝÐŹúô–ǵHï¾êÝ#´v¬|ç‚ zÁ]p¯fHŒm{ Ÿ§ÀF9`È›yè&*?‚‘0¼ó›78óμ“'(({j˜ý¢ÿýiõžw¿§zËÉo©¾yö75ÚIÃö`’žoF!P&&&Œ'yyíñÇû6»WþíßV§œrЇì;îØêüýÈsõË–ë@%Ñæýï?Å;èÝ3‡`B¬T7ÿ‘ CÞà PÌQ´)ÏlðŸ0Γplê9cV†Ÿ„ È”—«í,“˼qäîü¯ÿ±Hòn{ÝMßë«=èÁš zNhüЧ?tM¸«å?$Ýh\yà!x’‘n‹ƒáÇw¾ëæ¿%‹áÅÜAAžšz6e¨¶P>`(§¹È¬! øÉ¿;Já`ã†g`n<0 Ø;K0ʼXå>髥籌2=ñܤääȰÓyç}_MÌh.þCç“ Åã'ùˆL õy.̬€D*+‹«¦á]z$T$U.ó•2Ïä…"ö…ª<[iƒ‚኶êgðe‹å€[‡!fQlÕO c0ÖÄìrƒèà¨F>¤f¬á¯)‰Ô!lŒéCôðï§GØ:5ðÉì´SıP¬`Òö­£Ogq„ˆÕ?nÁMúQš"Pyb‡bHš¹øŸüäÇf¯Òš€¯~í+ÕóžwŒy†9ë}÷Ù×Í‚ìÚk¯Ó‚¶s½ï2 3¼ç&‡^ç Иƒ :Êß”} qÂ^åIwÞ„k?™/9w†‹ÙV¸Ðxì¹bÏê½ï{oõ°‡?ÌœÅvÞº§0ÀC 0ýk0 ñ³ òéOzà.š¼ño¬Þ«+n‰£3«ÝwÛݽVò‚¢µ÷Þ÷P}bû_¬õkéÒ¸GoòùfÑ›î¨óGŽÆ-‡®2Ê%•B.ƒ%É eX`&ÓRÚ…Ÿ‡ØŽ$Ø©pÑ[gˆ6è¬ožeÚÔýÿJY»JOy¡¨xˆ8ðJÕÄÄ„ýƒ¤8°ÿþÞ‚¢µYÊך5««Ë.½Ìô¢Ç²] ø¯M¿°G™'j„áióaúÝo©¢­ÌB¦$<8PŠÂAî„~Ò ž©ü}" Ú“í«×¬Þ*%z©xÃn”Û|óMáW-dÿ|öúS à#ùf$€S]tLkÂÓ´)ò23+€„3SôJ@ê~+C’“B5…CX0zÝ ×ß$ÂoÒ;Qâ_Øë?é­7*A.ä~mœýò…ÐVÔˆÝįÁ¸åK~êp3¶Ì.ÈS ´³:%¬˜‰ðÏàax„•ìÿøÇu3࿺'McMoõËZ;êŠUÕÅšû¾ê—¿¬ÖèaöòcvÖ-pŒƒ;=Š ,9!…:ðRз…=aò!lÛàî22­Û>b"Mþ2fDÓIè´¿ÿoÕƒgW3¯Ï>¸Ò{\µj•…S_êiC ´y„6yJÍ?†ñÁ;{ñàÆP6aqÇà—ù$4fÄ ô ÏH@ ïÃ>'ò«·cç9š/C¯²•ZÉÙ&]â×â<ê5Œ1å”;P¾~)žÚk¯=-Üïw¿ûY›˜˜ðŽG^õË«tã­Õå?_U}åË_©.¹ô-*¼Ì‹2oÛ°Ñ»08O‚²%kä4ØrŒ^„ÖÊ„²BÉÀ ^™47M Ïb£hÿÀ€¯pãköP~Ó~U&^ô§ui Ø DEa§l³=™ËD„.š¶@¨ym¸ÓìéÚÔbŽzµŽñß„r 9f`”–ÌbŽÍ.èäɇV‚ „NdoU›NÏæËÁšOEé†Ý„hlíÅ®x˜©aoªc‰4È+â'ùLž^Ñ”Æt~¬ð‡á†6*h© ¸àÇ?þã?¶bÁ‚@VØãF%ä=*"ÏM7ÞdÆÜ5ë0—Ëz˜¡Hxì4ºùPöí§7îÝæ`#~ž¡]*XgX×Gñ«èQD–.]bÀüÛï®ÐÁB #Ó³ßgŸ}ìÏBE„DG§n'½–ìaYç1sê§ÕH;ç¸cÑÛÍŠüíN¢>J@ûBNÀ_2¶dDs<“ªÚªM#¹c8]ðë(òŒÿÚÅ–n|Â1Âô Èʿɫ“%†-ýÒƒý6 'ì|qÊW¬'XzââY—'‚¥,FÎgþÚóÑÂÍøöÛã‘{à?ò‘xE?[Þ¤"Pi³ÁE bp+•Ù nÚw„;pr ·)#<-ÎôÑ4Þ0b|ÿ¦¾¾ð…/T‡~¸ßyô£m8\ l¶2òqþϯ–I ¯(‹¤ø,]¨yiÔ‘ÐG-Ðz¦ÈWæ ÒÝy3‰sãmÞ*p ?ò0ÓšúÀ.g¨ Tk¾‡±£.2›DÓ;tè ¯R&]ø(É¿Ñ9ðë/PÆPà !‹PYŒÊh4cš‡á”4ÂÛŠ˜xŽ÷•ï gÓ»Gá } Sð*ë૯ýëæƒ†lÆ?Î?±j5ž«}à@IDAT@oœJç¿Ëĉ@sQéNñ[ÊbDü°M¼°]¼0¯G“õW;t$ð²…âe(rãLö™©°UÐ<(Ó÷ h7Õ$k©àÏlÿ†-9S@Ã5¨2Ê«ÙP,c~ʤ/Z»~Ý/ï­Hy<¯¹Ôq´ƒâxž†Ó#nq†œBlfÃóƒZ 42¶xÉ$絃' Bâ«Ø=Lä¥Ã£‡Sí_ò^c)n=£µÂ÷ó=cu€ïÿ¡¸DOšõ áú§ÓÅB¿RQúBêçQŠJèDy0CÏ Gùà?¨:ï~àžnô°@I\p†sªùÛ·¼å-ÕücïõÎÞÔŽ˜ú2n°&;¤œVË”&=9cL9 ‘hè›ðFNŸÐ˜ŠàÔÀ“N:É×£°{ì±ÕÊ•+«ù—qò¢CxòÉ{D#(9 ²A ŒÒÒÌd µù£_~¾m, ‡¼ ÿ–µ|îìA2§Fà;ñ›q‚ŠîjSƒ/Éž­LƒFp(ô2;î8ׄÃϼâg‘Úm·éÒ …e/>+יʰð®’h„*q ‘˜McZ$ ù²¡^Pgò[Ž}²‘Qgü^P( û»$«[14P6Ü^¢áH~ÄO àdüÓ •2—¬È)\–‹EákŽS¦gÏj~èÓ(WY3õBù'ðPš|ËÅub|Ü={Ö¨÷zÖèˆWøp#£?}¦|˜³Å€0ß6‰_ºQ~¬·ác²øpT|Ø”qfZx•"ªóšÅM˜©Ša¦q×:éj`VÓ4ÛtaÙ6-RæšÞzKà|Òˆ2WÛÀBÀ¼8§RH% ¹^ /qóEw³ÅqÖ À°dˆž•ŒKGXü$ ˜ËD?–&×]{ÝõŠÁNýV-fu®m#·"ðýi¡-݉ƒ!Vy {—ï¡_Í»h{–0ìe„ ñúøT¿îŠkè-tz¥–n¸è«åN÷ =Ø›ê>]>?7i ï:ÃóÛ-ÈÚ[÷ÿ™ØÈ % 42o¢#pihÙ÷ís¾í><ƒ°gE¶4”4ØÌ£Ÿx≞ß}Ík^ãEwœãÏX6òkð_à“&il“€ÞC½8Î&`ÃõÚ¬êÎBæ¤txà‚çÞ£Ž:Êx±ÝŽù>1¤Ì›Ë©F%dP0¸@¨'u%ÔCz˜U£R$bèY4C¡¿ƒ%1c~~Ìsª§¥ØœHÛ>lªu•30ýà@:dë4‰@›|H?é/a`ÛÜåg°¤áf©Q 7”8ŠqÉ<‡á¬‰iË&#>Ôô%ë =Úž^`”êw~çw*¦ƒ8û‚éΪ`ZE1¦$èŸï,×LEÅÜ‚¿¶z” |C¡Åq焯°Û=éf·»~º)©ÿИax­ ™¤óJ=†Þóe(_ÁgU?‹„™sòð¿Þí…€ÿ|˜–0{*ïI¦“8å“‘§lÃä>”™ SΊFeÁ¦Vœœ¤\ªsȯÓá-«ÔóÙ_þ:žÏ%´þ |»fcWž©íÐÀdà0Yqã;¾ü½8F¢Raô7¦Þ±ψOTš‚Fq§¹õqް}`áYàÕѱ83öì ŸéMƒO jJ„§v˜Âë£}–ÿÃ8¨Ìœž†T'µŠ†t£†ZYÁJÏþ¼ïŸçùTˆUæ³"ÞÉQiyèµÑËúØÇ>æavSàP‘²1 Šô°èý! «÷Ç0-Çðr ·öÓÜp–Ûtðƒ§âäÀý÷ßß· ÒËä àÔkdˆÙ½9Q„¡chAþ’y—úâdÒ½-ÏC8n<\¤ÆË´Y»¡\Y¬}íR4<„­¼%NÓá=´Ÿ 6¶òþsýÄqhˆ=#ævA×bÖmá`‰$ 0ÇIÓ@C,rÁ¿r­šH•…Þ¬Ç@àŸp žJ`:ŠÎ ~r?3ÚóŽw¼Ã‚Ÿ-¯”žÏèì ÚÅ\£€qáø·ÍðôF…eÚ">Ê%GCÓQp+©¸aPbhá0FÖ¯™Ð)àüöýŠþÔ¥\è<‘Í¥n‰m™&ž9½€K™“õöž÷Üg‰./Óé¢ûìù#“ó¡¨y`KãE|¦–x0Àœ™@rLŠáG¤À—,®X ;ê÷B1õ·®^ý Ûº¿zEÛÔcY ÆXuQ9ñyA¶Õ M†ë,&Ï +/oùÖþú—ðçË~Òô–.óùÏT®$ZwLÂ×F;áŸ^î­B˜áMš ßáo‡i±¨Ñémi 5¶®-Üð鎓ø†òBiÊ!sI£¤ÔHPNÛ4²°L‡¨Ü¨yößÿýÿ×çñ3 ¾VBW5ûPÒPö4Œ”£ÜjÇu¯¬¶?ì°ÃÜ@æ¶:7êq·ðb4‚aUØÚŠÇá/ÿ®³ûY!žÛ àà0˜¡‚o—°ßì ŠÀÙ$|×ôJHx»˜Ë#xÜ„ˆCƒ@’7ÑìÉ?=î) Ç „,dƒ.\pDO”p\„°Ú¨©Ž-Nxƒá?X(‹á[qU¸M‘`€PʺL²Cq@ 3ê"ÞÀœJ~×â–镞¢F­X´Êðþa‡=¼ú“?ùÓ}bbÂÊ#ÜÀHy±ŒqüDÙÀS”Û Gù¢P޼ypãø…uûp Ž¼~¸a±ÅÅå2Û€¾âD^²\ìPãOÎî2ÓQ@4‘ò¿y¥ò)lá×tцò£|IƒÎ u„øRMùj`¥Ÿ‚Ÿ7N¾Ý(Ê6Bï_ IΡmD(pgŒÓœ*Ù3ô%#œ¬®Û®ŸíjH'ÕÐmVEº6.4Øä9·Ôòƒƒ¡‰&*h”Jº‰ã è(.*+4ÊJ+HT E¢<·kÂØâ±E%£Ñ‡`= q¢ièò¶ÇTÁ7n]¡›ÏlìÛ2x§[Ë{Zk >!¦ Hn›¯&N3ä߇MÐ>¶€ÚÀÎò’KúÏVŠíu•ûˆGþž‡Ú¯ÑjlÎÕ¿]‹¯X‰ÝËPN4–ô¶>¥‡õÈG>ÒJÀ³Ÿýl.D%ÈaÙ^0¦ºE^­Dª¾,У—öùÓOw…b€F›õƒ+ô.Y½ÏÊò¥ÕjeðhM‡uÔŸ•üb‘Yƒh¥V<…<=D?éQ—x¬.G‡·Š‡Ù»¼ï¾ûøê≉‰ê¢‹~Z½ò•[{î¹Zqþ ¡/UýèGÝ3F œ&íÁlÝ|Ss‰ÊÅ ^:dÀü |G¨¾v„w\@rÌ:‚_ Ž/Û’WådAZ"Ò~@{/§N2À=П³þ¿è¢‹|Pç7p!qhgàâ1€’ 3’ÅHa(†qô„Å*\`ŸÓ>Â(mMZ˜äsF°€AýÈœø='Ä*™¿“¿ FïÑx±ÊÈ @_Ù0ô6õ[Êüö=÷\1zÀr$°œ,VÝçHà\€ln÷þ5è=Ywb9ß_åh€fø3/ @ W-7³ á]s¥×¨"¯3GÉUã™.8™’(è'sëÓ\]Þö%œ, ë‡ØÏ@xQ©×Â_ ‰èªŒÛµ‚WÛ-ŒTN–ŒbKÁ>µ_@-n¼j|[niuàÊAqwô ;“wDm)¹í¤ Ù šè\7šn°­tÝ<¹È”ž-[=ô!ñ¶(z´ËµX %dC¶f¥lãûàž 1{î™o}Þóžçmwì±§Á¶"œüž(” ÁXw½j±o;6½=Þ½iׯ®Óž¬\êÁå«VUyÈCu%ò+% _—i«#{ýö( h=Dò@ÃO~y#Þô¦7y!÷pÉÑG<Ö Ï( ¬§xÏ{ÞãKƒ8’ø~÷;´ú»¿;ÙøCcLâՉ펿¦ä¿ÐÑ„¡ÎÊD9ËŸvæ§CyA)«Ùn!c9/؉y ¤ZáÒ Ý 1J&åÉèBŸÞ=‚œ2¤¬ÌŒF1Œ`‡W»{ö”/ 9‹€re!ÛQ®»þºŠ³ ô§K ½ôÒËt0Öåþt 0Q9,kwúÒNúôÂ?óq×»7T¾>ýOJö6®ÖÚ1ÜÚØ;Öì\]fJ‚2O°p¡ÜÅ9 @ï?DX­Ào) ®.(³1s¢d†@†F‹½¯l‡ù¯ÿú/¡IÜdÀœgRÚÖ5ôEb³oTÊ ·e?2fm…¿ì‘ö¬¬¡8pDPCq œªÁ¢Œ\¶l¹R¼É•¦ŽS[2ÍÚA VI·ö’{ü×.–°Ð^gìé¿úáÔŠå ˆ·¤S˯Xü4RÙVý(ÖH2>(—CA¦åµÛ$äÆÇÇÕù‡O‹\¢Fóv]¥KËÐ?oêüÔm²¦áûùÏîžXަǩoCòC¥ŠúÛ¡€äUÏ]ÓäÇ?]w `zy4özpÃT0p„9ÃÿÇwœï?8S7þQ'ÀÁLožºP ÷‡RCú, ƒNªäVJØ=À¢0†–98éÉøäêCñUì] Êh·}ôÑÕë_ÿzO °b=™~tí¢RÏÏ:.eCˆB38ÌeÝ3Ö »@WDÁÕw˜|Ï^wðDÜffiÁ†áaø¡Ы‡éá‡ö9‡¸„e>Ÿm‚ŒÊp2!£ì¸@wZhU·?J(»a8 e˜³ °ï±û˜•äõÖWÜã«›o¹Y—B]®ô—;MÚÒš\Ýù¾ë»/²\i3X]‰¡nRïì b(àªà†ZÉÊýYÈ…@ÈbÎÈÝ|×J€Üá\Î×á=Éͪ\ªF‚éÕfÚc?s¢´ÓHDŠÐO"RÓ@œîæ"õv®ÑÉr7j±Ò^òH?ƒApÅUÆUÕñò½ ÓŠÞŠƒ•J[#.ûËU±DË„âüÓJ"·~;üôÑñÝ ×ö˜Æë¿6ŒìÓÆ·g¢± °>¤ y{Íí𦵶†Åpe­•7Ù¹ÈÊ•¸QïŸËtèAáûãòŽûÖ“ºqS™Y¸S9ée}ö³ŸõQ»øÃ«ï|ç;nd‰‹ðmÈ\J´”"÷K? s8ðSãÎÜ£ Tþ“N:É[¾hÄgjÀ5•a„=yå–Ì·¾õ­¢§ñ§7ˆp梙|à®È/~ñ‹>—%qT2§ "T¸7á‡?øaõŽ|‡§) aÙjFoz0ò÷ÿ>/ž*½E„O7]¦ÏSòôA!+¡±(oÁÅød¸é¡Mç›Ð2‰éÂÎÜ/0õ¯"? |@7ɃВ²cÔ&•hÊ…/xðüàu„ýcûX {êe‹ëLP†iÌwÙeW­Ù$…]w[lØì7 )cî›x⟨ÖxÀuz&™<»¿!UF>X£5 9pbbÅÍn©ÀÍ%!¢m¢Nňæ}î³?‡ú³€^~ŽXÐw*0®«H¶mð él ‰Î‹a‘VË0·aÙ °H ÓÕk×­ûÅb5LZyÎq\4,fc¬i¨¤®¨éÀ[¡Bç£hUühTø5(h€õˆ~žd I! áPkŒÀ¿öÍ vË&xc‹SBÈ!¡Mñk"÷·,@Jï€áŸùéNÇô—ƹU‡žÌEÃ- µ±Á@Ù”B‹ÒT!‚F“^|@¤w‹`Â7 a”I vŠ…rs©8¶"<±¯×œ=~„)¬¤øJäxÍR$t:„ᢄ?»HŸÆœ!Ù§<å)î§)HàSAé"ìÁ“aï{ßû¬h[‹a½˜Œ!ÃÁÿýßÿípÌã£8|úÓŸöy r(rú Cþ_ûÚ× 7W‹£pï³Ï=«‰‰ +.Ðæe2>°¡Ðxˆ@<ˆhgo *ê¨G3 Cže:­è5lèþæ…ÆcFyA(ð0äßÑ»§|YŒÉˆ B<gÞ„ƒ¿±#À9…í®ÜK°bÅž†ÁbQ¦ÁnÖèÏ~÷ÚO眭†‡¸ì€¿ë®»[Øû{W'hš ~xË[NöHSIðíŽêÎŒ2ù[8Û ÊTŠyãXò?_4¥ ¶G¤¬/-¾XI#ü‘ì)ü‘ÑùÇ’ö“(ê9&óâæM8âˆ#¨bܦ†) j°oDóã³SOÉW™#(v¾£qÀÖ2êúkRwG×ÿÑÊÛŽ/ßÄЬхºËÝ„r˜â¨N[|¨Í‹ð=Mq—ÏØŽaúAè ¶vì µö­s BeÈLÇ4RHÞô(Xé? “´ `@T"¥J zYÈfIò-º«¬RøÓ`2ÿ‰€Ã=7Ò¡¬\~|ô0Àbˆ<…5'O¢Ô‘Â6Ë6ò,áAä@Ž5æä7ã¥iè\н4”u„(qh†1ÀCГOzålcd¸ÿ¯x…í"A/å€â«^õªê9ÏyŽ/±áL‚Ë5ÕÁb³k¯¹Ö ÷X±Guå•WVWè®htÓM7j¸2®°Í¡@Ò„ž O“‡ïéhÚ‘· œè™E-ÁÔ¿ù(½óÝwƒ‹Øü\8)!æ{`Ó…N©“àï´ l{û4 zÑ 7ÊåÚBgxˆ·¤5áÚñ“8ûa“îX¯yýeõò?¼ÌtÀÅ_R}èC²rÀš™%KâDAÒàüøˆ‘€g>ó™V(=€ÇÚéM“­»¼zP@å3zõÕWs;Ÿ;«”×|`ÃCÉ›ÔöÑÅããLpÒŸ‡ÿUŽm%2À‘ÀnÚÅs“*ï‘ïÿûF‘NÔ°f΀‚£+HÑ€Ê@Íö³}ÍšµçG ¾¥²(„žøˆ‘´ ÛDÕH Š€@× Ž Ï·{1ö°»4íIÝ  ±E!Mâ£yÀƒOR¤V»×þÀ)°Ò­~Û£];ÏÄp~ó±_vÈw„ŠœF~)\è±U[Ѷ± “834 3ßÁž€dÎÀÆO[°G/;®²½­÷œ÷Yg冓^+'xÀ—sô¸„¡ÅÊhMâÃ_ËwZnx÷™˜pCìK}@$éñéE\ÎÙç¨_vÐXwæf„BÈ#D9À ®9LK#þ0§qFP¨ñüüI'dEüÙÚÈM‚)DXðŒg<Ãnô YH†FਕÃVNœŸ1h£ybðF)BÉ Þù \pÔP”Y|ž>S¾E>™áòï¨ú1 ýÀ†ä:Û f/·„2ý›4Ì{é‘`ÍòmÁv€€-óÉ\oJÏ*ÝÚoÂC×|ºã·Ã¦ð昚2Z°«F vÝ5Fvsp=~ü˜F ^{ükµ†ä—108®šû#Ø>ËÑØ, EiÐhªëðŠjâ÷Ûø¦ÜTÖœÃÈÊv åm®/m¶™cÂÀ[¤«òšd÷“2‘¯Åé£ÝS(¸’a qÁ›Å{Ìíƒ?ør¨Jw  ³Ðk¦ÅÈ•zyéÉÜØ Àœ/+鉂¾—‡V<—-üÂ? 9cŸï„ø`Yjp‰[íÁgüH'×÷:/ ‰Ä1=’âhˆ°‡ÎIK6…ò ÎÖt$ ”ÿý!Ôb+,gb0:pη¿]½÷½ï­Þ­í»ï¾[µ^ü ¯S¦ðST/•’À"R¦”Ø>H¨;—ûl3u'ˆ­T¾^ô§)ÄE(SVJ/{>³˜åtÐAëˆGvLzè_íEöü‘©£BØÍ¼gÓ6Í‹i¯?ø¥¡p: -KÓZ¥y°+!öä6)Î’êA©´Ñ›Œèá „¬;uíŠèþìȱ=Ôã94iÜš} —d,\:ÜñK#ÓwG˜ºBw¹g¼¾jìüÂ-R³Ð-_SÃN×½Éa·ø#Œé¨ŸÐÅ”y”åø 9Q F‡Žˆþ zÓ€Ò°bR¨§@ÌERÙèâ~ÄGtlÅ¡ñM!À£¡{å+_épÏÕ¶76Xø½îøã=„zFÅj{Ö™p"ê o<¡zîŸ?§Z¡aôsÎ9Ç[ìXðÇ–â# iøY¤È¶< Ák¶w#PÙ3ßôâ¸4è>÷Ù¿šPY­FgTõ€Ëf¨4äK¥°,[ºLöeöÐ:`\î‚Ç7O6$öâ‡òì(½(æ! e”hrŒïP©“‡ºÃdÜéßu¬Ú’Ðó-x2Ô|Kùß 2üEy ìYoÁ¨–¡u¶2Sf³¥/é6·R†ö|ðÅhr’í²ðàÞJÿmo{›G«Þ÷¾÷K¡½Áx Œò0Z…²Ì®îÇxèCj~§Ž¤r@ïú„”1å®Ëê6gyç{ø3 “|EYéôN55‹ÆdGØÓ·" 7ßùÔw °ÈÑ —9m|<Œé“Ãè‡Ìažõ¬gañ¢Šò–çÿŒHÓZ»aÃú[¬m©uMbgÛCĺҔúá–@zÂ.ie$½Ýà;ãÈbb㤠¦Æu”+Xí–ñjxáÐvÆ«1øôòm7mMèm Vï´N‰k(‚¥·áðzÃ0d¥ô òv¤äruˆç^Ìw˜Uz¹”/xñFh!pt,¤ÂðM/̺|c('ø„†š-o,"<[Þ ðÍâ?M¦NÓûtaË»ÞõNWèÛuè½<˧>婊Á#{„Üq~‹ÙCÏ–.`€ÃÏ.ûYµÿþûk–Npc^ésˆ‘‰c¬fþC G©ð^lxä‘O¬®Õt<j(˜¹`ÂQÊ ÓëgÈx> %éL 7LÍYñi·aéÇ<ßo /ãGð«‘ +iu úHü†­Ÿÿt)KÅ­”Œ*=á O0àΡ?,ʤWˆ2ˆ€Èvª¼þî œ8a {ìJŸ\œRW˜Þù«¿ú+Ÿ|É¢PF¦üðõŠ©Î•`Ëè©§žZ×·¬kýq¹Ë§MèYh6zõ5W#|Mãv˜¹´“ViÓFÔ¦Mê²³¥ºhŠQ®öð¿ÂPés$9íG£j;'iÓXDŒ0À‰™ h ¢6V©p$ðOhì’éÂeZ‘êÊ¡ùdºB:ìÛ¦Wϰ{¬´¾Ø7»†}Õf”Ò»à 8:š¹9_ʾ¾'aš<™é~—9~ð‡¨¤ÃH,J>Ê) Î5Rrm„yt:˜Ãø)í>”¬?\ÎÁÄâzÎCähijˆ³Ó+"n(ø »ã-¾t. NU1È_3X(ö_£`Â/O{ÚÓªÏ}îsž>Bس&~aË& &=lŽ6O%>ÆLM`ѯA Ì-»f´S…Q+¥¯Q-F¸õ+©Ã'(œ` ^L1Šo¥²= ®3ÍÛ!¼êri„ƒ¸TG½ú7_Æu»ð"嬎Œªs„ @= {Í@  nY¾ùÆm&fN€Díä²´k6z! E·+“ŒWlÑö¦Ÿs»z‹ÑZ$½õ&(ŸŽQg›¬µ—üæ-ÓŠ×ÐJ‘³k  èNz/¾ ÑsÄíHܨìz¦x×~9ÄO¨WâЙ†¾H»˜Æh…³ðòe«*cîøM¬Œ™¸D,”$¹àIAèíòÀ“€= <.4Bô¦9°†íJ9·FC΄Áž76ÜÙï<þñ÷-}ÀÚ¬<2ON†ÅÙ»I àŸøãÂ)ƒ„I¶ù±’š“ñ8›žé0%űÁ\§É¡“Gi“à#¶ÜqÆ +¡,²@ô?þã?|6Ã?ÿó?[AÍÑ5` fjŠŠŠC´òäÁT Ç-Œòᬠ>[[= {˜¢âŒzû ”ålkMƒOžúÔ§ú*b”ò‘y¤¾Üe¦§@Ò ~¸ù¦›u\ü:î­W-èéÀW7›²°-øÛv”€z@v¦Ò:¢u"f|ðÆÌ©ÐF  hæÄ]Dã¬påÈê5«¯õ‘À:ŽÙ>Œƒ‘UŸ okéI”ú¯|ò¶  ò)qÝÔIÉYpãQµæ4ò ÞQük§æÇ@ð °µîýüê@;°D¢5àüt¬HRÖB*§ðj/G€Zå_ö´ï Å)Þn8JI‡—ÒL\Êg)yáaGÂõ7”;ÌHï„3ÎY`÷Õ¯~Õõ‰F4-Ezý¼©|4\ q²¿•c~ßþö·{Ñ\Îó›QVO¯[»®ºX½4Vë³ P×L{žœŽÇUÃÜÍNãÎÖ*às†; ÑØ¿õ­oÓ+ßò‚RÙc¤Aôæ\v¦P u¤x¨1²= G“zh ëSv^ЧƛE}¬ð_«¡fŽ"ýà?¨9è½­8C«¬Ký©> OfFøÀûèE:ð€äi š^CÒlJ¢0¬AG9”þë´ˆ)ölÒ·Ëš¢2ÄÎ4=gxôg?û™éåüQFQÒèeÓûFØzDªU/»À·>³}Îaà]²âÊF¾ðãÝ”´K¥"ÕCúP*Cù4š4RŒуÁΨ‘a7Â1œ‰?ñœòþS<üÉv§TPÃG>ìØ™ûÈ/έ§aêÀ»`;i$1e%5zU"(«w‹, û¹wŠdp¾èuÓh"HZgÑÝ¿ýÛ¿yX“ƒÆÇÇ=üÊÙ÷„Ëãm¯ºJÛú^÷ºê¤“N’Âpÿêzp Ûú€Åóõ4Þ(t4Œ4–¤Á΄£Ž:ʽ;â \Ð 2äNc¾ën»Zð.ßig)&»xaÏ=÷rcâ ±¸Ší„T0`îÈ@OÒ·½ØÀô„Ο¨Î:ë¬ê '¼AJÏ›ªý5:²vÍZÃE `¥?ù@‘a¾ÃÍôàR±¼Ü]˜h)WƒÓð¢ yfeüb¾ø+ÙгN¤…¿`Î/z¼¥ªÔy.-xz3Ô¿·æÚ9  ƒ ¥¼)Gø¥ôÿñ=-€ÐVÊÙ)£›pK²xZ3yƒˆ;0À‚g©?ð2Cÿ¸ñ ~ŒŒ%O‚+Šd*„aŠ‹k‡ßñŽw8äupÚrw"ﺾFžFµ€v¤Ù™6ƒ2› Y( ÊQõ{r=V,, åä…€yEp-üyÍ“,åäà‘aÍœ+IÌœ{b{ ‡ŸH#µ†¥LS+XΛ5¤vé"îFW×– Ò™µü”»…ùμ—w¾äÍ}ò§&âí É>4‹L¥²öÄö.ð ¯ä°ÄÅØim}Ú{‡?Dà)i÷ŒoGýþú)VùcH¾ÎWm)H+éÛÒºü=iXiŒh(1¬^¦ØÉ  ¯8ÁŒƒL8ÓœËmXýjÝz·jÕåÇ´ÁŠ{j…öiÕéZüD¯˜iÛ7ê¦4 JæõYÐ÷Íož­F0Î ÖR^•‚“^5é1Ç‹àGK?”Npaµ?CôT"âÀ—4ª;i”bɲ%Õ´ñðÇîsÛi@Ü"]Ò@@c¸þ^÷¯>#%‡­;ïÐí€Â‡p¤KØ+tÖ?ÏÃö07ü CG¸Pn›ô%¿Ì Ùîßà#§o²L» ߇ø‰:LU`ÏhacPúaÍ9 þ wê¸ÖiêÊ ¢¬i§PðàU茡½J>€Îð-½ê½èE¾Ò—­y«Ä§-_P»)“X¿”_-xÕI”(z”qðiú÷ÇPX© (ÎLULLL˜PR86š«àixØð1oîµ`õ‹E‚ä‘z‰?ùºË(è¡:6 o¼éFõLoãÞ»Í'H7Ú«Q¦@90Áß^ @Nd•`!»í+W®taS¦s®$±2côÒаe˜cëyЮèNm¿õÖÕ×ÑKP&ô/ßvÕ{ü:·Š„qŽÃ_ÅÁ![òÛÐ!6ñv¡‚p¸K›hmø¤ÝiÕ‰No1>bÁmjy\ûOÖejü»¾6sšë×ÇYæÄÙ¸ñv5vÆm¿çž+ªßxbµBCŸL¨rV·kÈŒõö/ù ùM#?Ê3y/qA  ñ¤ñÃóØ16Ë·¨Œ ܨî±ûÕÇ5„zàŠ=£76mãIÍí3•Àßn”ÅcÐàVÝ5¾~Ã:ùíì…eããã>À…i ðB6y€NWiº@+ƒ­èÒæÁŽ’‘Š£lvYóc‹3h+Ÿ³7m(²ë¿ƒ¯”@p*)eݸÙpþNåFŽñ£0þÀ C”)èŒÀçzÈl÷c1 †Å€Ð™p” #3ð-[òئÊ.uºUÓ5¸ Ò„e‘êÖm(€©¼P'XY@‰àrõ„úâmþ'o„Á°¾û'î}ï{»¶§³ Å]¦¡@ò…FT&E·MQ†¥`›`óaó¶tMŒ ø˜ðH …{€Bó£p.@ðÆ SžžsB ÃÐ=m5v“}ªÆ‹k éýsšãÙ‹5G{æÛo_§Š³«†ÊtÆ¡ÔeD2[ÆC~¼ý…×úUl‘îMÓÃÝÐ쮺dÛ—-[žÃ$ÐH4O  ajDGðIÔš¾Z-kGbTä¬Ä3üHzD:ñ8‘ËTü øŒÓXO”²§B`QöûØÇ|‹ñæ§ÅKþ¨dô®ˆÃƒ€¤Ç„{œÁù:£_sákVÇ9ÝÄgU==†ñQ4OÈ»»",5Ȭº_¤á  UNíܵñ?ì°ÃÜðÒS&8“ðÀ5 qÀ•Óü˜–`Zarÿûßß;ðçùÑT]ð“ ª½´Ë»V®\éSI‡<‘4!,tbA i¦rO0€0âÁÚÝSó×(Ìa‹©5²%%œXÎäu…GoÐQ[“|A-vm&”Ý©vW0û*L±ÈZÍÄžòC¸¢@q‚QžGÖŒàŸp“—xã]zéeþœÔ¸iÓfó+<º]'šÓ汆E;|±店֔pÕøøxõ =ÈÛ\ÙêÉʱ^?”¦®þð‡/†üÙö ®¤lêç°Œ©%zý©$¾ym, oH^› Ý~Š^ž¦Ö(ɨ:#œ‚[ÖËä…¹¢Eò”Êß 5â§j¼l©ê¼6«ôÚ @Ošsòö9"Þ®øÍo~Ó§£r| Rö„Ù‘™  •Œ‘ÖÛŽòC æ(Äuª?Wop_ÝW¿]ûôÐ~éàãXT¤ÞL“´EÔ4Án6êp„¢rC•탈at ŠY ‹… ¶oÛ²Íò Ž Rí}l Á#ýÈh`¬_[„ Hô+pnTà¤ÝÀiO0ðQ® …šÀ¦.4N:5^CÛh Èó« ?²¥aSzYÿøÇëmWSŽefØ”òb;œÉTè³]'çåp)#Œ0 l_„! OJï>ÃÞm’–#þ‘ZÑíÝñM¥AÃeíŠÓ$Ò¥Þ6„§G·xñ¨s¦ Ž9æµ^¥Þå75Íñ³K/­þWSW\· Ò+cÑCÎzÔ£<Í¡EôîHƒ< 0Í"@6ôd*%ƒQ•ƒ>H[ÖöõTÁ·¾ý-ºô’jL4àj ¯§i#ÚÇ^7°&Ô;ÊÕŎ*ñŽ—Nð°áÍÓ$Œ¨Ó¥¢ˆä^ø€¤Œœ²(8Y¦ðy¨óÑ'ŸÓ9#øQ´Æ”;oŒÛ•E¢AðÆ+v×Z”Û=Å"OÜ7mÚ(…wYµ÷½ö®~ç¨Îו½Ì¹3äÎÙ\Ý ¿z@|´ÎüOÅ0Ó#|Á.ÊÞàü¦ÁP$Ù¡ÀšÒ£^¥"I ”Ràð›üÝe‚ÐÃ[õyî@¼P8…éñ{CÙRßU¿'uöÇØŠ{.¹í¶_ ˆ,N þòp3^ð?&ëƒ?fð3¯ @2ÜbÄIU2#-d!,Ç-r&ÀU”ŸxÐA¿¯FvrBh<$(oòËAß”OV7ä_R+KÈLNÐ…!cŒ“)néÏ'î‹5W˰õ[Öë¤7iüŽ1ì¸tÆíúl<[-«â«q‘ ¡rÎÚ˜(…2zÙVheØÅ-Æ·¡­?fù}ixhHi¬>ûÙÏz%5 —ðˆ–F áL,j@#.Y¶4ÎâW8 óðA* ½òÃ?Ü e~%˜Tb—½c þCœŒKØyƒ ßú÷;¡Îd q?û[gû„ÁUW¬ò4ÀÆ"X Êð¨Øqc9=;zrŒ–p 5‹»Vj„€ð<(>( Œ.°bƒÖM\xáEÕYZy‰”‹U—_n¼6‹æÎƒpâÝmÒ ¼yRPàN>ˆÁ…4¾€ü²Ý­ð%Ê)&8ÆÖ¡j¤Q Ô¸‘†° S?Fè<»Œ¨3næè˜ð´€7)Üðe§Ë‚>ÖzpÄÂåùX$ˆfä‹{(OF¸xŠ=ülÙbç †x”mòl/ìQ.yÃ9Ü•111a;ñáÖqÄ^WÃŽ”Dø•<@S”G vò ½HwXšõÂó7Ý Zú°VmDk¶ˆÊN{þÂQ¾Loª“³ì—¿üÅ"áBOÃo%o»¾‘ö\­”Rp饗hd`{ J8 zs*Jz¤l•„fäb‚34#©`bÇ\r %«ÔG4C9!@ØvŠð×t™à…0é‘ù;)i—8#~Ô?ϙ˅ÑT*J$@›ýÀ ! ‰Ÿë Cžfjˆ¿žF_Mg°ã´F.gŠ‘LÈ¡úKnð'£4àtÞyçya*sóp€‡éáS '{k'#?(ªÌé£\\¡…|,’&mÊ!è‘éD™e9Rþ¹MñÁ~°•jÂC_. bQ-i¯ DR†„A1Å6iÁÃЪÁìÎkŸyX]SAcð´E®™óÖ T¢|Üf‰ùµöiäÐCÙåüó(§Ø (ÿö(@[ ¨Ë‘vd°y70\6<%1ª ¼`ÍÚµé&»Íªl‹£ž‰Úü'f¥ò•—ê"~úñ¨¬uå$By l8-?‡×÷’1-´GB&à€&á•T:ÒªAÈu:Æ‘í,&ZøƒºÑ´º“‹1’ S£é’¸ ‘w¢b sSöÌ{Ó1tê3ýåFƒ®²/,x8qY=¨#|’2­µ0 eË›¹zV4vÜ9Àªh Û§¥ûpGØ?çNYñMcP« ÇšjAZCte–n÷&ÞZãâ<â hÔyðcš3žñŒgXˆƒì;‡>$„à‚ ~¢¡ß ô=Rí¬õ{H©F‰ ÇNcm ^>l‘$?42àШ±Ð’F‘Ž>^³v C,vCaç~®Væl†ï~÷\ï'gA¼ADx1WgÝWw­?M©hŠ¡ÏÔ ç8›Ι ʤG=Ø ÁB=0ènœ¨ˆÒÝ8¤‡¹Opcd`PÜLŒòmȧJRFÐ&”M¸Ì)òÇ4tßUBžK¦ž®5.§œòCÐð<~𠵌éœþùög®žQ8O/“å h™˜˜¨ó A3„;#aŒQ yI#Þ…^hAGLû Ý~Û ôM¼rSùl¡Ìp„߇¥_À¦LFÑa`)çÿSø£´•XЧ–ß´'À΋ÍÜH°X…Fï¹Ï}®d¢“r#· W Œ]wݵWoÞ´e½€íÄŽ~59´)–úÛyZìÞ]X–Mض{c§ãNφ!NÌàÜ ¹ó«oÜ\Ñ¢ !ÃÝ&*éýv{îàxuÚi)ŽNK?¤L³Å7¿ƒd¥þÛU?ójhX`Îuô¬ª§§Äu¾¨gýɳªgþñ3«¼à/Õ EƒÄð* ½*†L߬Cs~ðƒÿñ<&ÇæB3z¶<èÌ3ϬŽÑ¼û>ðA ³Ýµòž3â31ð,ž4Àë¸4èÓº} zÅ>§Ú'IGÙB]W/¦)è5ƒ# ôÈ?0y0à”¼†þd½ÒÆÁ­j^´]CÒÀSC4Ê€ÀC0`€\„áë &ðÈa Ç©Œ¤ ~¬©¸n<|z”×^{o"dºE â X²`â§"̶É<¥‚)èAXüÁqÁèBÁŽi ÜÇBºuëÖZaK0ë=Vì¹¢º¯¦ŒÒÃÂ7´á@hJÙ# Áí£ý¨ÏÀ'ïä Ó[â´£wwž|ºâD}"×®Uä »üð†_vÚw?)¥·x›ë€þyÊ—²/”; ‹Y¸—åmÇÖ¸v°Âÿ °›ƒ{–iÀ'ІSÿ]8ýôÓ}ú%áð;òÈ#­°m– ÊþH“Â/øE/~‰G%¦f©[†Áò`D˜³ 7N^|ü㧆⠻Ѹ¥ì5¯}“a¿ð‚ «›uvŒ³ ¸º|QèÁ“y_Ê;p\ ùs¿eg˜}“¶{²]¡DºÀY.á¸×ÝïV=ê÷Y¢›øî{ð}%ôòÚð&=¼1ŽÀ§‹@d´8ä™aáè’8É™þ¨z´§ÃuÖMèlø‚›õ :Ðcܱx“õ.ôòÁ˜©*üÙò‰áÖÁ¤ï4À‚Îäƒ œ¡ÁQ耒Áû3ŸùŒËŒpÐ0ã0Êp 'øa¤Z!ðQ->I›äââß‘&0qûm4ä[e¡êä6`ÊYÍôšš”4©'#”ÃÄÄÄ2­›Z*þö‘ÀÂ#ÈE„?ñÞ–õÞÀÀOÔ»A̼+ ‡aÞ C&e¢îh ÊêZ×µê™\´Ï¾ûþŽ2±M9§Åˆ,š¬ª&vœògÇ©U6¬oWV“IhnöXq”‹.Ô[Š :•cZSÒi%×<NU£Ë[Ÿ¤K%sZÃ2¤é@¢àm7ì0m¨9uŽÒ’難ͩ ŒM£‚p¹yíÍÕ“Ÿòda5âyÒ1 ñ’ÿ®¿¡zÉ‹_ª}ןðö$ÃÑ+…G``>‹«Î8ã /°b±+ŸlðŒN£˜½ªÃ?¼zç;ß)á¢ë§µ-OE;ãÆ ¼H›ýÝ4Úïÿ)ÕcŽx¬·‹1‚Á!D Q³@-Q„^‹tÅNþyzÒ@xe¯•ô²AÎFž-HôèÞøÆ¼/aÞÌ7t%p2 d)m‹Ì!VÓ…®œ ÏtƃüÓôŠ+¯¨¾óíïT?¹ðã³HŠË?øÔ;}@uôs޶ò… ByãXYöË£¤Aw„Z¦OYð€ oðƒ~\ѼIow"¯ôêØïïb àHïΈñ.Ñú½Ax±êaOïÙe*…‚ü‹8<Ä¡áãLõ¢û n!èKhÊ“bt¹Ö}{y-O,Õ4FŽJ1…2>>î^Ê#(( ð/†ò¤ ¡%tƒ–Þðm ![É3teGÍ¿øE+DkòÊ;㆑¡£>ÚqHº°–,Èàó”mÊzƒÓo«i—h3"@Ë“¶r2=nÓk¾hCYˆ&U¯F¥´Y›…?o¥§VäÎ4:² .¬¾÷½ïM²õžÔ„t4ô  7‡†)1lwCNÒ£¼Íñ¾wYDÞ¤m7LLLˆA7LzkX%MTQ-xµíÿgïN€^öç^¶òö_yûÊÉ?󉕿émíüpúßDò+f…&ú\á,=?FY0~ ù]¿ö®•7¿éÍYù_²Ùñ÷òüNž¯fÖ úq§‘-L›£à¨%8ò1-è¨ØïåÓÉ”/þÃøëÖ;a„ÕçdZù¼æ5µŽî˜¦p' UBëmo{[Áx÷»ß]I~ê®êVÞFó„´:“N¸‘gNö¬ôŽ-öÑEùž;{®–j(nïøÕwä³Î¿_:ïM›xäáqçEH7 {m‰“o3:ùñÓ›ÞTŠƒÛý]ýZ~M«­+'´O‡ª>Å)ÒÄkêûé\•¾ëiTU" ‡0tÀ×”KùµYƱN—ð¸ôɵΖ´ d\.Õu×m€Í°ÕüAŽº¥Pù”‡Ÿ2ɇ{)°¥C/JŸúh:iOÒjoêJÿ‘®û&ZYúqBMQÿÊ´+tŸR?]fñ2[sÐêÉÛÐîHÐm(u¾–ºÊýŸ~Kf‘Ì,¶ð¯a­fÒO·Ü±šM Wu`߀Í$Ñð4bf1í8üð#¿‡&2ݯI䧘u[â6Èhxg fv“dŠãµ I™ˆVMF§öš‘^ô€têÒ¥jï†Ì¼ÄcxÉ`2Sÿí× ¶iðfX¶û²È~áLê¼)8a\µ0Þ*/[ ¸ÝÜv¯ê%QfÇ[Lùõ>üÐÃ+åœ'Â,ú0'(ˆÿä{ÿIíæÇÐuDñsr›àçþç×(\k€\f}9á¢b E÷ ½*5׈7¢_ú;E»4`écyûtÊ–aa8 lý¾¡P¹+ëÄK!»œ’¬i¤ k$Zb^64ÙŬqZË$`Œd SŒ‘Ð1ÕÿÝßýÝùÂßÿWïâêx˜˜6äë˜EÀ:ñ§úKjä‡é–ŽËh/ûGt€í˜uŒÅî·aW£H‹BßóFzYã¥ÀØ_F“sùÿG4á„I`ìK¡YCñ` â`ÀoÇÛW~ Âê;¿ó +oϦȇ² >ÇRÓfÌ&dƒ`ò£xüâ/þR)_ôÅ_T×ÂZËK>m´‚ƒÐ$`( .ß"Ü) oûÛkšýýxôF á½Í2Gî 8~låyÏ^)7‡S6‚ÝÑ\Ý1ú¯Ñ¾} F‘Τ›ê~ë[ÿŸÜrø{uÑÞÿŒzï+!og¿4¾ºf̨˜ 3ZW†ª£àîtž#Oþ|dž9Ê€2S¼Zh‚5÷ոт°7Èøž|eÑNxKJ_ù•_Y вI9»ŸŒÞ´Þ‰³Líã6Sh%Ðë0ÚT»×í®×oÿöo¯åô2 c$-_°á­lÊoïÚ°žÑhá¢,ž®Sõ*Zšè6FÏ»<p%0Z1hL H£™±ábBq“§xp£˜øŽïøŽš£°èWò€OÕÕz±ŸÒ®”µdThu$ Àe‰Ÿ:Qßì½4àMm¡N|ʧ|jöƞʀ^½áJ`J‘"‰z'|•òoj7]oO†ï: ´ý2“À·&V”ƒ\Lu§‡9’Qá}…üN¿íì¹sŽD:Ô>@)ÆÜ}Š›$^ù„®:ìñËkDþÒO^ñîG=#®5ç¨ó‰ÙÐiŠ$OjdÒe£¡7t›'…tù@ˆ2mst•§Þ ‘9Ê ÇHv°¿bSÅ Õ †L“°²¦íÓÐF„’І‹±ab˜‘Òí·ß¾òÆ7¾qåe/}YÆySô5êw‡©šª4Zùo¿à¿­]ê™5ʱ—Vqß–à©“§æÑ’ú½’™É['Eyt̺Ð'áÔ²ÃÙÕšqÀ0­«;©€ÙÛ¬¦,Ý“?&«ýwŽ©>ïãŸáö½+áóþÂÊ÷}Ÿ©þÿ.»þ?qå\„¤Y§DNžÈýþw¾¯„Ûg}ægU‡&è0l°»csƒO`cö)}ìŽ;î(OY9Áî³ÇÒÚ >Áñhhow¾]úÍ0àhVÅ#eðpÛ'`”¡¼êæÓ¸ÊïL¼/6:‰!¾o6Œ ½ð´ åß´Ï;œ)G6ƒº£ßÚ·ûíÑ™b߯±2ž~¤÷(¿ò¹ÇÎ÷¿ówþN)i·Eay<¸Â¯ÛDÕ{~Ø£ÙŽ—â©ú¹åT„enëny‚' ,<Õ-?´ë¼Øp‡ŸÙ¯fÎÒ‰¯†%½¶¥”­„«÷/ù’/©Ó0êÏ’Ž%þá.¡¯N(Nö|P´)€Föo´£°ÁCÞfÊìá¦È[^޽2Žš©ÞeX/õSÛ… ³šY¾³© 7òUÀ¦ðEÔÝ9Ñl3¢éÃGžñŒ[)Ëoþ䵇м bÕ×j–ýÖ(‡ÚÏv ûn4t&·­¥1¯E3®þ55®:Æä ±ï12‰à¬ãs7ì!mõÔŠí©i¼:9:sy®wß"êuÕï v6]¦á;”Æ¿jÔˆAÕÜÃ"æVÎjÉ~`°ƒ?Â;Ïi$·#3sž¤n7{v1õLAMš9ÞŽ2¿ÚDÔ:%à¡«ÀÒÔ?ÆgÿŽw¾£FDFe˜Mw$móÇø¬Kûܪø?ò£?’ÑäýU:q1ÎËèÆmx¾ÈöÒ—½´Î\=br–0a ÌfªW[¢¹T ¡|%x׌øÊ„¹bÀ”Ÿ“Å L³N©=eÁãå&ܺgšÿü¯ÉîŸS§hðFä6“ÉÞÉãÙEo ÝÈŒ*å¿U/Z&Ï0ŽöG3ª~xnf'nÎ Œú¡¼1}›ýNÝ|ªfP_‚r¦<T !45º•^\³lñ”û£öµüðUÿý ¡ë䛳qñdž[¯á›I ¨4lðáÖuGÀÍ2n¶3«¡lž­L•;å@°áø­ßú­u)Χe ħ˜Á7ÛÔ¤‚–¼dýúpõâ #uª¶vé‘¿6MI•¿z‚3šðGeÓf49B^µß~ÒA~©«µ|älõE/ú”[’WšÒa‚ŸBˆö 6ÙïT~ì´/vÍò°—|ÈûåÌ(9æ…é œÓçÆ\¼Ö¥g®¦qþ~ ôíðâ5%â~ø ·HgÕjÁh •dJÅ=Åœ`t#NÀº”ªÎšNñŸøÒÈ„{Xë¿<êYiˆ#R„)Ω³Í€Ö!\Á5Ak𠼓4ŽV„RÇ™‚ÛûàìF69—Bµlâ?õ3t1Áþék4æ\³ç"¦¨=hø,¦CÚG!ÀL]rÆ¡çÔÍ'kmعæºb7ß^ÿÕì$ÿ¥ìýÁñ€;µµ'%ÉÀö…uÑ™k˜¶Çx/&ŠIcÚ¦Ý ðe™0LÖ7Ý¿þÕ¯®} ¦V_ûº×fÍ=ù¹åÖ•;ÿ˹á®™„ÿ: ž’p8‚î'è8ÍŒÑI/g`ëÂ"'-ðèGǵ¾`P®Ñ” h»Ý- ,¬ËI)^ÒQa‰f«€= Ð @)K4’vjÚÛCu_ˆ™ˆ·rúôéjÀ•ÎÚmØt(Bâ÷s'xƒlÁ¬FÙr8u€öRNyÔ8­Ë¿rö{a±PklJ„Ä= }S17üT¾~¤_‡1|xW„tžÜóžéè›GúB{Ê ÑTVˆ3²Ø¿¶8à_áWö-$ÛFõBµ-þZu‘`„ÖÌí|ÿ?3Åot‚±i#˜¢Ñ%„Ñ¡¼úÕßPá˜÷G#ÄÎÏÇx·ËæÌ™šî×–0Ü›#Lu"XbëÀOj&d'RO„¯‚=i2pá wëÔv€ûÜ5åÆ(ʈÏHËfF£1åþæŒÎÌ~¼FôÚÿƒ=ÓÏ[yËO¼¥f5ÄSBšD#mõ%ôRVÏ3½Öˆœ¼)#ûg=³1¦~ë3n-áCðÈ_9Àãf{W¦~ÀîæÖù(7ã4º²qÐþ õë{pý»÷ïÞ¯{Ýëæ’–Ãü†ty[<Æì \.@3åUvøme„ÛÃ@!ùøûøÚÕþü\`d6à÷ï½5ÄêÅE«Qó.ï£oqL„Ü*“øÉŽÚ˜ºF;8©+´d´mwíQºUÒ)BWZ~à(“wÊŸ=_ýÕ_]ËaÊnÆ û %PÙiû/¦µéy†ÀÒVw>ÀÉìtõtg6}2WmŠ‘.Ê¢íRøy.ig•â©û£.•YÝefe-t­Yjõu¹¶·Ôg௢ùóž÷ñ€cÉSƒò,…?€_³®ÕôËê–à©Í1WÂ÷ ²`ìê§F¨i´L¦^VOâÔ ÀG2W—­A†Ñ×^8õE2ŸsÈþ.w<æ¥E)è¡%ª) #¹.ŸJÍ»Î^°¦°¸@÷ŠZÌ *bÁ“ þù^bì×YýªÌ@,IfÇìNveRŒÊØôd9ýL~#ÆAÿÊ|2M ³x³¡S¤uíÀc#ŸõHW»0| ï'ÂT?õS?¥»4:"F¦®Í*XÏÅ,15‚h¤—iøñµ·KÍ:NU½^û‰³iiºuŸÆ ó4ê²fmÊÚ'Y1PþÚ„sßÿîçÿ]\p›Û_ˆ‚`7ÿw¼î; ÷G},#èGVžûqÏ-!E9pÚÁ°úèG©mÊã»Ê£C˳™½$N3stðq 4„›§áˆç¹cYŒ‚{lZ£V?`¨ç>}udýÞq¸/ú¢/Zù`ŽQKÜVš®”Ÿ¾D þÉŸüIE5ªEOé…mUþ†i¿†ûìwÀs^õu¯ªå•¿ý5{åCw}¨ ,«OkÃUüi¦·Aå‡Aé$ˆ|БÀ6*7…ÿº×½®6Õ9RgÞ’€r8òªÍ(zè²H¯=¿1ʱc¯î `òøøÚxç#_ß Ð~h2â]û£$X2@Gùöö P"(Œv¥MSåjeSÞ·[gð)ô“z©€¡íÑÜQ½²ê<Õ´uÿÛmÑ®ºÒ6r’ãæ¸?$ìŸVØü´Tר–àSOŒÁ“zG½^Év F-35|Ëܰ?ÍøÃÙ4ôÞì†þÜì Jšu’Û%º‡ðßÜA½{ÒyG¬¸½u†h*½¿Þª×'þð©Qã‚Ò"ƒÉ¹ð|˜x:úÕ„oïmÛI_üf¢Ë ´„e ó7ðW&¿ :½•×ý4% ¹ÇЛ¦:Øu¬:1#ó+¾â+Šnæ#r·äªYÌ Ô.(U¥&2æéF¹gÜúŒ0¥¬'3ËÂL‹‚ÓÓííRŒ^4VžÑžÚ ¦l6Ã÷=v»ÐMßµ:Ñ ÜF|ðƒ[ã…ÁÂÛ> eÇ´{ßùµÚñcâÎèÛÑm¤6Ø1 k¸ó;HѰŠUíg§%ui8¿´Ê í6^¡Çá£u‡zð;U'Le÷„T×Ó%iA„ëôÈAíÐc,E°|ûgj‹ÓkÕKè&®YgÜÿÞßû»+ÜŸ›3Cg#¸u™SÞ)6úZÓ°"]æGŸ7û¡Ž hÜ g¦Çù~_u„·²¶ïÍQK ]³DŽèù`iüÖÚ£ü°6#CpƒÃ¯•84èi~ÇöÐV(Å”ýˆ` žf(¨Ú©8Ú”8h£O‚ g' Ð̽ =]²«´‘Õ\‰ÆT#ð}'GxDÍÜrË­GR—'2ÑÍôCh% ˜Xðe«ËÕÔýšvÔõ×e¾Ù n¹ÙwÞ5P&;tµªµtвùAk,«a¦å°w€s›zЫFXeœL‚6„O*iÄ)N‡ÅÂ$«Ìf†?üj´&£J‡rjµ># Þ6ÌùsG­ÛHrI”9«\urV¹¯*qÔí"½XcFNëùQFª­Á ·ì ¶/ƒ–Τ,˜Fƒ11ƒ)Ÿ«õQ;ú[` ®We[gÿg?øÏJP:ZiäbÓ‹yIÓ6!»´Kt Ø›ÂÀ¸P_ô,¯ETí ÙŸ¢Q™]•rN¬¬ ¨MÇÑ“*›:~y$#%Jáó=ßó¿ÕTµim‚Þ]O]Ï…_€ñ'´=m(<ŒQ6‹Cho4û+t-ØaYîYÏ|ÖÊOýôÿQõÏÖñMÊ#ô?•$K€èz9#®¼Õ™Ív_ÿõ__;î­3cóÅ_üť䙥¡ð8…ÁP LùÛ$*¶¬Ý:¦èãhöŒðëAúôš½ ­ŒS3fµÐT@ïwnšÆwQ…óöÛo_qâ‹_üâšiƒ·´ŽÎÊ MÝ·!K,ú’v‰.ò²„åÃ2JœŠ6OŸŸÑ¿J XÍrˡбö …°ý0`«_²1§ŽÜvÛ ŸMÔF@ŠM± –ˆ‹w!T3Ù9Gu™V ëå2?Cõ¼Là~xw8oª>›w=ûb¦DÿШ(gÈí?ZY}²eõŒI>UHiðÍîÔQ•-pý&pRÝ©tŽ‹Yk›UòV…'æ¢Ãîe§PŒ1úH¾Á¦íâM>[a´ï~ƒMÂlÊ“›Û¼—áÞ·6è‡Mm ó—å¦;£k›œë|-`L´Y—“`bN<'‚ #c#÷ŽY5ÌeÎ¥¨Ì¸NXÎJÕöp^Âk·6 OŒcõMî׿þõõ…:ÌÝÈд>쨩Ç?çü=Ã=ŒÚ®pÌÙŒƬ¯ ‡<4ÉÇÊK1è6_í0í_»6v^¢.ÙÂÐQÃMÅч:ÆÈ¹ßÒ"‚‹Gyl$,€Ùö8œ9s¦¦¬• îw—Q™Õ§#l6e ÑYÛn«z†EµÔüÙêî:xþóžŸ=W_¤tòÇýA¯êe0I³0cßHÑs½8³K~¯ºýÿá?¬üçÿüŸë#VÚ'üc…/ümdõ!+aÚ&Á®X¢Ðš°<@ÐSþz–Ãlx7P¶€>_ð_PëûâôR*F_pÑ=ñƒ#åÄæIðÌÆXŠ`Z‘Ц”_Þf( Žêš=CÝxž®¦Ûgèá$@}¤îríc/h6º§N2‚îjîÛ¸ù=ïùTÁ¡ù“×*¼…)›óV¯Û5û®tGí†jÊ£qk\i|øKÊ^W³N÷ÛŸñ™Ÿ“d¬ŠQ}º D@Ž^Þ>óØ`5Ù¼ÎQ›+ˆÆ¸Ò ÀIF‘K^òzùIw©ÉtP¸†£D•ߥ®èÓpåÛîÉ ¡† Ï9ΆWÌf" Lf|’ÃF”–!W΃T÷¦]5ÖDzÉÏz1h£\3[ŒÉúõ¿Ìº¨pK¾üçn æ…áŠ/®³cm£’³¥8JæWðru8_®T‹N[Sºo ®vWögN çâÍdÀKS‡+Ú5Žõ^8½Ö‡Í˜@#´òN€ØÝO*§Ù+ɪSYö¦D©°ô³Þ_f½©:bŽ8ã=àMèŠö{Ø„çȤ ž(4Ö« ‰Gàì=³ÞmòTNW×ÚÔd£%!&Þòäe¾ënu‹6CQ9”‹ºSáÇ)‚›kÄ»¡{KU|ámŸ”}/+%…¢BË¿R¦Ë7mÔ½SÚ »c 2›Ö‡¯x·ß~{ÕŸÝÿp•Í'ŒÍ¸xÇy}0¥5êVï°zGa–øoø†oXùóþÏ—rÀŸŸS%èlÏ€óûf×´ÊôrI@þ`¢q/è?êŠÑå­L`[ªSG耖O73ÚÏÚZÊïJà =øÐÅg?çÙ‡SOûz%°¶6ò¾h¯ˆ|ýI`J@þ·TÒUÔZ”̲Õߕ̕c\ Â6» iˆŽ²øfuï7ß²àPí½a>çB„ú&€¹ÝüÊÎO±§©ƒk›#|ý·Âá%°¡àYL¯…½,Ò)æ öå¹é‡à×Éwcä¹Dg”ƒ_þ¡)RñžöëD»É|Gi“q+Ü&dÇQ©Ý!Tí!ŒåXjÎù?ä‚™_ÌÇ~ì¨7:r«á~kÖý #.S­n¡Ãœ£m c“Ž5— 5D¯sÞ…6Ï9Êž90JLótU1¼Œâc<~Ìg{•… ¥ÊÞÚ•ôL¹áÁ>˜£v6ÔM~E®s=—›ôV£8i3£g,¡íUq&5‹nEÆüLô›ü¶ÊQ™0ÂF=:²éKŠ.pbPf9Ôá v¬›¶vuñ¿øÿ¢hðÆ(S}iá)>âr/s^§j£¥u¹Qf÷ÎfÝß%:÷EÀýA#¼Ô‘ ƒàA裹ë{)Ú‘ºØÊ([ã¬]ôŽyò#p•[}:íB0‹!…L°) ö°¸xÇÙ}K„¼µyÇI͹¨Ç1>ëñFì„‚¼>öø,°Úðç¶´¸pw¸¼½{Š€G¸rÁQ´AþÒ_Ž[Ñæ©æzeÂíˆ6r4û.~|>[v”&ôR'ûa×®~×K['=–öT‚?yR<§‡öæK…©k„c×~!Ê£6y%<‡ú'ÕšêÈó žµðhøžxì±?ÒðBãRi·Këg&ü ÿ¢Ëo¨ÅKný›ß”8IÚ§ì¼gß@Àc†Eï4 Àö œ¯©j¢Bþld5âµÿº&pYîã[ѦL×t/ãwÝU^Wÿ“r›À,OäŠ]wÈc˜¢Õçe”sWfˆËF°T´õVÆ5¶"ÃV7hXtL¼WÑ5¸WX•an|ÁØ«ù˜Ö—í >á5í £O V›Î8&saF~…Þ1a#C› .3ÖÐÝø=¹ññ'ƧŽ3 2Ê(E[oge œ…¡`ЈËw°•GÆ0ø)1½¥BÖfIå|ÛÛÞV›ð;}útÑŠåêZ£gí³EñTƒÿu uxßQf/Ôhß­‹§_xº3Sèò%x `q)* ÆIPv} €ë¿ð€›)z¶]׌ÍzÊj$­) å@ma ®:×vè-8>jFÔr—löÃŒ„õ| fnmÞÝÖï]˜EàW»šq” |ýŠ aÎßLºÐÞÔ EïO`»éѵÆðïélÐ@}‡Ž«Ù›fPŠ.±vÐ!¶AÈ ~µqõ÷q÷ÜL€=žöHØü¥LöR Ø€8­ä])ÛUºó¦‘á+k)dÙN!ÏÇ>”QÝ}¹ÿþ»u$')*c$ª³ëÜËR)z¼S|åô:sCL,9)ÑiÊæîÊ;Ž'ޝ:ʤÒÛ`6 ¿JÔAW°“E4`óÌÐ ¯)|ö_z.Ò°³p̹Yä(üB¯²÷tÅ1]# ÿ7w”»åû²^é’#£úõwÿzn0ÀfÖÂ1×nW³ ‰Ê:)'S^Ó ïµ)øšµeëúO<‘Vò9q2Óõ¹øæ®?ÃhK©ÍYF忆?fkoƒe1ïfC^ö²—³–Ƶ;ÞwÇʾó;kDiäÞ{ïÎŽ{û¦M“ÿ®Êµ®˜¥f¡š·òXßü¾ÚìÔ¿ÔawG%Íf8ˆI¹rÖhÜ…?„ž+‘íÐÖNåAíCúV¢l™Œôx¨¨j¦úi<¼ê»Ž>˜¾«¢­(þʯürÁ׿JW0;]AÉ0!½Ù i –ˆ› ¼I{õXâ`ìîWÒª[kðÌ™3gÊæïQñbK"FõžÓ§OWû¦  ƒë|-{#¡ùÄuhEhkû-ÀáÂ_~à2èDpöð3#% µ'*) â sbÍ)3ÊE qT×fÅV #õøt5¡ó!›#c“þÕ6ö‹ê4u•€s©¿g _°0^‡-ì«ä¥"@8ÖL@ð9”öu(Šžë‹WͶ1ê•w+s  @# 123k+6ž‹@¸³FSGÌa´AÍp#Òñiå€=5Tü‹" þ`åÈÏðmXÂm Šð_=žY„‚†å¹ Ýضì*`¤)›¢Röð¬ôGå9Áœ}§÷ƒ³Š&ùYǦqi{ïpAoÌË(Ç'ƒm\2:2:«}"aÜ„¼[5jÓ§vÙc¦âÕ§ÕY6ŽZg†`˜°ßŒòz¡v^ˆFÜêtQwÇŽæ¨b˜¬ïSýîÿõ»W¾4gÃM7÷yxLYûr 36EAךu.ækº_W»k€Û´µË‘JØ$sô+Y½óÒL)§²ÄB²ºCÙ<»4êÊTùô-#Yëæ_ûµ_[Ÿ¶H裡¤¾]gì;Êg+=•Š6Á°qC{4(D×~`¯Í ÓÚ`À¨Ú={Fð4cS¨ØÖë£x8ÈŸb°Ù(þàF?;îµQKL lðÄ“—;|)’‘§´Fù¨k#p /!¯üM¯Æ½ÐH¸6ƒö#=E„BHapÑ”$tãG±ÐnNŸ>]4·ƒ o›þZù!üÑC}XŽaz@\ÏÓѤ¾êŽ˜Ôç…Ðù<‡FŒç<çÙ> \“Mø÷3iÅ+«Ý¾Z1í¶t¹º;@E³n”.¯p¤…ŸÑÏlÒg¹£=ß]iÒO¦•þ]fttθê%¿ªÃÁµµáßµ6ìñÛÂ'3«Y‹®»®ßd6ç5!T0KBÀ¯±ìX[ã¼o¾•­ŸMù7Z©/¦_ëeÐFǵ_ø'‡ñ?Û¥.ÉØªaö7<‘å ÷áûb໳„aݳVV£8Ž 0ê" 1n‚a»MÜ•`I¤o‡³ÞÜSÕÊ~uíµªuœëx¼µšZˆÔÏÆXëþÛsÁo½Ÿé|ŒŠ°5¢åÆÔ±Ñò©S7Gà­ßæ8fvàÐx(CžÀ-ç„ UÀQ]ð|Áº¿ñoËš?Š^pQ-DûÆA‚‘Ðdš‘r‹O€«/P}J÷Û¾íÛJh[ãw2Å,†Qx§ß§uµaéÁ[Ò\F<—Íȇ -ŒÒ½Ã½ù§¶C™ê2PLåƒo„oTß †öÆÀ¹÷+œ>}ºÚŸ6ô¾÷½¯n&” €ÒÙ`è“Á_ú¥_Z³þKšЧøz Mk#`êýhžCÚ:ÛOøÙo½–€¶6Æ­‰ÝK›…)iß…X.~ªô-_/‡ï([JGœLõaît\SGùèGÿ$ŸþÓtüà ÌùË)æÌŠÍÆS@bÄÒñýÍœ`¼M EH¨è³½Œð‰{dÚÖÊô6%½ kN8PšQþò›c\Uè£KÂ÷Ô£P™rœPJ[ÃO†qØXuyl÷›¦±cp¦"M…™9;މáýØ×Z²‘Œ##›å\Õ µ×l_ð4™ Q¨*m™Ópëp ݨ꛾éZ9sæL­¯8º²z6»1ö7^ æìFDt¹²GC›»>|W…9ˆ WÏ” ávœh%Ï:å*›Åϲ| ï«t¢¡…‰bLÊ^‚.'=Á“'m`sù“K’GЂçÀzdXn(;lŠ M\&¦Ý¸rZÙ~ë·~«Ú -_”BilÔÍ‚ŒôKºJoÊ<_ûÚ×®|õWuþç³f./åcÚVO»Öí_‘¦ŸöÓÐm(òo<ùAa²W‰3AúeØì‘µ{œ<Ð/ðXÊ4cÃÓåAŸüÉŸ\aÊ펞=£¼oûÛKè; €¶ÜøVħÁZ({Úýiç¹ã2”r°o_H½ÔQÀ¸7¯ÿ{§á%ücO`(–ÛÁñš)™^Zr•Z»H!iG>rß}w=ôÀƒwM7^°'fޝ”ÕÿS9%ô…vp-Œ÷­ÛT™ãNµ’åÇ«Š>•oB܈·]—¹J4‰  ÈOÎ0Ûc=‡Šºþºï.“q^RÜKqÜo¤º³a´Fgv$;f§ö²© ƒt¬“«)Ñ09æð¡±K¼È;ÓxŸ°™pΉŒ—d¶, ¦a)ÃÑ/»áÍj0ûŸ¤l6ù„å3?ë3Ëßç|ÝY¯v»må€Ã0xöÕ™ÔëøO;—² quPv»Ê•²¬‡¢¼•5{Kq6ò˜Ú!Bç™zV¡q= 3Å,?4§ 9gošÛº:A*‚̽FÎFéFóŒÑ°ptmØ0ýðnÖÆ>›7)ük¦&på!oFþò"È=xËV|Lés¶k‚µ_›WÇ—p{ÌVð'œ-o˜å×åDlʲý ÚãˆáwÜQ›)âïå x=» .C1€‡ò)çÓÍt™ÕchYëÂí·´Ð>ÀOªÙèðÁc9=s*uSW'Ïž`ϳI“¤u|p5u»zg”=3SÚ¢úc¶Âûš)¦·àœµª~.dÏ5Á‡~èpFu=¯˜Ls\< ¡Ê³“âÃT4?m&çˆÏsrMþ ÄÉó«é`q^…PÌèÊ{äÑÌ»°·qº&6œ&\Œò'®ï‰&ׯõL«^ƒ fiDâÃ*nÿ;ž’wáÍ(oŠ·‘#Aj#ྸȓŸúGCŽÑY/W§Ú‘rØ6j9gþæ7¿¹Î¹cèü1V×ÿØÿXÁGƒ0â\Ý–zzÛeG¯xÅ+V¾üË_žÑÙ{k”èî› üÁüÁº— £ì¨<£T#÷¾õ­%Z 5ì+áÓÍ‘3j}.å¢mì ý®„Ë%á²­¬N‹¸gt&\'kôñ¼Lï ¯Û IððÖÅ E#qBL#.áJКYBkÊ•¶'Žw†ÝSøÞÁ ìùSBÕ%ÃRƒ“­´B€×9… ¥árõո˃Baùë ¿ð f/_ˆC ÃÙ”½Ù/8÷—û¸#ÖîåIÀ÷t>àmÙ ÉPLœ¦ù®ïú®z÷»ß= x´se1ƒvòQŽ%Žø4øQf ‘ú¾÷¾{ßÿÀýf‰ËOØA˜ÜŽi#` ý­”€Þ ¡ºE^?ð?PjÌVøŽV^Áÿ³Ð†ueá;6>òðIg{(ç¢o‰ŸÂ(OEË/°²©Š)p(SaFüŠY©½/ õgbî|C Õ›Nž(%$YnŠ<Ò Ï áU0FÖ“‚Œ@à'gy,Ý|?mùÕˆ/ö(j|ÂsÐÈ$Ëí˜&¼¥K@ªßmÚ ÆšŠª§ŠÑ‘·x›q€,ºµ±‚à W5ĸ·O<øÞ¸ÌÅGWþñ?þǹíï‡3šÿ½ÚŒöìg?«˜óÏÿü¿ËÌÀ‡«Ì´‡%3ëÕ¦{M Óî…£ÇV»ŠZ…˜ªy‰î\®ÍYFÚ¶_ï $S¯è ½Ñ“ŠìSÆ7aÛ%=!Ö “­éu´B³fê„87:÷:½ºòˆ‡ÎÒ‰ÓPñF©°Y•0fø›b'på㱠﫳aД»Ñ;Ù\gëm䉂ksž™³–0\,D€SVìi0à(%˜½ÎïteÁ>-9UbŠßÅBŒ²ºÉ‡Ü6ÈVN› •ƒ ×Öàâ”–™ƒþe~:šÐcR¿‡CÿóÙoa7þ¾“"m¤š{fv̸¤†¼¶FM ðÌ{âV9²k©"îªOöVæšÔ(-šÉîÕ¢âÔ° át´R¢é¾?§î>’}æä‹íŠMt£€øæ}”:¿Âê%?h7¹[”«4Q&Ñ[—®¨ì2ƒþÃ=ÿN( ü°“«~〓Xo]ƒŸn£3n–e]käž”ÆþŽ€©íàhvvÓĤ÷ÛÈaÐo¥‘\«f¯:{mÏÎöÇ3b{þ ž_7âýRî|ÿë9Kn$š¥ÅÌj‰ xf­ßøú…òzô#½fÐxC+—"3pTÅ…w„k*Åza.MzÐ>Á¥Ð)‚ë;Òñ3/Yý¿xÀz).Áµ›ÀuÏ×z½‘2%€ý<âóëtf$›æÜ¾ÆgÙÆUÔ>¼ãk{vü¦„±º3scjB™" žÄé+Ïœ9S£wy«Ë‰·o(Ãh#Gk¹Àæ;_±Û`TÞiÖ™Ûo¿½Fø «§íœaàK ØßÀM‰pŠÁÒ‡{ |—Ńf´§¦/[:Nˆ.”vçSÀŸf?Ê®N?|ׇÝX«.bi´{o&øÕÿå^ÉÎãÇã&˜¶š(!§„׿Aõ¥mÕžÍà0ÚÐÒ\“€FÂq8M„„Y‚Ö²ëU'ûh˜å=7=óYŸòÄ…'.fÚ7GÅ.áJ•Ÿ’´­ x0Ц÷1/ ïÞiTjzÎg³ÅÑììzƒŸÅ‘ÿõŠOéëG¾…ázÆ›ˆ-ÆA(}&"„ÈÅPË¿XwNÛϧ+n¢çºÑy_Ú«ÖÒ N7u×Îh6R  ¾èç\¿ý _÷ª¯ ³^±–kD¹v>"÷×)bȦïZÐ0- „{tô4È ßÆºûÈßf~›ûJÎí^EçÂ)?) Ó#•/;ù•‰£ñ+t&|ò*ˆWÿ–s¿dXøµc ¡<B¹ '"8?æLV”*Ç>#?Ú‹ “ÑÐìÚÚUÎN]”1út¹Å³Ÿýœº¬æ‘ºÒxìÀ&ÌB?66“aÐFáÆäup‚ÂÉð‡9ðÉ{y¥î»ò×#Oi®•!Èä)ÜÆ{·×–à ñåÉ…íbŒé¡ʼn°3nÐaY …5¿å-o©é}Œžaiú› tÅ‘?6ÝÝO‹CÀ†G•2¡NzÞ× )°ÍØ…Ï_Ÿ”vôÍË—¢ãÁÑÈÜ=oÎé_ ´Ä`”î#A–„ÜD7Œzãß8Ïf8fÖ ´)e·ó6@2³Á/?³ÜhFa‚?~Ý/ùS/D£Yìú pdÒùÐ+¤8Dw#Þ—‚ËW›T½0~=Àî%6&1u¨² §+ÕÙ>© ‡ù§­’ùò|ÞôÌ™3Õ™ÒÀÌô#èÅ Í>íåO5<#óJßÐd˜1Û±±È•ÝG¬øëLÒk=ù1Þó/31êêУGWo:uÓt¥¢@¡³U1ùñ"5q˜zÎý³Ÿ)ǘx—Øá¯ŠÚN2th go'€v¦È´È¬œóìÎ6.Òw |b ˆÅåæBÂÀFWýáèáõóãÚ.ßB^'æçû¾>Ꭰ@Ôƒ u[ô›òÐ>å=å< °áe›eÚ«hsÞÝ^×Ϙ¢9mº•m%ÄsÍЊP#Äþ÷|MÑ”7e€Pn„lzü[¾å[JÈò·©ÏæAôµ‰Î;ÛÚ»õåmÙ¥½Þí®—'¡ ¾0§6LíΫNTÔeŒð†aFà·FO ÚÃÏüÌÏÔéëþ–)¾õ[¿µ”´ª¹×@IDAT ¥—îE/zQ-'™¹ H¤ƒ;zˆ?ï–K,9™ @'ñà/ޏmQü§«A?u’=‡)EÜüö‹&hÏĦxdÏÇ‹nÉkíˆMø·"À¯VলV³Ï£* Œ­ÌÖ¾[ÅÜc¿ÖLu²…é^ajÀ†‹;ÓL-˜e7T|Zºcþ=ñç­”›+£ŠðŠ(B@Vìñ]é †P”9¼zò¦Sr‹™YRER'õ,:ñ´L?Òüïà•å¸ÿ*ö¢Ú“ç8Qº#Í×B´à­‚tè~ÚSå¦neY„¬ì6!x%F3[¤LúøÍkÛ^*L~\SL9_ÄT´ÕnÇK÷ÈVëás˜ü¦<«–«mÂ9q'ÿ‘öZþŽöW¿AM)˜AÙAŸáŽçœ7¼Tšíþ O3ížÊwŽOì 3…ŽaŒ.²ÎþŽw¼£À÷­x„·éoõCi0m®ŽÀ¡ €C¨›ªç6 à(ž#u-@á`€©z‚–?ÃÿÉ €7Â>¦ÿÍX—7­+å² ŽFøÊ# |¥÷ÎÀÙl„8„ñáfµý‰ð[µ;ጸÛÁ³"?…Ð-´‰(]g'örõ¾•<´¯c}ÙìøÈ‰´YÂÞI€Vzôïýpü I«×›µ2;E¹ÓÞÕe×mâÕºûÀM+®¼dBP-Î<ƒêºzßGî{è‰ÇÀ‡P"ÿ-›2 ®0Dtyej4¥“¬"õ‘(¼O ÿKãˆ+^) ‰žŽ“€n‹–ŽiÏ9höÆ|†ßÁý(½.ªlCE™=8DvšÓ„ꨗ?÷\}ûT`eƒ¿,JZwV pg”ûeb¢±2½–zÒFR¿«>*væÌ™“Yš:¿ìMŸÔ¥P‚?~I:6R>)ŠÝþ´ÙÍæÀg6# Ãma.„Ú«/\xäÁ‡ú-ßõ±±•â²å(ÒûŒs× ÍT¾¸1¡£×¦ßU¸×b¦y!ôó ѵ¬±fKÀºXðÇûºäA½)‘ÅÞ…\ü–íqDzý™ÂmBð*¼á¿ÿHšMõˆ2eì–CWC°NžR¬'“ILY“{ Ô @_ \#þyf% n³æ±Fû.Ç?_£3®>MçY‹¦‚¶Á¹¦æ¬œ¿xññlÀ¹ó…/<½rñ±G/Òv/†± Cn4ã-?“0eD+ÏP£"K0žXå¨ì°¢(ñ!ô=¾z"š{î!H' ‰FÅÃàa ÄýtŽƒmÂ4¦=ÇÛÇÌï aè®ù›ªlà¿oe¸é¶l5ë®»¶OÊ’s¶JRyŒÖ4UÏN€nξP¯Ÿ:·ë©ƒoh›Ó^£÷¢FP.\Cï˜I/H9møŠŠçÙcÓ¼‚Pf¬Å;Fg=Þ,¤‘¾Q5!m„ÄÍÏF@7îÙeïÌ<n-²)ÿ²»ß—ø\Ê#Í~f LµS2Z …‰ë¸&‚ºôvЬiàÇ´³ô7âìŽí׌ÈÍefèbê7ëÄûÐh¨v»C$ûKnÎÅL> äj¿ý·Mø÷£si/eûDôçþço‰è+Nsã¥y/4Í*¸ÓfÌWJÇz¿ãxaª ^,£JUÜ‚«Ë7gÅ)Ç6RåUêeü(*ŽR,¦ÂŽZM'¾¨n‘pÃvθ4…êT,nÎAÕ˺Ï¢´í¬&´7įòä§:ÐÐTfƒnãw¢Ùdm@îj^¤©ºÐ¾Òh´™©I%dˆçŠ´«Ÿ)£‚1ÖtÝ @í*=LäÆ×ñƧß)E®=Ìt#(ü‚°5 ïøã(  vbBÛ¾¯zÕ«V~á~¡>˜ã¼;ï¼³6×Ucž”íÔy|—þP ¬µò¾è‚3™„:¸Ž²½3Üÿñ?þÇJCq€ÜÀl~X·ñÓ0·õF”=¤€zÊÌMݘ  G-åXvQ—±ýPº}$ßµ(«/~ñ§Ý’»ê€my €コU=ݶú¦È­pmôEBr{y%p+Ë€ù›f²´]ý€Ñ^ÛHpàF¡ù’/ù’òˆÀ¶³Ò€Õ»ï¾ç¾'Ξ}„rõùôêuä+‘ÂÔ#v3•¸‹½d­mxßõ¤•D,i†÷`ßÜÖ©[n^=tØÆÄü/ÒUšƒþ ½Šf Ó¦hÈcéÙ×Ýô,Œò2c,`?Q»ó@+ÿeï<Ó )ÁN¥xøœ•bmˆ(ÞÕÒ+Î8Ò(l Ôzið—nïinÝbX…3ßêU èMŠÊUñêgqÆèš×©ýÓúOëòWßbŠ„±»óÿÊ_ù+õÜ~ûí+_üÅ_\£uÌ"¼-°m²£ðgS§ŠÐ2„¾xÖé¹…w< †;˜eºò¸ñó1A´¥šˆ¢w8Ö|¬–qÒÌÖÛÙ^¤á¦½¸°Ž¦}Ý”¶ìÆ¿å @þK€'#%•òÛ_‰´/…é~qM€&Rp,'í„éwî XK¹‘ï¡>òðïº%Œõ†›G ¥3ïa$ªGë Ä#qD›ÙŒ´–IʯˆXŒ£*Ÿ$@œÜÄ–õž(Y6®G­øûýßópó µ[ú ‘ÙEagº§4ýGx­ °]¿$éznˆç­ž‰^Ü»ªÆèô%îÒFhp…ŒÖÓ1Ês?àMí± P•Ñ2Ï]€ßuÒQê%%/ºL¶÷¦FuOI¦ŠŸ›xí§Ñ [›ð¶vÿ¦7½©>ýkêß&>‚Ûú¿ÒüÇ\£t¼Å¯00¸1`³ ºégÿ è8ÊÁ¿á9ZH (^’iÿþÏÿy}SlŠ8K~·Ÿt¸{÷XÖUêôPf.ÄÞ°:¼û\.… ýh+Ø,9M›[n\*f¤cÚÖ™e9¼_S@çd|¹J!M­ä58ò¢a™úxäCw}ø«»/º ­´%P÷IB> ™g8‹qÖ{~†UgshǪJå›xnÌÝ!Dã¿ 9'ØgÇ:†”–aªx]È}ÎOÀáÂ9¨2Lïå·',$‡ ðøM¯‰ˆëÔ\¦½‚Þx°µ¹ÊcþáègÊè ¯\3 ÁÝnúúÖSy^)õ~†C`”±IÛïsˆVì.CãÎn÷ÆD{þ¦ß©ùP^÷º×Õ-znt€<¦hJ^'äÂÝ,aM¨;`/åb Ë`Hÿe_öeµ_ÀÝ7EÃ>ü};@¾`[rØÌ÷œ7î ´#uÕí)×¢ö…@û^i§kd`f‘nNì‡+áß6¿<³ÿê¤dhüWîç~®Þ{Æ*~e®‰0áVÚ9,tžtªÐ¶ˆ<³‡t®ºÊêÁø€/¥…únPÍ(¢ )[˜ÌXˆ„òò“gbXƒù{f„ðÍ_å=4"xÉÔI> 43ˆN³_vñÃü”_v=Á>³Ç~!°/pá ÿ}~)ЪڢZÂFÞs$¯åë÷* ¸)Õ³ÕOm˜;?›ÌUÂHm„Ñ *ßEÐA Y®;—H ßÑÿ:Ư=3U¦‰0qXý7*—±õ#Bþë¾îëêc7„0!ÞÆ€„€‡à&èðÍ ØÉO‘ðN)øÆoüƕ׼æ553ðÆ7¾±6 J/³Üøš†‡ÿïÿ}í%ø¶oû¶Z °g¼Í ¹q¹a_ŸP_ê-÷=3s½ßu¨=Q2íÓ^Ó¦\ <Œ›"Ð3¤£Gç«GZ¦—6··…8­xúÓŠ€Nåì-3!\S+AÖ2À‘{ï»ï=çΟwûRæäS2³g;?†cUÔbÇ÷ó{ˆÒáÙüÉT‚I LqfE!é=ü=}ÞéöÇn´àZŠH!Î=m²Ý¨A8´C?õ´4›ß—a{çî|Gý6ÜM¨´÷UÙÕVGƒ2_AØ-ðB5@ Þ³GÌK ÷$³%À«uCt³÷$H_3I³U²Í`ð]=â5¦è¹›!bä6â?>Üc´Ž/™9pY™/í9!@pS¾ò+¿²> ,«~í÷ˆßŸvóCƉÆÑg› åc Hò1ñ£¾ÂÛjÔŸz½˜¥£³êŸŸ°ý2_m…eÒùùcqí·àï‘¿Y€ €öÅhoŒ=Lã{Í…atw> TéteOÄ®}w}èCwŸ?î1ŸRÍœ|¸d*bÉYÐ>©j$_îüÔûð«Œâ¥Žðð”?éÊTÎý¾šÀ)÷©à¾O¿³ ¯F¤lòc¦eïSÖ»Û”öDǦ管o@Ѫ‘™)·ýô—Æœ€m³òº4ÁÎ| Ø’nñèX>~ú‘gú‹6½^îëÃð¦éÐ¨ØøEs4zwÝî×|Í×Ôè]|û>õS?uþ¢ŸÛþŒ¨, HóŸþÓªÂy'ì·¯àÌ™3ÎM™p\ÐÕÁ_ú¥_ZyÊ -›ž×…n`ñdH]ÕFÀŒþçn‰ˆ¤1‹3É«'Kºã0í#íp•r™<Ýœ6{"m˜ìv §þ[ àï~‚R’¦ðu 5wT{7»ÅÜr]?¦Ù„Œ)v©/‡Bìûì±?¢d_Î*Êååäf«˜Òà>BÖM1$±Æß˜<;–¼'iló_ÄZ®!ŽÊ¨¯Ž¹gv ûÂ[…Œ‚ïð}„Ñ+ªÇ”»3ÝDÛöÞ{ ¹ÜêñöÔ(Ñ(›ú¾Û×ȦJ¼ûg0i—ŠPÅà™'ÿõZ?»ÏjGfâêzqÔÛ„tùOp×ûìØQÎû–ˆÐ¶^O0øÐ·ùŒœ9s¦¾Ü—5ÓyÓ_OŸú0EÁÔïwÜQøÙ H°3ö€ád …Ž7Ûw`@~–0aÊ„eW3Ú× sýS …<;BôÐGîûHüõˆ}1g6Á»ßßeTÇsÊÄE@½ гlÊ€g>ݾ(¡›Í5›hDhPŒM9ŒBÆ þ‘“Ñ|G9xðî{îý£ãùêÅ ¾ 0ЮÝñb—ÐN’üWÉqê ˆ|Ã.çÿî{ßKbM£þtÚÕã!Ú8 °˜X{aˆ—abçä@˜ruXûïEŽ{ cʼn‰-h¼ÇYmG ×ßAÅIÙmG/Ê”g-åQyªnÊs„tŒå1²­—e”¤! ëˆ;ÍeÒUÁ‰ú¡`ƒÈkLñsä}<ÂÒ1-îëÙÀïiþc¤o„eÝžqs w=aM ›Rµ‰Ï@Ìg}Ög­¼ûÝï.·´fŒì zy<ÿùϯ="y¹QÐÅà ÔÚt]ò{SÖÕ,ä¨#¹±›LÒ•;?K8ü¯g31ô|œ>}ºP5UOøþ>anïàÎÜÈøp;0Un3 Òõ¬4-ä;Ÿ†+}OÇrß0×?ôÕªÇÇ(sÇÎ>q¶>T¼bŸÐí¦fÖn½õ–•Oû´ÿêÖdÑxب¿ŸVz „Âk j¹É²¸Ø²Í]s ™9-ŠfÌL~ÅCRøÚ˜£4¿IG­)¡øæÄ­«T•RZŽÁ~úw;Ч(ÏhEìɃßÌÏú> ¼gKð¨ü’I3ÊšB÷Òfén¿ëÀ^`XØh”å—Ÿ:^™·ý@}™ï¨µ;ùVÅíqº,S{’ƒzbæügÇð¿ª_i7¥§æ•'Ë ÖŒÃUAއțÍë:-tQBþ9öä¿(H|ˆ101B7C€aºLE˜i~£wûr%lMç[÷·Ëßg„ÍdŠ×_9¥@è+¶«Ï-Ø”ÕÊBõ¥„Ý0×?ȦÔךÔE\{ø‘‡d#à”oÉÆç>÷9õ·Àg{z) FÿyŸí‹13Åt/wù\ƒŸ.d¬›¹mË—µ˜t°¹7äJ@3«é4ºvábv4Œ›HðŽÄ= ©¹Uy`^ù›Ü`ÏÎJœÈs<¡âO&á9s¸zó©[¢s´çnl,S~±1ü`‡kF£ü¯Ï˜®?ƒ&ƒ0ÚW—coq/13`'ƒZçïÌæ gÇUf-Ýô¨–ÉÝà°Q¾«|™èÇZŸ>¯Ö¹_Ä» [x7)Tm´ÉRWSf´Ñ©Á9®.Ð ?Ö¼0IBßt?cäNx3”€Ñç£*%øÍÉ›!dþÍ¿ù7eÿäOþdíȦæ•߸ߍÇé<Î gΜYyç;ßYïò“ï’??×5¢Ì­ª»´C–t¸{Z½…í^ÜÈÊÚ¯RZ8Å”àï­Ì @Ò``n,Fö¯þÕ¿ZùÀ>P ¬Y)íN¢knº,§&‚”… wñRކØ÷ž=w.:ü¢Ú˜~ü3”3RFƒ¿›ÞÅ €1²Š¥r-’t:qn:y"w=-e´9RÅÜæÏH›ì&3cyCöïðëÇnÔØE«BÍ[‡ì® z×(yÔßÈmùWA°«•פœúØ}ùFVõ;e÷vXÓË(Ôõñ;“&mzi÷š¾[vüD¹1ßýôk ܈ÜÚ=ã£A?ôC?T³„¼u~›øþþßÿû%ø-YÚõÿÓ?ýÓµÁïßþÛ[rÇ€‘Ö/ÿò/¯üÄOüDm´ùŠÂ`V€°øñÿñ:rˆ Ësw|eGE¾‘h˜„±vp8{À.åÃåÒ>äE´€Ó§Og²üäñ(•.:’°ý“ç­7[B5ØÖþ–fãÛ2äÝÝú{Û“6U¢=îs ¿9èž{ï»÷3Sð¢³O<á–ÀHe:‘48VÁÙÄ™&þn5fea$)æ¶' 'Nœ¬½ ©ìxu¢í§rã¬ÁÔ‚Î>F¸è$S‚ 2Lrr.Æž:fÒMĉ5\£wŸ€Ö¼‘4@ëö=u4e0å¾ãì:ýPÄ™”¾bǘ=®‰c´Í‘5_}$¯E"ÞМÚ>F´Wµôµ6ÍÌö zgø­÷»À}„¹¼iû7¼á +ßþíß¾ò-ßò-µ,ð³?û³+ßÿýß_#*Ìõ§~ê§J¸;%€W8`ö€ Û€í¯ýµúð™eþ½ìy­ép#ÿ«£€vc#à¹ÔãQ¡úÆUɈíçÙ°‡L:q8VÝÀ——3½þßJÀ¼ @yˆ [{ßûÞW³[àh›×|´Vòò—¿U×2PÔÈc# aüÄ÷?ðácј³,`/@ö@y’ÀTò¢@œFý:e1²æðSM…¹î0¹ÄAô›Nœ8tâø¸Ó[ú©â;哨ƒŽøp™FSpy’T×cP ÿ™8U”u2ï5Â:Ö¤]´(no‰Â®²UêQ5®ÅóÂkçÙLÅPõ­5t9vtoS*'¿rOeÅs(DbŒ¶+žÈÎëSÁ,û5¡L¨»ð¯xEN`í» ÈìÀK^ò’•¿õ·þV…þª#ŸôIŸTµ~†¿#€½½îÀïÀ43€·qß0;èúRïw}è®cf®¹÷Ó#òˆ¢z1GHå(©ÝCP£ÿàd0ßO+ñ'´Á˜Õ·¾õ­ìyyk±®¬¶ÿ£³0“Ågš×ظzÿgoj0ñê:ãGʥѩ†.·‰s-™Ù`Ò‰©0?:èM;Ù̇ ™M%™ õ±Òçƒp¡N0€)Á\C³!xÔCÑm·8Qµ»h!U²WÉw<ñHåÏxö#tžqØqfë¹ìkÂ2(+F÷•*Rp¤´LžUžEQö&ûë ~C(Ûô× zË[ÞR#~Sý„6æk&À™~ËÖ~ê'^U þE×Cè[÷ï+…1aü„á¦TÜX¸ÀPH]×€=üÐÅ(vŽ«Söª íܶ’P<´1m& ¦Í'fú@Û”€VfùÞí4a8Ïa[ìq$Zv>d¸&S!uŽ„ŠeÀÊÞÿ;Ù“V;Á]‚ ÅšØV]ªÄ]Æ)÷$ð§€5g:óW’}T¬Õt`7+ò¤¦#ŽdÛË”l™ûMA×…µ(ã <¬ :!»ÄFsù e,o•¥ G]î>»YYS‰ä8ƒn¿Ùc»Žæ†Ø3ú“/Á_elï8³ Ùìð¥3T¯ã|¡MÍ’¿RŽe`\Ž‘O+f;ÌõzN¦έøxÏÛßþöš²ï {„ú6,S¤1Чöᾋ~ax_ë4â-‚ë™67pÛH¥ÜŠr¸š#£ eõ».o6¦Ù‹7m'ŠÆ*%ó¶Ûn³ðXò$ìÝØ£ÿVø[– !¥í£ûÑýÑù:kðD¾. â1É„¸T=AÔ ÀÑhß÷dºåž„}\üp¦!³-ÌibgÅÒ1Ü‚Pņ¡å¯ÞÅ—œïdʼOóð¬é؇–[qÀŒJ‘4àòÉÛÚà—ÐëÂlÀÍ‚Uù¥ -Ëç†È{‰þÈ©~›v î*[‰S€‚­ÎËÄÿyk¿)èª-é+ƒzÊguønó) »ü¸ôLW‘º:DüõŸ >pŸê>ôÒÃF¿ÚeÖ#É«¼)7ÁþU_õUµá·‰íôèžÀg(ü&nT67¿¥Y†o[Æ»á¾þ)@¨÷ì÷8š½ç ^ù©ãýPÀÕöL~[rxñ‹?íæä,Ê@)¡X-ÄöÞÏÆ˜{ZÀisI„8h»;‡j0’(Š ÎãP>tÿþÑÑ|1~çQ&þ„› îUéëÈØòsKœffC”cn*I1ÁáÂ'æ[G§˜Œ èȉ‰Ž­TöƒY6}‹÷OÑÜÍ/³ï5sTiª~)v½{áÖð*hF-,ÁV•ß2›eŒ¥ÿöÝ£zÀ©šNUïfå>µÑ=/ÍáRŸí—`c*~òY8S–Ñ©ÜÓ{—¢úáu„þScKpÊL@ãEFó=?#/nÊÑ{ÛF÷7ú–¤|Êz¶, ì³ôD¿+p˲ý(|&jàÔ©“‡o¾ù–Éwþ4pò#ø{ Fþyg½bMuŠÀ’÷ëFб˜W½êUŦ€Ízl\Í4ÆGóià{Ž) ”iŠí¦|Ÿœ,¦‹V/<&ƒÍ(mW€„I2Ã'^¾=”éºCÇçâšâ{Bk͸‰;ÆÐâLx çuû[%)ôƒ9üË#?sÙ¦²îE ö«j"~ClîE`¬ãÛ®jû%áFÝïIN“v7“i¢a©6å–»Âå¥Ù“Œ¯Èæ|‹ðœpÊ;ÚŒz‡ë;íà†Éùã|BÞ€ÝB^?gö“Ñß ÿõCe=ëßêŸ,ð0ùÈýGã®FÑmc?°[øÀoçîÅ8[Š•ÕÏx[$É ¡õºXžÓlÕ˜ þýuÞÉ'D§á?>n™-ò‘ha¤fF>ÃÑ®ç(iÓd–U<öõ"k~™Éh/ó+uVµ{Vhøä}ïŒr xUy6ü¡sÚË<æ6íu"'Að1ºŸ {à¦ÞUHÙÛýtˆÖ£}kø½aïéPîeП y2iök¹n-ò wò›—«óU·G ÁUm( ÀùóÖ2à8Ÿ€OöQ ‚Ò³äðŸxMM zµ¶ñÙŸýÙ+Ÿû¹Ÿ[Ç2íž2×aœªüþ÷à³ÚvFþ׈nReâ`"EõWÅ÷ÓÏ¢È6Þ§Ø‹8fŽ>’€ÖÿÆ&Á6Ř\Íø—^ë¡|¯K{‚ò³…×%qvìàEóØ•ª·ßŽVÂ.ÀÕ{Ú!W~»»1õ p8š~ÕŽmi*䯴üÃÂRû¬tÙô^ø ÷˜ ØP€ÆöúÍÓíÑÿõ‹å Ì®†-w¤!X=„¼‡›wê|ÍÒ/ÙäIÓïu³^Îà_t"$=ÿøÅŸöâ'ù©ûÚ‰àxæž ·ÚH“í¦ÕáS»l¸ßô¦7޵95×ÜL…*€vb-£bÕ“86ºÿþÜ“êr·á‰!ï«,¢§h¢æ]’Þõê-ø±Ê³ÞCÇØ1FFâ îð™l#È<õM~d ׆•¶›ý±aàLì… ÞûûD£9›8&*ÎyÏa;¤á”¾ÚD×qÙ;„w¹dHíöƒšÉ\þÂf³ÛÍ€vèè¶ ©bÚzP+% Ê²v­1ÞaAo$»AmS€¬a¦=aZr†‡Iÿ¨ý«¤Fÿžø_ŒÀ}KN…Üæ"©È+kíÛÆe§á§?ûg_b `Þ˜¼7Ô¹`«NÞ¸9Â*½®õ¹€b³‡éŒØ&Cã¡ÜüÐÃÿI>ÀpÇÑcG^’ ÎgSä‘’ßIŒôœ*|ÙžþbÑShbU°‚8þñ,ƒd%$5ˆ,ïœÊI_#,"‚ŸŠn[pįO3•U1‹Î¦£(ûŒr2‰©Z˜h·[B5äÀFÿ)‘ŨŽWìâG¿®¼òS0GfÕF¼k?Ð÷¯¢…íÜ ›>|÷ˆA´½¢ÒU w#ê ì3ðêzxA¶ þÇ;ö#èkcÝ4ú7ò¿˜Od ºš _ð‚<‘¯@ ¿˜ËžVO<•»áŽË`õpÿ­y2ÙØÜaÿ %å ~¥ÀÜrË-™ 8z<ù“ã›×ÿ QÑ/䨽LQƒíëN‚e^óš×¬¹[{ª¼‹)xœk.[X}(Ÿàz衇?òüç?oåñÇ_;’ý>Ý«ŒÍ„ëKóSüÒŠS/#§gâ‚ȼý„döXHƒ8t4 MO]7C™~âókXq]{Si4 íx¢•©ðß¼e#¯"VòaW>ÐHíÈZýå*@)z2jqGà·Lõ‰€åù LªX|gGE9ÀŸ‰"i€ÈÜF]7Ju«_…M>s¼‘¶ÓܰoPàc- á:ɉ²É ~ 8ÂÒ«8ð®Ã­Ñ/"nèÅLã?žçP„û…Oø„O8¡"í¸qïpFý7eúÿDà6#à¡(ôqºøûÀÜ›d¶ŸF9ä§ùÅñ|òT®÷­3ª· áÛϬÄ¿–/Ü?‘k­-¬½ò•¯¼¾fšp=œÛ‹­ÂHúó?üÐï}Â'¼à¿)7}.¨þœD3 š¨fvy©÷ü,¤v%™˜æ\#šµÿcÇêæ®‹Ù9yøH–Yj“iðý~-íQ˜`0;ÖÝiDPÝð²[¤§üš¾•+:ïîH?AÏËTã)‹vb©&ÿå¯Þ‡{¤Ùñï”Ùœ§2Í~ãeC>•ÿŽsÛ}¢yP Ã9ѨéQ¸çG›ïH×çÝ—ú„§0Z| »Ý «‘wb ú¼ô%ìMqÛåÎŽqŠl-G7/dÿD.q:ûlFököÇ]áà0AŸQ½®SÓÿ½àxyÅ®áS~Ûº$®ìÁ²“)ÛÅ|àP–!NRbަ¬}ÀáõÎÎqG‡!J‡–PŽkù3pÊF6Z0/}éKWNŸ>½rçw*ìZ VCüÄÓ .üéþô÷^òé/©¸Ê–‰œ¸KÓ‹0ñ¸*êK<‰«v'¿zÇË_H'øPëȱ#«Ùy¹öÀ÷Ç/K•çˆw]þòÁ¬å€e~Ø ¼ofÎxÐ5y©‡± µ¶£ìÖ”¸„~Üo˜|ÕᎠoLÕjn“ é½áÂ#/ýºÃÜö0YxÐÚ^Ùy`9úC|f„'Çü¾‡¨Üuƒ;¤9нíTpÕZ ?B8¦„½ðÔqÐ>gÆö|¦íÏFH‰ ?Ay(îcñ;œ°Èù#Fõµ™®Gö=ª\~ðɳÚr‰r! ny‹s­ ¢ÈØœFp¶ðo»•Äò@´öÏÿüÏב{‘® £0ˆijÃ5›™ÚX**ßcÀÊ=÷ÜûáÇàcA'ÅéZ x¥®²‚yH\ˆ­1E©Ú_²ÀÎS‘5ïÉèÐá(7“9×½i‡R Ú Ü¡{[Œý ÛŽ«óS´ÜY¾%ȺšUPUâ—§P^”¤ò@2~JÖU¾ƒ6c±]Ç#¯|ÚwÔè´›#6˜ƒFÿF~7(p Œþ5oÌ«Q6!ï k¯&a[š| °“Æôý¹çÕŒàÏæ1u”°ÏôýáÈcøG3…,pêÊFÛ®ùŸ§ö$^g'¬f ,]Ç]aBméu`îFô3>ã3ný™ŸùÓþ¦û—'6¯ÿ—€Ž‰·öž÷¼§p½n€¦\U%m2½ðÄC=xÇ£=úþLÅR6Ú#`f°ëj.ƒ Žß¥ÝS‚£œrêH±9ñÊZ;ØêÉ“§j½gd5¥¹Ž¬¯F=B Ýî_ùNtØ _ É?&!v›ý$ŒeSÊݲ4]Y;µu´ˆ¦Å ðëÖO:wöÜÅŒÎi7Í\Ôáð;F‘S#ŒÇu²£Þ†Ô,±_£§ìñÐ@rÀ¡L]ó©ŸÆ¸ífõÞ¹GIüŽ2Oõ¾_?•o Ë‘kåÓˆµ½“̧UœàŒzÀÊkƒÖ±ƒL¦<ªEÄ=e3rz›=w/’À+U:jU{œÜ“Ÿ¶œ1K!_¨¶½ÔÏ^`qÆ l‹-PÛÆÇ·ÕÔýàýÎçscݹìp·)ï‰Lq»’ùð´9ïXýñLệßh÷¤4=…oTÏÈ+OÍ à×që6%äáÓ8µ¬Á•ôÁ?|¯Ÿ_¸Â?å¯k}C£ãÙ¬xâþûïw%po¤õ ÙXG¥ ­V3s²ò»¿û»+6Ú_w @WÎt€ŠTy8˜'£}G .<þè£üásžû¬Ï<»v¶õ%&ö˜x “dÃj˜±±¹'ŽÙ±¦4"I§±D u¸Ï?†þã~pá×Ҕ웊Uü¿‹XÅËϲ˜{èD¶¦ßzV˜'÷3ïò^UôRÈ­g¸CàP0:“Iˆ‚&¨áwqv˜Ëž$ eÁË üf¿ÐeÌ]LHÃO2¾ä.Oæ×mc×yú¸Ýľ³vÁÓ£úIðºMï\úù<‡"èÏÈþPÖèd½þ|F¶Ç£œ4ê9ÜJ»GõòÉSB?ް¯î\Ú.a¹• W"i? ZÃ-B§#™) Ö‘øõÈ¿Gÿ5õ¯¸y¸/PŠÌŽDŽ] í„ùôOÿôúúVLY)oÅŽ)™£¹xöƒúàïœ9sæËÕ0ÆWÜ.Öz•z!4†_Ûó[W~qÉ‚€øµ3”ö_ )sLõ¹ÏÞ ¥kÛˆ‚è\Ž”UáóS¥&(™É/{ù+ot™`ʯò_æÑK¿íºGZð«ˆõšŸá½noÜæxà ç˜~¾žá"p8¯‡ßB"…û¤åut‘K*áz@ùO h_£é:ƒÁô¨>Åç+œ°·ŸàM|Bz-ÇÏlÈ»au(ÓøçÛÑ{‚ÿ‚óìôµk¼‡'i ¸æµ`ÈK“Œwèþ©&è¯ÔdÔE豚i û¶ z3f&x–Ò‹I¼óïÌvöëĨX†&GS|ñ‹_¼òÉŸüÉ+¿ýÛ¿]w§Qà{QjûýÅ»?|÷‡gæ?M,:AÒ–ôaÀ)žŸ ìð„I<Š·×Äø9™ø (q"¯\ȱ¿ãÇ:uó)yWC¬¸üSÌ¿~d<—z ÂÆ€Óð%EÚ34“YÑ6y•¢‹¹îó)‰ßè«Lg@o»Íao€¿µÏ£&à;ÃÝfµéº¤ñ®75Ptm ³ê:é÷ö l‡›û°þÜ}:a5ÒÆ›'>­+Î;è êIøÖè2#zGíÖ\¤“©û'2M},Íz>¬t,üx`’¦gLßÛ…3 z_žò .ò,œ¤[àÆ»Ì„[¿>¥m´ ÍÖBOù1jŽ×˜zS`+U_‰3Óq~åW~åú›€XWd¯é𛌆`¡çXîú£'ΞýHîgxv.ê)™T¬°Š8•trKÛÎÁò½ŸöŸàÏ–ðjr锈¾êáælŒÂ!Ùå’Î0öÃAìBhˆ‚õÒ ™Õïû‘ó³K]YM/»ÌVò)® $y\ ©GáªÌ»)Ùz>S6å1h¹kà»AìÉÒΊ <Ñbà^îJwCä?ùn„]Jüµ(»Ýñ×#j휀ÉÓ#ìy>aŸø„ôÇã2ŠÜrmÖéWs7½My'¸3Ú72%èo ܺiÏÈ^zB_žò“OìZÓ65ÓyVœI±¨8ÛHsÄX¡Ã3žQ{Äß6áïA¨~l&œ™”ëffS£¨Bó{Å+^±öþÑ?Êe|u´vû§A8 xâ®»îú`¦‡ÈEMϾpþBvç¯fQ¾Øø\@0g31{ï—D౉±–FQ‰GlïðË7˜ƒN. ¸bìDFŽ%Z@LeØ/\F–K±#§d:ÑezkÔ¶ºW‘&ØyŸ´¹QNt´©ÈÛ‡»ELp ~ó7|ö,ƒ-òÜ™×D„$åžE„uZæ)ˆð©SÜåx#ÕS„>Ål¶¶aTŸ÷e¸-¤ÙáuFõvá;sþX„û¡LßÙŸ‹ûD„ÿa·èE˜ §)þMÈ÷2?àñÍ陚o ± 7øm%ì“Nòf   ºøbe´Œ|¸Ñ·Ë¾ðœÚ`Q&¯£#Þît”ù{EnÍGÃ?ç‘6¦CØÎ£rÂZÜ ºµ[‹@_ËHþqò"ì×"ì/dDS¦õe~¢Õ÷ç+´£ûÎ7á­\¬N£za5²WFyu\¸´YºÛï†})švìÐz%_&tÝ¡z] ~„mâ¶½e캚hìйí¶ÛÊÎR@««³øÑN»û®»~óÏûøÛŸxâñ48êÉÍLS™E¬¶5;&jÌ_l È KÄb•K<Û¿r÷qÚºþ÷Øñã+7¸iÍò^\ä9GßäÖq+”[Àw?LÃè"»ASŽA¦þÝ^ö°):¥j8 ü‚5YÜSÐw'VCÐø­Ïï$£½M´ëH_ V{Ne’ *ua ã.âÞbpÚÇ–‚ºhž ;ðÅiaoDkqÏeT_ÂÞüûcÙ…!ôV²)ïDž›l.#TlAß·åÉGžxàįã¥E¦íNÂ^ÞýtXEÈÏæ÷ö¿a_™h‡®ho–Å^€¤ê+‰UÂæ§€JÃPÖbÖ~ó7óúRºQX[ÒàþÒ_úKµðŽ;îШ] q ÀŸÏè®ÝõÒ?÷ÒÄ 1B” Õ i°Ì¸¼l0ÃC,L¶b¶œX¨˜°I1@6m›°n«'O\¹?W—vëÞˆKòdoͨºd×ñRÙNνͬ ,?/ë#ýnDCEÝÁOã̳í¹x[%™ÅeàV]WÇQ¤ªýMEØãÌ·Bh»~S{š›eÒipcÚövÁÞˆ÷±Kîwmcþyj¤¾É”Pˆ®Å´ÐŽÿE;ð3ªwdÌ—íÎFØû²ÝùŒîEÐ;nw*³š6ŽÕZ?>KØO;ð;8x^e–& —~PVž \–fóû2ì†{çPæk÷Þ{o]€Ðm£íMçJ‘.qìÓ¸>— KSÙ´°x^Wà#=ôЦ±žÍ Á±4El}nzQ ò¾.›¦—þ .Rå%ÿñÌrJ3ØY™HT—EfŒ®1i qí«%›‘_½Àª1Ü[\ÔœdNѨ~f!´“'uk$ ¸i1è½`—qƒçU¼xÁ57a>ÓkÌžTMï¯ÕD-ü0ÓjÁ<øL¤®æ˜÷š@f„÷ß§0ðfâ8ZžÕ+j5‚iD>Æ6þâ\´ß¹ú¬ÏŸÏ¦¼þ²ÝùLéŽ"pÜÆ¼ñCᛕ–°Çc{¾ü(lƒù5.W¿Cfi¤¹aöŸè¬Þ ”?øÁ]¸ûî»kHŸ61,™Ã·tê.õ_3Ø/|á ¯¯¤ƒ DMS(àí·ß¾’Ošf2PJA à)üIÃ}àÈ‘£Ÿ²×&AýÛâq½AF¾ @ÆóÂXá:›Î7"ðáW¡÷«É•_´æÚ˜\G”Š·7?UÀõ\ ÁÂißáëy·y7Ô.ñ(suôe 'Á´ÓÜjDxEÏüv®“ÇNÁn‘.™TfëAPŸ2žó_v°®A¶Rœ´áaÔAù)ÏWón€d’ä¨û ØŒºï4/€‚"†¾úQñœª IH)pãÏ[qxåÆú[²ÑÐ[fÂKjC¸IÆà–±„$îÀk$vÒ7ͯíaMÜi¨4èÄšÓœ»+ñ7Â)qRt‘ JÙ õ¾æáàñ^-ÓÛòL€cð)™HßùÒö{¥ï¶Ê äÒÀìSj¾¹~ï±åw•5˜ìÀ_÷Ò}û.›ð6°÷Ø”·`÷½Ÿ±u Eଞê~4}ÆÖþ³WOU°O^[ÊOâ-“vñ‹lS¾Úä½ë¸rÀ»o,ãÿç¿ÿ÷׋UðêEÊì€òtЃ+’½Gê€eí&vëÆç>÷¹Ûw`ÃÐ0Ê=F£Ý ºÀ‘íë/¿øòÿ¾÷Ó÷~n—븨´R¿3oЍ^vþ Bhú—øFK>Í0'4 "C•†é晓§Næ*EGÏfê-3Šì‘¬é"È-䑤¬\08–ÍyíÆ¼ä[ò/9<(›·Å´ì£\±šN¦˜ø¡4eʳÁ7ÃéÖÅíº¥ì˼AÊY¦¸LA!ßý½­r@EÙ}ÀªMØ5Çß訣ì÷ööYÊ­ÝóÜg²ï,œåû=ÞÑïÞwá¾­ðá›|äÃ|Æö¾-f÷|Ž|“þfúŒ­«¤ö‹½1ÏL¡[ ?ðŽíÀ7LÙ|Tö«Ê}Õ/þ]s{å€åæ@Ï÷þ¬ð¬}õ«_Ýý¿ú?^EÊC¾Ø£|cã~ËAðîTrÁÞmw  +"JY‹ŸþéŸ^üÝ¿ûwž{î¹Tn3ã7Ÿ] Øq#àg¿ûÿX¼îç!éByKI&~{UÝmëÄmwPgðÄæ'ð‚e`@ÃáíçhqêäɧOŸY\¹r…å³qú@¢7k¥DUyAl’mrÜ,‡Ä¿FRȇ]2¦Ñ-ãèˆbÆpJV3hû&S6£#.ƒp`¿EŒnJNd˜–BŠR¡#È"k¾1h‰¸S¾Ý²ßTÂSF.e¯Bµ 3Þ”=þžaç]»³µ1‰9¤÷µ¸¸Ëòýþ}/l~ô#Ýýð‡>¼qÏ…{ùºÝ=[Üo²µ¾v"à+»{ôï»»; ËWòN’äëÀA[CXó~‡u!¬ú~×¾=s êßúåâë‘ß¾ÓfeüE^é\EîR·¼Fѽq>=p¥|¾å ,F·Ý …•< u¤;3&b6`âÖ_}åÕo¨¬©ÿõ]Õ«V”¸«_åw‚ö Sg;pY€(UXQŒj£ësgÏÝ¥ëŠ%×¥ÒiE$0!:Þ»IVQèLi ±&mž·û½s™a§:Í1h%ë\±‰:½Y3^7æì¼H:Í Ó¬±¼“þª®‚ã‰Qó4Ïðçà»îÛ<,SËÎÇž~/îq€{íŸü“ò¯þ꯾„.Ú¡®½Ir®ò8ðÙáéÀ|`w”×èØ¹nÿ¶˜pKb‹ïû¾ï˽Å$ÖŠn"°LØæSO?õÝ+¼“?ÏKy7µ©³qšx~Wv½9ß?zÚôÇâH„ê d2Ÿå3Þ¿œ;^¬›3¡ «0„”3AÜ­ºnŽø;Çn–#éfF~3¼ÍcÉ$Ë$,“˜ÈÂĹÂßYÌkB›dɭ„ÅRøÐÔÃ#_°i1fµ‰”ÏSÛqIÐÍ”´îšËË n»žIÙ–Náè€wít?*]û(qé›öÙe¿ïÇn˜Õûe»µû/Þ¿î—íî»xß©³|ÆÖ{Ûùt9Êþà4/lÜ`ºà:ó,áà †Ìèé[Ö}kGø«6`Q+frëêŽW°NÆ]û6ÏySÔQç¢ôõ[¿xRÝ|ÎJøÁ?ý§ÿôåÿößþÛ ¶ {´~^Çí` ΜՓNš§Êí€Bó'ÿ䟼=vãó’Íâ÷ÿþßć üޱ7ðõf¶õÒK/½²»¿÷ ß–8þgWm§zR#§ôÀ´-þ&3œB§|±Ùè…pñ%oÃl©¥AûMjDUít 1Þ›†˜],*ÿ‰Nß­÷„5%¤°íXÌœßÇ¢RÔ¤O~4A `Jä{’ô‘:§Cv0)7Ñ*S¿Ù¿#±÷=°óEFC"…Õ˜'õ_¥žúgÀÀÓy×¼o9Ðo÷52jeÝÕÌÎwšÕYv.ÑabÂWìøŒí‡üŒí‡×ï¿tñö»òOñ®þÌÉ­Sö ë.ßç¡#¿ú&³zû®Ø·­Û»É.Ko5Iä`>_U™½\Uª ‰2äŒ}÷çÎÊ®s-µÕÌ:0«n©­ô…ûªˆЭ½qåÅþ¿ÿóÕ÷ËÿîÅ'¿õäkèž«ŒC‰9@IDATà]V?*½Ы׬Ìå¸mW̤Η=43Áq™°õÝ˯¼rù×iˆŸàê)­ll[Ïh2‰_!£“ÎjX"¥ãˆÂ@)º ¼\ „í…C®œ9}ÚïY/v÷vSB×a&E¥ˆc?YöïuP{ï¨I²£ðGŰ÷NlŽÙé/{*'¼.Å÷@ãæ˜tNA3BϨ¥LV°âKûþ¸e¨d3{8ËJu\²¨!ÊTn®ŠÞÝßkrÀú˜ìƶ­úÐñfVU%`Ô¾“ŽVôàùµµ]–íï¹÷žûÈǶ/=piëâý÷¯}èÒ‡é˜7OÚ:·±¹é5¡\ÊÂWñjfe—¾˜ÎƒþÂå{ÿÀ£¸í,²=5Ÿ›DSAR«‡ìK·Øe&GîÚ·qtXåWeç öÜŒ:—UíÆgëäÖÚ©“§2ðä›7‡¿þë¿~õ?ý§ÿtå+_ùÊk(ý«Ô]gþ*~O¼ÂãF@ýóU_d@]ö›y‡NZÙ4zä×vò'òöÜ`Õðþ,öÏýÜÏ-þá?ü‡GžaµQŽÌʧ'ÙÈð¦úÄw|Â3®‡ë¼#ɾ£Ò²Bj4¼=[âL~µMþ €´_Ùѳ p%¿,ß¹3ÓN£å–ó;™Øë÷,°y½/ ÀÞ¥LÖ*F4,,—(ø=;:.iÉP&þ‘ y…P#½gªÇmV¥l°‹“ µùÜýcÌnØ£,š²•ªZʽƒ’ÀNR’ÄÍúp×ÜtØ7øØOHÌ6i§:ÚæØ §’Þ_Ûf”Ø(i:Æ _7îxêÈÏØ~ô#|ÆöûOÞwßE–ò/rûçé-øVŽÓÖÝÁ¯òÞÙÞá.vú¥ (X„ïë}]O9C?- ÞœéGª ­ÁÀ1Õ%Vl—hµ Àê> À]s›åÀÐE‘jÔ±¸çʾë¤{ÙpkR}Ý£¢ïMœÂ=ž÷Ø£íùË_Þæœþ›ýáígŸ{ö ôË4÷PþWq;ËŸøôÀ•_ôfÀÞè 77êZÏqßž?ftŒÊ…Û2Ò:ÈpG7G¯½úê##óYKÓØùÆqÍO‡KBh #+j”Mµ½%öÀ¬ZñæÆúÚ™Óg_~ùåŠ §TC^þBÉV/3¬òܺßâYi0Qºª3±Û»E|BtžŽâz,}7ÉjtåJÏ3ÔgøÆû¾åß{»Ó;¤3cGåKˆÂëHî[/—y?Jæ–ÿ½¥òvò³ÔŒÎ4¯íì+xTôNyrl×NÕeU`Þ–—ÏØ2‹÷3¶'Pð‹<_¶;yß… ¹[;yrk‹…DÖð9Tí¦< ÎîwwéOaË.l§*ý5'Õé¤Q'=ˆã»#UôWÕÈfÏÔãJCå­nëG½Ÿµµvýh»ðîþ~P9`]k3ôMê›nÃû¡ÎẅHëê ^gSÿRœ†Y/Ÿxâ‰}n´=ÀÞ{衇®òŽï7~ã7®r ó64=Ö·OˆîPÝè磂w¦ß3ÿ8(.N¿Èq@èd€ƒ÷Õýëý¯“˜;â€ÇfšÅã?ž §1Gx6žzê釨9»Çè|³Þh;fuµ«%`ø£q§™…Ú7Ï0âwž(" š?6¬ñHïb$@DùL´Úµ¼ ‘ .žÆLž˜áW¾¡X´*fjqÐë|îtMöõsIv%þWÚÉø¢µÌ²áZ®ŸÙMÆ(Y§œ0‡1Õè.•€?òƒ]ÿ¢,ÝF¹kÞ6ì(5m£Ü S´ÓŸ!˜¢¢fcžëTÚl¶;àÕá!3¬ÅÇ>ú±m6â­s¾þˆø(þS^ªã%:t¬›‘>«¡±Í¬¾[‰3{ú:næö|p,gg¹ÀòÎ Z©,×~†Cù¦¶OƒÓ÷`ÒÑ‘Àâ,hSç]ómÏ®o2¶~ø8¸ÔÖ8!M›ôt['bo Îç>|±oñåo|y—£ãßüæoì>üðׯ¾òÊ+ûè´mÂz³^–ë!¯Â÷®›]âî¡ïTæÎè¯Âÿ*¼zàŒß§½0x9Ëÿžû?‚Þ‘›ê¿û»¿;i¸mf¨™mÆ9ø‰Ÿø‰Å/ýÒ/ùZàX:pݬ?÷ìs/íî¿R¾` êW÷SÓÛåo[Û(?zŒi0ÍR;ìr?ýÍX’³#÷ óüù{1½{Ç—ñÃ0…¼«£9Žt }ˆƒHdžW ‚6ÚÀ¾.Ë.«V0ŠNò³ Þ,q$©Œœg§üZă Öaß~»¥T”v[?ªŠ¤Är7Òm û·?·Þ£m^“¶]ËêétmgÉcz²œ«ŸÍêíxý²ÝâÂùóGîÀ¿xßÅMÞÕ0i8âÝý©{Îß³E²A‡êñaèûe»=/TÉ,, ‚²áMý‘g¬×3$°½ŠëÒ}×A»aâ.Eíkôófï–¾ÄsO?±§º"´{„LOÐóÓ-y ¹ëºÕ9ÐõNº*ù¶­sWTø<ýAº\È.«E'³QÏxîñÕÐå˯>úè#»Îì¿öµ¯í<úècÛ¯\~yŸ«ëw¤ú^>³ò¶©¿^)«¢ÞG–}øí¡¨Åëg‡°mÂTþ½à  7öÌþþßACøÇ2•n×ý7ÿæß¤B¾3^‚ö0Yò#Ž˜Î\ÝÙ~áÊ•×bÔõC ˜XFËP⛆Ðk§<«P£ÈÊ9HI#M øªýâ,wVéȼ3gNç6%*ù;ÅêØÓ@¢º®¥âœnµCìF JìÁ=Z©“ÄâêÝk‘1Í-¼Šá Ñ]Rð‰ôSºŽq[òmô·ÅòXÉS‰*WKY`ƒ0²ÿÛ(ãíÍÊÎgnì zVßp:Âl„²óµÆ±:¿wн7´õCŽÚí°Ao ¥À&àµó÷œ?É5ÝÜÓu’3t‹¾£?ðaU`›ýC*bêSú;ìðK£†2ed?™Â+>®ešçAí;Á€ª­wÝ4CM'vµ7†± µkDU‚ M}CøÏx"W¾€ïþÜdÌëœeØ}¶uA·áÖ3m•½õN83gO|y¬'Ñ{ã72x|úé§yä‘W_}uÿ¡‡¾ºó­o}kçòå—÷x5¬V?õ¬^%á¾µ({à^Ù«²÷ŸÆÓî÷öî.÷=‚tv†­ò÷q€íVúº}Ž„F6ÿy‚Î×^ÿû™Ï|&é4M·í ‰q§½æçþçþÙ?ûgk^{‰¡¥%”‰8±³½ýÚsÏ=û­K—..®lïx3ö»qÓàl}16<ÝÕÈlX í±€ °V‚{†Ûq2B Ë<ûβ[“+Y¥`É1§tXJ_’‘êÃàûñ#;xEu2å/¯™Åcè{3ÐH7•L‘`¥éé÷F鬦QEoÊò7¥sM¼0ºêÔŸÊåM¾[Ö¸«Ã¯N¥êÐ#éÍÕFª™•`vßÓn§MCFÙ;«·Óõ¡SîÏØž`¹~ßóôï»oëÒÚ¿tÿ¥õ³çÎl± —þtƒ+AY`Ùßo¡ÐîßxãuòŸ\§,l«QölÔås7ò _ÅòZogí1@¡W'Àt#8mWz)_ ¸RpëIMÀè*ªÈ+Њdí ¾ü€t‰¾z!hßQá!p÷ç=ä@×¹FµÌ|¬mF#‹Éc̨sÓl…™%|á,Õ{íûÊ}ïÑGÝáèù>×ðnó¾~‡°=tÒ| ß*u`ý¥nFÉC^Û¥|&á¹²wUá;ûo*ý °Uþ®d€×Ø=ÐßJ¿¿¸¡Mù:àèW‹_þå_Nûs £¹í‘’Fü:IO ?v«G¾'!-‡¯½úÚëk^À¦^šŒí4?Aï&k}£Ebë¼lðâV¢O ¸Þ/Àç¹ùô™³G¯¿þ{0ÛÈ2_ØÌhÈÀ¨> “Ê­2Lo3x$AsÚ7ÎИË.*ê-±Th6gw]nã›±aTÙ3òÊkÁ4‡–ãÆSs]‚½ rÏþ -"O™¢ÞAZ#]‘ùöü]ÒuãÁ£]&Ý);Ha_3«§CÎÕw[æEü!7âí2{?Á{úýä#î½ï亴ñÂ…ÍSgNŸbæïŒý„Çì˜6å=¿K®W™ÐvyKïE:òÈ#»=öØÎ‹/¾¸Ï2þ6ð6æey=«W‹FÑ«‡à…½Ï³½žÑ·ÂoÅÜðlòƒFßá/\…/ÞÜžTðse߃ƒÆ/ò!²ë@Ú׿‹ù/ÿåⳟýl^Uøê¼¸í]°Œ¦8zw:Ÿ³$Q)Ìa›àÏ<ó쯫€yoÈaK<Ço© UÜ£ Òšºù7ÆF†­-vÞÆX´fthˆGWmëôc¼+<±8wöìáóŒC2j$Eœâ3Þ¨wqóv„Ä“^¹ÈË€pŒÿÆ~æ4Šî|Ûcô+VòÄ<¶œð˜ï%zñœ'£Øæ7ÃôâVZ—)Ný¢Ä²°¶r}4Ÿoƒïd»ÊŠ„ñOÙeËN×räIá‰C'8}Æ–ôæ3«–íwÐoð5»ÝøÃ vßoÝéÃ{î9¿Á|¦õÜû&§=y°çѹÃÅ›W·îû)Tvï¨èQø¹DGFÅ‘§Fü4ƒø)?e Ø%"ž*³Vý@<ÒQ‹CXg‘Ø£n9~b‡7õ8`Fl>:C×HUÏã—®ŽÄ)Y Õ$hŠÐoí2¤ófT1²÷Ze¯¢§ÞQ*źC%·â¸„Ïññã¡ÕyòÉ'wžîù½‡~øê«¯½ºÇà2ÊšLW‘桎Z¡‘/ïÁ£ß×Gé‚§ÝñòNøç ~Rú3\ãt¼¹»•º0ÝíïY~Ã;näT>dÓíþ¹VþG?ó3?sLù›·í@á,DGfžÿÿÄ'>±ø©Ÿú)/8p”f ƒbk_¬=õÔ“Ï3;ØA韬ƣ*-¨-hÚ.G[5š$ÆïÀ&´ BɧAø®*–¦·±òe&„ä½c&ýi±–G¨öÞéš…5µš%¯IŠÀßûÏè  ””Èg4¦¦±Ì±†Ü˜­„rÉoÄ…w0R±LLp>².*§ùPÒŽ¼7‡R¡–ù.juTIÐ"ò­bÚåÞ6ù€î¬t̲rÜÎp—Gçë Ì%PÛé>ïç÷¸oóÞ×øCâ˜Ý½›÷q®þÜîÏÙÚð¸M‰ÝìŸôPGívøè 9›ûï­ƒä7y[™‡õÄ3õ•ó£\Ì|M²~”þ®NÚà¤Í¤œ œ`¡ø2ðþ)Ñ„àk5$ÏjúRH”AªÚâøCoQš;ŒXBŠ1ý5]ßL~µ=lf]ü4nãIÆ53[ßÓ3,\ñY¦wù~ßøœ­ß~æ™gvyö˜á_e àÆ»¹UŸXó¾·JÞ}?Ûö1E/~Óvãµ}lþ*\Åݰ¶çq¦-®am+{òÀïDùÿóþÏ£üô°ÊVýØh+·í€„\c(„9,íddòY.ãxŽç766׿£4®¶UY3F'mäjfT¨ž²§E¢ØGÃsàŸÞÅp3i„;ˆ“`mmМ©t™“!ç¡ýüël^Bo­‘2 ¹t6³‰q®—sÓí4@gÐ,Š7Jw&GHH·_Rœ„¯—Q–3ßNgå‡u¨:ì®;UCÄt*‡^ðëÊ$ÚLðµÓdPöv¢ÃmÁØqä3¶*ú±¤êì*Ÿ±åDÌîý÷_<à‚‘M7ç1»ßð¨Gñ6×7×¹Õ‹6ãr¬÷è³1ïÍ«ôa°•¼àçr,}ý:+ð*™*ÿ™Ô)AêL„Á—ÁW*gCÄ¿ÚjÜ@&48ütV,-S±F|ë¥ðñ[6ž8juß1cPLâúŠ|ŒO>éh=å‰Ëz?âüf·ºÞUÛ";È»®w†õÓ3{óÃpž5O~¨ì…u}ôæ<ÏÒ_¾|ù€ô¶Ÿþù•ýSO=åíy*ËV˜*ÍÞ˜…¯cÊž%üV¶­€÷¯i¼•¢o|mŸVæ ï¸ oYæð†µRŸÛ«ný“ÒéQ‘”£c3ÿ·Rþàß¾+ ׯU +GÿößþÛÒOa¸yÃØúk¯½úÒ /¼ðħ>ùÉコs•ÑÛ¦›ƒÀª†Õ]Búî€lÜ¥ÄÕžK¸„Gã´3'êÿŽF0¢bÄÉ•ÀÔG©DyÄGWÑŒh0”õ’gœ3ÿ2ä]¯{+°o€Ê»óhú‘{}Æqæ\Åz¿ü²lñÊÍïȩ̀ÌPn˜ *—± H¨ŽÛÒ«+%á5³zÁÔíIÙ;Ó¢eùÓ÷¦~¯žçe¿Á¾î­sgÏ­sän}kë$Úû0ÊÞMyÌìiœ«ß«¼¤=yó—é°Æ¿–«q+ûØÈq¨ËÌÅÎzxW¹€xÚ.ÿ‰ÕeÖ.ýâù³$À_ÑfñzF_±Â3‘E®Bº‚ô…× V |OÁ¥o~¸ø7á6ÓJ“HE±;Œô4€ådÈD<î;ÿg^ïRž•Ç”½ý©ut_÷DÑç½3W›º÷C…ÿÍo~sŸ>_…ÏÌþ*ïé÷œÝÏvà·ÂŒ¢GdsüÍÃæÀ wîÌkÝv2xñƒ£_÷Û-ßwxâ÷Vþ–Å0Ýío·ŠüÜ«Š^Ü~×aX·ca‹?òGþÈâïÿý¿ô»÷ïÎÞóÏü5OçæŽX°Âh|ðA­ìØÄN¢µ[ˆÜøôúÖÆ‚Ó’ih9öc£J[ Ž!<ÇzÈ,Ö‹ªC°…Ú£`e À —•A†1ƒ”oNŸ:í•ÀGVJåýcËÛè·Ä–§ÝÃHO¼‚xtñ^ÿ0æIòº¡<1ªðúmÉZa¸õËhøðþ•,¿]ge&êѧdo¹e"cÑH¥IŸÂ5ˆLCÈÉg9æõÎzæÓŠG·uEe4ê V½ê¥Ï1;VU³ß{|ýëÝõ܃¿Ç†WªÙ¿¼«7 ^™ÙÃ7ïì~+ëžÕÏ|8rÅø _q«„3HÀn·vËÓ<¦ ÑÝv»ÛoEÐ=Tì“?™E…Á8¨‰ÒgäÐ Œ üXÞâÿã¼ø;çïxì/%“×]ПÌ1hi­8ocÌ Åó/<ÿ?ßü ÎæØ4óŸx:«=âµIŠ™_ài¢´yIKãï¨é _ô´[`T\>åí*€WŸp³Éûf_˜¦K_:c6%k{;§¸•ê%Fâ›®A¸è5Ó%ÞõºBgÎÌÎ1Ff×Kí}ÆWØ™Löçí<-ýãIºgJžÎXçÆÎÁ­Iá¤ìí€1ÞcqÀö€ظÿÒ%”ý¥î»oýCz`ÿÞ{î9É7/XiåV\/Ñ9<ä3¶uÔÎÏØîìl“=hʼŸå§pXS„Ùh[dŽR)›ƒå@(N‰To×[ñfð)>JìÞhžT2°F¤©ÖY.k`&r©oCl7‰ny)Õà‘ )(—qÓaFº?Ò(ÿØ1ÜÀ¥g´u7!Ü “W‘KMíà_h'rÛùVë›¶‚i[˜õÌ~üLÜŒ§Br6ïÊ®KøÚîR÷ñ=ý×¾þµÝË/_ö=7æ±)ïÕW=W¿-•­JÀGåê|a.ÐŽ _\qæJ;ÊÜVØÓl™ ›ãN8À[‰7ÎÜßîc286°†këŸ?¬-Â&ùŽù Ó WC2Ãg%ÎüŒ’–Z÷Çÿø_ü‹ñ/üZeç¹ù,Ôih\cÞGu ¯ëØÞ ãhæóŸÿüâþÑ?ºøÿñ?æF@fÝÉ8pÌLïU~&Y•Ý"tMÇeëUÁÇ0À6¼i+aÕõÈ·æ¼E#NŠ*XôLI:Á‘#n;Qe41¼5d˜: %µãà§:‹ga2bRmLèIú:8iιn‡^É]¤Ã‰Ÿäï#A°¤¾Uv˜ÇÕ1#Z‚Í÷aL¾$f‚vèûj¿U=£Ã”½ÌÅ¡s¨ãvδœÖ“6î¬pCÞ!VgóÛìÆßàY{àÒ%`çxUò4‹ÍáÛž ÁÕºÔñ7¯zÔã :®˜mø²~Í%ÙÑdȆ®—œ:N™›?5hHÉ/~¦,S¬ògò¾p´FÛâ±Û:yä¹n‰ø¼•hÑnYZ¦ñ±ƒ^qRŒAX&¢z!¿‰ iÁ¡¢ šMøpVß2x \3¨6CÔ¶Jå$~ä†r܃Ãíb­Ö9eƒËIÄQçzf·2ÅWF*$”TfõÆE¡»1ï÷ô‡ÜŸ³ôÜÏyns{Þï«[·å+¯k^í¬_eŸ]î ,¼1oU1Gyç•sh'xØså>w¯Òéøm‡·üyZ®U[å-lUѯ*õø‘ÑLê0݈—|‹[¿ù…\EOrãvUÄ£ñêÅ_üÅ_Ìr¿wäОó:pÍs Nu zטÛz0—–-^3cFÙÆ,È“œÓ|–wñOsm÷ÇÈW"øÂà (Ìd­ X4¦6¥ @ÑüO¯æè!áÚÕšŸ®`4n¼¡vîü9—ˆ¶ìR »)#3¥”$õ¤¼pÇmµ‰ÿ/âWE“CK]\¡{£LVä*Òpšå[ØJÿñXay]ÞÁŽÜÜBvQù´ªÞi±l\ï§Y¥oçÂ)Ï·Ê6?âìï0³÷œ³m$3ÿ#^MùÛܟᦼû/òe»‹|éîâÅ#>bµAÇ|–Âk­ Ð\ìK]B´ Pô™H³#OeŸ¢#µé²¬òäKÀh;Š¥dÃJeÅS ø<Ë‚cdáÖmmp¤Þ7~…lüu¸°"PÖ`*ó '@3ÈWYŽÒî0ñG;ð´é‡y‘‘ ™ÇW„ÐN14ÉU;d6½Q‡‚Gšæ"7·o§Ýe:úWä)e?—Aë ¶&Aâ¹ß'õŠ1¢¯O,Û¡Ðy7ïyznÉ»¼ûo|c‡¥üfüûÔ7ûn+o*ñ}­ÛgêÛÞÛ;äžÝRÀâ·ÛóÚÝ+ÇŽÝ;Ço~§Ãä­[»Ã"Ï€5¼åÔn·afDÛº;\%®[رgäÝ/Ÿ˜7SÍ?ò WûzÙüu%…͵¹Ò÷ðþÑ?úG ?ë«NtåG~ÌN7Gډ߷5wÌÀ Ðü¡?ô‡Žþý¿ÿ÷*[½f.œ îìË—/?óÒË/?qéÒýcãQn Í¿´¬ô›Dc¿~ÚŸ}HéùB1Ù1Ôº£8á!t+C·\‡žH:4ãóîJwËi”1áÈOxËÊLbà¨ÿ ]DjúS2ÈiVð Ð}ë(Ò“‡dMK:ÒxøÑ¾]LdªÌ˜t §ô®üQÜ„Ùoeº±Ž,ɨ_7€õ©¤@&ëß¼ŠÂ&Ž„K (ùs;Ìì½1oñ‘dçÂÅûN݇ûÞ òe»õ“n¹ã&ótÜ.8[°*Sê¸où9Ãi#Ôº7ž!\,p"TƧD­¼+¼Ð/¬ Éð­¼.^FŸò>´´"nÚà¿]¹ŠrÁ‡;XF×ÏØFÑ¥g*8=>š 8œ¤o[seW}ÇÀV½à0 àËK2N9â¨<taI$pÞšo¶ò §"¼¿¦ë]÷YÚ*ž6]ö*ÜYë ¯r®¾ñÅAɺ„ï—í¾þõ¯o£ì÷ý²;ñ™¨ÛQå-ÚecuÛeû(pgö<­„µ£¤Áowüˆ?vüàéï=ÇpG˜°ùÓJ]˜î·{Z™¿mÞ}¤­dVò.ù7²SÅ Ò•6¯‚wF¯1Ÿ ´}×w}—¯F¿ý·ÿöůüʯ&|ž÷Èô;ñß‹¹ã_øÂLW2N{$ÒŠtÄprçÊ«¯>ÿÑ~„ïto“Ék)íÑA6cl£iq¸GC˜ìòÇeǦ(ž8á ¦R2³¹ èË«G¯¿á÷ˆÆ•ÀÎõ9"‚Q†ÃŽa&Ðõ›°+AY hr€ì4SrË{s¿©ë´íÓ¹ÉON·”Ù ˆ*ÿÈÖeßY½ì°+Ë;çE¸´ë8‘~³É6nCµáŽÆœU$ë”ÊÞ‘¿6&ï:mÜlÆó›õëç± ßþ‘ôÁÏ/ÛÁssõ¥Õ@~íì¿l¤[°ÉçqàË\½‚ ímîNEŒÎcëA…WûÒ* 38Lƒ—Š ÍA6$eÜá¼”-¡DÓ^"…¥ñCÖŠì4A%äL¸Y­xð ®á-mZ<*IÃEÄ©ñâ–q¡L^¨ŒôÀ3‚$(͇6ó47ìfí._éDæaÛWiF‹½Ò&.ýêš3Kp™i)éQÞÕ£Øs®žø;ßüoîøÎþ‘ºßõs%¥Iýö¸¨ Öí÷yO/žX+ð¶çWã:(ÞïìÅŸ+ù¹{Nk.ƒîVöo§äyÁo[¸äÓ°¸ÉŸ†#bJu²ÁÕ$Üv«~eäufö„ƒd>h>«ß0eÿýØ9PXü‰?ñ'Ï>Bâ÷@aОʵÃÃý=üÜ1¦±S\10 èÅ—^úµïZ[üYïÔfÁt©–SV£ Áñá×LM-h€– ¼q õxãæ­cÜhâwŽ^{ý çÞý½KÑŸÿV*‰2²“(»’5ǽ÷~D-ÊM¿RØ™x#Ô—q:Ï„˜†BÞ·SÈ’óÿvZÍœ²ÕÙfr+t{fÎD›Ô±ÞÞîú:ÃȲž«F4àpçØQ;ãÐÈ}×yÄ2Þ;îw˜Åo ôýØÍ!—Nñe»óì§_Xw»Ýi»$gîÀßΦ¼!>“{÷XŇ]£¶\tš–Ü¡2òÁð䉉ÖSFÅ?•ÞOkEB³xzãçG5à ¯PXihЙ°î\¾~xI°ŒôÒ„õêÆêÖZ|ýiIXÿ€úø‡)Ì¥/~¢´u`d¨NØÈê*@ÒJŸ ñSD¡bë’ÞÈïøÇüHÚ+$ÁŸØ†ÔüH»MòtXtÖzeä§Þ­±?$Ë÷#Ü÷õGÜ”·Ç»ù,á?þØã;/½üÒ³|ºâé¶¼V°nÈs°ºo=FޱƒOv⯬Dكߊºüª²ZÁÇ¿aòh»›^øðv·­"×Ý }î6O„³‘Sž‘ÇXÉì†ÌǪj¿C‚êíÆ"Ê~¸SæûÇ>ö±…æá$Ãâ/þÅ¿xô½ßû½ Vñ¿÷÷þÞ´g –Ÿ4„ëæ^Oe*À°ë1·ý dÆš_üâ¿ãwüŽÅ¯ýÚ¯¹Ü‘c$x*ÐÇì[_ü‘®œ ÌÌ3¤ée(@fÍãk 4Åm§00Ø¢·3w“ÔÖÖæ‚Îyñ̳Ï\w„4¼¬E);ÕeLLo™£ê€i”¡&üÊy#¿M†ZXÝ<ÿšÉ„TV¼7ÂöÆâÈXù&K’äGuH¥øÞ½4ªXŠD‹òÅÖ$€ºe¯²öÑpWÅÇíløGœ¥ßfV¿Å{û6åùZéäÙsçøÜÄÉ ö´fÑØÁ&=ê4úW>ë,áGk|ÆÖ›)‹›¿µíVzÃNiÃÐÂÃÆ1•Gò€íÆL ÒHú¿Æ­¼)f"•$8bF´ÐÿêáI×)ME‹#5º|D M#•H“´À—nSµô¥˜Øog–?¨ŒBGù) Q0<¸“öX¢‰Ð¢9r6øÒ¨eg–,÷’7@~’}=aÂçšHBß›Y­s*qM+sígÃÎ|óÙ½8~b]…og¢*|¯Æe#Þ®_¶ãØÝŽ×ãºûÞËt £Òmš#v(#÷>©p§MyàAjšÕwœ(løG9‹CŸùjA+uáswû;ÎÜVý“\3넳ÖîIÑ#[» ›óÏxÃ<õßµ“þä-yÄùUeM¹tÿ=ßó=~g`ñ×ÿú_wånÁ¾œÅ§?ýé”Q+{y8³—¾Yhù¦îÓP^±ýòwÈ3…]ã¶tbM¤# 3Ã¥™eÁyõ‘ ^{jÿàð Êù|5rêøh¤¶ÂìPÎHßPMÊ-®éGü´X!¸E r9âìlÞ›²LvÞ˜0'ZïÅ,ŠºØMIûF•·å„`“Ô!¸êö¯x¡ƒ3•P>õs<-‚?hÓy;䈨•äÿ²Ã¶,’[©7¸ qjtódXy‘Å€†;}Æ6£w¨So÷èt]N=`#Ï^”ýý÷Øœ·|ó /UÙ™ç™,µæ3¶tW¹ÏJïò]ä¾òÂ/²šäôuAdÀë¿iÂÁÂa)A`8$·€  ®¨¯àK …/‘ ’ ’[ÍúÅÅL¼Ê&:m±H•æ"‘oBK¤Ñ6ÍøN3#‰–¦ÀIÙ‘(HBÿP!¶Ê ]FÒ¯©>bøÂ|äáH˜ƒ§äuÀà5Óλö' ò‹CN(H9±Û±Œ>§3µý ÑòÓ}C¬c«uÌG\޶uR¯m½CñÇáTR,áï=þøã»(¥ý¯|ù+Û¡ö+w{¼kv‰õ˜R…F^A5úÙ}¯Õsõ*î¾WóÍx.åÏ—ëçîàŠß<†»¼ás™ænq¬­èu¿ÝCAäö¿Ø¸µ5*xÝíÛ|&í4³lpŒ­b&ÿ‚çmh“™éÿøÿøâ;¾ã;’Çëoý-¯ã]|üã_0ÀOþ[•»/i«×d¯²ŸÏì›ö[ÙÆ»æŽ¬&ôû¿ÿûÿõ¿þ×[ή¬<§©ÄO0‚}âì™ÓßGíd)j—/.u‘cvl£awþeT/Põ Õ¡á ›`² ÑØv{|­°Þ“¥ ßKą́Mqª‹üŠtSÁIˆ’vfCƒæÍ’nùc'³*Ó†Ì\:o* 7yžÊ’¯!öÓ1£ -S1,ƒIôìªhdž—²Õ$}ÎÈÙ€Ê[¦eL#>df°Ë¬~÷óû4ü}•=öÞ…û.lž>ujó$Wãò²Þ½Ü_çê÷ ±KçL)e—¿,<ÍÊ—ò¬bä^ª]j ?•i±ƒ¾²§‹±¢‡F…é-2§øÂ¥”‡ÜPfáÚ-¤`â§c6W*"LT—n«B…Ðr:)~èðcþ‡GÒ$®4XeÍ=|‹HÀ‘xø+ ¿­¢'ÑFб>@š=¤ñ¦?'…>µœ¦à rD2S#³ŠBlJº,Š[èGF],C’ÊTªo6pâx*…¹QÑ«<°É*ëä8¢ìUú*{g’·CYªì¹ ׋t˜Ù{cÞ®éh }L™Z-©çÙyO˜çê³9»•pÇÑï%:“YânÛðñÌã6~ÛÍ_+üVæ6÷·rÖnmýf`ÃâN[-˜þ<È×n@ÁÏ€ Ü´qò0ÊÞì!Å;mû_ÏYá/ü…| Î¥û_ø…_Èj´ÊßIª,ï(x ú} ³Œ\AX5%ÚqhÓ9½5¾;rÀ]G¿ôK¿Ô9`a‘oGì&]w·äë|Íé¥{î¹—ŒÓmÝâ–vÇAØF«´y–?Õ¥Ú1 †‡*ÑÊÔ±2p&sÑ›3êH3FÃiÕ34ü„§žÔÉkño ’:&ºªŸZÂ’®ë&J ç”DÜR¿voU‰¯›Ý-‰\ž(uÞWæ0Ýê{ÂIÙQ¸|Ë4›Óà rúŒ­ B667WòÂÞ¶ ±Ý­àÛ6lUÉ 3cb›&Üš†›o†ÏŸ(_q­Ç°°Óo3»Ï,ÞY¾ÑX”ó\ý‘öÏÿüÏûº,ÛÿôOÿt|èêš2suÅ ¤­’×ÈÕ€US¢‡ïÛiî¨@gØ|÷ä,³(Ðüþ+—/ÿï?õà-w3tÌÿ õšü]Ò1Ù@©.v4–¹9; —±xF},µ)[/·Í ÓØä¤N¦Ø:o… Éѳ5yéÊ;Mᆙ„BÅ&?–´Kòþ­4Îpo˜ßD\J5ÙH¼vêÊ&£|(_±qX*„Ñ ®íÖ,ËgžÏå3¶÷î±ÒÃå9Ü…éþ5Fþ›lÔ[œ=w–[ 7O;[‡ˆÇô¶X}Ê7ë÷vèÏ ÚÊ^…¿æ÷ê)Š)™rᇯ‰ËOÙø‰+RéT½Y 6¨PEŽÌ¥c†˜+83‹­tKSפXGü¼D+VEtÌ€‹^Õqƒ5í Å&™¥=|Šax~f“³˜½Šs Äh*8í¯Ëß4P~Ã;+_ËëaƒOÇ r7fÒ¥’ƒü+GÙÑê¤'y8'’i&tâ.xò¿´;9æVV’jÆÐtZ*{1ճˋ:ço¢èõûøe;?xëΗîŸ{þ¹]ÎÔï²›{Púbœ¹Í1;ÊÓ%{g÷ÙpÇàB¼Vغã‡OÃ+q¶ªäÞvø ZÂúi¸v?†©¬õk·[¿Ñ0í¹?“¾žL™×þÀÆl>mtæêˆ“60LÎ×;°rsÞÏþìϹÿ÷üžß³øƒð.È×¼vÏ2ÐøÚAÃZÁ»„ß8AäGŸU³Š·þíð߀Î(3WóC?ôC)¨§Ÿ~ÚÆärŒ¹ëˆN{Ÿw[~á ?`ëæÙ‘‘»»ívÙh8aXÎéFOpŒÄ@•YâS™øJŽË0¿¦¥bº£"¥R\[/–‚¼›«/tª‚&ÑØŠ7ˆ´ýn4ß)üX&ؽaV2°ØÜ fï$ÈÛ…Uwck[åkrI½ô…My†ó–ˆe¾Ú,ÇI×Yš;½rç9¿yÿý—vøÊÝ:þ{Îß{‚%|ŽÕolÚ‰Ó]óað:n·ë{<7ð¨ö˜Í©èOðÑz*ºªŠ–2Ò÷˜{Dz|ÿFAJ¥ò6x•®üšµ:F°i0M¾­àÍ/u¯Iàpë t‚^•о¥irƒYêKšQ‰×eI¼T¦Š?ÿ«Ðm¢ÄOÛIáÕŽÅ4gÎJzI3¨Hâ#± Mœ·:FáVnçJuc€×¨Ê8WŸ%üVöÐÛGéÍt”>åѰVðñS§zPÐʾý¯=w«°Öî¹­¶5\ÛÇ0ŸöÏmó¥ýº'e\³Þ÷d“‡ € ‚Ê~à¶®È,Þºèæ¼?ÿçÿü(ï—ÉF=gÿNàŒSõ• føŽ³zaÎæ(ève`Õ÷™›¦3‡Ý.î;b`f™©vº¾—q¥ ¤6E+Ù . xšœÿ[lP{lc”Á˜IŒ‹h4ë²'Сô‰2ÛB!‘F9+Ûú‰5^ô¾IƒÛ`uTMe¥ŽÍëý]•Ï4J8ÜgCÎë% ~wèðHÞtbäw«x\ÃôoÑØ˜±[àjÞ:í{?½½Œ‘?3-E¥Þì3jg¯ò<^wéÒý;,ùm±¡ó#ü­“[ܼ·åLR>lybí“eYgõPÉÀ‚:i'¿!Ó2Ö‹{”ed!æ[Ý„âáó²k¼V4âÖRÁ­WxpÕX,iZ¸Ì¢Å(sƒÍäe qšm¦X5z‰Ôq Ë€cFÏ ½!#ݼW/å3Égò  öÒHVÈÆÍv¬@—rˆEÉ“¦†g—xVäT†ç5I#¸üÞ:{®^árøÿa/+Zh»|ï@K¢‘åÔÊÞY}O:YÝmÒ±ÅÕ¿“Ì3XÍÔO~ò“‹ÿõ¿þW Œ0+Í:j%>CCú+¯¿þ$#¹OÑm$œ [6)3 :-€ ]k‰#Jð­Œ%Ru‡Æ3²>öp êXÅhÊÄ•rýëÁÌà ò^~•Ocìth:4á‹'öÀjäÂx×_Ñ›Ü*rf¯e1°Äw†«qn•ÿ­ye@U´Ïmw,Á;³ßK'ĸûœ§ã› çvï»ïâ‚o7¬³÷Â}÷ž¤a³ ÿ,“z_À4ëì°]’Ý¡ã°/5&Ù²õ\}­"Öjbê ’ GE2"t©€ü&ïæuÑxꜢ“ßÐr Û´+¦ˆvXå“Fœ  f sþ[ôçÝÒ¼&„”&±C9Xî` x 2„A#Šs¤?JQ %b)Ët¸UÄ ’P ]ã ZzcÅÈGüJyÁ2I4ò£ ÓoHYÈó8)ŸAšª„ªë¶jk:aDL-KÚŸ»ô»¯ƒÀÔ—ƒ]&Þ¸½l‰ ™¸óØï¥Kêå½=> Ä…x|ÍÎOÖî£à÷¾úÐW·_yõgöì}#×Ú’/­\]Õ̬[FùÈ u³?xÓÊ{®œûëv­à spиU©K‰ÏÝMCXóoåÞ°†kû(“8Ú> kÛf®îÉéI¦#›vžáÆ[þ1ãΦ;¹pÑ]~×XÄS±«¼ÿÜŸûsGwäüÈLW㊫±m[tKOEïÌ_:ï¦ì›NÛ!z‡þÜq Ì‘™K7ÿá?ü‡igaP *ûµçŸá•+¯¿ö _6ûK@Ü~Æå<¾ð›z…ªUÇpÛlGå°Óu4ÊT°$Ñ*n£eeâ:n=áÖèe]x…ÆqÝ?“²Ã©ÎVN2ðºiv„‰v¤i¢%=`BLŒ~Ót« rn(Ò(_Ë“ gYì¾÷}{²1PÐÜÈÈglO­]¸÷^fó÷8Ϲ|Îvÿüy¾lwæôfÞ©ž8±AÛGÙ×î}ß×§sqRJ÷êÌÚ‚u~{y`)ż2€ÙTW&)ƒƒˆ—ŠÑ)؈V”¸SÃÊÙ•¢ÑíóºjQZšú"¯KÎQú©w"[:…1ÉÑn‰hœD¬ø-㨸Ãa`>#ê”Í?^â“þÄßðö%†ŒY&ÞgY8Ø (ø8ðT2²N}éPº²3aXe* ¸vE*+3°uvɆ‘£×®¼–fÞýkÄK5o"×gG†ŽRB–œÂ”ÕôDÒFº»åKúGóJùÉq] æ ͈62•½.xX&Ç•=þ(iÊ™Ý÷çÏœå›õܘwß…{·î¹÷Â⽎Xb¥ofó_¶ó>W¤ÃEoºLu>ÔXì¸D‡Ž']=à^æ-ÙÌÃQöökŽRGJºÐ‰à•ËÉ~F.ìÒaŒH£ËÌ—ÀBºÃ°[™\@ó;´‰ÓðD <ƒQøž’O½-J!šK,f’X»U±i0qªäCêšøÊ"ª±‹üeÛ”ô¿´d ¬Áƒb, ®e ß l ¦0ÀfÇ2=…×ù†“ ¾å¬§j\Çbù~:ƒ¾³¾ uágk e¿Y_¶ã¸g£Ì¶_»zô̳Ïîû±väkï°i›ãÇ{( V´­<}Oß_¶›vߣèsE.B5~+å·›Õ;Pg>˜˜» [¥Õ4•eîžd®[%Þ°·Rô“’ÏÜ´Mj7<°Ê; G‡ ^›>;qÌ^OIi;(WaÛ_Ó¦ÈËÅþè.~ßïû}¹N—sõYæw·={t§ëqûÀ˜,È&ú ŽÙ¼|æ¦é›»ç8¿UÜwÌ  Ê‘£ÀœŸøÄ',«ùu$G’©”àYÙ^zñ¥gX³3ý½e-Š]46O:‰‚ò«côP  ²øñE‹¯~íP¼ fóä©5÷<}øtÈ8Ð(E2¸aG-ʆ ‘Þ´Ôÿ ©l·ÀÈ"†¼$Ãu"?9ñû-Ü5³zqè3³×MáØQ:ˆâ\ý9¿p·àwáó±›ó÷Þsï=k'Ù9^fõÄO]Øcsßîžùbñ­Ã Ïr!Ë0)f$¦è£°’({.³ÃÙ=oÝÊRt %0‘°Ì„ä vU%¼#;k^R<ØiKš©n–Ö(+èôŠ^d´ä °t¥< çß`½=³j#W“F½ *áKôȦé&0´üIˆEϸFˆ¬Ã]2æÊ"¼Ó(íøå‰Ã@aq'$y-ÊîÀ¤‘oF ¦ŽáŽItÁ ·°Êø`V\RÑÌ•‹§>bœ‘\ˆ[F~$É-ø\^Ï©–î}ÿ‹æW¡ø]…_x‘sõWŸxâñ½‡þ߬¿ŒýðÎ /¼°Í’t–æan_cuŠ¥nÖ%:‡G¼ ¨ûï©£óYý¤¤‘ϸúC¶ø±g §qµûi¼ö+ÃÜÝ~íIÆ™[XÃÍBÝÇldœû ®’EFá>ÛvfæºmÃÚ˜5”}pê †à…·âq„qñ“?ù“‹ïþîï>úèG?ºø³öÏæ}½ß·wÆ>7¶q—ú-—žüY¶o·W·¸wÍÛçÀ3x«$Xa†é Ù7n½üÒK_Û¹ºý2g¶.¦6.{³D©¾‰.†˜]EBDÀœ»—˜Ö~;cˆä£Ÿï9Ÿc`¡%| ˆvÃ&4 F»“Gš_ˆ ·‚GµS„pÈ6ÑÁ£ù¥Ó®”T?Pní0x¢|µ ÷aÀEocÆt‡qDùíòœ`ïÄÑEÞÓß{ï=[øÎŸ=·¾¹uÒ/ÛmIÇ_+{ß­¶¨²SûyØNÞ’ŽZ°ERýuˆá)sÓ8¥µbrÀhÉ®š†ÐG–f.ŒV a•…†w̉âÌ«ÎLt88xçqä2ઓõ¾~7+ŒØ ²ÏsqöÌ)ê§9ùô1‘¯2#}êé§Þ|ãÍC¿j÷È#rÿýK{ÜžçN|ßÕ«T[ÙFiR×ü`“¯ó‘êgfè+¸ÏY½? ù¢¤±ç ¾éÏa?øÄŸÛså¾êÖߊ½Ý‘{ÀÛmÆLndÔŸÙÚT0¼Ê>(ÆáIÛt¹~f2)ó[õ¾¿ÿÒ—¾tôàƒfyßÛó\¹5Þ,$« oeßñ<†·jJÄãPqïšëË;j`¡[È.9tÈÏýÜÏy~Ö]£2æÊÊSO?óÌ‹¯¿ùúkìè¼È1›C÷äÒ¡U?Go•Ž~굪â¼[õép[GÕµÑ †Nµfª¼þçÐÁ¡LD¼¾{­ÝÇ”ŒmÕ€úÑqý¦ O4ÌÅ´M NxååJç¬wâ@IDATõ Í2yͨœÕuµN)ûVôÚ*mÀ¾ëôVöë|ºöðþ.r¡ÎɳçÏž8{šøô:¥Â+Eï.]ÞÚ§@^ôÚÎ’›®¸ ÚÈYKµž!r€!ÊL ›fù'Vý”HM:©ð."}¡“ŸN)¸‚XtBA*!_?Ò.1IáôÝûçb†5x ¬È!¹*¤èX_15‹!¥¢sâY¼ëºùVéHZ‚W˜Ã9"·e·Oª×ëpR¦ÈX6ŽƒzG4Ó_™:Â'â©íAšBRô*zŸ*›ì'ƒÆ!³ú½C÷¾QWØ{#GêÜÚ™­3´úÚŸ£Ì<{ôÑ=.v9à w;œ§ßæÄwâï ¨æKê­8sÔŽz—ãv*xxäáô\iG9Sß'¥ Þ¤ÌCÒÚßñ–¸#¼ÝÚÊиºçá«J¾en¥®mö ×n¿mW·í¦áíÖßO–îi¿Ye—xÙ=?»ˆ-$ÀgžYò7ÿæßÌÍy*í?öÇþ˜t)b ú¸qÀЗ¦9 Ï~ÜgÕ¶jÞŠæ*Î]ÿ»çÀ5XMNµAûT°Qq¹ÿ ³»»óƯ¿ñ0Kòî/öÝ‘äQ€˜êŸˆ“hU9 *× 0&¿vd‰¯¾[€º‰í«Ì0Î:Â=dÂ4ãÌÕ˜×ø‡ˆáU³Qh„ŒÝh'àšhטD›ÅJioµYÖ¼§7¤Ou/£Vð*k.ÂIÿn'¹¹µytöÔÙ#–íw˜Éo^¸pßÁý÷ß·8wöÜGí6NæËvÙÆÝpgõ6K®&R–÷õ*{LÒ:Åð-%/ž‡­)Â/P ¸j¤Z®„1ðW )ÛV䢚ßFДRНA`hö©P|äWAs4q§z‘xÍEOQ8žAB]ë*Ý ¤>2AzÕÑŠojðlA& ÑS¶ØK‡´Á#-pÝ«…+lnëž?f¤þÉ&/u#ZJ^w<'a¤«ìÓ¦9Gkèî>Ö™¿~_»~ö³ŸÍѺ¿ý·ÿv®Çõö<ÏÛ;è§\Œøiè–¦7mgø>m„)b‰IUÀßfînØ]ûÖäÀ9èJöàƒš ~„aY[h$N(¬¿ÉÙÚ¯òŸü?Yæ£r3k°v¾ ‡-@çOxUF;1ÿk0GØX®dÚÜ 8#ó ©;Óݤңç÷R[٧ɦ C·{Ï´_CoQÞ¦Ôc]Ô™6Þê¼Åq%ÆmÖÆ¸¸ï ‹tð­ú=ŽØm]¸pï>»ñ×β)y'Áñ^Üé5€ñw9í>&ÓjÇÞüêÝdµ‚‘ü’.+rÄDFã”7¿ÒiµC`eSÉF^]ôA.?æ±îe¾çS1øM¤æ¨=øŒ€.ªÆkŽ‰Ñ²KÌûÉFÝÁ³˜%Šô“à§ŒQÒü;ÁAÃ*¢X$$ûaIj’Ð(õ"ß²5D‹þˆªQÔt0rI-ô"C‰¡À×ä—Â<¢±D.âõà6)¡Ê9¶ „TÙ[ÕùZ,ñ¬’´%ªËÚâÌ)/ÑÙ‚¤Á¶©—‡‹Ç{|ÿi®Ã}ùåË_þòÿwÕóxWïYûù¬^Åêä w૜ÍS5öTö¬ç‹c%+îIÙƒ;…ÏÝÒ™Å9w§ŸðƯ= ·‘ Ó^uë7×;LEÝ0áy­Ýö†S?R»…«¼³'ÇÁ}g”½nÊžþ3³z¾ïéÿÚ_ûkGäëÂ]ùŸúÔ§Ž){Ùõ@ÁÕY}|â†^ìùO‰Xq5Úí®»¿ïwÜQ€®.i¼¾Ñ¹·9ï¦hÈ©øà¥v]ÅÏ’´ '-!Ý‘h³Î)ÔªÚ„ìd /¬%n¡¹Ä( ¼XEÇeIg³(ÆçΟ?°±´¼ï‹ \¡Y˵%ad)vïLàBç-h$€ù<ò%ÍamGËÆ¥5¿7o6Úo˜äõ>Ëyžnà.ü‹œ§?¿å‡oØ…ÏŒþÔÆ©“§²„OŒ-Æ£S^ßÙ©ø¦(;̘ÿ‘ÚÌãÌG] ˆ¥\žFÅß%bP+ª£h˜(ˆIgÊè« ‚mS=TDã×8‚ƒ\÷ -^ UIÂgŠiœ"U¼ŒÂh{ &W‹‰Ó}ò`^…ÆïÌ/*PIÙQVø ‹gF4ÅkˆîìÄ/"W¼‘£ñøƒœ‰„»†UùÒƒ¤Ý·ybq=AüÔeâ"qÞÓŽ?ÿðN}q`IÝcþ¬m{ålýÚ&Jã즟±Íë=6‚]Yìnï}õ+_Ý}ú™§ýFýËøÛìÌÏÌÅ3¿D' ”ú6«§Žeéž>•ü¹ÂÖ= ¨ x”9îVês{îwõQ††µ[{þØ%µ?}þ¹mV¶UÙäœÃÚš,O¶ë¤(vú£ø]nýã´ƒ^ ¬¢ì=WOûÎæê?ógþ̨\™ë™{Yt[‚Æô[á>*øžÍ¿Û~Ói[îš.î¨Àj6­.9žF@¥´Ao1ø w´_¥‚žvvî"vhø›\˜Æi´ŸtWgÆÔÜ›ZXEj p ß_¼ßnT ïÝÀ¦äˆ­"j2m¿;­eœÂ¥¡¥À6‘él}GOCö³1A8beþèô©Ó{§NŸ>Áµ¸ût‡*{ŽàìóeƒKNXeÝÜd³¶Ü_åÑǼ«ÏËzõy†¶gƆ›Ï؆_å¬)H*LS9*Ô"Á_ ø¬¨1£Œ7(&zkÀ"Ö¨E{æ@g${êÄ,{U_Š|ð—@ªvdˆLÍ[ O UÅRub`(ÊP¨ññ#Aè ;tCCw4fÑ7aIÜW€ 4tUFHœxFˆð¥I:ùQM¡ ˜Ÿú¯ˆ…:â—A„d[á·Š@h°4ïþÌ‘V‹À¶ªò€g½éq…Le¿…qVϦÏ('ŽÔùQ­Ã‡9b÷ŠÞ¯Û±›sõ{ž­‡–Ê·glhe>aQºÚðs¾áâ·Â6|~ÜÎ¥û)l¸'ÿ[ÄM|à­Üµ›‡ÊÚ¸Ú k·þVæswôÍÑØ¶ÛáŸ`È(8.PüV¾*{Òä>.ç@À¹3õ/}éK.Õý?ð?öc?æ—3«W‰ËÃvìgmÅ5¾ a†©ì{f/ß6C¶öÆ6ަíxîþÜV9pÇ º‚Z1}ŸôWþÊ_9úÿà8õ}T”mÞ†·É+€g®¾yõõõõÓÌpYp¿•í"½T÷„x¬Bòˆ[Ú›¹LUìvÙN0zFΧç}¤áïÕ¤µ‚l‡ž-gø_KeµÁFÖÇp" 8.á{¬‰$@>:݃sçÏíŸ9}zËsvù|­ß1ؼçÂ=‡gÏœ[ßÚÚ8¹NǬa°é«ãï²¼±PðÙjE8G§H¾]=ë$B¥W߇Dòô€Z¹¶Ìº¤¶“׳G“ …©W‚d iCÚ*àȯÀËM@ñÑ—¸¸Ý”Uè‘S%H&º‡­¾Ù©8h…ñŽ¿ÕHÝGIJšNk"£YT8=*/‰ìtm˜‡l~¬O]Â7—"±„páÜ…}.ÑÙ``²Cç°ÎQÅ >xÃêýñƶàË’ÂÁ&ï1²ÑjŸËQ:v&Æ›ø#SýFB¿Kêx’»%‘Õùw<.S2…ÊC@R[ª7 @+ .•ê4XqÄìlžlcK`?x,× ln¢Œâç'<å–ÂÖqÜ´Òâ¡âJU:õXó€øI~é¦ò I„aK Lƒ£ €6ð’’)ó&âK? ÇÔoœK>šG…!NÉÊ+òi@Œ0®¦SþA;7¹qÅ¢({ÑŒõÒ‹/±!/_¶ûÊCmsLwï >vóÔ“Oî¨èi+­„UŽQ¨(£\¤CýÏq»¶™™6nÛQÒäáä7ËúÆžð[µ;<4Àk[æîȬá-窢o¿¶ùÒ~Û‘þkd¼„;;÷5'ðOg¿_zßù߸3ö¿ü—ÿò‘Çè¸&ÝËu2 X­»;Ÿü΀Þ•¼´íG«ñ0>DXq­â ¼ë¹£ràŽ¨5Ž^5ÎP1i0ؾû;A?q…åÇøðËì½¾s¸¶éÁ±•…žô‰ØVît*ºgÅ×øÆÕbÕ‘ºY)û ØxÖïxg´íˆú­QQðwPÃÒ¥2(ô[ùÛt–ÂueÓ PÒ†‡—èñ•±}÷ø%;ý.ïï6Ïž;ÃÆ¼s'XÂç®<>Y¨ÐpbÇÓ¦wš°(œTÈÏEþ @Kší}"à ø)fú NéÞp‰ÝÁ 4Lr•pã9”‘R¢‰ll33Ntq ±†‚ß’$ÑÆ@¢rZRÓíÓ¦Ëtë³1VKÍwH–>€[o:ÎD/ ôEªÄOX#`Oy¤‚õ<à4-#UšälFr#F•Ë šøÆþÄMÿFaCGÊ@¥/ÆPöðI(õÄWh´§Z¾Ï5ë;û@üØ Í¦hQ¯Ï>ûÜÁkW^=à[õ{}å!ßٯáó¶;ãýû\±:îÏØ:h®‹sPÜÎìyW;Êüv÷Œ>8ÔÓé]þÀ+{Ý*ï†Íé¶Ro%oX»µm”ío…>·Í&ým›&¼åG.áZ± Àèξ3{ƒ*Ø­‡yÏn¸t TA÷n~à~À‹tŽðá›”ƒ¸«ÆòqV/]ݹrºjÄñ™›‘†9è®û7YÜq€®”Vh àïý½¿—Û¥£§G!ÒvŸî¹ç7çïTq¦¿KÿG=O ÕMÚNº¨A©s°Ól»5hÄëîÖ#jž8{ö\dr„mƒn¹ÓÄ1ñÊŽ´spòê ²D¼ìÀ×VÙÛ‡@ïÀ#O§ÏŸÙã{õܘwþ„Êž³¸[ìÀ?qúô™›[0=±ÆhGtÞ:`…4w%B…þ[EOÇáIE¸“^“LZª×R>Ù™¸g^<†$81 („&xyÅl*eÇ ”üòmÝäO  ¨R²³ª°eÙ€¼ÂOŒÆë"´Yì8šȃŸñ¿[Ê |åó7ôG¼Yô%ȇ?VÍŠ»üUæÉ˜çIÄY:‚çü]q©pš„ʽÂõµ)þÔéä\ä±Ü5T8êC øTò&È:¼·ë { jÅe¥híÌÙsk½sïÇ!õÑS>òèþ•×®ì?É‘»¯}íkùØÍ·Pö¯¼òê\«PM]ÞÓ3Àä\ý t»·å±e?så7¼c‹C|Ý­ôãÆßŠ|ÕßøÚ*oõÛßv+ö¹­¬úÍ>mý«î†Ùn ‹ß<W3âį[%NûMxö ÎÈ5*lüGn¼óXŸö£7G¾§7ÌMÏâën#á½B`ߨ8ïöe»¦Óõ¡ýwíß9pÇ ºX¬ôVZ+¾iÕnƒßxùòå/s’×è®_ÛQV_IÿWŠÏvj9ï6 dWKhsž‘¸eEœ˜¥<Ü7ÏwæÏ<õÔ¡#’i4ˆ*7O‰"jÀÇ>xCð!†»ð}?¿Ã'lù²ÊþÂË÷[ 2ÖOrõ0[ðÝm·U4¼^wŸ/‘Ñ÷&Y™©±  ¶aÛmŒYžÚú,ózòB¿xüg4 r$.±£@–0ƒHAÅ¿¹¢ ö‰7®& :¤ep˜¢UÁ® iD!¿¦ftÝ%C»CÙò y穘ü®Þà׋aÐ ßB"œ?ÂÍÛæ«œÁO~T™W”Š!ã…¸6ÿ•³º+dPŽô I^ºÁñã ÜrK²£$õógF Wd•B›’Y¶`OE¯;ü}OÏŠühcñº!¢8òùÚ“gϰ´Î¬Ÿ[4Xæç¦¼£¯ýk^¢ã—ív¸)/»ñ\=ƶ¦Bm¥šãvÄ÷Š1³yÚªKùù¤-°Ž¼Ž¯‚ŸÂp o»Û¯ícÐvÓÑÞ¶îö+Sûu÷#¬Ý–‚îc6rêÏc½Ð­i˜L–ðI‚|c¡C{vÔÎ~ëÈ#u*{¿Sÿ—þÒ_:ú¾ïû¾…÷ßÿ÷ú5Ë aa9h´}Tò*{ËT¼Ueßñ´Åi3w7ì®ý[3îÈ€íÍÊïˆ×W?õS?µøWÿê_¥1¸{˜¢ô®x[Ëæ?ñ8×ǾÁËîsnJ¢Ô?M6m"3)¢ŒŽ1ÕÀ6Ö¤ü»ñØÌ+v¡åwùCPºgU÷_¼ß”MrÕ€»Ñ)‚;ð¸8;7‚œ<…²çcBÜ”·Ãl~¥ÏWî.p±zþ“~¾lÇ´‰øCÙû €Ž€']:¾G0䯣â&uÈ«°‘îD½2Пm|Ž0‘; +ebrw„È@"Ð…00š‚x¥l¤žXµ¹3AÔ /‰tì²X(­.(ï¥â­8¥|*’ÂpI‹ˆ*É1Ë ­f0yÌ<ÐÂc$¬™âí²Kšƒ#õ%‡¥fÖyµ /iZƉ©„—󸽑¿äˆÜðò5{ÐÃßh8â&^P+ÀBÉ+WË‚ð¡ì÷¼¡Þ:¿QoýÜØÚXÛâS¶ÖÙmÎÕ;«g3ÞÁ£>²ûÚkWö¾ñoî|ë‰'Pö¯ì¾øÒKÌBž”*¼ò±Úc”+áèµkfõsåœãz$ ›ø°£Ägtã7¼Ã†»ýÚÍN·•{+ö¹mŸ nëîÇÌÓíà<¶îùƒ|ñ—¼é¸Ý˜q÷l^¼i6®[嬲ÿ]¿ëw->÷¹Ïe×ý/þâ/=ðÀyWïû{ûû4nû6ËQEßaòiãjª²ò¯Ðª «˜wýws ràŽtáѨâôkR8èÃêZ*½íÕÀ“¯¾öêeÓ³hÐÏs->7¦³¥s´Ï­_IAÆÎ7MÓëVPü¢­ñbì|Ù/Í’=wÛ¢Øw·w¶OÛ€C—®šs͇\”sxZeáÂÎ…{îÝðû,ûy…æI¾BvjÓ/ÛAqë³»ã:5$qöçlÎÕ%^¥Â„ØMÙ,•‰‚9óS„c¿E.›ÄU2JÍÐŒ0ýQaTŒ¡ìG·i>$∭P×<Žé¼¥ÃÊY]-0Å5ª(è¢ ³â ¦¤-ƒŠoHNì¢b…&´R–G¾Ì:ôÊ,k CÌŠ KDÑRqÞiÀ#QË—èP ÓæÜAAŠ1‰×LŽtx´ó€mVK˾³·ƹú-ÎÕ3Ý8µÁµÙlú÷õ+¯/8!sôÜ Ïís=î×äòe»‡·™‰:³ßc3™Kø­`%3õ(3g÷½ß™ýÛ½«÷ú\ãGq#ͤÀq¿’oüVòí·-7L[ÔMXdðvkÏ“®?6òÍýºÍµØ¸5q›¿¤;+w(ÞØ*fúç%|ÝìýñãâOý©?5¥ó3¶*lwß{m®,¤©‘ޝô7ÌÀ\Ùqå§Ä´ ,kËܽ‚~×{7Þ2îè@Wxß³kºQàtàòã›`.¿ðü‹=øŸúÌööU®ûÜÈ7ì>UJiÁiC4@<åïF¥o¸Ž|–ˆ8Ó rŒâÙ*íÀ„†¾ñ]ßó]oð}ðC6ùœ:Å=nË[÷³¶œ³_ã¼='í6Oó>”YŠÍ»×|Æv›~~¨ùôÌê8ÞW àGT‚,y’æôcâ—¬Y.Nà€$ܰ™âC¡J£‚*žQ¤Âí„fŽp•ù”Y…˜X­äñ§±J ÐŽD!$‘ýàÔOD€¾ªP”ŒjâáȓÌb„A3öHG†;„uªE‰íiX9PÊ%ñ›F…‹Û ÁK&JÇÐ†ë·øÀÚRnàO|‚.áúÛ(†âw°‡K^Bà2‡NéÕhLó™An 88¾‰²ç"^Õþ?cûÚÎÎá“O>Ž÷ùz¿pÇy/ìú[”P+dIE¹ªðx¢è€N¶npZ1·R~Ësõ¶ÁÛøs»Ý£ÝJ}înXäjù°[Ö¶Í9Ý«þÀi§ÚÇäk?A‰—Y¸ Ûµ›óŒÇÒ½§kÄÂÖ¶ÏqÐ.‰/}éKQü¬Úy,98ÎîÝeoxõÜ6Ä«97åéWÉk“Ç9Î,͹)ÑæJÝÊ4ÌÜݰ»öݸÞPQ^oœ¿•ŠÖÄG=ŸùÌgÖl¨gOéˆ`x?°7Ù1û}ñ‹?ú³—/¿¼Ãý$wV)ºN¬ô¬æÅ²‘ à€ç!Ä:æ?Öï×YzŽÃ³DªòN£gSïé]’evf'ž—üŽaˆ‚겿ªdÐQÜíÇ–¼e¤Ou7â•l³7lE|%o”Y ôZ†øÚoXQ„7ž¸©à ß°Bh2nÐ%¤ÑSBÅÛàòLœOýò‹x~q+ásx”%ÀÝy {1z̵‰˜GÃ]Ö„1b‡èJÜ!KÒE¸6ƘÊAAò¥iYçÊ]¢Ö¯ —âQ¡ROrÉ%•'ù]6ã­ÜrgwV‚¢P\6æÊCf <òÈî·žø_¶{™/Û}sûåW^áó\¥Ç«d¢ûDQ"ÇûHüXVŽÚµ²§Í´øñƒ?¹¥3ðwn·»ñõ·2Ÿ» oå®»ý­È [u›a 7L¿nW(Úß6U?•¿ýÚÙ×ʾm•´³rt0k¼“ÏÆwàÉ(dˆ=O¢V@ˆl¸†‘æÚ Ñ þKåè< 6àlÎDÖDÄYPGá³i(¥E\¿’Æ%:gÜÙm‘ô‰Åëo¼¾xò©oí¿ùú›_ç;õ\»ËYûÝG¹D‡zósõ­(³„¿±±ž/Û¹tϹ¡e¥ÝO…{ ð•¡qÛ­=lÀúÛn·~shÕºašÆ)g•Ä€å¢0Ò3r¹Â˜LÊÞ€}ˆ÷Þ»™ÎÜüÂ/üÂ;ñ~ðpñÃ?üÙÁ»”/ýÄUþ}®^åÞïæ{s(“1Þm‚éhZÇ€w=wsàÛwä ŒŠßÑúÇ?þñ\iù_þËIËu6h;‘O<ñØ7ý¼ Ôm¹+ N¥¡ñ×Ñ9}D:Y]ö* Ư;s 1Áõ§û–gñ[E4Ì4á•=°ÆfNWü01‡¯0iA ”=õŸîâSiM¸?¥EÒÏ\M‡^UKç¡ $…(O~c°FnH ±ò;‚ÅÉŽ ñý°Š¥ÁSH”·äpkôAGôãFY'¤ Þæ)¤A8V—™´±R)‚XòÊ<3~„àÐ ~°*(Hå_þ‘HÆá©cú£ÜåÈg5ZŽ(`{làD§Èœù;8Ë%:[gÃ8¨u§þbqùåˇ>Âq»×¯øÛmîÁÏÇnž|òÉmêz+ÜcÊ”¶A}_GéfS^·³{Hvœ(eòª•óêüÆÓž»'|àín[9ÄÕÖréž+wá­Ðu›Ôö7ž°éAÎଜÇp|nx”íÀÍ¥8—T)ûïùžïÉR¾;î9N|ĉ†Åþèfvß«‹Òiã’~Ÿ«·ïñ®iº2°j„7¿[¶¹†ÜµïæÀ›wäÀ,³qÙ Åû>îÓŸþtr’†™N×þÚél½Èöå½ý½—9öþ]K>S’øé:Fžþ%Ýqõ:ºjýmÒ˜mäÂR®³j£J¬ÂBÑ ™íÝB ¤èŒh VÁ†Pœ"C~†?p<(Y†@Ë-ÏìaGµ"mŸ’±ü%§˜²¨åqí¿Öy€4ŒZ_&¢x¡ eÒiL©(‚…î/h…P"1bލííðII'°ð’GIÆH…ôÇ;öâ#²<åÄø'qã«E²ž2‹xRÀRè.¹NGª“á`iù7.Rrç¾4]ÿ9Øe¨—MyõÞ~~Mq±Å•Ë’´ûJè™gž;PÁ¿rù•ƒ‡zèêK/¿´ûüó/ì¾ôÒ‹;£>Ï•jÎÕ£Ð2«7Å•sòÎðuCZü~Þî]ý[)ø9L=§¥[XÓm·öüiE.LwûÍÁUwÃzVo¸ù'Ö‘Õ£vÂŒÓF¿¦í†ßµïæÀí˜wì`53íæ†è%:vPgÙÑüïB¿véþKìîïúÝov*£Òù§Ý²cÊÓ~'G”4rù—ÌÀŸ°"-xð+¸f€žheR›aŸ%l¢5OhH"…ޝ­šžu€š’ç&¹ > >ZDñ'yu)o&”;aÁ\3¼r‚h$ŸÆùg¼¹ Êè7ªò“¦¢Å¯yG ¸ý[i^–BƒNA‰áLÛt;ƒ¡ä»~è…?Ö.A7PØnYÜ{iÄa:ª( ©d _^<*{–î!„ºg‰¯|xÁÃ×í6lðÛM¾lÇ÷ÖQ;»Û –Ýßxø{¼³g6ÿâ¾—è¼òÊåÌ쳟`PqZ‡s®žøÓ¹zë¶JÛå~qZaw•}”6õ±uÏðq:¬/î1~‡wXÓÔßî¹ÝÊ\˜îö·Û,l·v+ù†'‹G›ÔÒiˆß¼ëø®ð …?íÀí.ß´ïwó\‰{ôùÏ~Á©†…Ëø«Ë÷®J‡üË#[qä¥i;žñS¢•Gžš<ôîïݸsràŽt#õ£Üлu»ñŠQa¯3‹zÑ÷zË;ò ´›ª–]|é!ÂÒ®qÔr;¨uXŠVê‰ÌÿÕU£BÃSàŠX'ôè•¡\-¤ˆ0h†7îBÊj01L™‚œ5~÷TT£»*Ü 1)ºø,„0+ø c|d%·ü ùôLp‚tgîÔ‚‡ÈqÄÕWÒLD*O„1XAkâ;pŒC@çŠ+` zŒ”ÏÞ6bÅ(a–O‡T“F#êP™ç7n;ù$-JÅO•¸Jƒ|&õê¼ÿ¿½sûµó(ÓüÚ¶·94´i‚!$c!!"é"¡Ã!AL!#"A™Ä€Ä€sà†[£‘r7€„P·‚´`Òƒãó)±“xÛÞö>ïÕÏï©z¿U{eÙtg¾xû-û[UõÖ[‡ïYk×Sçò¢¼JöeÛÝFm·[Ôù8óççØn·ú¯ÚWÏêûg_úËž=sÚv§^½¦–—[â52|¯|qóøàˆ^ºð89Û/}“µ~ø-kÝU61®Â‚è[‚oÝQ—Oúãþ wwCö&}…îGeëÜUæ¡yÄô¶õwK¸·ÚÑ#çÕËë{_½Ãè½þóŸ÷‘ÛÌ×ïØ±Ã:7ÝtQ×ÕÞ[_²U!”óô#ïÐ%!~­mO~$—8—| ð×µµ8©øKí*—Z‘Õ»ú¿úcÿL /ÌE¹¸%wDWýîÅâªaòwZ…í;mç$ŸÉʼnDÚÄCU}×X«¦ºSv”Bk‘"·%‚áí—´ü/o¨ôKºj–*~G^£HV%y£«ÄËû— ZNèè ¦¯QJ<¤ÅG!\t%•Ud%£ªV”N¿ÙzD”®“w”Ts*ßRç–8N†x8 LI m¡® P&Q”’r)QI ¥n”A>üL!–¿7áN8kvn¤AùðŽRÞ$¢§‡N‹ò4?<<;;»²W‡çœš9µtäð‘Å̱Վ…yŠLBüªˆ›9zÀëKoÚóïC¿#hé:tkzÖ‘ßrÉ:Ý6|LÞêàn 72—±†…›CnƒªòpGz*_˜M„uÑ kèÞªuôðYÿÆoäüûÁÑ£G‡Ü]Çw˜ÐiÔ“¼ò-ÈÍÐ=†tCCø¨ÄmqÂ…¤+X_\² €øãäsÝu× n¾ùææM=t§Þ‚+ýS™Mi«à¿Q+žv@4…2Ì,†ŠÄ>]–ªYEê Üá5ƒYÓ¤r‚KJQïÕ˜®¤$«ñR_’>'¶Ù_?T‡9´Vnîô+qLT½R”ÚJ^¥KgAJ„wFÛ&œ%]^¥”¶ä^òDj11"ªª§*Ûçr+d*F}d$'O^¹Fs9ðÔ¨ò‚²J >©”WB¹½æAº…äyÓ‚2º¸‰TF$/–¤^óM*Q7˜Ür Û’÷-øÎýh"=Ìäýôœ…Ï–;¦gNÏœž9}zõÔÌÌÊ_öüeþÌé3K:qrAçá/0|/òâ7!w=f‘'æñ£\QKÂ÷‚<ýNMàUŸxŽ«2uîú¢G£Ö[Óˆøa±·6îx‚Ѓä[?àâÛn•1ü rÈ!Ã`{¨¿þúªjâ Â–ElzõÆ_ní÷;VÜßsÏ=C‘ýà¼ýío·Þø!:ü=³(£†„ÓÁ‹ò@!M"ð׸d¼•-~ç°š·6¸]Ät¨7醲çTaÌ©âßV¸¢!'ã@2…{”0RIŠm)ήzƒ|*Mɺ£` ,Œø(4$ä0dJ…øJ·fÙ¹“üp¸`[íõ[VâS ›…GI(Å]Ò¨åì2(iòn‘’«râTã4±NŸ¼#T¶âàíðéÊã …¡ OäM:øëä%#K­çLˆTžÈ}¿!U‡…R(R, ҕŘRĈ°!{“ 9 GöÕk“¡]F’á ûü{Í$õ²~‚}õêÝkaÞÉe‹;öÌ™%õê´=L¶sêüÆ‚0}…-Ãøú½Åªûñ¹ú eæôq¹wýn;w„Ëît« ò½H³%xdAð­eÅ7P‡»ó«Œ¸ã‘³¸UÆ525r|âáà d¡W/C/ÚUc‰½ôCn·ÓtÈ`÷îÝÝÜéé•Ióõè“.dÏCÚã‹òœ‹…kdjyF‚t%‰€̹äaˆ?îvõo}©X¸M[¨Žœ>}f϶+¶ÞÊÞgÅQãG5EDv}ÉX*±öȪ65N›RÁ ‹‡(ÕŠ…팈"¢ñ ã8’¹Yàd*DZFÑ'Sç9"»š)kýœ`ɱª‰ÀœHÍ›0œR%ÔäYË„7LÉ•tºÈ ’´ü/PVªmÚQn§áòÖFF}ŸHÛ‰9 ÅFH¸ X3©–Eè…nÏù³ÌaMIeå«Ô ¾ʳ’¶&ÏeÕi…ièÔ¶­Û¸Hɸ -Ê[Ñ5¶Ç–ggÏé§c:wÙ›R´µÒñôÖ†¦/HKz ^‚ÊÃ^Þ_üâÅë ŽÊLfYÈ ÙΜ|îä‰n¸ap~öܪŽáõªíµUÑ*!¹R‚Tœôè£òêHP HׂúU@… O•´éÉ{¸Ÿ„«ÒŠ)€¡ÈMWþ˜Ä\wÃÔmŽ‘'…+‰@bnHTRt ƒ(.¿?§• ‹A™Q-j‘d<¦–5’ÇouE**4d" ÜÕzß")!­šu„F؈xÐé( ˜Œ¬Ð±-§*4“U”€°p׌ª¶|h–á|TH®5$u 󦔈]?oç+•«"\zEU E^r%ïwoUUѬ U‹\J’Šy4jNÛ\R£hÎÉD’Ïn§Fr6‘E)UX ÈP¼/2– ]“€+š:W3Ïyn^“óô6õèë.çC°B_£>«Oyj‘klŸ~úéö2Ïe7 á‹Ì‚lýûPòì«ça„Ȥ Ã+Oo¹“~;÷n‚–^¤áý÷J£³që "oã¶ò'?äηڸÇýAäÈ[7ð„ÛóïUfèa°õØSÝŒ}õôÌ!e‘³‡òq×á{zãœ,äÃr¸ºÒ~üñÇ=wÏe7ï|ç;MîyÍÃiá&’½/Íño–•ø<ã&ôø.ôî¥$/uÑ`ˆÃü!»fff¨\¨ë¨©‰¨,‡þ×÷Ýv[p™8 CE%ÚÔWª‰Z°Ö&Q×KQ9É&'H†ßMˆŽ)§Âõ¿4ÐÁž"©¡Ê¦>÷xÓÖ‰T뀽l7/é–¤ì#9;HÍê'}¹]¬äy€Á"‡‚Æ ® ¶!嵄]„+±‚dÉÛQê»—ÔºRœ§ÞÎxno½ Ñ’<§\zõZÀ)Rá |Ó–+|ËåšãÜu¡{ìø3ËG^ÐÐýÊž={æOˆägDöú=0 äjRÕïø’»W­ß söÞSOï¾ê¯!jű_º]xë®iEœ°ƒàÇýÎWqÆ Þå«r~U¢&¢=vìYlU3¥{‚G>×;TÔ—™ ´%s¤W¡/u(¥‘^á~¨¾˜¦NSRõä=)mÁ‹Òœ¼u" f )Çý9ïR¿7ù)&ª]Á”Hi`D¾”±$½þ¢OÇ+ySÎh€y§U»dÔˆA €ŽÜ%§pé’eÍšlJ,òb”Cn”0¸e¡ÏI4Ùà!†ééõOë®z®¯Ýx¶nVSÏóìì9í¯Ÿ[=ztïÒÑcGtbÞé¥=Oï™)q¥í’¾sˆ–§#M”摼ä¾Ažú óÖîçÕ8N3â×ôC?ˆ=lçA>ÍCYðG™pó» îxB?‡<ì pÂâd8;¿Ýµaì^¼FFl×Kj¬CøôêªgÞý _øÂ`ûöí¾·þ¾ûîžÚÖ]àcûØð—¿üeGIT ª½ê_[¹Nê^€g¯½îM»æç´‚{ã¶„ªUR1dÏ×ÕÖ]Ô¤Ö Õj»‚3™ÑfPÿ]ë*rôÜ©³GD\ ®Ú†c©æG_™VMÇeˆWʤ]õäªÍ ´mHÓå¤×(˜hЫè)Ž£IDO¿ÁIjDâ„ñ>DãƒF’lß#¨Y­èh\/•sÞDàŽõMS[§9MCùš2àÒ›ósç!Ÿ•óss«ûžÞ;âä‰ÅçN>Çv;¢£aeˆ—'ˆÓ‡èˆôL²|¿"¬˜«oÒõLÚúŽÂm?ú„ɶ¿ê»I?dèó8ÏêÈ‚Èñó„»uƒPÈÂ=©g¯âL>üð{®½l÷è!ptÚ†/äŽPdîCv˜§ÿæ7¿Iƒ`ðéOÚûê!ôñklÙRǨz4"x„­I?åéH“¬3Ö]€-G2T–¦¦ú}yq—/éFµÓ6n¸îv†¦Ù §Aà&´Ê]mÄ.1 ‘ƒ"Y w!KˆÐäíO—’ªz¬B”"m;øÃZÄdñ_!Þ’.êÄùŠÀ¼N RpºøeŠ»q”ÏŠD S h¶(‚BnÝZn)Ô¦ˆ]ä‰:'1zA8ÂU ϳ\.Òä6ožžšÞºYªµñ ™vc Ÿ}æYßl§³ðç_xþùÅgOœX`¾ˆ'zÞA¬&M‘Cø&ÙÕí­×V;ñÛ²ˆr'èv»éx”ýªúãv„c·O{kãnŸ–ÜÇÝ`ƒœ§%z†î#Ò&céq³(¯êXŽz̳[³¤çC° o¶Ù±ÝN‹÷ßÿ€ÃsX´G½5?DO Èž´ÇåEŸ°qã†ï¸0ý‰@"pÉ °nT–j»yFå•îê¡CG~Ë;o½ßJž)þ­¨Œž¬WÅ©q¤)Í[—’,,X [èò_ºåNšªC&qN=n¥MïFþÚ«.é“h¥Û’œ5Ƚ˜" _—P^Ò.· ŠoÄð5:V¤»&‘ZÖZÁ;vÅ… zè%uð)%\æ*ù²f̽~5¦¶lÙ ‰˜æç<¶¬hØ~åôÌÌ’î¬×e73¬¾×ív'æiŒ)áx >Ÿ¯½ù«j0DoÞ6=|=AØÄ±[™Ù-rÂ!O"ûñx¡ÛÊI§%øð·$Û嬺¸ÃláÇ?¿‰ð«˜¹³¥‡A×+ï™§GR¶’Ü4`‘Ñ›ç¤<†ëß÷¾÷q¾{öŸúÔ§TQÛ µ!=T¥_c”x]J„3® ›tø¨i{´Aaü#œâÇ´C—ñdÜÐpü¨ƒË«Â€£?dÁÙ÷üSb‹ËK8NO~ƒVák¨Ø7Û®n¸/ÇÑÝô¬¶_Ö¢±%­Àç²›¥gž}fAóø1Oß’êÚklEðZ‚ïÞ¿Vók=·=85½z8F,Sþ]¸Âp_È<>ôZÙ„èƒàÑEžÙ¯2†LEà „vØSãx_$ì ®g¨’ÆÐ˜•È®~ËÏ<óÌàÞ{ï~ðƒt8óõèG£!†Úpè¶ìAðþ^õÝŽŸ˜‡œ40¸Ã´î¥$ëK¾Ð~-Qy5C¤Q!3Q ilSt¯N{Û¿i£jÈÚ“¼0œ‰²ÔÕTån@ŽÎ¤V’›0‰©JîzŸðâ&ÞÔö,ú§ý…$RŽ£uÄ7ÈJ‘J„—´#=$kÂÈ@â.;žN†rP¶âU™Dö¬ºW¯}¸ªÓð$Ñp±ˆž‹n6êÛm›eoôIy º¸nqaa¸wïÓ‹:_|iß¾ýÌÓû[á½ê Û z€0ñŠtºUø¸C.;â¶Cø¬~è#ëä5~øÛôpG9ÂD~Ê…¬µÇÝ€‡Ìvý…™Š6bûªçùyÜô¸5ŒîƒrÔ›·*¿Ïø2Ä.ârÞ=={S0xðÁ‡ïxÇ;Ü[眖ìÉ*ââæ¡Lä†þ¸A#¸Ûþ4‰@"py!ðâšâ~ÿèѼûÝïüîw¿‹ÊΕ±*Yˆå*U°ÇÕ£zò-oyË®ÙsçV´(m$Xzôª×!gª÷Úp¯YmêOTâ„A9°Ï[ö¢8¦*Y”U1ëŸÓ‘E^7ÜíFP rLml@Â]EíŒQ(‰fI«¦ïxå£4<ÛñÝ£—>iKÌ+2É—•yDâ [»ajÓæÚjw%Ä?X˜ŸÓb°ÅáìÙÙÕýö«zéÈ‘£‹‡šçV; ?/ŠPèÙ¡šDEfÆ—Ü æAø’“t}Û«'^ëŸDöÖ‰<ªeb{MùªßnÈ<_˜…»{*‘v~°…à¥ã'‘ªÉ^[ä,câ1Äyßyçî©çü{çéœÁÕW_=xÃÞ°†ìù=G|ÒÇV]X>'‘=ñÒ$‰@"Ð"°®Qñ}üãþèG?ŠŽ ãà—! ÇþøÇ?>yÓ7Þǽ V«›Ü!Kªmï¿§—L‹þ²L §”ÐSÃÀb}˜bíA™V„,é»ãpÇ)òX[(Ø…¶®UÜk";_/$g½R+T/Fyè½4¡\z‰”•ø7m†°¦¦é%*#:sÈ«:oeß¾}ógΜ]>tèàüñãÇfÏž[Ô ý î M¯À–²iS<¯Ãgõ}èBÀAÔ„CöÓ÷ræ÷‘Eœqw¤ÑéK×yÕ´Ã=é ¢rŸd*ÛA±×<*[øTÂø­@ö|'l»Ãf­‰ß¡Û]C‹[‹ì|:ûêuS%¿»Á#<â#n92wÒ¾z¦H“|Ÿ§'íR4\#ƒ~˜Ö²´D G`]5¢âS%í÷ŒU˜ÓôZ7iOù¿éÆÖSºæïµ(O¹ê[×÷8ˆ•)”êº]ŸA­’ÔàÚ¯a„+Àbá.Ñ«ºýU¤€ÚxhÓw4J±ä,rÄÒeÞÆ+£FLû-û½y ¶ãMëHÜÍõÔ<½§C]c{j8¿°°¢yúåý½î©?xðà‚n¼›ùpÜm1xA˜Ü£àa|0ÔcÒ¦W/ºkˆZßA'—~Gê­[醜|:}ò«2Âð‡n—«ÊqÎ3‰àC”æ«4†HÌ®Î$ŸúóŸÿLk£*mZQÆ #¯Õ‚¨­ÿãÑG¿ÿ¦7]ûñÅ¥Å% Okp|HuÄMŸ°#z{SäÔÌÉØ" £X?ÜT¨¡ñlÃæÒu˜Òf”Ai@M„^Õ%œïŠûêEúΉ0NÌÛÂV;‘<#ü[7?ÿÂs+ :ëàØ±£K˜?}æìÒ¡C‡æOz¡½¯R5Iê¼Õ[ùxž^v;ß’sœ”‡¬Õ 2ÿk¶ã)î8¹#Y{k¡‡ B†~Ûzl?z—Î]e²æÞ<$€8zLÒü–BFtŽ™æ`zï>úèû[ßúÖÁ'?ùIÕOê­3„O:¤ÉÐ=vôðxóQŠØäD?M"$¯ëj ¨Vœ4p\ñËÏžkÍùO¯ªâžýçù—ÿõÀý÷L‡Ïl˜Þª=Ð+Œõ*Û2¼NŠœŠÆ™„™Ú±D¦k:STè½3Ü f XÇÑp¡à¬HCÿX˜W.­xI×ËêY®mÂu›WàoÓJü ° FG/Íë®®Õ} Î_Ôª|æë™«‡Å¢G[ó•ìSÝù÷’Ó«bÆŽ'æê× Ù+]Ò¼Ñwq›tBFZwø!päØ.çw<áþ^«¤~Í(ŽK¸Ë¡‹JÕsO!z zó+MOþÍo~óàßøÆP[¬-á¦ñ…v?Gã‚Ey“5oç×~”ßX+Iw"$¯ë¦@¥JJÌëµ×^;øÓŸþÄ0ntÛ!)UÞs²_û‡ßÿþI­ºþ?×¼þõwéPxlœæRw¦_!gúã¥OùSÿEÊ…‘gæ6¶Ž¤U\ô言º mŒBæÐ•Îɳ>‡èˆ‰ÍZÜVÈ ðôæéÁ•ÓÛtŸ­Ö(hcþ³³gu,îƒ{^óõ{絘QwÕÏ,b‹À‚Œ!Q¤ðp¯^X¦ž(=û%¥µ¼¬Q|éµq‚è-žF?Ümd­¼ Rw¾Ò ù¤‡ïæBÄMXgCàø1U^Ö±Œß‚È7жÝ–F¸˜ìßóž7³“¤ IDAT÷øV;æíÞ½{¨)"ﱇücD)Ò‰Qzÿ¤KC È~ÒѸüÃP&LØ!O;H> +ÔG¾¯XžÑ£Ç¦ëJ§4¿ÍB¿ ’sJ '­lV¥ýw"„Íÿxë­ÿí‘G¾ù?OŸ9}Õ–-›!a廂v]-ljOß(Áå´ƒël’/¯èž½‚V8HXë$;ñ¯z‰ÒÛ°QEá³ O§æQÛìÑp€Ž¶Ù-ž=«kl÷<=¯÷X85sjIò½Ä$‹ý¢ív}Õk‰·ý*£ÝU§%òvßþÅH>Òmˬõãvùªî ‘½‰^eÝxÌ *gø±1]¯__/$ì¡{zç,Êã;(QŠ2iâ¿ûî»ÝHd¡¨Žð;yï{ßëUøñÛ!DŸ8¸±9k‚çB0äŸ&HW3ë®ØTÄÁ 7Ü0¥Enº>vã”*qF;x8þl‹dÛ%Û¬ãRïÿ§ÿÓwN>5Ü<½Ùtêñ¶2—~éÄ«N‡Ç½½Žº¾}©ë8(¤ÁKSKã2ÐØ~£Èžyz.½Ù¤î —óççÔèXÑѸÏpBÞ’"K{þò´NÌ{aqfæ4ÞwD*b‰cq‘Aò¾«^î–Ä[7óõ&rt«^„[N:Íy¶²Öí|¥ßÚQ¾°€¸[ôðCÔ¶qÇS±¹Äš÷>=n‘° ^‹é¼ºÞ õâU|.ÇñQ¸,¸Û¹sçà«_ýªçìo¾ùf“8y ‹að„‡ùúñÅ{V¨脉tŸv"$—ëf  ›@e¯€+rÉ ÕÛ&A ÷¯œSÏqëÏ~ö³ÿ-÷kïúÈG¿vþܬFã­'ÒÖD{%ˆJÿe  çõUù‹;Ô?¬½Dq\/‰Ž²U~ӹߠá›|bê便¹ÕÿwäðâÉ'žá…å½ûöÍ=sfñŒˆ_»‚xa"©(Và›è)»ˆ*®± R7I«Ì¶¥Û‘{ëVÚ\î5q«Ÿ¼ÑÁ&|’Ý•QááÆ‚è‘ìªgUÙ°Û‡ïËb¾CÜ w¯’KL%éá5×\3øÒ—¾¤£‡ŸóuÐ:wÞ:ëÁzíSã{ëɇ§5«­•Òæ+†°×†¦/HKu5@…MÅ AP¡ÿú׿èªS‰ÄŠËËP7»¨é96í =W+èïe_©!áÿþá;?|Ÿöo_£ÓhË*pÅ3 {14„ †ƒX€ótZÞ¦i/ú’›FÃ`N‡èèd¼UÝl£yúýºÂöyŸ’§¹ûùsZ”§^?ìÄj¢—_7nb‹o…蕟ɼêG¼èÑ›¼h@ ×éVwëoÓwwå¡Lžq‚oýµ‰[ïÒ’ºÝ¿VÎ÷d?øÕ8}×#—̸kï¼{ûœ÷À µÈqpÏ=÷˜ð!tVç“>úÜÈ1ÈHÃBèX Z®ðvö¸^ŽD HÖëª0þ}h½À)\ë¢@€©€+õ\-rxzþW¾ño|›nüà-·Üú_u:ÛŽ­[7o¥è¤<í£W£@söîù/iXrP/s(²_>7{nyŸöÕ¿ 9úºìF§ ²¯žžzo%wÕsg==z¶Û™äEö-G¼òq˜t!xH™ðÐ h8žüŽW툇 ÷¸dß•³ê…܆´‘™¼UÆðKTd*/2L§S{Ù¾¢¶Ê;’F‘td¦88‡F€Î¾Bòº)pÀ:l¹cHŸÅv$Ïw€ad Èžõ<&l{êǨX#i¤3’¤+HõÀºmˆÐÝëãp–ÿøÇ:ævšC\ÖçF8€Q€+%c$àD$WËõÖ­Û®}ãŽÿåõ×¼þ:õ<ÿazz³”oÙvV§æÍž=»2§¹{êÔÌ ËºñNœ¤Côµ‘Pqƒ(Mˆ"z¾ò+«ïeã–OKÞö« „·rÜñ~¸ÛøÈ",ÒÆF6n#‹‡²âní(?vzØkzõ*§‰½êáÆØ 32ËQ‡¼ãp-ÔôôÈç>÷¹!‹ñ´ÈÑs÷칇Ø!ôÖÔE~&žFië§±=Â_+M_"$—ë®@¥/"íÈC§Þqë„-#tÛ©î¾J$²]'ím×Àßá×ãAuÓX`ä€xÄgL™.(£ ç¸EZì­w_aAÎAÌø»!|•µ%tt>ÁnÃ"­ÖnÉ>žð ø ùÖß’ý8áÇ|½å•H!ìö‘wt-dÍú õ@Ô¾ Å÷5¶nˆ—&HD`2e¬trØ%)J?lÈ™ëSõ«_™ DA†4 \Z9[7r]r†é•¬‚BŸ—‹žié±¥£…c»ûÉÑ‹´ƒIÃD-ÝŽì«yKøÄiýŽGÞz"¬KW2—«†!oó7vûÄû Ãm¿Êh·Ê2“v£ƒÜóõô¸]y[Æk³'C#?—ÛÜvÛm&ïÇÜäϰ=2²P~ÖçƒFiÕÊÒÍvè@ú<­A^ŠY¤‘VØ­nºD H.ŒÀºàUƒd z: w°k×.zêS"Øò§ñÃð Öx4@~lÖ`Óû']7d“A† ‘›x•vø…ˆ=ä¡ñÙcOzœùÖpìñ'Ê…½æQï Q˜Þ9Ä;;zàê‰[†¢%ªÂtšÐò€Eyïz×»LÚ=ö ¸Çþmo{[7 C<â&ˆ÷¤“òcJ‹; ¾àŸ‰@"¼\¬Ëà@ÃÈô"¿ûÝïN}ï{ßÃ=%™‚¦Øk‘3¤ÏÁÇîÿ é\)äÛ—ߺ5^LNÓ€x!IlH<ì–È‘û!öÉG# ü¤…{ÜŽüÂ&|ÍÐ=~L¸ec¼OïƒÜdÏH Ó$"uˇÑÝ ÞCÿ‘|„³\~óÐC ™¯ß±cÇ`ûöíÞÄàIKéûA†{¼7Ü„ÅyD>kåIÏá•Hqó`†šÎÆÇ¦§söE­4¸½îÌ™3ƒ/ùËl­ÞrË-ƒÏ|æ3¾»žûêé±®Äc|i@ð`°=7µlkÄ”%M"$‰ÀßË¢@o”yåßüæ7¬˜â67-F£ÀûÃZz4b˜?­?ÈŸ81À·„d¤w+oÝ/l“¹ôñ;mµs‡lÙ3tO8Ä*"Æm²òEŽ›}õêÙ{Xž{êѽóÎ;wÜqÇ@— Þ:i` z†ñiP@ð¤ƒ;ˆ¿h•Ïȯ•‘wšD HWëºÄÄ£?üáßúÖ·¦ ?-^ƒÄì‘ñDc züa£ŽãÉcÒ•'H»%x‘…œ°­±U–.-•7&dŸw ²/*ÖñÐ{õ»×O»ví2aóÎ\cKïÿÞ{ï\ýõ.'ì:àx,ücX¿Ž$„JgŠÙ‰ŒùÈ—®D HWë¾à„€ïÿûƒï|ç;Ñ [ ¡©Ác·=þ‡Þxw6Hºm â—ÓK™Šh²4mDú/dJ}ìŽEu(Ëx^Ÿëj!oÈ]g øH\Èþª«®êp(ê£Ï¸Æ–9úØW^ㆼ'™Iº“ôR–$‰@"ðêAà²h7äQ±)€¶ /žhŒ“þ8ùK¶Ä ©c:r—²È»s†²Œe ­Ù×­qVÇáЛg{# ñn¿ýöé@äÜp7NÈ—lia3—OÃâB¦]©é…}¡8)OD ¸t¸l|%$€üàƒoûÛ¾°G$É­,jƒÔ!zt£! ‹k:v•×9ÑõpƒÝ¸œtY—Àv:÷ÚEºÖÅ¡<*וöýèGÇgè~ø¡}ÈûæÙ~Q·sð1*@Aü}-£Óÿˆü.¦3'ý‰@"$—6‰]Ú¯ñ/=dÑц8Ÿzê©Ág?ûÙ©={ö‘úú`V·Kw ñ×\ݽpÛȤ$ooÕCÆÙ`x]„îƒr4ßE©iyè]ä=¼õÖ[,Æãüû|pxÓM7y~çÎkÈž,y‡0øI‹FÅÅLÝ4‰@"$—/—]€¯:È2Ö°ê}ïÞ½ £OqhPÕñ¹‘ȹcLF 蹫÷ÍÁB>0Ç‘ê‡æÑ™2ªÙ·a¸5ï¹ù»ï¾›Ct¼Ÿþë_ÿºÐah|_==yÊ i·óõã&¾•'Ù·h¤;HD.Ë/Þ6˜w‡$!Ù?üáàx[nlµk0¤ÎJz˜azÜŒåq*só»wïèü{Ÿž÷ðÃ;.k.´¯žòv>e7MÙº $ûŠt$‰@"\˶&ÑÀfÈŸ)H—†sé?ýéOMÀ̽ÿä'?™bx9wî¢ç2àÍÎÎvjxž^:ñ1ÚWïóï_óš× ¾øÅ/:­Ióð‘¤ÍA}¤ãÄêG’}‹FºD Hþ¸¬€€pÓ p!†¤þóŸ3J0xòÉ'û÷ïÜwß}nïB†Q ħ!d=n’ìÇI"$‰ÀËÀeßÐ Ü cü<짧DZ·‹ëÐ#¼Õo¿Èžx4"èùcB·Õ‹|[Ù$½6<݉@"$‰ÀË@6^Š<ÄÎ4½ú ù‹%Õ’}’üÅʰD H¿Ù¸Ê/•´_j¼‹%ƒD H—l¼8!xzñAôÙ£ f”D H^È@¯ðgæ‰@"$‰@?”}kýä¹&‰@"$‰@Od 'à3ÛD HD O²Ð'ú™w"$‰@"ÐÙè øÌ6HD èlô‰~æ$‰@"ô„@6z>³MD HúD }¢Ÿy'‰@"$=! €ž€ÏlD H>È@ŸègÞ‰@"$‰@Od 'à3ÛD HD O²Ð'ú™w"$‰@"ÐÙè øÌ6HD èlô‰~æ$‰@"ô„@6z>³MD HúD }¢Ÿy'‰@"$=! €ž€ÏlD H>È@ŸègÞ‰@"$‰@Od 'à3ÛD HD O²Ð'ú™w"$‰@"ÐÙè øÌ6HD èlô‰~æ$‰@"ô„@6z>³MD HúD }¢Ÿy'‰@"$=! €ž€ÏlD H>È@ŸègÞ‰@"$‰@Od 'à3ÛD HD O²Ð'ú™w"$‰@"ÐÙè øÌ6HD èlô‰~æ$‰@"ô„@6z>³MD HúD }¢Ÿy'‰@"$=! €ž€ÏlD H>È@ŸègÞ‰@"$‰@Od 'à3ÛD HD O²Ð'ú™w"$‰@"ÐÙè øÌ6HD èlô‰~æ$‰@"ô„@6z>³MD HúD }¢Ÿy'‰@"$=! €ž€ÏlD H>øw'ÙrüðêIEND®B`‚icnV C fish/osx/install.sh000077500000000000000000000013411214535744100146320ustar00rootroot00000000000000#!/bin/sh # Die if anything has an error set -e # Make sure we're run as root scriptname=`basename "$0"` if [[ $UID -ne 0 ]]; then echo "${scriptname} must be run as root" exit 1 fi # Set the prefix for installation PREFIX=/usr/local # Jump to the Resources directory cd "$(dirname "$0")" # Add us to the shells list ./add-shell "${PREFIX}/bin/fish" # Ditto the base directory to the right place ditto ./base "${PREFIX}" # Announce our success echo "fish has been installed under ${PREFIX}/ and added to /etc/shells (if it was not already present)" echo "To start fish, run:" echo " ${PREFIX}/bin/fish" echo "If you wish to change your default shell to fish, run:" echo " chsh -s ${PREFIX}/bin/fish" echo "Enjoy!" fish/osx/launch_fish.scpt000066400000000000000000000106121214535744100160040ustar00rootroot00000000000000FasdUAS 1.101.10ÿÿÿÿ k i Iÿþ ÿý ÿþ0 launch_fish  ÿü oÿû ÿû 0 fish_pathÿüÿý Oj ki   lÿúÿú ?9 Don't create multiple windows if Terminal is not running±r Don't create multiple windows if Terminal is not running lÿùÿù D> For some reason this sometimes throws an error on SnowLeopard±| For some reason this sometimes throws an error on SnowLeopard Q$ r Iÿøÿ÷ ÿø.corecnte******** l ÿöÿõ 6!" !2 ÿô ÿô prcs "= #$ #1 ÿó ÿó bnid $m%%±&&$com.apple.Terminalÿöÿõÿ÷ oÿò ÿò0terminal_count Rÿñÿðÿï ÿñ.ascrerr ********ÿðÿï r!$'( 'm!"ÿîÿî (oÿí ÿí0terminal_count)ÿì )Z%i*+ÿë, *=%(-. -o%&ÿê ÿê0terminal_count .m&'ÿéÿé +O+T/0 /k/S1123 2I/4ÿèÿçÿæ ÿè.miscactvnullÿÿ€ÿÿnullÿçÿæ34ÿå 4Q5S567 5I8Dÿä89 ÿä.coredoscnullÿÿ€ÿÿ€ctxt 8l8;:ÿãÿâ :b8;;< ;m89==±>> exec <o9:ÿá ÿá 0 fish_pathÿãÿâ9ÿà?ÿß ÿà kfil ?4<@ÿÞ@ ÿÞ cwin @m>?ÿÝÿÝÿß 6RÿÜÿÛÿÚ ÿÜ.ascrerr ********ÿÛÿÚ 7kLSAABC BlLLÿÙDEÿÙ D1+ If there's no window 0, just have it do itE±FFV If there's no window 0, just have it do itCGÿØ GILSÿ×HÿÖ ÿ×.coredoscnullÿÿ€ÿÿ€ctxt HlLOIÿÕÿÔ IbLOJK JmLMLL±MM exec KoMNÿÓ ÿÓ 0 fish_pathÿÕÿÔÿÖÿØÿå 0m+,NN¼@alis^DrizzleÊ<“H+x… Terminal.appx+½Ì–gÿÿÿÿ UtilitiesÊ #import #import #import #import #import #import #import #import // The path to the command file, which we'll delete on death (if it exists) static char s_command_path[PATH_MAX]; static void die(const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); fputc('\n', stderr); if (s_command_path[0] != '\0') { unlink(s_command_path); } exit(EXIT_FAILURE); } static void launch_fish_with_applescript(NSString *fish_binary_path) { // load the script from a resource by fetching its URL from within our bundle NSString *path = [[NSBundle mainBundle] pathForResource:@"launch_fish" ofType:@"scpt"]; if (! path) die("Couldn't get path to launch_fish.scpt"); NSURL *url = [NSURL fileURLWithPath:path isDirectory:NO]; if (! url) die("Couldn't get URL to launch_fish.scpt"); NSDictionary *errors = nil; NSAppleScript *appleScript = [[NSAppleScript alloc] initWithContentsOfURL:url error:&errors]; if (! appleScript) die("Couldn't load AppleScript"); // create the first parameter NSAppleEventDescriptor *firstParameter = [NSAppleEventDescriptor descriptorWithString:fish_binary_path]; // create and populate the list of parameters (in our case just one) NSAppleEventDescriptor *parameters = [NSAppleEventDescriptor listDescriptor]; [parameters insertDescriptor:firstParameter atIndex:1]; // create the AppleEvent target ProcessSerialNumber psn = {0, kCurrentProcess}; NSAppleEventDescriptor *target = [NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber bytes:&psn length:sizeof(ProcessSerialNumber)]; // create an NSAppleEventDescriptor with the script's method name to call, // this is used for the script statement: "on show_message(user_message)" // Note that the routine name must be in lower case. NSAppleEventDescriptor *handler = [NSAppleEventDescriptor descriptorWithString: [@"launch_fish" lowercaseString]]; // create the event for an AppleScript subroutine, // set the method name and the list of parameters NSAppleEventDescriptor *event = [NSAppleEventDescriptor appleEventWithEventClass:kASAppleScriptSuite eventID:kASSubroutineEvent targetDescriptor:target returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID]; [event setParamDescriptor:handler forKeyword:keyASSubroutineName]; [event setParamDescriptor:parameters forKeyword:keyDirectObject]; // call the event in AppleScript if (![appleScript executeAppleEvent:event error:&errors]) { // report any errors from 'errors' NSLog(@"Oops: %@", errors); } [appleScript release]; } /* This approach asks Terminal to open a script that we control */ int main(void) { [[NSAutoreleasePool alloc] init]; /* Get the fish executable. Make sure it's absolute. */ NSURL *fish_executable = [[NSBundle mainBundle] URLForResource:@"fish" withExtension:@"" subdirectory:@"base/bin"]; if (! fish_executable) die("Could not find fish executable in bundle"); launch_fish_with_applescript([fish_executable path]); /* If we succeeded, it will clean itself up */ return 0; } fish/output.cpp000066400000000000000000000352171214535744100140710ustar00rootroot00000000000000/** \file output.c Generic output functions */ #include "config.h" #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "expand.h" #include "common.h" #include "output.h" #include "highlight.h" #include "env.h" /** Number of color names in the col array */ #define COLORS (sizeof(col)/sizeof(wchar_t *)) static int writeb_internal(char c); /** Names of different colors. */ static const wchar_t *col[]= { L"black", L"red", L"green", L"brown", L"yellow", L"blue", L"magenta", L"purple", L"cyan", L"white" L"normal" } ; /** Mapping from color name (the 'col' array) to color index as used in ANSI color terminals, and also the fish_color_* constants defined in highlight.h. Non-ANSI terminals will display the wrong colors, since they use a different mapping. */ static const int col_idx[]= { 0, 1, 2, 3, 3, 4, 5, 5, 6, 7, FISH_COLOR_NORMAL, }; /** The function used for output */ static int (*out)(char c) = &writeb_internal; /** Name of terminal */ static wcstring current_term; /* Whether term256 is supported */ static bool support_term256 = false; void output_set_writer(int (*writer)(char)) { CHECK(writer,); out = writer; } int (*output_get_writer())(char) { return out; } static bool term256_support_is_native(void) { /* Return YES if we think the term256 support is "native" as opposed to forced. */ return max_colors == 256; } bool output_get_supports_term256(void) { return support_term256; } void output_set_supports_term256(bool val) { support_term256 = val; } unsigned char index_for_color(rgb_color_t c) { if (c.is_named() || ! output_get_supports_term256()) { return c.to_name_index(); } else { return c.to_term256_index(); } } static bool write_color(char *todo, unsigned char idx, bool is_fg) { bool result = false; if (idx < 16 || term256_support_is_native()) { /* Use tparm */ writembs(tparm(todo, idx)); result = true; } else { /* We are attempting to bypass the term here. Generate the ANSI escape sequence ourself. */ char stridx[128]; format_long_safe(stridx, idx); char buff[128] = "\x1b["; strcat(buff, is_fg ? "38;5;" : "48;5;"); strcat(buff, stridx); strcat(buff, "m"); int (*writer)(char) = output_get_writer(); if (writer) { for (size_t i=0; buff[i]; i++) { writer(buff[i]); } } result = true; } return result; } bool write_foreground_color(unsigned char idx) { if (set_a_foreground && set_a_foreground[0]) { return write_color(set_a_foreground, idx, true); } else if (set_foreground && set_foreground[0]) { return write_color(set_foreground, idx, true); } else { return false; } } bool write_background_color(unsigned char idx) { if (set_a_background && set_a_background[0]) { return write_color(set_a_background, idx, false); } else if (set_background && set_background[0]) { return write_color(set_background, idx, false); } else { return false; } } void set_color(rgb_color_t c, rgb_color_t c2) { #if 0 wcstring tmp = c.description(); wcstring tmp2 = c2.description(); printf("set_color %ls : %ls\n", tmp.c_str(), tmp2.c_str()); #endif ASSERT_IS_MAIN_THREAD(); const rgb_color_t normal = rgb_color_t::normal(); static rgb_color_t last_color = rgb_color_t::normal(); static rgb_color_t last_color2 = rgb_color_t::normal(); static int was_bold=0; static int was_underline=0; int bg_set=0, last_bg_set=0; int is_bold = 0; int is_underline = 0; /* Test if we have at least basic support for setting fonts, colors and related bits - otherwise just give up... */ if (!exit_attribute_mode) { return; } is_bold |= c.is_bold(); is_bold |= c2.is_bold(); is_underline |= c.is_underline(); is_underline |= c2.is_underline(); if (c.is_reset() || c2.is_reset()) { c = c2 = normal; was_bold=0; was_underline=0; /* If we exit attibute mode, we must first set a color, or previously coloured text might lose it's color. Terminals are weird... */ write_foreground_color(0); writembs(exit_attribute_mode); return; } if (was_bold && !is_bold) { /* Only way to exit bold mode is a reset of all attributes. */ writembs(exit_attribute_mode); last_color = normal; last_color2 = normal; was_bold=0; was_underline=0; } if (! last_color2.is_normal() && ! last_color2.is_reset() && ! last_color2.is_ignore()) { /* Background was set */ last_bg_set=1; } if (! c2.is_normal() && ! c2.is_ignore()) { /* Background is set */ bg_set=1; if (c==c2) c = (c2==rgb_color_t::white())?rgb_color_t::black():rgb_color_t::white(); } if ((enter_bold_mode != 0) && (strlen(enter_bold_mode) > 0)) { if (bg_set && !last_bg_set) { /* Background color changed and is set, so we enter bold mode to make reading easier. This means bold mode is _always_ on when the background color is set. */ writembs(enter_bold_mode); } if (!bg_set && last_bg_set) { /* Background color changed and is no longer set, so we exit bold mode */ writembs(exit_attribute_mode); was_bold=0; was_underline=0; /* We don't know if exit_attribute_mode resets colors, so we set it to something known. */ if (write_foreground_color(0)) { last_color=rgb_color_t::black(); } } } if (last_color != c) { if (c.is_normal()) { write_foreground_color(0); writembs(exit_attribute_mode); last_color2 = rgb_color_t::normal(); was_bold=0; was_underline=0; } else if (! c.is_special()) { write_foreground_color(index_for_color(c)); } } last_color = c; if (last_color2 != c2) { if (c2.is_normal()) { write_background_color(0); writembs(exit_attribute_mode); if (! last_color.is_normal()) { write_foreground_color(index_for_color(last_color)); } was_bold=0; was_underline=0; last_color2 = c2; } else if (! c2.is_special()) { write_background_color(index_for_color(c2)); last_color2 = c2; } } /* Lastly, we set bold mode and underline mode correctly */ if ((enter_bold_mode != 0) && (strlen(enter_bold_mode) > 0) && !bg_set) { if (is_bold && !was_bold) { if (enter_bold_mode) { writembs(tparm(enter_bold_mode)); } } was_bold = is_bold; } if (was_underline && !is_underline) { writembs(exit_underline_mode); } if (!was_underline && is_underline) { writembs(enter_underline_mode); } was_underline = is_underline; } /** Default output method, simply calls write() on stdout */ static int writeb_internal(char c) { write_loop(1, &c, 1); return 0; } int writeb(tputs_arg_t b) { out(b); return 0; } int writembs_internal(char *str) { CHECK(str, 1); return tputs(str,1,&writeb)==ERR?1:0; } int writech(wint_t ch) { mbstate_t state; size_t i; char buff[MB_LEN_MAX+1]; size_t bytes; if ((ch >= ENCODE_DIRECT_BASE) && (ch < ENCODE_DIRECT_BASE+256)) { buff[0] = ch - ENCODE_DIRECT_BASE; bytes=1; } else { memset(&state, 0, sizeof(state)); bytes= wcrtomb(buff, ch, &state); switch (bytes) { case (size_t)(-1): { return 1; } } } for (i=0; imax_width) { break; } written+=w; writech(*(str++)); } written += fish_wcwidth(ellipsis_char); writech(ellipsis_char); while (written < max_width) { written++; writestr(L" "); } } int write_escaped_str(const wchar_t *str, int max_len) { wchar_t *out; int i; int len; int written=0; CHECK(str, 0); out = escape(str, 1); len = my_wcswidth(out); if (max_len && (max_len < len)) { for (i=0; (written+fish_wcwidth(out[i]))<=(max_len-1); i++) { writech(out[i]); written += fish_wcwidth(out[i]); } writech(ellipsis_char); written += fish_wcwidth(ellipsis_char); for (i=written; i candidates; wcstring_list_t el; tokenize_variable_array(val, el); for (size_t j=0; j < el.size(); j++) { const wcstring &next = el.at(j); wcstring color_name; if (is_background) { // look for something like "--background=red" const wcstring prefix = L"--background="; if (string_prefixes_string(prefix, next)) { color_name = wcstring(next, prefix.size()); } } else { if (next == L"--bold" || next == L"-o") is_bold = true; else if (next == L"--underline" || next == L"-u") is_underline = true; else color_name = next; } if (! color_name.empty()) { rgb_color_t color = rgb_color_t(color_name); if (! color.is_none()) { candidates.push_back(color); } } } // Pick the best candidate rgb_color_t first_rgb = rgb_color_t::none(), first_named = rgb_color_t::none(); for (size_t i=0; i < candidates.size(); i++) { const rgb_color_t &color = candidates.at(i); if (color.is_rgb() && first_rgb.is_none()) first_rgb = color; if (color.is_named() && first_named.is_none()) first_named = color; } // If we have both RGB and named colors, then prefer rgb if term256 is supported rgb_color_t result; if ((!first_rgb.is_none() && output_get_supports_term256()) || first_named.is_none()) { result = first_rgb; } else { result = first_named; } if (result.is_none()) result = rgb_color_t::normal(); result.set_bold(is_bold); result.set_underline(is_underline); #if 0 wcstring desc = result.description(); printf("Parsed %ls from %ls (%s)\n", desc.c_str(), val.c_str(), is_background ? "background" : "foreground"); #endif return result; } void output_set_term(const wcstring &term) { current_term.assign(term); } const wchar_t *output_get_term() { return current_term.empty() ? L"" : current_term.c_str(); } fish/output.h000066400000000000000000000116631214535744100135350ustar00rootroot00000000000000/** \file output.h Generic output functions */ /** Constants for various character classifications. Each character of a command string can be classified as one of the following types. */ #ifndef FISH_OUTPUT_H #define FISH_OUTPUT_H #include #include "screen.h" #include "color.h" /** Constants for various colors as used by the set_color function. */ enum { FISH_COLOR_BLACK, FISH_COLOR_RED, FISH_COLOR_GREEN, FISH_COLOR_YELLOW, FISH_COLOR_BLUE, FISH_COLOR_MAGENTA, FISH_COLOR_CYAN, FISH_COLOR_WHITE, /** The default fg color of the terminal */ FISH_COLOR_NORMAL, FISH_COLOR_IGNORE, FISH_COLOR_RESET } ; /** The value to send to set_color to tell it to use a bold font */ #define FISH_COLOR_BOLD 0x80 /** The value to send to set_color to tell it to underline the text */ #define FISH_COLOR_UNDERLINE 0x100 /** Sets the fg and bg color. May be called as often as you like, since if the new color is the same as the previous, nothing will be written. Negative values for set_color will also be ignored. Since the terminfo string this function emits can potentially cause the screen to flicker, the function takes care to write as little as possible. Possible values for color are any form the FISH_COLOR_* enum, FISH_COLOR_IGNORE and FISH_COLOR_RESET. FISH_COLOR_IGNORE will leave the color unchanged, and FISH_COLOR_RESET will perform an exit_attribute_mode, even if set_color thinks it is already in FISH_COLOR_NORMAL mode. In order to set the color to normal, three terminfo strings may have to be written. - First a string to set the color, such as set_a_foreground. This is needed because otherwise the previous strings colors might be removed as well. - After that we write the exit_attribute_mode string to reset all color attributes. - Lastly we may need to write set_a_background or set_a_foreground to set the other half of the color pair to what it should be. \param c Foreground color. \param c2 Background color. */ void set_color(rgb_color_t c, rgb_color_t c2); /** Write specified multibyte string */ #define writembs( mbs ) \ { \ char *tmp = mbs; \ if( tmp ) \ { \ writembs_internal( tmp ); \ } \ else \ { \ debug( 0, \ _(L"Tried to use terminfo string %s on line %d of %s, which is undefined in terminal of type \"%ls\". Please report this error to %s"), \ #mbs, \ __LINE__, \ __FILE__, \ output_get_term(), \ PACKAGE_BUGREPORT); \ } \ } /** Write a char * narrow string to FD 1, needed for the terminfo strings. This is usually just a wrapper aound tputs, using writeb as the sending function. But a weird bug on PPC Linux means that on this platform, write is instead used directly. */ int writembs_internal(char *str); /** Write a wide character using the output method specified using output_set_writer(). */ int writech(wint_t ch); /** Write a wide character string to FD 1. */ void writestr(const wchar_t *str); /** Write a wide character string to FD 1. If the string is wider than the specified maximum, truncate and ellipsize it. */ void writestr_ellipsis(const wchar_t *str, int max_width); /** Escape and write a string to fd 1 */ int write_escaped_str(const wchar_t *str, int max_len); /** Return the internal color code representing the specified color */ int output_color_code(const wcstring &val, bool is_background); rgb_color_t parse_color(const wcstring &val, bool is_background); /** This is for writing process notification messages. Has to write to stdout, so clr_eol and such functions will work correctly. Not an issue since this function is only used in interactive mode anyway. */ int writeb(tputs_arg_t b); /** Set the function used for writing in move_cursor, writespace and set_color and all other output functions in this library. By default, the write call is used to give completely unbuffered output to stdout. */ void output_set_writer(int (*writer)(char)); /** Return the current output writer */ int (*output_get_writer())(char) ; /** Set the terminal name */ void output_set_term(const wcstring &term); /** Return the terminal name */ const wchar_t *output_get_term(); /** Sets whether term256 colors are supported */ bool output_get_supports_term256(); void output_set_supports_term256(bool val); /* Exported for builtin_set_color's usage only */ bool write_foreground_color(unsigned char idx); bool write_background_color(unsigned char idx); unsigned char index_for_color(rgb_color_t c); #endif fish/parse_util.cpp000066400000000000000000000374311214535744100147000ustar00rootroot00000000000000/** \file parse_util.c Various mostly unrelated utility functions related to parsing, loading and evaluating fish code. This library can be seen as a 'toolbox' for functions that are used in many places in fish and that are somehow related to parsing the code. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "common.h" #include "tokenizer.h" #include "parse_util.h" #include "expand.h" #include "intern.h" #include "exec.h" #include "env.h" #include "signal.h" #include "wildcard.h" /** Maximum number of autoloaded items opf a specific type to keep in memory at a time. */ #define AUTOLOAD_MAX 10 /** Minimum time, in seconds, before an autoloaded item will be unloaded */ #define AUTOLOAD_MIN_AGE 60 int parse_util_lineno(const wchar_t *str, size_t offset) { if (! str) return 0; int res = 1; for (size_t i=0; str[i] && i= off2-off-1) { line_offset2 = off2-off-1; } return off + line_offset2; } int parse_util_locate_cmdsubst(const wchar_t *in, wchar_t **begin, wchar_t **end, int allow_incomplete) { wchar_t *pos; wchar_t prev=0; int syntax_error=0; int paran_count=0; wchar_t *paran_begin=0, *paran_end=0; CHECK(in, 0); for (pos = (wchar_t *)in; *pos; pos++) { if (prev != '\\') { if (wcschr(L"\'\"", *pos)) { wchar_t *q_end = quote_end(pos); if (q_end && *q_end) { pos=q_end; } else { break; } } else { if (*pos == '(') { if ((paran_count == 0)&&(paran_begin==0)) { paran_begin = pos; } paran_count++; } else if (*pos == ')') { paran_count--; if ((paran_count == 0) && (paran_end == 0)) { paran_end = pos; break; } if (paran_count < 0) { syntax_error = 1; break; } } } } prev = *pos; } syntax_error |= (paran_count < 0); syntax_error |= ((paran_count>0)&&(!allow_incomplete)); if (syntax_error) { return -1; } if (paran_begin == 0) { return 0; } if (begin) { *begin = paran_begin; } if (end) { *end = paran_count?(wchar_t *)in+wcslen(in):paran_end; } return 1; } void parse_util_cmdsubst_extent(const wchar_t *buff, size_t cursor_pos, const wchar_t **a, const wchar_t **b) { wchar_t *begin, *end; wchar_t *pos; const wchar_t *cursor = buff + cursor_pos; CHECK(buff,); if (a) { *a = (wchar_t *)buff; } if (b) { *b = (wchar_t *)buff+wcslen(buff); } pos = (wchar_t *)buff; while (1) { if (parse_util_locate_cmdsubst(pos, &begin, &end, 1) <= 0) { /* No subshell found */ break; } if (!end) { end = (wchar_t *)buff + wcslen(buff); } if ((begin < cursor) && (end >= cursor)) { begin++; if (a) { *a = begin; } if (b) { *b = end; } break; } if (!*end) { break; } pos = end+1; } } /** Get the beginning and end of the job or process definition under the cursor */ static void job_or_process_extent(const wchar_t *buff, size_t cursor_pos, const wchar_t **a, const wchar_t **b, int process) { const wchar_t *begin, *end; long pos; wchar_t *buffcpy; int finished=0; CHECK(buff,); if (a) { *a=0; } if (b) { *b = 0; } parse_util_cmdsubst_extent(buff, cursor_pos, &begin, &end); if (!end || !begin) { return; } pos = cursor_pos - (begin - buff); if (a) { *a = begin; } if (b) { *b = end; } buffcpy = wcsndup(begin, end-begin); if (!buffcpy) { DIE_MEM(); } tokenizer_t tok(buffcpy, TOK_ACCEPT_UNFINISHED); for (; tok_has_next(&tok) && !finished; tok_next(&tok)) { int tok_begin = tok_get_pos(&tok); switch (tok_last_type(&tok)) { case TOK_PIPE: { if (!process) { break; } } case TOK_END: case TOK_BACKGROUND: { if (tok_begin >= pos) { finished=1; if (b) { *b = (wchar_t *)buff + tok_begin; } } else { if (a) { *a = (wchar_t *)buff + tok_begin+1; } } break; } } } free(buffcpy); } void parse_util_process_extent(const wchar_t *buff, size_t pos, const wchar_t **a, const wchar_t **b) { job_or_process_extent(buff, pos, a, b, 1); } void parse_util_job_extent(const wchar_t *buff, size_t pos, const wchar_t **a, const wchar_t **b) { job_or_process_extent(buff,pos,a, b, 0); } void parse_util_token_extent(const wchar_t *buff, size_t cursor_pos, const wchar_t **tok_begin, const wchar_t **tok_end, const wchar_t **prev_begin, const wchar_t **prev_end) { const wchar_t *begin, *end; long pos; wchar_t *buffcpy; const wchar_t *a = NULL, *b = NULL, *pa = NULL, *pb = NULL; CHECK(buff,); assert(cursor_pos >= 0); parse_util_cmdsubst_extent(buff, cursor_pos, &begin, &end); if (!end || !begin) { return; } pos = cursor_pos - (begin - buff); a = buff + pos; b = a; pa = buff + pos; pb = pa; assert(begin >= buff); assert(begin <= (buff+wcslen(buff))); assert(end >= begin); assert(end <= (buff+wcslen(buff))); buffcpy = wcsndup(begin, end-begin); if (!buffcpy) { DIE_MEM(); } tokenizer_t tok(buffcpy, TOK_ACCEPT_UNFINISHED | TOK_SQUASH_ERRORS); for (; tok_has_next(&tok); tok_next(&tok)) { size_t tok_begin = tok_get_pos(&tok); size_t tok_end = tok_begin; /* Calculate end of token */ if (tok_last_type(&tok) == TOK_STRING) { tok_end += wcslen(tok_last(&tok)); } /* Cursor was before beginning of this token, means that the cursor is between two tokens, so we set it to a zero element string and break */ if (tok_begin > pos) { a = b = (wchar_t *)buff + pos; break; } /* If cursor is inside the token, this is the token we are looking for. If so, set a and b and break */ if ((tok_last_type(&tok) == TOK_STRING) && (tok_end >= pos)) { a = begin + tok_get_pos(&tok); b = a + wcslen(tok_last(&tok)); break; } /* Remember previous string token */ if (tok_last_type(&tok) == TOK_STRING) { pa = begin + tok_get_pos(&tok); pb = pa + wcslen(tok_last(&tok)); } } free(buffcpy); if (tok_begin) { *tok_begin = a; } if (tok_end) { *tok_end = b; } if (prev_begin) { *prev_begin = pa; } if (prev_end) { *prev_end = pb; } assert(pa >= buff); assert(pa <= (buff+wcslen(buff))); assert(pb >= pa); assert(pb <= (buff+wcslen(buff))); } void parse_util_set_argv(const wchar_t * const *argv, const wcstring_list_t &named_arguments) { if (*argv) { const wchar_t * const *arg; wcstring sb; for (arg=argv; *arg; arg++) { if (arg != argv) { sb.append(ARRAY_SEP_STR); } sb.append(*arg); } env_set(L"argv", sb.c_str(), ENV_LOCAL); } else { env_set(L"argv", 0, ENV_LOCAL); } if (! named_arguments.empty()) { const wchar_t * const *arg; size_t i; for (i=0, arg=argv; i < named_arguments.size(); i++) { env_set(named_arguments.at(i).c_str(), *arg, ENV_LOCAL); if (*arg) arg++; } } } wchar_t *parse_util_unescape_wildcards(const wchar_t *str) { wchar_t *in, *out; wchar_t *unescaped; CHECK(str, 0); unescaped = wcsdup(str); if (!unescaped) { DIE_MEM(); } for (in=out=unescaped; *in; in++) { switch (*in) { case L'\\': { switch (*(in + 1)) { case L'*': case L'?': { in++; *(out++)=*in; break; } case L'\\': { in++; *(out++)=L'\\'; *(out++)=L'\\'; break; } default: { *(out++)=*in; break; } } break; } case L'*': { *(out++)=ANY_STRING; break; } case L'?': { *(out++)=ANY_CHAR; break; } default: { *(out++)=*in; break; } } } *out = *in; return unescaped; } /** Find the outermost quoting style of current token. Returns 0 if token is not quoted. */ static wchar_t get_quote(const wchar_t *cmd, size_t len) { size_t i=0; wchar_t res=0; while (1) { if (!cmd[i]) break; if (cmd[i] == L'\\') { i++; if (!cmd[i]) break; i++; } else { if (cmd[i] == L'\'' || cmd[i] == L'\"') { const wchar_t *end = quote_end(&cmd[i]); //fwprintf( stderr, L"Jump %d\n", end-cmd ); if ((end == 0) || (!*end) || (end-cmd > len)) { res = cmd[i]; break; } i = end-cmd+1; } else i++; } } return res; } void parse_util_get_parameter_info(const wcstring &cmd, const size_t pos, wchar_t *quote, size_t *offset, int *type) { size_t prev_pos=0; wchar_t last_quote = '\0'; int unfinished; tokenizer_t tok(cmd.c_str(), TOK_ACCEPT_UNFINISHED | TOK_SQUASH_ERRORS); for (; tok_has_next(&tok); tok_next(&tok)) { if (tok_get_pos(&tok) > pos) break; if (tok_last_type(&tok) == TOK_STRING) last_quote = get_quote(tok_last(&tok), pos - tok_get_pos(&tok)); if (type != NULL) *type = tok_last_type(&tok); prev_pos = tok_get_pos(&tok); } wchar_t *cmd_tmp = wcsdup(cmd.c_str()); cmd_tmp[pos]=0; size_t cmdlen = wcslen(cmd_tmp); unfinished = (cmdlen==0); if (!unfinished) { unfinished = (quote != 0); if (!unfinished) { if (wcschr(L" \t\n\r", cmd_tmp[cmdlen-1]) != 0) { if ((cmdlen == 1) || (cmd_tmp[cmdlen-2] != L'\\')) { unfinished=1; } } } } if (quote) *quote = last_quote; if (offset != 0) { if (!unfinished) { while ((cmd_tmp[prev_pos] != 0) && (wcschr(L";|",cmd_tmp[prev_pos])!= 0)) prev_pos++; *offset = prev_pos; } else { *offset = pos; } } free(cmd_tmp); } wcstring parse_util_escape_string_with_quote(const wcstring &cmd, wchar_t quote) { wcstring result; if (quote == L'\0') { result = escape_string(cmd, ESCAPE_ALL | ESCAPE_NO_QUOTED | ESCAPE_NO_TILDE); } else { bool unescapable = false; for (size_t i = 0; i < cmd.size(); i++) { wchar_t c = cmd.at(i); switch (c) { case L'\n': case L'\t': case L'\b': case L'\r': unescapable = true; break; default: if (c == quote) result.push_back(L'\\'); result.push_back(c); break; } } if (unescapable) { result = escape_string(cmd, ESCAPE_ALL | ESCAPE_NO_QUOTED); result.insert(0, "e, 1); } } return result; } fish/parse_util.h000066400000000000000000000122321214535744100143350ustar00rootroot00000000000000/** \file parse_util.h Various mostly unrelated utility functions related to parsing, loading and evaluating fish code. */ #ifndef FISH_PARSE_UTIL_H #define FISH_PARSE_UTIL_H #include "autoload.h" #include #include #include /** Find the beginning and end of 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 parse_util_locate_cmdsubst(const wchar_t *in, wchar_t **begin, wchar_t **end, int flags); /** Find the beginning and end of the command substitution under the cursor. If no subshell is found, the entire string is returned. If the current command substitution is not ended, i.e. the closing parenthesis is missing, then the string from the beginning of the substitution to the end of the string is returned. \param buff the string to search for subshells \param cursor_pos the position of the cursor \param a the start of the searched string \param b the end of the searched string */ void parse_util_cmdsubst_extent(const wchar_t *buff, size_t cursor_pos, const wchar_t **a, const wchar_t **b); /** Find the beginning and end of the process definition under the cursor \param buff the string to search for subshells \param cursor_pos the position of the cursor \param a the start of the searched string \param b the end of the searched string */ void parse_util_process_extent(const wchar_t *buff, size_t cursor_pos, const wchar_t **a, const wchar_t **b); /** Find the beginning and end of the job definition under the cursor \param buff the string to search for subshells \param cursor_pos the position of the cursor \param a the start of the searched string \param b the end of the searched string */ void parse_util_job_extent(const wchar_t *buff, size_t cursor_pos, const wchar_t **a, const wchar_t **b); /** Find the beginning and end of the token under the cursor and the token before the current token. Any combination of tok_begin, tok_end, prev_begin and prev_end may be null. \param buff the string to search for subshells \param cursor_pos the position of the cursor \param tok_begin the start of the current token \param tok_end the end of the current token \param prev_begin the start o the token before the current token \param prev_end the end of the token before the current token */ void parse_util_token_extent(const wchar_t *buff, size_t cursor_pos, const wchar_t **tok_begin, const wchar_t **tok_end, const wchar_t **prev_begin, const wchar_t **prev_end); /** Get the linenumber at the specified character offset */ int parse_util_lineno(const wchar_t *str, size_t len); /** Calculate the line number of the specified cursor position */ int parse_util_get_line_from_offset(const wcstring &str, size_t pos); /** Get the offset of the first character on the specified line */ size_t parse_util_get_offset_from_line(const wcstring &str, int line); /** Return the total offset of the buffer for the cursor position nearest to the specified poition */ size_t parse_util_get_offset(const wcstring &str, int line, long line_offset); /** Set the argv environment variable to the specified null-terminated array of strings. */ void parse_util_set_argv(const wchar_t * const *argv, const wcstring_list_t &named_arguments); /** Make a duplicate of the specified string, unescape wildcard characters but not performing any other character transformation. */ wchar_t *parse_util_unescape_wildcards(const wchar_t *in); /** Calculates information on the parameter at the specified index. \param cmd The command to be analyzed \param pos An index in the string which is inside the parameter \param quote If not NULL, store the type of quote this parameter has, can be either ', " or \\0, meaning the string is not quoted. \param offset If not NULL, get_param will store the offset to the beginning of the parameter. \param type If not NULL, get_param will store the token type as returned by tok_last. */ void parse_util_get_parameter_info(const wcstring &cmd, const size_t pos, wchar_t *quote, size_t *offset, int *type); /** Attempts to escape the string 'cmd' using the given quote type, as determined by the quote character. The quote can be a single quote or double quote, or L'\0' to indicate no quoting (and thus escaping should be with backslashes). */ wcstring parse_util_escape_string_with_quote(const wcstring &cmd, wchar_t quote); #endif fish/parser.cpp000066400000000000000000003263461214535744100140330ustar00rootroot00000000000000/** \file parser.c The fish parser. Contains functions for parsing and evaluating code. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" #include "proc.h" #include "parser.h" #include "parser_keywords.h" #include "tokenizer.h" #include "exec.h" #include "wildcard.h" #include "function.h" #include "builtin.h" #include "env.h" #include "expand.h" #include "reader.h" #include "sanity.h" #include "env_universal.h" #include "event.h" #include "intern.h" #include "parse_util.h" #include "path.h" #include "signal.h" #include "complete.h" /** Maximum number of function calls, i.e. recursion depth. */ #define MAX_RECURSION_DEPTH 128 /** Error message for unknown builtin */ #define UNKNOWN_BUILTIN_ERR_MSG _(L"Unknown builtin '%ls'") /** Error message for improper use of the exec builtin */ #define EXEC_ERR_MSG _(L"This command can not be used in a pipeline") /** Error message for tokenizer error. The tokenizer message is appended to this message. */ #define TOK_ERR_MSG _( L"Tokenizer error: '%ls'") /** Error message for short circuit command error. */ #define COND_ERR_MSG _( L"An additional command is required" ) /** Error message on a function that calls itself immediately */ #define INFINITE_RECURSION_ERR_MSG _( L"The function calls itself immediately, which would result in an infinite loop.") /** Error message on reaching maximum recursion depth */ #define OVERFLOW_RECURSION_ERR_MSG _( L"Maximum recursion depth reached. Accidental infinite loop?") /** Error message used when the end of a block can't be located */ #define BLOCK_END_ERR_MSG _( L"Could not locate end of block. The 'end' command is missing, misspelled or a ';' is missing.") /** Error message on reaching maximum number of block calls */ #define BLOCK_ERR_MSG _( L"Maximum number of nested blocks reached.") /** Error message when a non-string token is found when expecting a command name */ #define CMD_ERR_MSG _( L"Expected a command name, got token of type '%ls'") /** Error message when a non-string token is found when expecting a command name */ #define CMD_OR_ERR_MSG _( L"Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; or COMMAND'? See the help section for the 'or' builtin command by typing 'help or'.") /** Error message when a non-string token is found when expecting a command name */ #define CMD_AND_ERR_MSG _( L"Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; and COMMAND'? See the help section for the 'and' builtin command by typing 'help and'.") /** Error message when encountering an illegal command name */ #define ILLEGAL_CMD_ERR_MSG _( L"Illegal command name '%ls'") /** Error message when encountering an illegal file descriptor */ #define ILLEGAL_FD_ERR_MSG _( L"Illegal file descriptor '%ls'") /** Error message for wildcards with no matches */ #define WILDCARD_ERR_MSG _( L"No matches for wildcard '%ls'.") /** Error when using case builtin outside of switch block */ #define INVALID_CASE_ERR_MSG _( L"'case' builtin not inside of switch block") /** Error when using loop control builtins (break or continue) outside of loop */ #define INVALID_LOOP_ERR_MSG _( L"Loop control command while not inside of loop" ) /** Error when using return builtin outside of function definition */ #define INVALID_RETURN_ERR_MSG _( L"'return' builtin command outside of function definition" ) /** Error when using else builtin outside of if block */ #define INVALID_ELSE_ERR_MSG _( L"'%ls' builtin not inside of if block" ) /** Error when using 'else if' past a naked 'else' */ #define INVALID_ELSEIF_PAST_ELSE_ERR_MSG _( L"'%ls' used past terminating 'else'" ) /** Error when using end builtin outside of block */ #define INVALID_END_ERR_MSG _( L"'end' command outside of block") /** Error message for Posix-style assignment */ #define COMMAND_ASSIGN_ERR_MSG _( L"Unknown command '%ls'. Did you mean 'set %ls %ls'? For information on assigning values to variables, see the help section on the set command by typing 'help set'.") /** Error for invalid redirection token */ #define REDIRECT_TOKEN_ERR_MSG _( L"Expected redirection specification, got token of type '%ls'") /** Error when encountering redirection without a command */ #define INVALID_REDIRECTION_ERR_MSG _( L"Encountered redirection when expecting a command name. Fish does not allow a redirection operation before a command.") /** Error for evaluating null pointer */ #define EVAL_NULL_ERR_MSG _( L"Tried to evaluate null pointer." ) /** Error for evaluating in illegal scope */ #define INVALID_SCOPE_ERR_MSG _( L"Tried to evaluate commands using invalid block type '%ls'" ) /** Error for wrong token type */ #define UNEXPECTED_TOKEN_ERR_MSG _( L"Unexpected token of type '%ls'") /** While block description */ #define WHILE_BLOCK N_( L"'while' block" ) /** For block description */ #define FOR_BLOCK N_( L"'for' block" ) /** Breakpoint block */ #define BREAKPOINT_BLOCK N_( L"Block created by breakpoint" ) /** If block description */ #define IF_BLOCK N_( L"'if' conditional block" ) /** Function definition block description */ #define FUNCTION_DEF_BLOCK N_( L"function definition block" ) /** Function invocation block description */ #define FUNCTION_CALL_BLOCK N_( L"function invocation block" ) /** Function invocation block description */ #define FUNCTION_CALL_NO_SHADOW_BLOCK N_( L"function invocation block with no variable shadowing" ) /** Switch block description */ #define SWITCH_BLOCK N_( L"'switch' block" ) /** Fake block description */ #define FAKE_BLOCK N_( L"unexecutable block" ) /** Top block description */ #define TOP_BLOCK N_( L"global root block" ) /** Command substitution block description */ #define SUBST_BLOCK N_( L"command substitution block" ) /** Begin block description */ #define BEGIN_BLOCK N_( L"'begin' unconditional block" ) /** Source block description */ #define SOURCE_BLOCK N_( L"Block created by the . builtin" ) /** Source block description */ #define EVENT_BLOCK N_( L"event handler block" ) /** Unknown block description */ #define UNKNOWN_BLOCK N_( L"unknown/invalid block" ) /** Datastructure to describe a block type, like while blocks, command substitution blocks, etc. */ struct block_lookup_entry { /** The block type id. The legal values are defined in parser.h. */ block_type_t type; /** The name of the builtin that creates this type of block, if any. */ const wchar_t *name; /** A description of this block type */ const wchar_t *desc; } ; /** List of all legal block types */ static const struct block_lookup_entry block_lookup[]= { { WHILE, L"while", WHILE_BLOCK }, { FOR, L"for", FOR_BLOCK }, { IF, L"if", IF_BLOCK }, { FUNCTION_DEF, L"function", FUNCTION_DEF_BLOCK }, { FUNCTION_CALL, 0, FUNCTION_CALL_BLOCK }, { FUNCTION_CALL_NO_SHADOW, 0, FUNCTION_CALL_NO_SHADOW_BLOCK }, { SWITCH, L"switch", SWITCH_BLOCK }, { FAKE, 0, FAKE_BLOCK }, { TOP, 0, TOP_BLOCK }, { SUBST, 0, SUBST_BLOCK }, { BEGIN, L"begin", BEGIN_BLOCK }, { SOURCE, L".", SOURCE_BLOCK }, { EVENT, 0, EVENT_BLOCK }, { BREAKPOINT, L"breakpoint", BREAKPOINT_BLOCK }, { (block_type_t)0, 0, 0 } }; static bool job_should_skip_elseif(const job_t *job, const block_t *current_block); parser_t::parser_t(enum parser_type_t type, bool errors) : parser_type(type), show_errors(errors), error_code(0), err_pos(0), current_tokenizer(NULL), current_tokenizer_pos(0), job_start_pos(0), eval_level(-1), current_block(NULL), block_io(shared_ptr()) { } /* A pointer to the principal parser (which is a static local) */ static parser_t *s_principal_parser = NULL; parser_t &parser_t::principal_parser(void) { ASSERT_IS_NOT_FORKED_CHILD(); ASSERT_IS_MAIN_THREAD(); static parser_t parser(PARSER_TYPE_GENERAL, true); if (! s_principal_parser) { s_principal_parser = &parser; } return parser; } void parser_t::skip_all_blocks(void) { /* Tell all blocks to skip */ if (s_principal_parser) { //write(2, "Cancelling blocks\n", strlen("Cancelling blocks\n")); block_t *c = s_principal_parser->current_block; while (c) { c->skip = true; //fprintf(stderr, " Cancelled %p\n", c); c = c->outer; } } } void parser_t::push_block(block_t *newv) { const enum block_type_t type = newv->type(); newv->src_lineno = parser_t::get_lineno(); newv->src_filename = parser_t::current_filename()?intern(parser_t::current_filename()):0; newv->outer = current_block; if (current_block && current_block->skip) newv->mark_as_fake(); /* New blocks should be skipped if the outer block is skipped, except TOP ans SUBST block, which open up new environments. Fake blocks should always be skipped. Rather complicated... :-( */ newv->skip=current_block?current_block->skip:0; /* Type TOP and SUBST are never skipped */ if (type == TOP || type == SUBST) { newv->skip = 0; } /* Fake blocks and function definition blocks are never executed */ if (type == FAKE || type == FUNCTION_DEF) { newv->skip = 1; } newv->job = 0; newv->loop_status=LOOP_NORMAL; current_block = newv; if ((newv->type() != FUNCTION_DEF) && (newv->type() != FAKE) && (newv->type() != TOP)) { env_push(type == FUNCTION_CALL); newv->wants_pop_env = true; } } void parser_t::pop_block() { block_t *old = current_block; if (!current_block) { debug(1, L"function %s called on empty block stack.", __func__); bugreport(); return; } current_block = current_block->outer; if (old->wants_pop_env) env_pop(); delete old; } const wchar_t *parser_t::get_block_desc(int block) const { for (size_t i=0; block_lookup[i].desc; i++) { if (block_lookup[i].type == block) { return _(block_lookup[i].desc); } } return _(UNKNOWN_BLOCK); } /** Returns 1 if the specified command is a builtin that may not be used in a pipeline */ static int parser_is_pipe_forbidden(const wcstring &word) { return contains(word, L"exec", L"case", L"break", L"return", L"continue"); } /** Search the text for the end of the current block */ static const wchar_t *parser_find_end(const wchar_t * buff) { int had_cmd=0; int count = 0; int error=0; int mark=0; CHECK(buff, 0); tokenizer_t tok(buff, 0); for (; tok_has_next(&tok) && !error; tok_next(&tok)) { int last_type = tok_last_type(&tok); switch (last_type) { case TOK_STRING: { if (!had_cmd) { if (wcscmp(tok_last(&tok), L"end")==0) { count--; } else if (parser_keywords_is_block(tok_last(&tok))) { count++; } if (count < 0) { error = 1; } had_cmd = 1; } break; } case TOK_END: { had_cmd = 0; break; } case TOK_PIPE: case TOK_BACKGROUND: { if (had_cmd) { had_cmd = 0; } else { error = 1; } break; } case TOK_ERROR: error = 1; break; default: break; } if (!count) { tok_next(&tok); mark = tok_get_pos(&tok); break; } } if (!count && !error) { return buff+mark; } return 0; } void parser_t::forbid_function(const wcstring &function) { forbidden_function.push_back(function); } void parser_t::allow_function() { /* if( al_peek( &forbidden_function) ) debug( 2, L"Allow %ls\n", al_peek( &forbidden_function) ); */ forbidden_function.pop_back(); } void parser_t::error(int ec, int p, const wchar_t *str, ...) { va_list va; CHECK(str,); error_code = ec; err_pos = p; va_start(va, str); err_buff = vformat_string(str, va); va_end(va); } /** Print profiling information to the specified stream */ static void print_profile(const std::vector &items, FILE *out) { size_t pos; for (pos = 0; pos < items.size(); pos++) { const profile_item_t *me, *prev; size_t i; int my_time; me = items.at(pos); if (!me->skipped) { my_time=me->parse+me->exec; for (i=pos+1; iskipped) { continue; } if (prev->level <= me->level) { break; } if (prev->level > me->level+1) { continue; } my_time -= prev->parse; my_time -= prev->exec; } if (me->cmd.size() > 0) { if (fwprintf(out, L"%d\t%d\t", my_time, me->parse+me->exec) < 0) { wperror(L"fwprintf"); return; } for (i=0; ilevel; i++) { if (fwprintf(out, L"-") < 0) { wperror(L"fwprintf"); return; } } if (fwprintf(out, L"> %ls\n", me->cmd.c_str()) < 0) { wperror(L"fwprintf"); return; } } delete me; } } } void parser_t::destroy() { if (profile) { /* Save profiling information. OK to not use CLO_EXEC here because this is called while fish is dying (and hence will not fork) */ FILE *f = fopen(profile, "w"); if (!f) { debug(1, _(L"Could not write profiling information to file '%s'"), profile); } else { if (fwprintf(f, _(L"Time\tSum\tCommand\n"), profile_items.size()) < 0) { wperror(L"fwprintf"); } else { print_profile(profile_items, f); } if (fclose(f)) { wperror(L"fclose"); } } } lineinfo.clear(); forbidden_function.clear(); } /** Print error message to string if an error has occured while parsing \param target the buffer to write to \param prefix: The string token to prefix the each line with. Usually the name of the command trying to parse something. */ void parser_t::print_errors(wcstring &target, const wchar_t *prefix) { CHECK(prefix,); if (error_code && ! err_buff.empty()) { int tmp; append_format(target, L"%ls: %ls\n", prefix, err_buff.c_str()); tmp = current_tokenizer_pos; current_tokenizer_pos = err_pos; append_format(target, L"%ls", this->current_line()); current_tokenizer_pos=tmp; } } /** Print error message to stderr if an error has occured while parsing */ void parser_t::print_errors_stderr() { if (error_code && ! err_buff.empty()) { debug(0, L"%ls", err_buff.c_str()); int tmp; tmp = current_tokenizer_pos; current_tokenizer_pos = err_pos; fwprintf(stderr, L"%ls", this->current_line()); current_tokenizer_pos=tmp; } } int parser_t::eval_args(const wchar_t *line, std::vector &args) { expand_flags_t eflags = 0; if (! show_errors) eflags |= EXPAND_NO_DESCRIPTIONS; if (this->parser_type != PARSER_TYPE_GENERAL) eflags |= EXPAND_SKIP_CMDSUBST; int do_loop=1; CHECK(line, 1); // CHECK( args, 1 ); // PCA we need to suppress calling proc_push_interactive off of the main thread. I'm not sure exactly what it does. if (this->parser_type == PARSER_TYPE_GENERAL) proc_push_interactive(0); tokenizer_t tok(line, (show_errors ? 0 : TOK_SQUASH_ERRORS)); /* eval_args may be called while evaulating another command, so we save the previous tokenizer and restore it on exit */ scoped_push tokenizer_push(¤t_tokenizer, &tok); scoped_push tokenizer_pos_push(¤t_tokenizer_pos, 0); error_code=0; for (; do_loop && tok_has_next(&tok) ; tok_next(&tok)) { current_tokenizer_pos = tok_get_pos(&tok); switch (tok_last_type(&tok)) { case TOK_STRING: { const wcstring tmp = tok_last(&tok); if (expand_string(tmp, args, eflags) == EXPAND_ERROR) { err_pos=tok_get_pos(&tok); do_loop=0; } break; } case TOK_END: { break; } case TOK_ERROR: { if (show_errors) error(SYNTAX_ERROR, tok_get_pos(&tok), TOK_ERR_MSG, tok_last(&tok)); do_loop=0; break; } default: { if (show_errors) error(SYNTAX_ERROR, tok_get_pos(&tok), UNEXPECTED_TOKEN_ERR_MSG, tok_get_desc(tok_last_type(&tok))); do_loop=0; break; } } } if (show_errors) this->print_errors_stderr(); if (this->parser_type == PARSER_TYPE_GENERAL) proc_pop_interactive(); return 1; } void parser_t::stack_trace(block_t *b, wcstring &buff) { /* Check if we should end the recursion */ if (!b) return; if (b->type()==EVENT) { /* This is an event handler */ const event_block_t *eb = static_cast(b); wcstring description = event_get_desc(eb->event); append_format(buff, _(L"in event handler: %ls\n"), description.c_str()); buff.append(L"\n"); /* Stop recursing at event handler. No reason to believe that any other code is relevant. It might make sense in the future to continue printing the stack trace of the code that invoked the event, if this is a programmatic event, but we can't currently detect that. */ return; } if (b->type() == FUNCTION_CALL || b->type()==SOURCE || b->type()==SUBST) { /* These types of blocks should be printed */ int i; switch (b->type()) { case SOURCE: { const source_block_t *sb = static_cast(b); const wchar_t *source_dest = sb->source_file; append_format(buff, _(L"in . (source) call of file '%ls',\n"), source_dest); break; } case FUNCTION_CALL: { const function_block_t *fb = static_cast(b); append_format(buff, _(L"in function '%ls',\n"), fb->name.c_str()); break; } case SUBST: { append_format(buff, _(L"in command substitution\n")); break; } default: /* Can't get here */ break; } const wchar_t *file = b->src_filename; if (file) { append_format(buff, _(L"\tcalled on line %d of file '%ls',\n"), b->src_lineno, file); } else { append_format(buff, _(L"\tcalled on standard input,\n")); } if (b->type() == FUNCTION_CALL) { const function_block_t *fb = static_cast(b); const process_t * const process = fb->process; if (process->argv(1)) { wcstring tmp; for (i=1; process->argv(i); i++) { if (i > 1) tmp.push_back(L' '); tmp.append(process->argv(i)); } append_format(buff, _(L"\twith parameter list '%ls'\n"), tmp.c_str()); } } append_format(buff, L"\n"); } /* Recursively print the next block */ parser_t::stack_trace(b->outer, buff); } /** Returns the name of the currently evaluated function if we are currently evaluating a function, null otherwise. This is tested by moving down the block-scope-stack, checking every block if it is of type FUNCTION_CALL. */ const wchar_t *parser_t::is_function() const { // PCA: Have to make this a string somehow ASSERT_IS_MAIN_THREAD(); wcstring result; block_t *b = current_block; while (1) { if (!b) { return NULL; } if (b->type() == FUNCTION_CALL) { const function_block_t *fb = static_cast(b); return fb->name.c_str(); } b=b->outer; } } int parser_t::get_lineno() const { int lineno; if (! current_tokenizer || ! tok_string(current_tokenizer)) return -1; lineno = current_tokenizer->line_number_of_character_at_offset(current_tokenizer_pos); const wchar_t *function_name; if ((function_name = is_function())) { lineno += function_get_definition_offset(function_name); } return lineno; } int parser_t::line_number_of_character_at_offset(size_t idx) const { if (! current_tokenizer) return -1; int result = current_tokenizer->line_number_of_character_at_offset(idx); //assert(result == parse_util_lineno(tok_string( current_tokenizer ), idx)); return result; } const wchar_t *parser_t::current_filename() const { /* We query a global array for the current file name, so it only makes sense to ask this on the principal parser. */ ASSERT_IS_MAIN_THREAD(); assert(this == &principal_parser()); block_t *b = current_block; while (1) { if (!b) { return reader_current_filename(); } if (b->type() == FUNCTION_CALL) { const function_block_t *fb = static_cast(b); return function_get_definition_file(fb->name); } b=b->outer; } } /** Calculates the on-screen width of the specified substring of the specified string. This function takes into account the width and alignment of the tab character, but other wise behaves like repeatedly calling wcwidth. */ static int printed_width(const wchar_t *str, int len) { int res=0; int i; CHECK(str, 0); for (i=0; str[i] && i= (size_t)min_match && (wcsncmp(L"--help", s, len) == 0)); } job_t *parser_t::job_create(void) { job_t *res = new job_t(acquire_job_id()); this->my_job_list.push_front(res); job_set_flag(res, JOB_CONTROL, (job_control_mode==JOB_CONTROL_ALL) || ((job_control_mode == JOB_CONTROL_INTERACTIVE) && (get_is_interactive()))); return res; } bool parser_t::job_remove(job_t *j) { job_list_t::iterator iter = std::find(my_job_list.begin(), my_job_list.end(), j); if (iter != my_job_list.end()) { my_job_list.erase(iter); return true; } else { debug(1, _(L"Job inconsistency")); sanity_lose(); return false; } } void parser_t::job_promote(job_t *job) { signal_block(); job_list_t::iterator loc = std::find(my_job_list.begin(), my_job_list.end(), job); assert(loc != my_job_list.end()); /* Move the job to the beginning */ my_job_list.splice(my_job_list.begin(), my_job_list, loc); signal_unblock(); } job_t *parser_t::job_get(job_id_t id) { job_iterator_t jobs(my_job_list); job_t *job; while ((job = jobs.next())) { if (id <= 0 || job->job_id == id) return job; } return NULL; } job_t *parser_t::job_get_from_pid(int pid) { job_iterator_t jobs; job_t *job; while ((job = jobs.next())) { if (job->pgid == pid) return job; } return 0; } /** Parse options for the specified job \param p the process to parse options for \param j the job to which the process belongs to \param tok the tokenizer to read options from \param args the argument list to insert options into \param args unskip whether we should ignore current_block->skip. Big hack because of our dumb handling of if statements. */ void parser_t::parse_job_argument_list(process_t *p, job_t *j, tokenizer_t *tok, std::vector &args, bool unskip) { int is_finished=0; int proc_is_count=0; int matched_wildcard = 0, unmatched_wildcard = 0; wcstring unmatched; int unmatched_pos=0; /* Test if this is the 'count' command. We need to special case count in the shell, since it should display a help message on 'count -h', but not on 'set foo -h; count $foo'. This is an ugly workaround and a huge hack, but as near as I can tell, the alternatives are worse. */ proc_is_count = (args.at(0).completion == L"count"); while (1) { switch (tok_last_type(tok)) { case TOK_PIPE: { wchar_t *end; if (p->type == INTERNAL_EXEC) { error(SYNTAX_ERROR, tok_get_pos(tok), EXEC_ERR_MSG); return; } errno = 0; p->pipe_write_fd = fish_wcstoi(tok_last(tok), &end, 10); if (p->pipe_write_fd < 0 || errno || *end) { error(SYNTAX_ERROR, tok_get_pos(tok), ILLEGAL_FD_ERR_MSG, tok_last(tok)); return; } p->set_argv(completions_to_wcstring_list(args)); p->next = new process_t(); tok_next(tok); /* Don't do anything on failure. parse_job will notice the error flag and report any errors for us */ parse_job(p->next, j, tok); is_finished = 1; break; } case TOK_BACKGROUND: { job_set_flag(j, JOB_FOREGROUND, 0); } case TOK_END: { if (!p->get_argv()) p->set_argv(completions_to_wcstring_list(args)); if (tok_has_next(tok)) tok_next(tok); is_finished = 1; break; } case TOK_STRING: { int skip=0; if (job_get_flag(j, JOB_SKIP)) { skip = 1; } else if (current_block->skip && ! unskip) { /* If this command should be skipped, we do not expand the arguments */ skip=1; /* But if this is in fact a case statement or an elseif statement, then it should be evaluated */ block_type_t type = current_block->type(); if (type == SWITCH && args.at(0).completion == L"case" && p->type == INTERNAL_BUILTIN) { skip=0; } else if (job_get_flag(j, JOB_ELSEIF) && ! job_should_skip_elseif(j, current_block)) { skip=0; } } else { /* If this is an else if, and we should skip it, then don't expand any arguments */ if (job_get_flag(j, JOB_ELSEIF) && job_should_skip_elseif(j, current_block)) { skip = 1; } } if (!skip) { if ((proc_is_count) && (args.size() == 1) && (parser_t::is_help(tok_last(tok), 0)) && (p->type == INTERNAL_BUILTIN)) { /* Display help for count */ p->count_help_magic = 1; } switch (expand_string(tok_last(tok), args, 0)) { case EXPAND_ERROR: { err_pos=tok_get_pos(tok); if (error_code == 0) { error(SYNTAX_ERROR, tok_get_pos(tok), _(L"Could not expand string '%ls'"), tok_last(tok)); } break; } case EXPAND_WILDCARD_NO_MATCH: { unmatched_wildcard = 1; if (unmatched.empty()) { unmatched = tok_last(tok); unmatched_pos = tok_get_pos(tok); } break; } case EXPAND_WILDCARD_MATCH: { matched_wildcard = 1; break; } case EXPAND_OK: { break; } } } break; } case TOK_REDIRECT_OUT: case TOK_REDIRECT_IN: case TOK_REDIRECT_APPEND: case TOK_REDIRECT_FD: case TOK_REDIRECT_NOCLOB: { int type = tok_last_type(tok); shared_ptr new_io; wcstring target; bool has_target = false; wchar_t *end; /* Don't check redirections in skipped part Otherwise, bogus errors may be the result. (Do check that token is string, though) */ if (current_block->skip && ! unskip) { tok_next(tok); if (tok_last_type(tok) != TOK_STRING) { error(SYNTAX_ERROR, tok_get_pos(tok), REDIRECT_TOKEN_ERR_MSG, tok_get_desc(tok_last_type(tok))); } break; } errno = 0; int fd = fish_wcstoi(tok_last(tok), &end, 10); if (fd < 0 || errno || *end) { error(SYNTAX_ERROR, tok_get_pos(tok), ILLEGAL_FD_ERR_MSG, tok_last(tok)); } else { tok_next(tok); switch (tok_last_type(tok)) { case TOK_STRING: { target = tok_last(tok); has_target = expand_one(target, no_exec ? EXPAND_SKIP_VARIABLES : 0); if (! has_target && error_code == 0) { error(SYNTAX_ERROR, tok_get_pos(tok), REDIRECT_TOKEN_ERR_MSG, tok_last(tok)); } break; } default: error(SYNTAX_ERROR, tok_get_pos(tok), REDIRECT_TOKEN_ERR_MSG, tok_get_desc(tok_last_type(tok))); } if (! has_target || target.empty()) { if (error_code == 0) error(SYNTAX_ERROR, tok_get_pos(tok), _(L"Invalid IO redirection")); tok_next(tok); } else if (type == TOK_REDIRECT_FD) { if (target == L"-") { new_io.reset(new io_close_t(fd)); } else { wchar_t *end; errno = 0; int old_fd = fish_wcstoi(target.c_str(), &end, 10); if (old_fd < 0 || errno || *end) { error(SYNTAX_ERROR, tok_get_pos(tok), _(L"Requested redirection to something that is not a file descriptor %ls"), target.c_str()); tok_next(tok); } else { new_io.reset(new io_fd_t(fd, old_fd)); } } } else { int flags = 0; switch (type) { case TOK_REDIRECT_APPEND: flags = O_CREAT | O_APPEND | O_WRONLY; break; case TOK_REDIRECT_OUT: flags = O_CREAT | O_WRONLY | O_TRUNC; break; case TOK_REDIRECT_NOCLOB: flags = O_CREAT | O_EXCL | O_WRONLY; break; case TOK_REDIRECT_IN: flags = O_RDONLY; break; } io_file_t *new_io_file = new io_file_t(fd, target, flags); new_io.reset(new_io_file); } } if (new_io.get() != NULL) { j->io.push_back(new_io); } } break; case TOK_ERROR: { error(SYNTAX_ERROR, tok_get_pos(tok), TOK_ERR_MSG, tok_last(tok)); return; } default: error(SYNTAX_ERROR, tok_get_pos(tok), UNEXPECTED_TOKEN_ERR_MSG, tok_get_desc(tok_last_type(tok))); tok_next(tok); break; } if ((is_finished) || (error_code != 0)) break; tok_next(tok); } if (!error_code) { if (unmatched_wildcard && !matched_wildcard) { job_set_flag(j, JOB_WILDCARD_ERROR, 1); proc_set_last_status(STATUS_UNMATCHED_WILDCARD); if (get_is_interactive() && !is_block) { int tmp; debug(1, WILDCARD_ERR_MSG, unmatched.c_str()); tmp = current_tokenizer_pos; current_tokenizer_pos = unmatched_pos; fwprintf(stderr, L"%ls", parser_t::current_line()); current_tokenizer_pos=tmp; } } } return; } /* static void print_block_stack( block_t *b ) { if( !b ) return; print_block_stack( b->outer ); debug( 0, L"Block type %ls, skip: %d", parser_get_block_desc( b->type ), b->skip ); } */ /** Fully parse a single job. Does not call exec on it, but any command substitutions in the job will be executed. \param p The process structure that should be used to represent the first process in the job. \param j The job structure to contain the parsed job \param tok tokenizer to read from f \return 1 on success, 0 on error */ int parser_t::parse_job(process_t *p, job_t *j, tokenizer_t *tok) { std::vector args; // The list that will become the argv array for the program int use_function = 1; // May functions be considered when checking what action this command represents int use_builtin = 1; // May builtins be considered when checking what action this command represents int use_command = 1; // May commands be considered when checking what action this command represents int is_new_block=0; // Does this command create a new block? bool unskip = false; // Maybe we are an elseif inside an if block; if so we may want to evaluate this even if the if block is currently set to skip bool allow_bogus_command = false; // If we are an elseif that will not be executed, or an AND or OR that will have been short circuited, don't complain about non-existent commands block_t *prev_block = current_block; scoped_push tokenizer_pos_push(¤t_tokenizer_pos, tok_get_pos(tok)); while (args.empty()) { wcstring nxt; bool has_nxt = false; bool consumed = false; // Set to one if the command requires a second command, like e.g. while does int mark; // Use to save the position of the beginning of the token switch (tok_last_type(tok)) { case TOK_STRING: { nxt = tok_last(tok); has_nxt = expand_one(nxt, EXPAND_SKIP_CMDSUBST | EXPAND_SKIP_VARIABLES); if (! has_nxt) { error(SYNTAX_ERROR, tok_get_pos(tok), ILLEGAL_CMD_ERR_MSG, tok_last(tok)); return 0; } break; } case TOK_ERROR: { error(SYNTAX_ERROR, tok_get_pos(tok), TOK_ERR_MSG, tok_last(tok)); return 0; } case TOK_PIPE: { const wchar_t *str = tok_string(tok); if (tok_get_pos(tok)>0 && str[tok_get_pos(tok)-1] == L'|') { error(SYNTAX_ERROR, tok_get_pos(tok), CMD_OR_ERR_MSG, tok_get_desc(tok_last_type(tok))); } else { error(SYNTAX_ERROR, tok_get_pos(tok), CMD_ERR_MSG, tok_get_desc(tok_last_type(tok))); } return 0; } default: { error(SYNTAX_ERROR, tok_get_pos(tok), CMD_ERR_MSG, tok_get_desc(tok_last_type(tok))); return 0; } } mark = tok_get_pos(tok); if (contains(nxt, L"command", L"builtin", L"not", L"and", L"or", L"exec")) { int sw; int is_exec = nxt == L"exec"; if (is_exec && (p != j->first_process)) { error(SYNTAX_ERROR, tok_get_pos(tok), EXEC_ERR_MSG); return 0; } tok_next(tok); sw = parser_keywords_is_switch(tok_last(tok)); if (sw == ARG_SWITCH) { tok_set_pos(tok, mark); } else { if (sw == ARG_SKIP) { tok_next(tok); } consumed = true; if (nxt == L"command" || nxt == L"builtin") { use_function = 0; if (nxt == L"command") { use_builtin = 0; use_command = 1; } else { use_builtin = 1; use_command = 0; } } else if (nxt == L"not") { job_set_flag(j, JOB_NEGATE, !job_get_flag(j, JOB_NEGATE)); } else if (nxt == L"and") { bool skip = (proc_get_last_status() != 0); job_set_flag(j, JOB_SKIP, skip); allow_bogus_command = skip; } else if (nxt == L"or") { bool skip = (proc_get_last_status() == 0); job_set_flag(j, JOB_SKIP, skip); allow_bogus_command = skip; } else if (is_exec) { use_function = 0; use_builtin=0; p->type=INTERNAL_EXEC; tokenizer_pos_push.restore(); } } } else if (nxt == L"while") { bool new_block = false; tok_next(tok); while_block_t *wb = NULL; if ((current_block->type() != WHILE)) { new_block = true; } else if ((wb = static_cast(current_block))->status == WHILE_TEST_AGAIN) { wb->status = WHILE_TEST_FIRST; } else { new_block = true; } if (new_block) { while_block_t *wb = new while_block_t(); wb->status = WHILE_TEST_FIRST; wb->tok_pos = mark; this->push_block(wb); } consumed = true; is_new_block=1; } else if (nxt == L"if") { tok_next(tok); if_block_t *ib = new if_block_t(); this->push_block(ib); ib->tok_pos = mark; is_new_block=1; consumed = true; } else if (nxt == L"else") { /* Record where the else is for error reporting */ const int else_pos = tok_get_pos(tok); /* See if we have any more arguments, that is, whether we're ELSE IF ... or just ELSE. */ tok_next(tok); if (tok_last_type(tok) == TOK_STRING && current_block->type() == IF) { const if_block_t *ib = static_cast(current_block); /* If we've already encountered an else, complain */ if (ib->else_evaluated) { error(SYNTAX_ERROR, else_pos, INVALID_ELSEIF_PAST_ELSE_ERR_MSG, L"else if"); } else { job_set_flag(j, JOB_ELSEIF, 1); consumed = true; /* We're at the IF. Go past it. */ tok_next(tok); /* We want to execute this ELSEIF if the IF expression was evaluated, it failed, and so has every other ELSEIF (if any) */ unskip = (ib->if_expr_evaluated && ! ib->any_branch_taken); /* But if we're not executing it, don't complain about its command if it doesn't exist */ if (! unskip) allow_bogus_command = true; } } } /* Test if we need another command */ if (consumed) { /* Yes we do, around in the loop for another lap, then! */ continue; } if (use_function && (unskip || ! current_block->skip)) { bool nxt_forbidden=false; wcstring forbid; int is_function_call=0; /* This is a bit fragile. It is a test to see if we are inside of function call, but not inside a block in that function call. If, in the future, the rules for what block scopes are pushed on function invocation changes, then this check will break. */ if ((current_block->type() == TOP) && (current_block->outer) && (current_block->outer->type() == FUNCTION_CALL)) is_function_call = 1; /* If we are directly in a function, and this is the first command of the block, then the function we are executing may not be called, since that would mean an infinite recursion. */ if (is_function_call && !current_block->had_command) { forbid = forbidden_function.empty() ? wcstring(L"") : forbidden_function.back(); if (forbid == nxt) { /* Infinite recursive loop */ nxt_forbidden = true; error(SYNTAX_ERROR, tok_get_pos(tok), INFINITE_RECURSION_ERR_MSG); } } if (!nxt_forbidden && has_nxt && function_exists(nxt)) { /* Check if we have reached the maximum recursion depth */ if (forbidden_function.size() > MAX_RECURSION_DEPTH) { error(SYNTAX_ERROR, tok_get_pos(tok), OVERFLOW_RECURSION_ERR_MSG); } else { p->type = INTERNAL_FUNCTION; } } } args.push_back(completion_t(nxt)); } if (error_code == 0) { if (!p->type) { if (use_builtin && builtin_exists(args.at(0).completion)) { p->type = INTERNAL_BUILTIN; is_new_block |= parser_keywords_is_block(args.at(0).completion); } } if ((!p->type || (p->type == INTERNAL_EXEC))) { /* If we are not executing the current block, allow non-existent commands. */ if (current_block->skip && ! unskip) allow_bogus_command = true; //note this may already be true for other reasons if (allow_bogus_command) { p->actual_cmd.clear(); } else { int err; bool has_command = path_get_path(args.at(0).completion, &p->actual_cmd); err = errno; bool use_implicit_cd = false; if (! has_command) { /* If the specified command does not exist, try using an implicit cd. */ wcstring implicit_cd_path; use_implicit_cd = path_can_be_implicit_cd(args.at(0).completion, &implicit_cd_path); if (use_implicit_cd) { args.clear(); args.push_back(completion_t(L"cd")); args.push_back(completion_t(implicit_cd_path)); /* If we have defined a wrapper around cd, use it, otherwise use the cd builtin */ if (use_function && function_exists(L"cd")) p->type = INTERNAL_FUNCTION; else p->type = INTERNAL_BUILTIN; } } // Disabled pending discussion in https://github.com/fish-shell/fish-shell/issues/367 #if 0 if (! has_command && ! use_implicit_cd) { if (fish_openSUSE_dbus_hack_hack_hack_hack(&args)) { has_command = true; p->type = INTERNAL_BUILTIN; } } #endif /* Check if the specified command exists */ if (! has_command && ! use_implicit_cd) { int tmp; const wchar_t *cmd = args.at(0).completion.c_str(); /* We couldn't find the specified command. What we want to happen now is that the specified job won't get executed, and an error message is printed on-screen, but otherwise, the parsing/execution of the file continues. Because of this, we don't want to call error(), since that would stop execution of the file. Instead we let p->actual_command be 0 (null), which will cause the job to silently not execute. We also print an error message and set the status to 127 (This is the standard number for this, used by other shells like bash and zsh). */ if (wcschr(cmd, L'=')) { wchar_t *cpy = wcsdup(cmd); wchar_t *valpart = wcschr(cpy, L'='); *valpart++=0; debug(0, COMMAND_ASSIGN_ERR_MSG, cmd, cpy, valpart); free(cpy); } else if (cmd[0]==L'$') { const env_var_t val_wstr = env_get_string(cmd+1); const wchar_t *val = val_wstr.missing() ? NULL : val_wstr.c_str(); if (val) { debug(0, _(L"Variables may not be used as commands. Instead, define a function like 'function %ls; %ls $argv; end'. See the help section for the function command by typing 'help function'."), cmd+1, val, cmd); } else { debug(0, _(L"Variables may not be used as commands. Instead, define a function. See the help section for the function command by typing 'help function'."), cmd); } } else if (wcschr(cmd, L'$')) { debug(0, _(L"Commands may not contain variables. Use the eval builtin instead, like 'eval %ls'. See the help section for the eval command by typing 'help eval'."), cmd, cmd); } else if (err!=ENOENT) { debug(0, _(L"The file '%ls' is not executable by this user"), cmd?cmd:L"UNKNOWN"); } else { debug(0, _(L"Unknown command '%ls'"), cmd?cmd:L"UNKNOWN"); } tmp = current_tokenizer_pos; current_tokenizer_pos = tok_get_pos(tok); fwprintf(stderr, L"%ls", parser_t::current_line()); current_tokenizer_pos=tmp; job_set_flag(j, JOB_SKIP, 1); wcstring_list_t event_args; event_args.push_back(args.at(0).completion); event_fire_generic(L"fish_command_not_found", &event_args); proc_set_last_status(err==ENOENT?STATUS_UNKNOWN_COMMAND:STATUS_NOT_EXECUTABLE); } } } if ((p->type == EXTERNAL) && !use_command) { error(SYNTAX_ERROR, tok_get_pos(tok), UNKNOWN_BUILTIN_ERR_MSG, args.back().completion.c_str()); } } if (is_new_block) { const wchar_t *end=parser_find_end(tok_string(tok) + current_tokenizer_pos); int make_sub_block = j->first_process != p; if (!end) { error(SYNTAX_ERROR, tok_get_pos(tok), BLOCK_END_ERR_MSG); } else { if (!make_sub_block) { int done=0; tokenizer_t subtok(end, 0); for (; ! done && tok_has_next(&subtok); tok_next(&subtok)) { switch (tok_last_type(&subtok)) { case TOK_END: done = 1; break; case TOK_REDIRECT_OUT: case TOK_REDIRECT_NOCLOB: case TOK_REDIRECT_APPEND: case TOK_REDIRECT_IN: case TOK_REDIRECT_FD: case TOK_PIPE: { done = 1; make_sub_block = 1; break; } case TOK_STRING: { break; } default: { done = 1; error(SYNTAX_ERROR, current_tokenizer_pos, BLOCK_END_ERR_MSG); } } } } if (make_sub_block) { long end_pos = end-tok_string(tok); const wcstring sub_block(tok_string(tok) + current_tokenizer_pos, end_pos - current_tokenizer_pos); p->type = INTERNAL_BLOCK; args.at(0) = completion_t(sub_block); tok_set_pos(tok, (int)end_pos); while (prev_block != current_block) { parser_t::pop_block(); } } else tok_next(tok); } } else tok_next(tok); if (!error_code) { if (p->type == INTERNAL_BUILTIN && parser_keywords_skip_arguments(args.at(0).completion)) { if (!p->get_argv()) p->set_argv(completions_to_wcstring_list(args)); } else { parse_job_argument_list(p, j, tok, args, unskip); } } if (!error_code) { if (!is_new_block) { current_block->had_command = true; } } if (error_code) { /* Make sure the block stack is consistent */ while (prev_block != current_block) { parser_t::pop_block(); } } return !error_code; } /** Do skipped execution of command. This means that only limited execution of block level commands such as end and switch should be preformed. \param j the job to execute */ void parser_t::skipped_exec(job_t * j) { process_t *p; /* Handle other skipped guys */ for (p = j->first_process; p; p=p->next) { if (p->type == INTERNAL_BUILTIN) { if ((wcscmp(p->argv0(), L"for")==0) || (wcscmp(p->argv0(), L"switch")==0) || (wcscmp(p->argv0(), L"begin")==0) || (wcscmp(p->argv0(), L"function")==0)) { this->push_block(new fake_block_t()); } else if (wcscmp(p->argv0(), L"end")==0) { if (!current_block->outer->skip) { exec(*this, j); return; } parser_t::pop_block(); } else if (wcscmp(p->argv0(), L"else")==0) { if (current_block->type() == IF) { /* Evaluate this ELSE if the IF expression failed, and so has every ELSEIF (if any) expression thus far */ const if_block_t *ib = static_cast(current_block); if (ib->if_expr_evaluated && ! ib->any_branch_taken) { exec(*this, j); return; } } } else if (wcscmp(p->argv0(), L"case")==0) { if (current_block->type() == SWITCH) { exec(*this, j); return; } } } } job_free(j); } /* Return whether we should skip the current block, if it is an elseif. */ static bool job_should_skip_elseif(const job_t *job, const block_t *current_block) { if (current_block->type() != IF) { /* Not an IF block, so just honor the skip property */ return current_block->skip; } else { /* We are an IF block */ const if_block_t *ib = static_cast(current_block); /* Execute this ELSEIF if the IF expression has been evaluated, it evaluated to false, and all ELSEIFs so far have evaluated to false. */ bool execute_elseif = (ib->if_expr_evaluated && ! ib->any_branch_taken); /* Invert the sense */ return ! execute_elseif; } } /** Evaluates a job from the specified tokenizer. First calls parse_job to parse the job and then calls exec to execute it. \param tok The tokenizer to read tokens from */ void parser_t::eval_job(tokenizer_t *tok) { ASSERT_IS_MAIN_THREAD(); job_t *j; int start_pos = job_start_pos = tok_get_pos(tok); long long t1=0, t2=0, t3=0; profile_item_t *profile_item = NULL; bool skip = false; int job_begin_pos; const bool do_profile = profile; if (do_profile) { profile_item = new profile_item_t(); profile_item->skipped = 1; profile_items.push_back(profile_item); t1 = get_time(); } switch (tok_last_type(tok)) { case TOK_STRING: { j = this->job_create(); job_set_flag(j, JOB_FOREGROUND, 1); job_set_flag(j, JOB_TERMINAL, job_get_flag(j, JOB_CONTROL)); job_set_flag(j, JOB_TERMINAL, job_get_flag(j, JOB_CONTROL) \ && (!is_subshell && !is_event)); job_set_flag(j, JOB_SKIP_NOTIFICATION, is_subshell \ || is_block \ || is_event \ || (!get_is_interactive())); current_block->job = j; if (get_is_interactive()) { if (tcgetattr(0, &j->tmodes)) { tok_next(tok); wperror(L"tcgetattr"); job_free(j); break; } } j->first_process = new process_t(); job_begin_pos = tok_get_pos(tok); if (parse_job(j->first_process, j, tok) && j->first_process->get_argv()) { if (job_start_pos < tok_get_pos(tok)) { long stop_pos = tok_get_pos(tok); const wchar_t *newline = wcschr(tok_string(tok)+start_pos, L'\n'); if (newline) stop_pos = mini(stop_pos, newline - tok_string(tok)); j->set_command(wcstring(tok_string(tok)+start_pos, stop_pos-start_pos)); } else j->set_command(L""); if (do_profile) { t2 = get_time(); profile_item->cmd = j->command(); profile_item->skipped=current_block->skip; } /* If we're an ELSEIF, then we may want to unskip, if we're skipping because of an IF */ if (job_get_flag(j, JOB_ELSEIF)) { bool skip_elseif = job_should_skip_elseif(j, current_block); /* Record that we're entering an elseif */ if (! skip_elseif) { /* We must be an IF block here */ assert(current_block->type() == IF); static_cast(current_block)->is_elseif_entry = true; } /* Record that in the block too. This is similar to what builtin_else does. */ current_block->skip = skip_elseif; } skip = skip || current_block->skip; skip = skip || job_get_flag(j, JOB_WILDCARD_ERROR); skip = skip || job_get_flag(j, JOB_SKIP); if (!skip) { int was_builtin = 0; if (j->first_process->type==INTERNAL_BUILTIN && !j->first_process->next) was_builtin = 1; scoped_push tokenizer_pos_push(¤t_tokenizer_pos, job_begin_pos); exec(*this, j); /* Only external commands require a new fishd barrier */ if (!was_builtin) set_proc_had_barrier(false); } else { this->skipped_exec(j); } if (do_profile) { t3 = get_time(); profile_item->level=eval_level; profile_item->parse = (int)(t2-t1); profile_item->exec=(int)(t3-t2); } if (current_block->type() == WHILE) { while_block_t *wb = static_cast(current_block); switch (wb->status) { case WHILE_TEST_FIRST: { // PCA I added the 'wb->skip ||' part because we couldn't reliably // control-C out of loops like this: while test 1 -eq 1; end wb->skip = wb->skip || proc_get_last_status()!= 0; wb->status = WHILE_TESTED; } break; } } if (current_block->type() == IF) { if_block_t *ib = static_cast(current_block); if (ib->skip) { /* Nothing */ } else if (! ib->if_expr_evaluated) { /* Execute the IF */ bool if_result = (proc_get_last_status() == 0); ib->any_branch_taken = if_result; /* Don't execute if the expression failed */ current_block->skip = ! if_result; ib->if_expr_evaluated = true; } else if (ib->is_elseif_entry && ! ib->any_branch_taken) { /* Maybe mark an ELSEIF branch as taken */ bool elseif_taken = (proc_get_last_status() == 0); ib->any_branch_taken = elseif_taken; current_block->skip = ! elseif_taken; ib->is_elseif_entry = false; } } } else { /* This job could not be properly parsed. We free it instead, and set the status to 1. This should be rare, since most errors should be detected by the ahead of time validator. */ job_free(j); proc_set_last_status(1); } current_block->job = 0; break; } case TOK_END: { if (tok_has_next(tok)) tok_next(tok); break; } case TOK_BACKGROUND: { const wchar_t *str = tok_string(tok); if (tok_get_pos(tok)>0 && str[tok_get_pos(tok)-1] == L'&') { error(SYNTAX_ERROR, tok_get_pos(tok), CMD_AND_ERR_MSG, tok_get_desc(tok_last_type(tok))); } else { error(SYNTAX_ERROR, tok_get_pos(tok), CMD_ERR_MSG, tok_get_desc(tok_last_type(tok))); } return; } case TOK_ERROR: { error(SYNTAX_ERROR, tok_get_pos(tok), TOK_ERR_MSG, tok_last(tok)); return; } default: { error(SYNTAX_ERROR, tok_get_pos(tok), CMD_ERR_MSG, tok_get_desc(tok_last_type(tok))); return; } } job_reap(0); } int parser_t::eval(const wcstring &cmdStr, const io_chain_t &io, enum block_type_t block_type) { const wchar_t * const cmd = cmdStr.c_str(); size_t forbid_count; int code; block_t *start_current_block = current_block; /* Record the current chain so we can put it back later */ scoped_push block_io_push(&block_io, io); scoped_push forbidden_function_push(&forbidden_function); if (block_type == SUBST) { forbidden_function.clear(); } CHECK_BLOCK(1); forbid_count = forbidden_function.size(); job_reap(0); debug(4, L"eval: %ls", cmd); if (!cmd) { debug(1, EVAL_NULL_ERR_MSG); bugreport(); return 1; } if ((block_type != TOP) && (block_type != SUBST)) { debug(1, INVALID_SCOPE_ERR_MSG, parser_t::get_block_desc(block_type)); bugreport(); return 1; } eval_level++; this->push_block(new scope_block_t(block_type)); tokenizer_t local_tokenizer(cmd, 0); scoped_push tokenizer_push(¤t_tokenizer, &local_tokenizer); error_code = 0; event_fire(NULL); while (tok_has_next(current_tokenizer) && !error_code && !sanity_check() && !exit_status()) { this->eval_job(current_tokenizer); event_fire(NULL); } parser_t::pop_block(); while (start_current_block != current_block) { if (current_block == 0) { debug(0, _(L"End of block mismatch. Program terminating.")); bugreport(); FATAL_EXIT(); break; } if ((!error_code) && (!exit_status()) && (!proc_get_last_status())) { //debug( 2, L"Status %d\n", proc_get_last_status() ); debug(1, L"%ls", parser_t::get_block_desc(current_block->type())); debug(1, BLOCK_END_ERR_MSG); fwprintf(stderr, L"%ls", parser_t::current_line()); const wcstring h = builtin_help_get(*this, L"end"); if (h.size()) fwprintf(stderr, L"%ls", h.c_str()); break; } parser_t::pop_block(); } this->print_errors_stderr(); tokenizer_push.restore(); while (forbidden_function.size() > forbid_count) parser_t::allow_function(); /* Restore previous eval state */ eval_level--; code=error_code; error_code=0; job_reap(0); return code; } /** \return the block type created by the specified builtin, or -1 on error. */ block_type_t parser_get_block_type(const wcstring &cmd) { for (size_t i=0; block_lookup[i].desc; i++) { if (block_lookup[i].name && cmd == block_lookup[i].name) { return block_lookup[i].type; } } return (block_type_t)-1; } /** \return the block command that createa the specified block type, or null on error. */ const wchar_t *parser_get_block_command(int type) { for (size_t i=0; block_lookup[i].desc; i++) { if (block_lookup[i].type == type) { return block_lookup[i].name; } } return NULL; } /** Test if this argument contains any errors. Detected errors include syntax errors in command substitutions, improperly escaped characters and improper use of the variable expansion operator. */ int parser_t::parser_test_argument(const wchar_t *arg, wcstring *out, const wchar_t *prefix, int offset) { wchar_t *unesc; wchar_t *pos; int err=0; wchar_t *paran_begin, *paran_end; wchar_t *arg_cpy; int do_loop = 1; CHECK(arg, 1); arg_cpy = wcsdup(arg); while (do_loop) { switch (parse_util_locate_cmdsubst(arg_cpy, ¶n_begin, ¶n_end, 0)) { case -1: err=1; if (out) { error(SYNTAX_ERROR, offset, L"Mismatched parenthesis"); this->print_errors(*out, prefix); } free(arg_cpy); return err; case 0: do_loop = 0; break; case 1: { wchar_t *subst = wcsndup(paran_begin+1, paran_end-paran_begin-1); wcstring tmp; tmp.append(arg_cpy, paran_begin - arg_cpy); tmp.push_back(INTERNAL_SEPARATOR); tmp.append(paran_end+1); // debug( 1, L"%ls -> %ls %ls", arg_cpy, subst, tmp.buff ); err |= parser_t::test(subst, 0, out, prefix); free(subst); free(arg_cpy); arg_cpy = wcsdup(tmp.c_str()); /* Do _not_ call sb_destroy on this stringbuffer - it's buffer is used as the new 'arg_cpy'. It is free'd at the end of the loop. */ break; } } } unesc = unescape(arg_cpy, 1); if (!unesc) { if (out) { error(SYNTAX_ERROR, offset, L"Invalid token '%ls'", arg_cpy); print_errors(*out, prefix); } return 1; } else { /* Check for invalid variable expansions */ for (pos = unesc; *pos; pos++) { switch (*pos) { case VARIABLE_EXPAND: case VARIABLE_EXPAND_SINGLE: { wchar_t n = *(pos+1); if (n != VARIABLE_EXPAND && n != VARIABLE_EXPAND_SINGLE && !wcsvarchr(n)) { err=1; if (out) { expand_variable_error(*this, unesc, pos-unesc, offset); print_errors(*out, prefix); } } break; } } } } free(arg_cpy); free(unesc); return err; } int parser_t::test_args(const wchar_t * buff, wcstring *out, const wchar_t *prefix) { int do_loop = 1; int err = 0; CHECK(buff, 1); tokenizer_t tok(buff, 0); scoped_push tokenizer_push(¤t_tokenizer, &tok); scoped_push tokenizer_pos_push(¤t_tokenizer_pos); for (; do_loop && tok_has_next(&tok); tok_next(&tok)) { current_tokenizer_pos = tok_get_pos(&tok); switch (tok_last_type(&tok)) { case TOK_STRING: { err |= parser_test_argument(tok_last(&tok), out, prefix, tok_get_pos(&tok)); break; } case TOK_END: { break; } case TOK_ERROR: { if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), TOK_ERR_MSG, tok_last(&tok)); print_errors(*out, prefix); } err=1; do_loop=0; break; } default: { if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), UNEXPECTED_TOKEN_ERR_MSG, tok_get_desc(tok_last_type(&tok))); print_errors(*out, prefix); } err=1; do_loop=0; break; } } } error_code=0; return err; } // helper type used in parser::test below struct block_info_t { int position; //tokenizer position block_type_t type; //type of the block int indentation; //indentation associated with the block bool has_had_case; //if we are a switch, whether we've encountered a case }; int parser_t::test(const wchar_t *buff, int *block_level, wcstring *out, const wchar_t *prefix) { ASSERT_IS_MAIN_THREAD(); /* Set to one if a command name has been given for the currently parsed process specification */ int had_cmd=0; int err=0; int unfinished = 0; // These are very nearly stacks, but sometimes we have to inspect non-top elements (e.g. return) std::vector block_infos; int indentation_sum = 0; //sum of indentation in block_infos int res = 0; /* Set to 1 if the current command is inside a pipeline */ int is_pipeline = 0; /* Set to one if the currently specified process can not be used inside a pipeline */ int forbid_pipeline = 0; /* Set to one if an additional process specification is needed */ bool needs_cmd = false; /* Counter on the number of arguments this function has encountered so far. Is set to -1 when the count is unknown, i.e. after encountering an argument that contains substitutions that can expand to more/less arguemtns then 1. */ int arg_count=0; /* The currently validated command. */ wcstring command; bool has_command = false; CHECK(buff, 1); if (block_level) { size_t len = wcslen(buff); for (size_t i=0; i tokenizer_push(¤t_tokenizer, &tok); scoped_push tokenizer_pos_push(¤t_tokenizer_pos); for (;; tok_next(&tok)) { current_tokenizer_pos = tok_get_pos(&tok); int last_type = tok_last_type(&tok); int end_of_cmd = 0; switch (last_type) { case TOK_STRING: { if (!had_cmd) { int mark = tok_get_pos(&tok); had_cmd = 1; arg_count=0; command = tok_last(&tok); // Pass SKIP_HOME_DIRECTORIES for https://github.com/fish-shell/fish-shell/issues/512 has_command = expand_one(command, EXPAND_SKIP_CMDSUBST | EXPAND_SKIP_VARIABLES | EXPAND_SKIP_HOME_DIRECTORIES); if (! has_command) { command = L""; err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), ILLEGAL_CMD_ERR_MSG, tok_last(&tok)); print_errors(*out, prefix); } break; } if (needs_cmd) { /* end is not a valid command when a followup command is needed, such as after 'and' or 'while' */ if (contains(command, L"end")) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), COND_ERR_MSG); print_errors(*out, prefix); } } needs_cmd = false; } /* Decrement block count on end command */ if (command == L"end") { tok_next(&tok); tok_set_pos(&tok, mark); /* Test that end is not used when not inside any block */ if (block_infos.empty()) { err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), INVALID_END_ERR_MSG); print_errors(*out, prefix); const wcstring h = builtin_help_get(*this, L"end"); if (! h.empty()) append_format(*out, L"%ls", h.c_str()); } } else { indentation_sum -= block_infos.back().indentation; block_infos.pop_back(); } } /* Store the block level. This needs to be done _after_ checking for end commands, but _before_ checking for block opening commands. */ if (block_level != NULL) { int indentation_adjust = 0; if (command == L"else") { // if or else if goes back indentation_adjust = -1; } else if (command == L"case") { if (! block_infos.empty() && block_infos.back().type == SWITCH) { // mark that we've encountered a case, and increase the indentation // by doing this now, we avoid overly indenting the first case as the user types it if (! block_infos.back().has_had_case) { block_infos.back().has_had_case = true; block_infos.back().indentation += 1; indentation_sum += 1; } // unindent this case indentation_adjust = -1; } } block_level[tok_get_pos(&tok)] = indentation_sum + indentation_adjust; } /* Handle block commands */ if (parser_keywords_is_block(command)) { struct block_info_t info = {current_tokenizer_pos, parser_get_block_type(command), 1 /* indent */}; block_infos.push_back(info); indentation_sum += info.indentation; tok_next(&tok); tok_set_pos(&tok, mark); } /* If parser_keywords_is_subcommand is true, the command accepts a second command as it's first argument. If parser_skip_arguments is true, the second argument is optional. */ if (parser_keywords_is_subcommand(command) && !parser_keywords_skip_arguments(command)) { needs_cmd = true; had_cmd = 0; } if (contains(command, L"or", L"and")) { /* 'or' and 'and' can not be used inside pipelines */ if (is_pipeline) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), EXEC_ERR_MSG); print_errors(*out, prefix); } } } /* There are a lot of situations where pipelines are forbidden, including when using the exec builtin. */ if (parser_is_pipe_forbidden(command)) { if (is_pipeline) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), EXEC_ERR_MSG); print_errors(*out, prefix); } } forbid_pipeline = 1; } /* Test that the case builtin is only used directly in a switch block */ if (command == L"case") { if (block_infos.empty() || block_infos.back().type != SWITCH) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), INVALID_CASE_ERR_MSG); print_errors(*out, prefix); const wcstring h = builtin_help_get(*this, L"case"); if (h.size()) append_format(*out, L"%ls", h.c_str()); } } } /* Test that the return bultin is only used within function definitions */ if (command == L"return") { bool found_func = false; size_t block_idx = block_infos.size(); while (block_idx--) { if (block_infos.at(block_idx).type == FUNCTION_DEF) { found_func = true; break; } } if (!found_func) { /* Peek to see if the next argument is --help, in which case we'll allow it to show the help. */ int old_pos = tok_get_pos(&tok); int is_help = 0; tok_next(&tok); if (tok_last_type(&tok) == TOK_STRING) { wcstring first_arg = tok_last(&tok); if (expand_one(first_arg, EXPAND_SKIP_CMDSUBST) && parser_t::is_help(first_arg.c_str(), 3)) { is_help = 1; } } tok_set_pos(&tok, old_pos); if (!is_help) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), INVALID_RETURN_ERR_MSG); print_errors(*out, prefix); } } } } /* Test that break and continue are only used within loop blocks */ if (contains(command, L"break", L"continue")) { bool found_loop = false; size_t block_idx = block_infos.size(); while (block_idx--) { block_type_t type = block_infos.at(block_idx).type; if (type == WHILE || type == FOR) { found_loop = true; break; } } if (!found_loop) { /* Peek to see if the next argument is --help, in which case we'll allow it to show the help. */ int old_pos = tok_get_pos(&tok); int is_help = 0; tok_next(&tok); if (tok_last_type(&tok) == TOK_STRING) { wcstring first_arg = tok_last(&tok); if (expand_one(first_arg, EXPAND_SKIP_CMDSUBST) && parser_t::is_help(first_arg.c_str(), 3)) { is_help = 1; } } tok_set_pos(&tok, old_pos); if (!is_help) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), INVALID_LOOP_ERR_MSG); print_errors(*out, prefix); } } } } /* Test that else and else-if are only used directly in an if-block */ if (command == L"else") { if (block_infos.empty() || block_infos.back().type != IF) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), INVALID_ELSE_ERR_MSG, command.c_str()); print_errors(*out, prefix); } } } } else { err |= parser_test_argument(tok_last(&tok), out, prefix, tok_get_pos(&tok)); /* If possible, keep track of number of supplied arguments */ if (arg_count >= 0 && expand_is_clean(tok_last(&tok))) { arg_count++; } else { arg_count = -1; } if (has_command) { /* Try to make sure the second argument to 'for' is 'in' */ if (command == L"for") { if (arg_count == 1) { if (wcsvarname(tok_last(&tok))) { err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), BUILTIN_FOR_ERR_NAME, L"for", tok_last(&tok)); print_errors(*out, prefix); } } } else if (arg_count == 2) { if (wcscmp(tok_last(&tok), L"in") != 0) { err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), BUILTIN_FOR_ERR_IN, L"for"); print_errors(*out, prefix); } } } } else if (command == L"else") { if (arg_count == 1) { /* Any second argument must be "if" */ if (wcscmp(tok_last(&tok), L"if") != 0) { err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), BUILTIN_ELSEIF_ERR_ARGUMENT, L"else"); print_errors(*out, prefix); } } else { /* Successfully detected "else if". Now we need a new command. */ needs_cmd = true; had_cmd = false; } } } } } break; } case TOK_REDIRECT_OUT: case TOK_REDIRECT_IN: case TOK_REDIRECT_APPEND: case TOK_REDIRECT_FD: case TOK_REDIRECT_NOCLOB: { if (!had_cmd) { err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), INVALID_REDIRECTION_ERR_MSG); print_errors(*out, prefix); } } break; } case TOK_END: { if (needs_cmd && !had_cmd) { err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), CMD_ERR_MSG, tok_get_desc(tok_last_type(&tok))); print_errors(*out, prefix); } } needs_cmd = false; had_cmd = 0; is_pipeline=0; forbid_pipeline=0; end_of_cmd = 1; break; } case TOK_PIPE: { if (!had_cmd) { err=1; if (out) { if (tok_get_pos(&tok)>0 && buff[tok_get_pos(&tok)-1] == L'|') { error(SYNTAX_ERROR, tok_get_pos(&tok), CMD_OR_ERR_MSG, tok_get_desc(tok_last_type(&tok))); } else { error(SYNTAX_ERROR, tok_get_pos(&tok), CMD_ERR_MSG, tok_get_desc(tok_last_type(&tok))); } print_errors(*out, prefix); } } else if (forbid_pipeline) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), EXEC_ERR_MSG); print_errors(*out, prefix); } } else { needs_cmd = true; is_pipeline=1; had_cmd=0; end_of_cmd = 1; } break; } case TOK_BACKGROUND: { if (!had_cmd) { err = 1; if (out) { if (tok_get_pos(&tok)>0 && buff[tok_get_pos(&tok)-1] == L'&') { error(SYNTAX_ERROR, tok_get_pos(&tok), CMD_AND_ERR_MSG, tok_get_desc(tok_last_type(&tok))); } else { error(SYNTAX_ERROR, tok_get_pos(&tok), CMD_ERR_MSG, tok_get_desc(tok_last_type(&tok))); } print_errors(*out, prefix); } } had_cmd = 0; end_of_cmd = 1; break; } case TOK_ERROR: default: if (tok_get_error(&tok) == TOK_UNTERMINATED_QUOTE) { unfinished = 1; } else { err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), TOK_ERR_MSG, tok_last(&tok)); print_errors(*out, prefix); } } break; } if (end_of_cmd) { if (has_command && command == L"for") { if (arg_count >= 0 && arg_count < 2) { /* Not enough arguments to the for builtin */ err = 1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), BUILTIN_FOR_ERR_COUNT, L"for", arg_count); print_errors(*out, prefix); } } } else if (has_command && command == L"else") { if (arg_count == 1) { /* If we have any arguments, we must have at least two...either "else" or "else if foo..." */ err = true; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), BUILTIN_ELSEIF_ERR_COUNT, L"else", arg_count); print_errors(*out, prefix); } } } } if (!tok_has_next(&tok)) break; } if (needs_cmd) { err=1; if (out) { error(SYNTAX_ERROR, tok_get_pos(&tok), COND_ERR_MSG); print_errors(*out, prefix); } } if (out != NULL && ! block_infos.empty()) { const wchar_t *cmd; int bad_pos = block_infos.back().position; block_type_t bad_type = block_infos.back().type; error(SYNTAX_ERROR, bad_pos, BLOCK_END_ERR_MSG); print_errors(*out, prefix); cmd = parser_get_block_command(bad_type); if (cmd) { const wcstring h = builtin_help_get(*this, cmd); if (h.size()) { append_format(*out, L"%ls", h.c_str()); } } } /* Fill in the unset block_level entries. Until now, only places where the block level _changed_ have been filled out. This fills in the rest. */ if (block_level) { int last_level = 0; size_t i, len = wcslen(buff); for (i=0; i= 0) { last_level = block_level[i]; /* Make all whitespace before a token have the new level. This avoid using the wrong indentation level if a new line starts with whitespace. */ size_t prev_char_idx = i; while (prev_char_idx--) { if (!wcschr(L" \n\t\r", buff[prev_char_idx])) break; block_level[prev_char_idx] = last_level; } } block_level[i] = last_level; } /* Make all trailing whitespace have the block level that the validator had at exit. This makes sure a new line is correctly indented even if it is empty. */ int last_indent = block_infos.empty() ? 0 : block_infos.back().indentation; size_t suffix_idx = len; while (suffix_idx--) { if (!wcschr(L" \n\t\r", buff[suffix_idx])) break; block_level[suffix_idx] = last_indent; } } /* Calculate exit status */ if (! block_infos.empty()) unfinished = 1; if (err) res |= PARSER_TEST_ERROR; if (unfinished) res |= PARSER_TEST_INCOMPLETE; /* Cleanup */ error_code=0; return res; } block_t::block_t(block_type_t t) : block_type(t), made_fake(false), skip(), had_command(), tok_pos(), loop_status(), job(), src_filename(), src_lineno(), wants_pop_env(false), event_blocks(), outer(NULL) { } block_t::~block_t() { } /* Various block constructors */ if_block_t::if_block_t() : block_t(IF), if_expr_evaluated(false), is_elseif_entry(false), any_branch_taken(false), else_evaluated(false) { } event_block_t::event_block_t(const event_t &evt) : block_t(EVENT), event(evt) { } function_block_t::function_block_t(const process_t *p, const wcstring &n, bool shadows) : block_t(shadows ? FUNCTION_CALL : FUNCTION_CALL_NO_SHADOW), process(p), name(n) { } source_block_t::source_block_t(const wchar_t *src) : block_t(SOURCE), source_file(src) { } for_block_t::for_block_t(const wcstring &var) : block_t(FOR), variable(var), sequence() { } while_block_t::while_block_t() : block_t(WHILE), status(0) { } switch_block_t::switch_block_t(const wcstring &sv) : block_t(SWITCH), switch_taken(false), switch_value(sv) { } fake_block_t::fake_block_t() : block_t(FAKE) { } function_def_block_t::function_def_block_t() : block_t(FUNCTION_DEF), function_data() { } scope_block_t::scope_block_t(block_type_t type) : block_t(type) { assert(type == BEGIN || type == TOP || type == SUBST); } breakpoint_block_t::breakpoint_block_t() : block_t(BREAKPOINT) { } fish/parser.h000066400000000000000000000354131214535744100134700ustar00rootroot00000000000000/** \file parser.h The fish parser. */ #ifndef FISH_PARSER_H #define FISH_PARSER_H #include #include "proc.h" #include "util.h" #include "event.h" #include "function.h" #include #define PARSER_TEST_ERROR 1 #define PARSER_TEST_INCOMPLETE 2 /** event_blockage_t represents a block on events of the specified type */ struct event_blockage_t { /** The types of events to block. This is interpreted as a bitset whete the value is 1 for every bit corresponding to a blocked event type. For example, if EVENT_VARIABLE type events should be blocked, (type & 1< event_blockage_list_t; inline bool event_block_list_blocks_type(const event_blockage_list_t &ebls, int type) { for (event_blockage_list_t::const_iterator iter = ebls.begin(); iter != ebls.end(); ++iter) { if (iter->typemask & (1<typemask & (1<made_fake ? FAKE : this->block_type; } /** Mark a block as fake; this is used by the return statement. */ void mark_as_fake() { this->made_fake = true; } bool skip; /**< Whether execution of the commands in this block should be skipped */ bool had_command; /**< Set to non-zero once a command has been executed in this block */ int tok_pos; /**< The start index of the block */ /** Status for the current loop block. Can be any of the values from the loop_status enum. */ int loop_status; /** The job that is currently evaluated in the specified block. */ job_t *job; #if 0 union { int while_state; /**< True if the loop condition has not yet been evaluated*/ wchar_t *for_variable; /**< Name of the variable to loop over */ int if_state; /**< The state of the if block, can be one of IF_STATE_UNTESTED, IF_STATE_FALSE, IF_STATE_TRUE */ wchar_t *switch_value; /**< The value to test in a switch block */ const wchar_t *source_dest; /**< The name of the file to source*/ event_t *event; /** blocks; /** Whether or not we output errors */ const bool show_errors; /** Last error code */ int error_code; /** Position of last error */ int err_pos; /** Description of last error */ wcstring err_buff; /** Pointer to the current tokenizer */ tokenizer_t *current_tokenizer; /** String for representing the current line */ wcstring lineinfo; /** This is the position of the beginning of the currently parsed command */ int current_tokenizer_pos; /** List of called functions, used to help prevent infinite recursion */ wcstring_list_t forbidden_function; /** String index where the current job started. */ int job_start_pos; /** The jobs associated with this parser */ job_list_t my_job_list; /** Keeps track of how many recursive eval calls have been made. Eval doesn't call itself directly, recursion happens on blocks and on command substitutions. */ int eval_level; /* No copying allowed */ parser_t(const parser_t&); parser_t& operator=(const parser_t&); void parse_job_argument_list(process_t *p, job_t *j, tokenizer_t *tok, std::vector&, bool); int parse_job(process_t *p, job_t *j, tokenizer_t *tok); void skipped_exec(job_t * j); void eval_job(tokenizer_t *tok); int parser_test_argument(const wchar_t *arg, wcstring *out, const wchar_t *prefix, int offset); void print_errors(wcstring &target, const wchar_t *prefix); void print_errors_stderr(); public: std::vector profile_items; /** Returns the name of the currently evaluated function if we are currently evaluating a function, null otherwise. This is tested by moving down the block-scope-stack, checking every block if it is of type FUNCTION_CALL. */ const wchar_t *is_function() const; /** Get the "principal" parser, whatever that is */ static parser_t &principal_parser(); /** Indicates that execution of all blocks in the principal parser should stop. This is called from signal handlers! */ static void skip_all_blocks(); /** Create a parser of the given type */ parser_t(enum parser_type_t type, bool show_errors); /** The current innermost block, allocated with new */ block_t *current_block; /** Global event blocks */ event_blockage_list_t global_event_blocks; /** Current block level io redirections */ io_chain_t block_io; /** Evaluate the expressions contained in cmd. \param cmd the string to evaluate \param io io redirections to perform on all started jobs \param block_type The type of block to push on the block stack \return 0 on success, 1 otherwise */ int eval(const wcstring &cmdStr, const io_chain_t &io, enum block_type_t block_type); /** Evaluate line as a list of parameters, i.e. tokenize it and perform parameter expansion and cmdsubst execution on the tokens. The output is inserted into output, and should be freed by the caller. \param line Line to evaluate \param output List to insert output to */ /** \param line Line to evaluate \param output List to insert output to */ int eval_args(const wchar_t *line, std::vector &output); /** Sets the current evaluation error. This function should only be used by libraries that are called by \param ec The new error code \param p The character offset at which the error occured \param str The printf-style error message filter */ void error(int ec, int p, const wchar_t *str, ...); /** Returns a string describing the current parser pisition in the format 'FILENAME (line LINE_NUMBER): LINE'. Example: init.fish (line 127): ls|grep pancake */ const wchar_t *current_line(); /** Returns the current line number */ int get_lineno() const; /** Returns the line number for the character at the given index */ int line_number_of_character_at_offset(size_t idx) const; /** Returns the current position in the latest string of the tokenizer. */ int get_pos() const; /** Returns the position where the current job started in the latest string of the tokenizer. */ int get_job_pos() const; /** Set the current position in the latest string of the tokenizer. */ void set_pos(int p); /** Get the string currently parsed */ const wchar_t *get_buffer() const; /** Get the list of jobs */ job_list_t &job_list() { return my_job_list; } /** Pushes the block. pop_block will call delete on it. */ void push_block(block_t *newv); /** Remove the outermost block namespace */ void pop_block(); /** Return a description of the given blocktype */ const wchar_t *get_block_desc(int block) const; /** Create a job */ job_t *job_create(); /** Removes a job */ bool job_remove(job_t *job); /** Promotes a job to the front of the list */ void job_promote(job_t *job); /** Return the job with the specified job id. If id is 0 or less, return the last job used. */ job_t *job_get(int job_id); /** Returns the job with the given pid */ job_t *job_get_from_pid(int pid); /** Test if the specified string can be parsed, or if more bytes need to be read first. The result will have the PARSER_TEST_ERROR bit set if there is a syntax error in the code, and the PARSER_TEST_INCOMPLETE bit set if the code contains unclosed blocks. \param buff the text buffer to test \param block_level if non-null, the block nesting level will be filled out into this array \param out if non-null, any errors in the command will be filled out into this buffer \param prefix the prefix string to prepend to each error message written to the \c out buffer */ int test(const wchar_t * buff, int *block_level = NULL, wcstring *out = NULL, const wchar_t *prefix = NULL); /** Test if the specified string can be parsed as an argument list, e.g. sent to eval_args. The result has the first bit set if the string contains errors, and the second bit is set if the string contains an unclosed block. */ int test_args(const wchar_t * buff, wcstring *out, const wchar_t *prefix); /** Tell the parser that the specified function may not be run if not inside of a conditional block. This is to remove some possibilities of infinite recursion. */ void forbid_function(const wcstring &function); /** Undo last call to parser_forbid_function(). */ void allow_function(); /** Initialize static parser data */ void init(); /** Destroy static parser data */ void destroy(); /** This function checks if the specified string is a help option. \param s the string to test \param min_match is the minimum number of characters that must match in a long style option, i.e. the longest common prefix between --help and any other option. If less than 3, 3 will be assumed. */ int is_help(const wchar_t *s, int min_match) const; /** Returns the file currently evaluated by the parser. This can be different than reader_current_filename, e.g. if we are evaulating a function defined in a different file than the one curently read. */ const wchar_t *current_filename() const; /** Write a stack trace starting at the specified block to the specified wcstring */ void stack_trace(block_t *b, wcstring &buff); int get_block_type(const wchar_t *cmd) const; const wchar_t *get_block_command(int type) const; }; #endif fish/parser_keywords.cpp000066400000000000000000000031751214535744100157520ustar00rootroot00000000000000/** \file parser_keywords.c Functions having to do with parser keywords, like testing if a function is a block command. */ #include "config.h" #include #include #include "fallback.h" #include "common.h" #include "parser_keywords.h" bool parser_keywords_is_switch(const wcstring &cmd) { if (cmd == L"--") { return ARG_SKIP; } else if (! cmd.empty() && cmd.at(0) == L'-') { return ARG_SWITCH; } else { return ARG_NON_SWITCH; } } bool parser_keywords_skip_arguments(const wcstring &cmd) { return contains(cmd, L"else", L"begin"); } bool parser_keywords_is_subcommand(const wcstring &cmd) { return parser_keywords_skip_arguments(cmd) || contains(cmd, L"command", L"builtin", L"while", L"exec", L"if", L"and", L"or", L"not"); } bool parser_keywords_is_block(const wcstring &word) { return contains(word, L"for", L"while", L"if", L"function", L"switch", L"begin"); } bool parser_keywords_is_reserved(const wcstring &word) { return parser_keywords_is_block(word) || parser_keywords_is_subcommand(word) || contains(word, L"end", L"case", L"else", L"return", L"continue", L"break"); } fish/parser_keywords.h000066400000000000000000000032361214535744100154150ustar00rootroot00000000000000/** \file parser_keywords.h Functions having to do with parser keywords, like testing if a function is a block command. */ #ifndef FISH_PARSER_KEYWORD_H #define FISH_PARSER_KEYWORD_H /** Return values for parser_keywords_is_switch() */ enum { ARG_NON_SWITCH, ARG_SWITCH, ARG_SKIP }; /** Check if the specified argument is a switch. Return ARG_SWITCH if yes, ARG_NON_SWITCH if no and ARG_SKIP if the argument is '--' */ bool parser_keywords_is_switch(const wcstring &cmd); /** Tests if the specified commands parameters should be interpreted as another command, which will be true if the command is either 'command', 'exec', 'if', 'while', or 'builtin'. This does not handle "else if" which is more complicated. \param cmd The command name to test \return 1 of the command parameter is a command, 0 otherwise */ bool parser_keywords_is_subcommand(const wcstring &cmd); /** Tests if the specified command is a reserved word, i.e. if it is the name of one of the builtin functions that change the block or command scope, like 'for', 'end' or 'command' or 'exec'. These functions may not be overloaded, so their names are reserved. \param word The command name to test \return 1 of the command parameter is a command, 0 otherwise */ bool parser_keywords_is_reserved(const wcstring &word); /** Test if the specified string is command that opens a new block */ bool parser_keywords_is_block(const wcstring &word); /** Check if the specified command is one of the builtins that cannot have arguments, any followin argument is interpreted as a new command */ bool parser_keywords_skip_arguments(const wcstring &cmd); #endif fish/path.cpp000066400000000000000000000256671214535744100134750ustar00rootroot00000000000000#include "config.h" #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "common.h" #include "env.h" #include "wutil.h" #include "path.h" #include "expand.h" /** Unexpected error in path_get_path() */ #define MISSING_COMMAND_ERR_MSG _( L"Error while searching for command '%ls'" ) static bool path_get_path_core(const wcstring &cmd, wcstring *out_path, const env_var_t &bin_path_var) { int err = ENOENT; debug(3, L"path_get_path( '%ls' )", cmd.c_str()); /* If the command has a slash, it must be a full path */ if (cmd.find(L'/') != wcstring::npos) { if (waccess(cmd, X_OK)==0) { struct stat buff; if (wstat(cmd, &buff)) { return false; } if (S_ISREG(buff.st_mode)) { if (out_path) out_path->assign(cmd); return true; } else { errno = EACCES; return false; } } else { struct stat buff; wstat(cmd, &buff); return false; } } else { wcstring bin_path; if (! bin_path_var.missing()) { bin_path = bin_path_var; } else { if (contains(PREFIX L"/bin", L"/bin", L"/usr/bin")) { bin_path = L"/bin" ARRAY_SEP_STR L"/usr/bin"; } else { bin_path = L"/bin" ARRAY_SEP_STR L"/usr/bin" ARRAY_SEP_STR PREFIX L"/bin"; } } wcstring nxt_path; wcstokenizer tokenizer(bin_path, ARRAY_SEP_STR); while (tokenizer.next(nxt_path)) { if (nxt_path.empty()) continue; append_path_component(nxt_path, cmd); if (waccess(nxt_path, X_OK)==0) { struct stat buff; if (wstat(nxt_path, &buff)==-1) { if (errno != EACCES) { wperror(L"stat"); } continue; } if (S_ISREG(buff.st_mode)) { if (out_path) out_path->swap(nxt_path); return true; } err = EACCES; } else { switch (errno) { case ENOENT: case ENAMETOOLONG: case EACCES: case ENOTDIR: break; default: { debug(1, MISSING_COMMAND_ERR_MSG, nxt_path.c_str()); wperror(L"access"); } } } } } errno = err; return false; } bool path_get_path(const wcstring &cmd, wcstring *out_path, const env_vars_snapshot_t &vars) { return path_get_path_core(cmd, out_path, vars.get(L"PATH")); } bool path_get_path(const wcstring &cmd, wcstring *out_path) { return path_get_path_core(cmd, out_path, env_get_string(L"PATH")); } bool path_get_cdpath_string(const wcstring &dir_str, wcstring &result, const env_var_t &cdpath) { wchar_t *res = 0; int err = ENOENT; bool success = false; const wchar_t *const dir = dir_str.c_str(); if (dir[0] == L'/'|| (wcsncmp(dir, L"./", 2)==0)) { struct stat buf; if (wstat(dir, &buf) == 0) { if (S_ISDIR(buf.st_mode)) { result = dir_str; success = true; } else { err = ENOTDIR; } } } else { wcstring path = L"."; // Respect CDPATH env_var_t cdpath = env_get_string(L"CDPATH"); if (! cdpath.missing_or_empty()) { path = cdpath.c_str(); } wcstokenizer tokenizer(path, ARRAY_SEP_STR); wcstring next_path; while (tokenizer.next(next_path)) { expand_tilde(next_path); if (next_path.size() == 0) continue; wcstring whole_path = next_path; append_path_component(whole_path, dir); struct stat buf; if (wstat(whole_path, &buf) == 0) { if (S_ISDIR(buf.st_mode)) { result = whole_path; success = true; break; } else { err = ENOTDIR; } } else { if (lwstat(whole_path, &buf) == 0) { err = EROTTEN; } } } } if (!success) { errno = err; } return res; } bool path_get_cdpath(const wcstring &dir, wcstring *out, const wchar_t *wd, const env_vars_snapshot_t &env_vars) { int err = ENOENT; if (dir.empty()) return false; if (wd) { size_t len = wcslen(wd); assert(wd[len - 1] == L'/'); } wcstring_list_t paths; if (dir.at(0) == L'/') { /* Absolute path */ paths.push_back(dir); } else if (string_prefixes_string(L"./", dir) || string_prefixes_string(L"../", dir) || dir == L"." || dir == L"..") { /* Path is relative to the working directory */ wcstring path; if (wd) path.append(wd); path.append(dir); paths.push_back(path); } else { // Respect CDPATH env_var_t path = env_vars.get(L"CDPATH"); if (path.missing_or_empty()) path = L"."; //We'll change this to the wd if we have one wcstring nxt_path; wcstokenizer tokenizer(path, ARRAY_SEP_STR); while (tokenizer.next(nxt_path)) { if (nxt_path == L"." && wd != NULL) { // nxt_path is just '.', and we have a working directory, so use the wd instead // TODO: if nxt_path starts with ./ we need to replace the . with the wd nxt_path = wd; } expand_tilde(nxt_path); // debug( 2, L"woot %ls\n", expanded_path.c_str() ); if (nxt_path.empty()) continue; wcstring whole_path = nxt_path; append_path_component(whole_path, dir); paths.push_back(whole_path); } } bool success = false; for (wcstring_list_t::const_iterator iter = paths.begin(); iter != paths.end(); ++iter) { struct stat buf; const wcstring &dir = *iter; if (wstat(dir, &buf) == 0) { if (S_ISDIR(buf.st_mode)) { success = true; if (out) out->assign(dir); break; } else { err = ENOTDIR; } } } if (! success) errno = err; return success; } bool path_can_be_implicit_cd(const wcstring &path, wcstring *out_path, const wchar_t *wd, const env_vars_snapshot_t &vars) { wcstring exp_path = path; expand_tilde(exp_path); bool result = false; if (string_prefixes_string(L"/", exp_path) || string_prefixes_string(L"./", exp_path) || string_prefixes_string(L"../", exp_path) || exp_path == L"..") { /* These paths can be implicit cd, so see if you cd to the path. Note that a single period cannot (that's used for sourcing files anyways) */ result = path_get_cdpath(exp_path, out_path, wd, vars); } return result; } static wcstring path_create_config() { bool done = false; wcstring res; const env_var_t xdg_dir = env_get_string(L"XDG_CONFIG_HOME"); if (! xdg_dir.missing()) { res = xdg_dir + L"/fish"; if (!create_directory(res)) { done = true; } } else { const env_var_t home = env_get_string(L"HOME"); if (! home.missing()) { res = home + L"/.config/fish"; if (!create_directory(res)) { done = true; } } } if (! done) { res.clear(); debug(0, _(L"Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory where the current user has write access.")); } return res; } /* Cache the config path */ bool path_get_config(wcstring &path) { static const wcstring result = path_create_config(); path = result; return ! result.empty(); } static void replace_all(wcstring &str, const wchar_t *needle, const wchar_t *replacement) { size_t needle_len = wcslen(needle); size_t offset = 0; while ((offset = str.find(needle, offset)) != wcstring::npos) { str.replace(offset, needle_len, replacement); offset += needle_len; } } void path_make_canonical(wcstring &path) { /* Remove double slashes */ size_t size; do { size = path.size(); replace_all(path, L"//", L"/"); } while (path.size() != size); /* Remove trailing slashes, except don't remove the first one */ while (size-- > 1) { if (path.at(size) != L'/') break; } /* Now size is either -1 (if the entire string was slashes) or is the index of the last non-slash character. Either way this will set it to the correct size. */ path.resize(size+1); } bool path_is_valid(const wcstring &path, const wcstring &working_directory) { bool path_is_valid; /* Some special paths are always valid */ if (path.empty()) { path_is_valid = false; } else if (path == L"." || path == L"./") { path_is_valid = true; } else if (path == L".." || path == L"../") { path_is_valid = (! working_directory.empty() && working_directory != L"/"); } else if (path.at(0) != '/') { /* Prepend the working directory. Note that we know path is not empty here. */ wcstring tmp = working_directory; tmp.append(path); path_is_valid = (0 == waccess(tmp, F_OK)); } else { /* Simple check */ path_is_valid = (0 == waccess(path, F_OK)); } return path_is_valid; } bool paths_are_same_file(const wcstring &path1, const wcstring &path2) { if (path1 == path2) return true; struct stat s1, s2; if (wstat(path1, &s1) == 0 && wstat(path2, &s2) == 0) { return s1.st_ino == s2.st_ino && s1.st_dev == s2.st_dev; } else { return false; } } fish/path.h000066400000000000000000000064131214535744100131260ustar00rootroot00000000000000/** \file path.h Directory utilities. This library contains functions for locating configuration directories, for testing if a command with a given name can be found in the PATH, and various other path-related issues. */ #ifndef FISH_PATH_H #define FISH_PATH_H #include "env.h" /** Return value for path_cdpath_get when locatied a rotten symlink */ #define EROTTEN 1 /** Returns the user configuration directory for fish. If the directory or one of it's parents doesn't exist, they are first created. \param path The directory as an out param \return whether the directory was returned successfully */ bool path_get_config(wcstring &path); /** Finds the full path of an executable. Returns YES if successful. \param cmd The name of the executable. \param output_or_NULL If non-NULL, store the full path. \param vars The environment variables snapshot to use \return 0 if the command can not be found, the path of the command otherwise. The result should be freed with free(). */ bool path_get_path(const wcstring &cmd, wcstring *output_or_NULL, const env_vars_snapshot_t &vars = env_vars_snapshot_t::current()); /** Returns the full path of the specified directory, using the CDPATH variable as a list of base directories for relative paths. The returned string is allocated using halloc and the specified context. If no valid path is found, null is returned and errno is set to ENOTDIR if at least one such path was found, but it did not point to a directory, EROTTEN if a arotten symbolic link was found, or ENOENT if no file of the specified name was found. If both a rotten symlink and a file are found, it is undefined which error status will be returned. \param dir The name of the directory. \param out_or_NULL If non-NULL, return the path to the resolved directory \param wd The working directory, or NULL to use the default. The working directory should have a slash appended at the end. \param vars The environment variable snapshot to use (for the CDPATH variable) \return 0 if the command can not be found, the path of the command otherwise. The path should be free'd with free(). */ bool path_get_cdpath(const wcstring &dir, wcstring *out_or_NULL, const wchar_t *wd = NULL, const env_vars_snapshot_t &vars = env_vars_snapshot_t::current()); /** Returns whether the path can be used for an implicit cd command; if so, also returns the path by reference (if desired). This requires it to start with one of the allowed prefixes (., .., ~) and resolve to a directory. */ bool path_can_be_implicit_cd(const wcstring &path, wcstring *out_path = NULL, const wchar_t *wd = NULL, const env_vars_snapshot_t &vars = env_vars_snapshot_t::current()); /** Remove double slashes and trailing slashes from a path, e.g. transform foo//bar/ into foo/bar. The string is modified in-place. */ void path_make_canonical(wcstring &path); bool path_is_valid(const wcstring &path, const wcstring &working_directory); /** Returns whether the two paths refer to the same file */ bool paths_are_same_file(const wcstring &path1, const wcstring &path2); #endif fish/po/000077500000000000000000000000001214535744100124335ustar00rootroot00000000000000fish/po/de.po000066400000000000000000010005111214535744100133610ustar00rootroot00000000000000# translation of de.po to deutsch # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # Hermann J. Beckers , 2006. # msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-01-16 20:57+0100\n" "PO-Revision-Date: 2006-02-12 13:33GMT\n" "Last-Translator: Hermann J. Beckers \n" "Language-Team: deutsch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.3\n" #: builtin.c:80 #, c-format msgid "Send job %d, '%ls' to foreground\n" msgstr "Sende Job %d, '%ls' in den Vordergrund\n" #: builtin.c:370 #, c-format msgid "%ls: Can not specify scope when removing block\n" msgstr "%ls: Bei Blocklöschung kann kein Bereich angegeben werden\n" #: builtin.c:376 #, c-format msgid "%ls: No blocks defined\n" msgstr "%ls: Keine Blöcke definiert\n" #: builtin.c:830 builtin.h:28 #, c-format msgid "%ls: Invalid combination of options\n" msgstr "%ls: Kombination der Optionen ungültig\n" #: builtin.c:854 #, c-format msgid "%ls: Expected exactly one function name\n" msgstr "%ls: Erwartete genau einen Funktionsnamen\n" #: builtin.c:864 #, c-format msgid "%ls: Function '%ls' does not exist\n" msgstr "%ls: Funktion '%ls' existiert nicht\n" #: builtin.c:925 msgid "" "Current function definitions are:\n" "\n" msgstr "" "Aktuelle Funktionsdefinitionen:\n" "\n" #: builtin.c:1087 #, c-format msgid "%ls: Unknown signal '%ls'\n" msgstr "%ls: Unbekanntes Signal '%ls'\n" #: builtin.c:1111 #, c-format msgid "%ls: Invalid variable name '%ls'\n" msgstr "%ls: Ungültiger Variablenname '%ls'\n" #: builtin.c:1173 #, c-format msgid "%ls: Cannot find calling job for event handler\n" msgstr "%ls: Kann aufrufenden Job zur Ereignisbehandlung nicht finden\n" #: builtin.c:1191 #, c-format msgid "%ls: Invalid process id %ls\n" msgstr "%ls: Ungültige Prozess-ID %ls\n" #: builtin.c:1228 #, c-format msgid "%ls: Expected one argument, got %d\n" msgstr "%ls: Erwartete ein Argument, erhielt %d\n" #: builtin.c:1236 #, c-format msgid "%ls: Illegal function name '%ls'\n" msgstr "%ls: Ungültiger Funktionsname '%ls'\n" #: builtin.c:1246 #, c-format msgid "" "%ls: The name '%ls' is reserved,\n" "and can not be used as a function name\n" msgstr "" "%ls: Der Name '%ls' ist reserviert,\n" "und kann nicht als Funktionsname benutzt werden\n" #: builtin.c:1262 msgid "Current functions are: " msgstr "Aktuelle Funktionen sind: " #: builtin.c:1405 #, c-format msgid "%ls: Seed value '%ls' is not a valid number\n" msgstr "%ls: Seed-Wert '%ls' ist keine gültige Zahl\n" #: builtin.c:1419 #, c-format msgid "%ls: Expected zero or one argument, got %d\n" msgstr "%ls: Erwartete kein oder ein Argument, erhielt %d\n" #: builtin.c:1860 builtin.c:3060 #, c-format msgid "%ls: Argument '%ls' must be an integer\n" msgstr "%ls: Argument '%ls' muss eine Ganzzahl sein\n" #: builtin.c:1871 builtin.c:2164 builtin.c:3071 #, c-format msgid "%ls: Too many arguments\n" msgstr "%ls: Zu viele Argumente\n" #: builtin.c:1916 #, c-format msgid "%ls: Could not find home directory\n" msgstr "%ls: Konnte Startverzeichnis nicht finden\n" #: builtin.c:1928 #, c-format msgid "%ls: '%ls' is not a directory or you do not have permission to enter it\n" msgstr "%ls: '%ls' ist kein Verzeichnis oder Sie haben keine Rechte zum Wechseln\n" #: builtin.c:1940 #, c-format msgid "%ls: '%ls' is not a directory\n" msgstr "%ls: '%ls' ist kein Verzeichnis\n" #: builtin.c:1955 #, c-format msgid "%ls: Could not set PWD variable\n" msgstr "%ls: Konnte PWD-Variable nicht setzen\n" #: builtin.c:2110 #, c-format msgid "%ls: Parameter '%ls' is too long\n" msgstr "%ls: Parameter '%ls' ist zu lang\n" #: builtin.c:2231 builtin.c:3116 #, c-format msgid "%ls: Expected exactly one argument, got %d\n" msgstr "%ls: Erwartete genau ein Argument, erhielt %d\n" #: builtin.c:2244 #, c-format msgid "%ls: '%ls' is not a file\n" msgstr "%ls: '%ls' ist keine Datei\n" #: builtin.c:2269 #, c-format msgid "%ls: Error while reading file '%ls'\n" msgstr "%ls: Fehler beim Lesen der Datei '%ls'\n" #: builtin.c:2329 builtin.c:2750 #, c-format msgid "%ls: There are no jobs\n" msgstr "%ls: Es gibt keine Jobs\n" #: builtin.c:2346 #, c-format msgid "%ls: Ambiguous job\n" msgstr "%ls: Mehrdeutiger Job\n" #: builtin.c:2352 builtin.c:2709 #, c-format msgid "%ls: '%ls' is not a job\n" msgstr "%ls: '%ls' ist kein Job\n" #: builtin.c:2365 builtin.c:2724 #, c-format msgid "%ls: No suitable job: %d\n" msgstr "%ls: Kein passender Job: %d\n" #: builtin.c:2416 #, c-format msgid "%ls: Unknown job '%ls'\n" msgstr "%ls: Unbekannter Job '%ls'\n" #: builtin.c:2425 #, c-format msgid "Send job %d '%ls' to background\n" msgstr "Sende Job %d '%ls' in den Hintergrund\n" #: builtin.c:2445 msgid "(default)" msgstr "(Standard)" #: builtin.c:2499 msgid "Job\tGroup\t" msgstr "Job\tGruppe\t" #: builtin.c:2501 msgid "CPU\t" msgstr "CPU\t" #: builtin.c:2503 msgid "State\tCommand\n" msgstr "Status\tBefehl\n" #: builtin.c:2512 proc.c:632 msgid "stopped" msgstr "gestoppt" #: builtin.c:2512 msgid "running" msgstr "aktiv" #: builtin.c:2527 msgid "Group\n" msgstr "Gruppe\n" #: builtin.c:2540 msgid "Procces\n" msgstr "Prozess\n" #: builtin.c:2557 msgid "Command\n" msgstr "Befehl\n" #: builtin.c:2769 #, c-format msgid "%ls: Expected at least two arguments\n" msgstr "%ls: Erwartete mindestens zwei Argumente\n" #: builtin.c:2776 #, c-format msgid "%ls: '%ls' is not a valid variable name\n" msgstr "%ls: '%ls' ist kein gültiger Variablenname\n" #: builtin.c:2784 #, c-format msgid "%ls: Second argument must be 'in'\n" msgstr "%ls: Zweites Argument muss 'in' sein'\n" #: builtin.c:2844 #, c-format msgid "%ls: Not inside of block\n" msgstr "%ls: Nicht innerhalb eines Blocks\n" #: builtin.c:2968 #, c-format msgid "%ls: Not inside of 'if' block\n" msgstr "%ls: Nicht innerhalb eines 'if'-Blocks\n" #: builtin.c:3020 #, c-format msgid "%ls: Not inside of loop\n" msgstr "%ls: Nicht innerhalb einer Schleife\n" #: builtin.c:3087 #, c-format msgid "%ls: Not inside of function\n" msgstr "%ls: Nicht innerhalb einer Funktion\n" #: builtin.c:3147 #, c-format msgid "%ls: 'case' command while not in switch block\n" msgstr "%ls: 'case'-Befehl ausserhalb eines switch-Blocks\n" #: builtin.c:3345 #, c-format msgid "Unknown builtin '%ls'" msgstr "unbekannter interner Befehl '%ls'" #: builtin.c:3367 msgid "Temporarily block delivery of events" msgstr "Blockiere zeitweise Ereignis-Weitergabe" #: builtin.c:3368 msgid "Run a builtin command instead of a function" msgstr "Internen Befehl anstatt einer Funktion ausführen" #: builtin.c:3369 msgid "Edit command specific completions" msgstr "Befehlsspezifische Erweiterungen bearbeiten" #: builtin.c:3370 msgid "Change working directory" msgstr "Arbeitsverzeichnis wechseln" #: builtin.c:3371 msgid "Exit the shell" msgstr "Shell verlassen" #: builtin.c:3372 msgid "Define a new function" msgstr "Neue Funktion definieren" #: builtin.c:3373 msgid "List or remove functions" msgstr "Funktionen anzeigen oder entfernen" #: builtin.c:3374 msgid "End a block of commands" msgstr "Befehlsblock beenden" #: builtin.c:3375 msgid "Evaluate block if condition is false" msgstr "Werte Block aus, wenn die Bedingung falsch ist" #: builtin.c:3376 msgid "Evaluate parameters as a command" msgstr "Parameter als Befehl auswerten" #: builtin.c:3377 msgid "Perform a set of commands multiple times" msgstr "Eine Befehlsfolge mehrmals ausführen" #: builtin.c:3378 msgid "Evaluate contents of file" msgstr "Inhalt einer Datei auswerten" #: builtin.c:3379 msgid "Handle environment variables" msgstr "Behandlung von Umgebungsvariablen" #: builtin.c:3380 msgid "Send job to foreground" msgstr "Job in Vordergrund schicken" #: builtin.c:3381 msgid "Send job to background" msgstr "Job in Hintergrund schicken" #: builtin.c:3382 msgid "Print currently running jobs" msgstr "Derzeit laufende Jobs anzeigen" #: builtin.c:3383 msgid "Read a line of input into variables" msgstr "Eine Eingabe-Zeile in Variablen einlesen" #: builtin.c:3384 msgid "Stop the innermost loop" msgstr "Innerste Schleife beenden" #: builtin.c:3385 msgid "Skip the rest of the current lap of the innermost loop" msgstr "Rest des aktuellen Durchlaufs der innersten Schleife überspringen" #: builtin.c:3386 msgid "Stop the currently evaluated function" msgstr "Derzeit ausgewertete Funktion stoppen" #: builtin.c:3387 msgid "Set or get the commandline" msgstr "Setzen oder Abrufen der Befehlszeile" #: builtin.c:3388 builtin.c:3389 msgid "Conditionally execute a block of commands" msgstr "Befehlsblock bedingt ausführen" #: builtin.c:3390 msgid "Run a program instead of a function or builtin" msgstr "Programm statt Funktion oder internem Befehl ausführen" #: builtin.c:3391 msgid "Evaluate block if condition is true" msgstr "Block auswerten, wenn Bedingung wahr ist" #: builtin.c:3392 msgid "Perform a command multiple times" msgstr "Einen Befehl mehrmals ausführen" #: builtin.c:3393 msgid "Handle fish key bindings" msgstr "Fish-Tastenbelegungen bearbeiten" #: builtin.c:3394 msgid "Generate random number" msgstr "Zufallszahl generieren" #: builtin.c:3395 msgid "Run command in current process" msgstr "Befehl im aktuellen Prozess ausführen" #: builtin.c:3396 msgid "Negate exit status of job" msgstr "Exit-Status des Jobs negieren" #: builtin.c:3397 msgid "Execute command if previous command failed" msgstr "Befehl ausführen, wenn vorheriger Befehl fehlerhaft war" #: builtin.c:3398 msgid "Execute command if previous command suceeded" msgstr "Befehl ausführen, wenn vorheriger Befehl fehlerfrei war" #: builtin.c:3399 msgid "Create a block of code" msgstr "Code-Block erstellen" #: builtin.c:3400 msgid "Return status information about fish" msgstr "Status-Information über Fish zurückgeben" #: builtin.c:3401 msgid "Set or get the shells resource usage limits" msgstr "Die Ressourcen-Grenzen der Shell setzen/abrufen" #: builtin_set.c:96 #, c-format msgid "%ls: Invalid index starting at '%ls'\n" msgstr "%ls: Ungüligter Indexstart bei '%ls'\n" #: builtin_set.c:488 #, c-format msgid "" "%ls: Erase needs a variable name\n" "%ls\n" msgstr "" "%ls: Erase benötigt einen Variablennamen\n" "%ls\n" #: builtin_set.c:525 #, c-format msgid "" "%ls: Values cannot be specfied with erase\n" "%ls\n" msgstr "" "%ls: Bei erase können keine Werte angegeben werden\n" "%ls\n" #: complete.c:52 msgid "User home" msgstr "Anwender-Startverzeichnis" #: complete.c:57 msgid "Variable: " msgstr "Variable: " #: complete.c:62 msgid "Executable" msgstr "Programm" #: complete.c:66 msgid "Executable link" msgstr "Programm-Link" #: complete.c:71 msgid "File" msgstr "Datei" #: complete.c:75 msgid "Character device" msgstr "zeichenorientiertes Gerät" #: complete.c:79 msgid "Block device" msgstr "blockorientiertes Gerät" #: complete.c:83 msgid "Fifo" msgstr "Fifo" #: complete.c:87 msgid "Symbolic link" msgstr "Symbolischer Link" #: complete.c:91 msgid "Rotten symbolic link" msgstr "zerstörter symbolischer Link" #: complete.c:95 msgid "Symbolic link loop" msgstr "Schleife bei symbolischem Link" #: complete.c:99 msgid "Socket" msgstr "Socket" #: complete.c:103 init/fish_complete.fish.in:68 init/fish_complete.fish:68 #: init/completions/ruby.fish:23 msgid "Directory" msgstr "Verzeichnis" #: complete.c:108 init/completions/function.fish:2 #: init/completions/functions.fish:2 msgid "Function" msgstr "Funktion" #: complete.c:112 init/completions/function.fish:3 msgid "Builtin" msgstr "eingebauter Befehl" #: complete.c:764 complete.c:783 msgid "Unknown option: " msgstr "Unbekannte Option: " #: complete.c:788 msgid "Multiple matches for option: " msgstr "Mehrere Treffer für Option: " #: env.c:195 msgid "Could not get user information" msgstr "Kann Anwender-Information nicht abrufen" #: env.c:291 msgid "Changing language to english" msgstr "Sprachwechsel zu Englisch" #: env.c:849 #, c-format msgid "No history item at index %d\n" msgstr "Kein Eintrag im Befehlsverlauf bei Index %d\n" #: env.c:1024 msgid "Tried to pop empty environment stack." msgstr "" #: event.c:490 msgid "Signal list overflow. Signals have been ignored." msgstr "Überlauf Signal-Liste. Signale wurden ignoriert." #: exec.c:52 #, c-format msgid "An error occurred while redirecting file descriptor %d" msgstr "Fehler beim Umleiten des Dateideskriptors %d" #: exec.c:56 #, c-format msgid "An error occurred while redirecting file '%ls'" msgstr "Fehler beim Umleiten der Datei '%ls'" #: exec.c:60 msgid "Could not create child process - exiting" msgstr "Konnte Kindprozess nicht starten - Abbruch" #: exec.c:448 #, c-format msgid "Failed to execute process '%ls'" msgstr "Konnte Prozess '%ls' nicht ausführen" #: exec.c:619 #, c-format msgid "Could not send process %d from group %d to group %d" msgstr "Konnte Prozess %d nicht von Gruppe %d an Gruppe %d senden" #: exec.c:631 exec.c:643 proc.c:895 proc.c:907 #, c-format msgid "Could not send job %d ('%ls') to foreground" msgstr "Konnte Job %d ('%ls') nicht in den Vordergrund schicken" #: exec.c:814 #, c-format msgid "Unknown function '%ls'" msgstr "Unbekannte Funktion '%ls'" #: exec.c:922 #, c-format msgid "Unknown input redirection type %d" msgstr "Unbekannter Typ %d bei Eingabeumleitung " #: exec.c:1249 #, c-format msgid "Sent null command to subshell. This is a fish bug. If it can be reproduced, please send a bug report to %s." msgstr "Sendete Null-Befehl an Untershell. Dies ist ein fish-Bug. Wenn er reproduziert werden kann, senden Sie einen Fehlerbericht an %s." #: exec.c:1297 #, c-format msgid "Subshell '%ls' returned illegal string, discarded one entry" msgstr "Subshell '%ls' gab ungültige Zeichenkette zurück, ein Eintrag verworfen" #: input.c:409 msgid "Invalid Control sequence" msgstr "Ungültige Kontrollsequenz" #: input.c:521 #, c-format msgid "Could not parse sequence '%ls'" msgstr "Konnte Sequenz '%ls' nicht auswerten" #: input.c:687 msgid "Invalid sequence - no dash after control\n" msgstr "Ungültige Sequenz - kein Strich nach Steuerung\n" #: input.c:717 msgid "Invalid sequence - Control-nothing?\n" msgstr "Ungültige Sequenz - Steuerung-Nichts?\n" #: input.c:732 msgid "Invalid sequence - no dash after meta\n" msgstr "Ungültige Sequenz - kein Strich nach Alt\n" #: input.c:737 msgid "Invalid sequence - Meta-nothing?" msgstr "Ungültige Sequenz - Alt-Nichts?" #: input.c:782 #, c-format msgid "Invalid sequence - '%ls' expanded to zero characters" msgstr "Ungültige Sequenz - '%ls' wurde zu null Zeichen erweitert" #: input.c:846 msgid "Mismatched $endif in inputrc file" msgstr "Unpassendes $endif in der Datei inputrc" #: input.c:898 msgid "Mismatched quote" msgstr "Unpassendes Anführungszeichen" #: input.c:912 msgid "Expected a ':'" msgstr "Erwartete ein ':'" #: input.c:957 #, c-format msgid "I don't know what '%ls' means" msgstr "Ich weiss nicht, was '%ls' bedeutet" #: input.c:961 #, c-format msgid "Expected end of line, got '%ls'" msgstr "Zeilenende erwartet, erhielt '%ls'" #: input.c:966 msgid "Syntax: set KEY VALUE" msgstr "Syntax: set Schlüssel Wert" #: input.c:1032 msgid "Unable to parse key binding" msgstr "Konnte Tastenkürzel nicht analysieren" #: input.c:1058 #, c-format msgid "I don't know what %ls means" msgstr "Ich weiss nicht, was '%ls' bedeutet" #: input.c:1084 #, c-format msgid "Error while reading input information from file '%ls'" msgstr "Fehler beim Lesen der Eingabeinformationen aus Datei '%ls'" #: input.c:1312 msgid "Could not set up terminal" msgstr "Konnte Terminal nicht einrichten" #: io.c:73 #, c-format msgid "An error occured while reading output from code block on file descriptor %d" msgstr "Fehler beim Lesen der Ausgabe des Codeblocks auf Dateideskriptor %d" #: parser.c:56 #, c-format msgid "If this error can be reproduced, please send a bug report to %s." msgstr "Wenn dieser Fehler reproduziert werden kann, senden Sie bitte einen Fehlerbereicht an %s." #: parser.c:61 msgid "This command can not be used in a pipeline" msgstr "Dieser Befehl kann nicht in einer Pipe benutzt werden" #: parser.c:67 #, c-format msgid "Tokenizer error: '%ls'" msgstr "Tokenizer-Fehler: '%ls'" #: parser.c:72 msgid "Short circut command requires additional command" msgstr "" #: parser.c:77 msgid "Maximum recursion depth reached. Accidental infinite loop?" msgstr "Maximale Rekursionstiefe erreicht. Zufällige Endlos-Schleife?" #: parser.c:82 msgid "Could not locate end of block. The 'end' command is missing, misspelled or a ';' is missing." msgstr "Konnte Blockende nicht finden, Der 'end'-Befehl fehlt, ist falsch geschriebne oder ein ':' fehlt." #: parser.c:87 msgid "Maximum number of nested blocks reached." msgstr "Maximal-Anzahl geschachtelter Blöcke erreicht." #: parser.c:92 #, c-format msgid "Expected a command name, got token of type '%ls'" msgstr "Erwartete einen Befehlsnamen, bekam Zeichen des Typs '%ls'" #: parser.c:97 #, c-format msgid "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; or COMMAND'? For more information on the 'or' builtin command, see the help section for 'or' by typing 'help or'." msgstr "Erwartete einen Befehlsnamen, bekam Zeichen des Typs '%ls'. Meinten Sie 'Befehl; or Befehl'? Zu weiteren Informationen über den eingebauten Befehl 'or' schauen Sie in der Hilfe zu 'or' nach oder geben Sie 'help or' ein." #: parser.c:102 #, c-format msgid "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; and COMMAND'? For more information on the 'and' builtin command, see the help section for 'and' by typing 'help and'." msgstr "Erwartete einen Befehlsnamen, bekam Zeichen des Typs '%ls'. Meinten Sie 'Befehl; and Befehl'? Zu weiteren Informationen über den eingebauten Befehl 'and' schauen Sie in der Hilfe zu 'and' nach oder geben Sie 'help and' ein." #: parser.c:107 #, c-format msgid "Illegal command name '%ls'" msgstr "Ungültiger Befehlsname '%ls'" #: parser.c:112 #, c-format msgid "Warning: No match for wildcard '%ls'. The command will not be executed." msgstr "Warnung: Kein Treffer für Jokerzeichen '%ls'. Der Befehl wird nicht ausgeführt." #: parser.c:117 msgid "'case' builtin not inside of switch block" msgstr "eingebauter Befehl 'case' nicht innerhalb eines switch-Blocks" #: parser.c:122 msgid "Loop control command while not inside of loop" msgstr "Schleifensteuerungs-Befehl 'while' nicht innerhalb einer Schleife" #: parser.c:127 msgid "'else' builtin not inside of if block" msgstr "eingebauter Befehl 'else' nicht innerhalb eines if-Blocks" #: parser.c:132 msgid "'end' command outside of block" msgstr "'end'-Befehl ausserhalb eines Blocks" #: parser.c:137 #, c-format msgid "Unknown command '%ls'. Did you mean 'set VARIABLE VALUE'? For information on setting variable values, see the help section on the set command by typing 'help set'." msgstr "Unbekannter Befehl '%ls'. Meinten Sie 'set VARIABLE WERT'? Zu Informationen zum Setzen von Variablen-Werten schauen Sie in der Hilfe zum set-Befehl nach oder geben Sie 'help set' ein." #: parser.c:142 #, c-format msgid "Expected redirection specification, got token of type '%ls'" msgstr "Erwartete Umleitungsspezifikation, erhielt Zeichen vom Typ '%ls'" #: parser.c:147 msgid "Encountered redirection when expecting a command name. Fish does not allow a redirection operation before a command." msgstr "Umleitung anstelle eines Befehlsnamens. Fish erlaubt keine Umleitung vor einem Befehl." #: parser.c:152 msgid "Tried to evaluate null pointer." msgstr "Versuchte, einen Null-Zeiger auszuwerten." #: parser.c:157 #, c-format msgid "Tried to evaluate commands using invalid block type '%ls'" msgstr "Versuchte, Befehle mittels des ungültigen Blocktyps '%ls' auszuwerten" #: parser.c:163 #, c-format msgid "Unexpected token of type '%ls'" msgstr "Unerwartetes Zeichen des Typs '%ls'" #: parser.c:168 #, c-format msgid "Error while searching for command '%ls'" msgstr "Fehler beim Suchen des Befehls '%ls'" #: parser.c:174 msgid "'while' block" msgstr "'while'-Block" #: parser.c:180 msgid "'for' block" msgstr "'for'-Block" #: parser.c:186 msgid "'if' conditional block" msgstr "'if'-Bedingungsblock" #: parser.c:192 msgid "function definition block" msgstr "Funktionsdefinitons-Block" #: parser.c:198 msgid "function invocation block" msgstr "Funktionsausführungs-Block" #: parser.c:204 msgid "'switch' block" msgstr "'switch'-Block" #: parser.c:210 msgid "unexecutable block" msgstr "nicht ausführbarer Block" #: parser.c:216 msgid "global root block" msgstr "globaler Root-Block" #: parser.c:222 msgid "command substitution block" msgstr "Befehlsersetzungs-Block" #: parser.c:228 msgid "'begin' unconditional block" msgstr "'begin' unbedingter Block" #: parser.c:234 msgid "unknown/invalid block" msgstr "unbekannter/ungültiger Block" #: parser.c:876 #, c-format msgid "Could not write profiling information to file '%s'" msgstr "Konnte Profilierungs-Informationen nicht in Datei '%s' schreiben" #: parser.c:882 msgid "Time\tSum\tCommand\n" msgstr "Zeit\tSum\tBefehl\n" #: parser.c:1036 #, c-format msgid "%ls (line %d): " msgstr "%ls (Zeile %d): " #: parser.c:1222 #, c-format msgid "Could not expand string '%ls'" msgstr "Konnte Zeichenkette '%ls' nicht expandieren" #: parser.c:1324 msgid "Invalid IO redirection" msgstr "Ungültige I/O-Umleitung" #: parser.c:1367 #, c-format msgid "Requested redirection to something that is not a file descriptor %ls" msgstr "Angeforderte Umleitung auf etwas, das kein Dateideskriptor ist %ls" #: parser.c:1780 #, c-format msgid "Unknown command '%ls'" msgstr "Unbekannter Befehl '%ls'" #: parser.c:2215 msgid "End of block mismatch. Program terminating." msgstr "Unpassendes Blockende. Programm wird beendet." #: proc.c:149 msgid "Job inconsistency" msgstr "Job-Inkonsistenz" #: proc.c:501 #, c-format msgid "Job %d, '%ls' has %ls" msgstr "Job %d, '%ls' hat %ls" #: proc.c:577 #, c-format msgid "%ls: Job %d, '%ls' terminated by signal %ls (%ls)" msgstr "%ls: Job %d, '%ls' durch Signal %ls (%ls) beendet" #: proc.c:585 #, c-format msgid "%ls: Process %d, '%ls' from job %d, '%ls' terminated by signal %ls (%ls)" msgstr "%ls: Prozess %d, '%ls' aus job %d, '%ls' durch Signal %ls (%ls) beendet" #: proc.c:616 msgid "ended" msgstr "beendet" #: proc.c:835 msgid "An error occured while reading output from code block" msgstr "Fehler während des Lesens der Ausgabe aus Codeblock" #: proc.c:1018 proc.c:1028 proc.c:1038 msgid "Could not return shell to foreground" msgstr "Konnte Shell nicht wieder in Vordergrund setzen" #: proc.c:1061 msgid "Job command" msgstr "Job-Befehl" #: proc.c:1064 proc.c:1091 msgid "Process list pointer" msgstr "Zeiger auf Prozessliste" #: proc.c:1067 msgid "Job list pointer" msgstr "Zeiger auf Jobliste" #: proc.c:1078 #, c-format msgid "More than one job in foreground: job 1: '%ls' job 2: '%ls'" msgstr "Mehr als ein Job im Vordergrund: Job 1: '%ls' Job 2: '%ls'" #: proc.c:1089 msgid "Process argument list" msgstr "Prozessargumentliste" #: proc.c:1090 msgid "Process name" msgstr "Prozessname" #: proc.c:1092 msgid "Process command" msgstr "Prozessbefehl" #: proc.c:1097 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'stopped'=%d" msgstr "Job '%ls', Prozess '%ls' hat inkonsistenten Status 'stopped'=%d" #: proc.c:1107 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'completed'=%d" msgstr "Job '%ls', Prozess '%ls' hat inkonsistenten Status 'completed'=%d" #: reader.c:299 msgid "Could not set terminal mode for new job" msgstr "Konnte Terminalmodus für neuen Job nicht setzen" #: reader.c:320 msgid "Could not set terminal mode for shell" msgstr "Konnte Terminalmodus für neue Shell nicht setzen" #: reader.c:1602 msgid "Couldn't put the shell in its own process group" msgstr "Konnte Shell nicht in ihre eigene Prozessgruppe verschieben" #: reader.c:1612 msgid "Couldn't grab control of terminal" msgstr "Konnte Terminalsteuerung nicht übernehmen" #: reader.c:1644 msgid "Could not set exit function" msgstr "Konnte Ende-Funktion nicht setzen" #: reader.c:2376 msgid "Pop null reader block" msgstr "" #: reader.c:2518 msgid "There are stopped jobs\n" msgstr "Es sind gestoppte Jobs vorhanden\n" #: reader.c:3034 #, c-format msgid "Unknown keybinding %d" msgstr "Unbekannte Tastenkombination %d" #: reader.c:3104 msgid "Error while reading commands" msgstr "Fehler beim Lesen der Befehle" #: reader.c:3123 msgid "Error while closing input stream" msgstr "Fehler beim Schliessen des Eingabestroms" #: reader.c:3151 #, c-format msgid "Could not convert input. Read %d bytes." msgstr "Konnnte Eingabe nicht konvertieren. %d Bytes gelesen." #: reader.c:3157 msgid "Could not read input stream" msgstr "Konnte Eingabestrom nicht lesen" #: reader.c:3166 msgid "Error while opening input stream" msgstr "Fehler beim Öffnen des Eingabestroms" #: sanity.c:34 msgid "Errors detected, shutting down" msgstr "Fehler gefunden, Programmabbruch" #: sanity.c:62 #, c-format msgid "The pointer '%ls' is invalid" msgstr "Der Zeiger '%ls' ist ungültig" #: sanity.c:68 #, c-format msgid "The pointer '%ls' is null" msgstr "Der Zeiger '%ls' ist null" #: signal.c:55 msgid "Terminal hung up" msgstr "Terminal getrennt" #: signal.c:61 msgid "Quit request from job control (^C)" msgstr "Quit-Anforderung über Job-Steuerung (^C)" #: signal.c:67 msgid "Quit request from job control with core dump (^\\)" msgstr "Quit-Anforderung über Job-Steuerung mit Speicherauszug (^\\)" #: signal.c:73 msgid "Illegal instruction" msgstr "Illegale Instruktion" #: signal.c:79 msgid "Trace or breakpoint trap" msgstr "" #: signal.c:85 msgid "Abort" msgstr "Abbruch" #: signal.c:91 msgid "Misaligned address error" msgstr "Fehler: nicht ausgerichtete Adresse" #: signal.c:97 msgid "Floating point exception" msgstr "Fliesskomma-Ausnahmefehler" #: signal.c:103 msgid "Forced quit" msgstr "Erzwungene Beendigung" #: signal.c:109 msgid "User defined signal 1" msgstr "Anwender-definiertes Signal 1" #: signal.c:114 msgid "User defined signal 2" msgstr "Anwender-definiertes Signal 2" #: signal.c:120 msgid "Address boundary error" msgstr "Adressbereichsfehler" #: signal.c:126 msgid "Broken pipe" msgstr "zerstörte Pipe" #: signal.c:132 msgid "Timer expired" msgstr "Zeitgeber abgelaufen" #: signal.c:138 msgid "Polite quit request" msgstr "Höfliche Beendigungsanforderung" #: signal.c:144 msgid "Child process status changed" msgstr "Kindprozess-Status geändert" #: signal.c:150 msgid "Continue previously stopped process" msgstr "Vorher gestoppten Prozess fortsetzen" #: signal.c:156 msgid "Forced stop" msgstr "Erzwungener Stopp" #: signal.c:162 msgid "Stop request from job control (^Z)" msgstr "Stoppanforderung über Jobsteuerung (^Z)" #: signal.c:168 msgid "Stop from terminal input" msgstr "Stopp durch Terminaleingabe" #: signal.c:174 msgid "Stop from terminal output" msgstr "Stopp durch Terminalausgabe" #: signal.c:180 msgid "Urgent socket condition" msgstr "" #: signal.c:186 msgid "CPU time limit exceeded" msgstr "CPU-Zeit-Begrenzung überschritten" #: signal.c:192 msgid "File size limit exceeded" msgstr "Dateigrössen-Begrenzung überschritten" #: signal.c:198 msgid "Virtual timer expired" msgstr "Virtueller Zeitgeber abgelaufen" #: signal.c:204 msgid "Profiling timer expired" msgstr "Profilierungs-Zeitgeber abgelaufen" #: signal.c:210 msgid "Window size change" msgstr "Änderung der Fenstergrösse" #: signal.c:216 msgid "I/O on asynchronous file descriptor is possible" msgstr "E/A auf asynchronem Dateideskriptor ist möglich" #: signal.c:223 msgid "Power failure" msgstr "Stromausfall" #: signal.c:230 msgid "Bad system call" msgstr "Fehlerhafter Systemaufruf" #: tokenizer.c:28 msgid "Unexpected end of token" msgstr "Unerwartetes Zeichenende" #: tokenizer.c:32 msgid "Parenthesis mismatch" msgstr "Nicht passende Klammern" #: tokenizer.c:36 msgid "Invalid redirection" msgstr "Ungültige Umleitung" #: tokenizer.c:40 msgid "Invalid input" msgstr "Ungültige Eingabe" #: tokenizer.c:45 msgid "Can not use fd 0 as pipe output" msgstr "Kann FD 0 nicht als Pipe-Ausgabe verwenden" #: tokenizer.c:59 msgid "Tokenizer not yet initialized" msgstr "Tokenizer noch nicht initialisiert" #: tokenizer.c:60 msgid "Tokenizer error" msgstr "Tokenizer-Fehler" #: tokenizer.c:61 msgid "Invalid token" msgstr "Ungültiges Zeichen" #: tokenizer.c:62 msgid "String" msgstr "Zeichenkette" #: tokenizer.c:63 msgid "Pipe" msgstr "Pipe" #: tokenizer.c:64 msgid "End of command" msgstr "Ende des Befehls" #: tokenizer.c:65 msgid "Redirect output to file" msgstr "Ausgabe auf Datei umleiten" #: tokenizer.c:66 msgid "Append output to file" msgstr "Ausgabe an Datei anhängen" #: tokenizer.c:67 msgid "Redirect input to file" msgstr "Eingabe auf Datei umleiten" #: tokenizer.c:68 msgid "Redirect to file descriptor" msgstr "Auf Dateideskriptor umleiten" #: tokenizer.c:69 msgid "Run job in background" msgstr "Job im Hintergrund ausführen" #: tokenizer.c:70 msgid "Comment" msgstr "Kommentar" #: wildcard.c:291 msgid "unknown" msgstr "unbekannt" #: wildcard.c:295 msgid "empty" msgstr "leer" #: builtin.h:23 #, c-format msgid "%ls: Expected argument\n" msgstr "%ls: Argument erwartet\n" #: builtin.h:33 #, c-format msgid "" "%ls: Invalid combination of options,\n" "%ls\n" msgstr "" "%ls: Ungültige Kombination von Optionen,\n" "%ls\n" #: builtin.h:38 #, c-format msgid "" "%ls: Variable scope can only be one of universal, global and local\n" "%ls\n" msgstr "" "%ls: Variablen-Bereich kann nur universell, global oder lokal sein\n" "%ls\n" #: builtin.h:43 #, c-format msgid "" "%ls: Variable can't be both exported and unexported\n" "%ls\n" msgstr "" "%ls: Variable kann nicht gleichzeitig exportiert und nicht exportiert sein\n" "%ls\n" #: builtin.h:48 #, c-format msgid "%ls: Unknown option '%ls'\n" msgstr "%ls: Unbekannte Option '%ls'\n" #: builtin.h:50 #, c-format msgid "%ls: Invalid character '%lc' in variable name. Only alphanumerical characters and underscores are valid in a variable name.\n" msgstr "%ls: Ungültiges Zeichen '%lc' im Variablenname. Nur alfanumerische Zeichen und Unterstriche sind in einem Variablennamen gültig.\n" #: builtin.h:52 #, c-format msgid "%ls: Variable name can not be the empty string\n" msgstr "%ls: Variablenname kann nicht leer sein\n" #: exec.h:19 msgid "An error occurred while setting up pipe" msgstr "Fehler beim Einrichten der Pipe aufgetreten" #: init/fish_complete.fish.in:184 init/fish_complete.fish:184 #: init/completions/apropos.fish:11 init/completions/apt-build.fish:3 #: init/completions/apt-cache.fish:2 init/completions/apt-cdrom.fish:2 #: init/completions/apt-config.fish:2 #: init/completions/apt-extracttemplates.fish:3 #: init/completions/apt-file.fish:2 init/completions/apt-ftparchive.fish:2 #: init/completions/apt-get.fish:23 init/completions/apt-listbugs.fish:2 #: init/completions/apt-listchanges.fish:2 #: init/completions/apt-proxy-import.fish:2 #: init/completions/apt-rdepends.fish:2 #: init/completions/apt-show-source.fish:2 #: init/completions/apt-show-versions.fish:2 #: init/completions/apt-sortpkgs.fish:2 init/completions/apt-spy.fish:2 #: init/completions/apt-src.fish:2 init/completions/apt-zip-inst.fish:2 #: init/completions/apt-zip-list.fish:2 init/completions/bc.fish:9 #: init/completions/cat.fish:10 init/completions/chgrp.fish:10 #: init/completions/chown.fish:9 init/completions/complete.fish:13 #: init/completions/configure.fish:1 init/completions/cut.fish:8 #: init/completions/date.fish:9 init/completions/df.fish:33 #: init/completions/diff.fish:26 init/completions/du.fish:18 #: init/completions/echo.fish:4 init/completions/fish.fish:2 #: init/completions/functions.fish:4 init/completions/gpg.fish:108 #: init/completions/gprof.fish:31 init/completions/grep.fish:23 #: init/completions/gunzip.fish:8 init/completions/gzip.fish:10 #: init/completions/id.fish:6 init/completions/less.fish:1 #: init/completions/ls.fish:88 init/completions/man.fish:56 #: init/completions/mimedb.fish:8 init/completions/mount.fish:47 #: init/completions/mplayer.fish:30 init/completions/mplayer.fish:35 #: init/completions/mplayer.fish:82 init/completions/mv.fish:10 #: init/completions/nice.fish:3 init/completions/pine.fish:3 #: init/completions/ps.fish:35 init/completions/python.fish:4 #: init/completions/read.fish:1 init/completions/rmdir.fish:6 #: init/completions/rm.fish:8 init/completions/rpm.fish:4 #: init/completions/ruby.fish:8 init/completions/sed.fish:27 #: init/completions/set.fish:68 init/completions/sort.fish:19 #: init/completions/su.fish:10 init/completions/test.fish:2 #: init/completions/tex.fish:2 init/completions/top.fish:5 #: init/completions/touch.fish:10 init/completions/trap.fish:4 #: init/completions/type.fish:2 init/completions/ulimit.fish:13 #: init/completions/umount.fish:16 init/completions/uname.fish:10 #: init/completions/uniq.fish:13 init/completions/valgrind.fish:24 #: init/completions/vared.fish:2 init/completions/wc.fish:6 #: init/completions/wget.fish:6 init/completions/who.fish:18 #: init/completions/xprop.fish:2 init/completions/xsel.fish:16 #: init/completions/yum.fish:49 init/completions/zcat.fish:7 #: init/completions/zip.fish:31 msgid "Display help and exit" msgstr "Hilfe anzeigen und beenden" #: init/fish_complete.fish.in:203 init/fish_complete.fish:203 #: init/completions/apt-get.fish:21 msgid "Package" msgstr "Paket" #: init/fish_complete.fish.in:292 init/fish_complete.fish:292 msgid "Start service" msgstr "Starte Dienst" #: init/fish_complete.fish.in:293 init/fish_complete.fish:293 msgid "Stop service" msgstr "Dienst anhalten" #: init/fish_complete.fish.in:294 init/fish_complete.fish:294 msgid "Print service state" msgstr "Dienststatus anzeigen" #: init/fish_complete.fish.in:295 init/fish_complete.fish:295 msgid "Stop and then start service" msgstr "Stoppe und starte Dienst" #: init/fish_complete.fish.in:296 init/fish_complete.fish:296 msgid "Reload service configuration" msgstr "Dienstkonfiguration neu laden" #: init/fish.in:74 msgid "-d" msgstr "-d" #: init/fish.in:75 msgid "fish" msgstr "fish" #: init/fish_interactive.fish.in:13 init/fish_interactive.fish:13 msgid "Welcome to fish, the friendly interactive shell\\n" msgstr "Willkommen zu fish, der Freundlichen Interaktiven Shell\\n" #: init/fish_interactive.fish.in:14 init/fish_interactive.fish:14 msgid "Type %shelp%s for instructions on how to use fish\\n" msgstr "Anweisungen zur fish-Benutzung erhalten Sie über %shelp%s\\n" #: init/fish_interactive.fish.in:20 init/fish_interactive.fish:20 msgid "Commands to execute when fish exits" msgstr "Beim Ende von fish auszuführende Befehle" #: init/fish_interactive.fish.in:21 init/fish_interactive.fish:21 msgid "Good bye\\n" msgstr "Auf Wiedersehen\\n" #: init/fish_interactive.fish.in:28 init/fish_interactive.fish:28 msgid "Write out the prompt" msgstr "Prompt anzeigen" #: init/fish_function.fish:58 msgid "%s: Key not specified\\n" msgstr "%s: Schlüssel nicht angegeben\\n" #: init/fish_function.fish:130 msgid "%s: Could not find a web browser.\\n" msgstr "Konnte keinen Webbrowser finden.\\n" #: init/fish_function.fish:131 #, sh-format msgid "Please set the variable $BROWSER to a suitable browser and try again\\n\\n" msgstr "Setzen Sie bitte die Variable $BROWSER auf einen passenden Browser und versuchen Sie es erneut\\n\\n" #: init/fish_function.fish:273 msgid "vared: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of %s\\n" msgstr "vared: %s ist eine Feldvariable. Benutzen Sie %svared%s %s[n] zum Editieren den n. Elementes von %s\\n" #: init/fish_function.fish:277 msgid "vared: Expected exactly one argument, got %s.\\n\\nSynopsis:\\n\\t%svared%s VARIABLE\\n" msgstr "vared: Erwartete genau ein Argument, erhielt %s.\\n\\nSynopsis:\\n\\t%svared%s VARIABLE\\n" #: init/fish_function.fish:386 msgid "Hit end of history...\\n" msgstr "Ende des Befehlsverlaufs errreicht ...\\n" #: init/fish_function.fish:422 msgid "The number of positions to skip must be a non-negative integer\\n" msgstr "Anzahl zu überspringender Positionen muss eine positive Ganzzahl sein\\n" #: init/fish_function.fish:775 msgid "%s is a function with definition\\n" msgstr "%s ist eine Funktion mit der Definition\\n" #: init/fish_function.fish:779 msgid "function" msgstr "Funktion" #: init/fish_function.fish:795 msgid "%s is a builtin\\n" msgstr "%s ist ein eingebauter Befehl\\n" #: init/fish_function.fish:798 msgid "builtin\\n" msgstr "eingebauter Befehl\\n" #: init/fish_function.fish:815 msgid "%s is %s\\n" msgstr "%s ist %s\\n" #: init/fish_function.fish:818 msgid "file" msgstr "Datei" #: init/fish_function.fish:829 msgid "%s: Could not find '%s'" msgstr "%s: Konnte '%s' nicht finden" #: init/fish_function.fish:845 msgid "%s: Invalid mask '%s'\\n" msgstr "%s: Ungültige Mmaske '%s'\\n" #: init/fish_function.fish:1032 msgid "%s: Too many arguments\\n" msgstr "%s: Zu viele Argumente\\n" #: init/fish_function.fish:1052 msgid "%s: Unknown argument '%s'\\n" msgstr "%s: Unbekanntes Argument '%s'\\n" #: init/completions/apm.fish:2 init/completions/apropos.fish:20 #: init/completions/apt-build.fish:29 init/completions/apt-cache.fish:28 #: init/completions/apt-cdrom.fish:11 init/completions/apt-config.fish:5 #: init/completions/apt-file.fish:12 init/completions/apt-ftparchive.fish:15 #: init/completions/apt-get.fish:61 init/completions/apt-proxy-import.fish:3 #: init/completions/apt-rdepends.fish:12 #: init/completions/apt-show-source.fish:8 #: init/completions/apt-sortpkgs.fish:4 init/completions/apt-zip-inst.fish:3 #: init/completions/apt-zip-list.fish:3 init/completions/at.fish:2 #: init/completions/atq.fish:2 init/completions/atrm.fish:2 #: init/completions/bc.fish:8 init/completions/bunzip2.fish:15 #: init/completions/bzip2.fish:17 init/completions/cat.fish:11 #: init/completions/chgrp.fish:11 init/completions/chown.fish:10 #: init/completions/configure.fish:2 init/completions/cut.fish:9 #: init/completions/cvs.fish:33 init/completions/cvs.fish:44 #: init/completions/date.fish:10 init/completions/df.fish:34 #: init/completions/diff.fish:25 init/completions/du.fish:19 #: init/completions/echo.fish:5 init/completions/fish.fish:3 #: init/completions/gprof.fish:32 init/completions/grep.fish:43 #: init/completions/gunzip.fish:18 init/completions/gzip.fish:20 #: init/completions/id.fish:7 init/completions/less.fish:41 #: init/completions/ls.fish:89 init/completions/make.fish:26 #: init/completions/mimedb.fish:9 init/completions/modprobe.fish:14 #: init/completions/mount.fish:46 init/completions/mplayer.fish:83 #: init/completions/mv.fish:11 init/completions/nice.fish:4 #: init/completions/perl.fish:18 init/completions/ping.fish:27 #: init/completions/ps.fish:34 init/completions/python.fish:12 #: init/completions/rmdir.fish:7 init/completions/rm.fish:9 #: init/completions/rpm.fish:5 init/completions/ruby.fish:21 #: init/completions/sed.fish:28 init/completions/sort.fish:20 #: init/completions/su.fish:11 init/completions/tar.fish:51 #: init/completions/test.fish:3 init/completions/tex.fish:3 #: init/completions/top.fish:13 init/completions/touch.fish:11 #: init/completions/umount.fish:15 init/completions/uname.fish:11 #: init/completions/uniq.fish:14 init/completions/valgrind.fish:26 #: init/completions/wc.fish:7 init/completions/w.fish:5 #: init/completions/wget.fish:5 init/completions/who.fish:19 #: init/completions/xsel.fish:18 init/completions/yum.fish:57 #: init/completions/zcat.fish:9 msgid "Display version and exit" msgstr "Version anzeigen und beenden" #: init/completions/apm.fish:3 msgid "Print APM info" msgstr "APM-Informationen anzeigen" #: init/completions/apm.fish:4 msgid "Print time remaining" msgstr "Verbleibende Zeit anzeigen" #: init/completions/apm.fish:5 msgid "Monitor status info" msgstr "Status-Information beobachten" #: init/completions/apm.fish:6 msgid "Request APM standby mode" msgstr "APM-Standby-Modus anfordern" #: init/completions/apm.fish:7 msgid "Request APM suspend mode" msgstr "APM-Suspend-Modus anfordern" #: init/completions/apm.fish:8 msgid "APM status debugging info" msgstr "APM-Status Debug-Informationen" #: init/completions/apropos.fish:9 msgid "whatis entry" msgstr "whatis-Eintrag" #: init/completions/apropos.fish:12 msgid "Print debugging info" msgstr "Debug-Informationen ausgeben" #: init/completions/apropos.fish:13 init/completions/apt-file.fish:8 #: init/completions/apt-listchanges.fish:4 #: init/completions/apt-proxy-import.fish:4 #: init/completions/apt-show-source.fish:10 init/completions/arp.fish:2 #: init/completions/darcs.fish:64 init/completions/darcs.fish:148 #: init/completions/darcs.fish:160 init/completions/darcs.fish:166 #: init/completions/makedepend.fish:11 init/completions/mount.fish:48 #: init/completions/mv.fish:9 init/completions/ping.fish:26 #: init/completions/python.fish:11 init/completions/rmdir.fish:5 #: init/completions/rpm.fish:7 init/completions/ruby.fish:19 #: init/completions/ssh.fish:61 init/completions/tar.fish:49 #: init/completions/umount.fish:17 init/completions/valgrind.fish:28 #: init/completions/wget.fish:13 init/completions/zip.fish:14 msgid "Verbose mode" msgstr "Gesprächiger Modus" #: init/completions/apropos.fish:14 msgid "Keyword as regex" msgstr "Schlüsselwort als regulärer Ausdruck" #: init/completions/apropos.fish:15 msgid "Keyword as wildwards" msgstr "Schlüsselwort als Muster" #: init/completions/apropos.fish:16 msgid "Keyword as exactly match" msgstr "Schlüsselwort als genaue Übereinstimmung" #: init/completions/apropos.fish:17 msgid "Search for other system" msgstr "Nach anderem System suchen" #: init/completions/apropos.fish:18 msgid "Specify man path" msgstr "Man-Pfad angeben" #: init/completions/apropos.fish:19 msgid "Specify a configuration file" msgstr "eine Konfigurationsdatei angeben" #: init/completions/apt-build.fish:4 msgid "Update list of packages" msgstr "Paketliste aktualisieren" #: init/completions/apt-build.fish:5 msgid "Upgrade packages" msgstr "Pakete aktualisieren" #: init/completions/apt-build.fish:6 msgid "Rebuild your system" msgstr "Ihr Sytem neu erstellen" #: init/completions/apt-build.fish:7 msgid "Build and install a new package" msgstr "Ein neues Paket erstellen und installieren" #: init/completions/apt-build.fish:8 msgid "Download and extract a source" msgstr "Eine Quelle abrufen und extrahieren" #: init/completions/apt-build.fish:9 msgid "Info on a package" msgstr "Informationen über ein Paket" #: init/completions/apt-build.fish:10 msgid "Remove packages" msgstr "Pakete entfernen" #: init/completions/apt-build.fish:11 msgid "Erase built packages" msgstr "Erstellte Pakete löschen" #: init/completions/apt-build.fish:12 msgid "Build source without install" msgstr "Quelle ohne Installation erstellen" #: init/completions/apt-build.fish:13 msgid "Clean source directories" msgstr "Quellverzeichnisse bereinigen" #: init/completions/apt-build.fish:14 msgid "Update source and rebuild" msgstr "Quelle aktualisieren und erneut erstellen" #: init/completions/apt-build.fish:15 msgid "Update the repository" msgstr "Paket-Depot aktualisieren" #: init/completions/apt-build.fish:16 msgid "Do not use gcc wrapper" msgstr "Nicht die gcc-Ummantelung nutzen" #: init/completions/apt-build.fish:17 msgid "Remove build-dep" msgstr "Erstellungsabhängigkeiten entfernen" #: init/completions/apt-build.fish:18 msgid "Do not download source" msgstr "Quelle nicht abrufen" #: init/completions/apt-build.fish:19 msgid "Specify build-dir" msgstr "Erstellungsverzeichnis angeben" #: init/completions/apt-build.fish:20 msgid "Rebuild a package" msgstr "Ein Paket neu erstellen" #: init/completions/apt-build.fish:21 msgid "Rebuild and install an installed package" msgstr "Ein installiertes Paket neu erstellen und installieren" #: init/completions/apt-build.fish:22 msgid "Use to build" msgstr "Benutze zur Erstellung" #: init/completions/apt-build.fish:23 msgid "Apply patch" msgstr "-Patch anwenden" #: init/completions/apt-build.fish:24 msgid "Prefix to strip on patch" msgstr "" #: init/completions/apt-build.fish:25 init/completions/apt-listbugs.fish:21 #: init/completions/yum.fish:50 msgid "Assume yes to all questions" msgstr "Bei allen Fragen ja annehmen" #: init/completions/apt-build.fish:26 init/completions/apt-get.fish:50 msgid "Use purge instead of remove" msgstr "purge anstelle von remove verwenden" #: init/completions/apt-build.fish:27 msgid "Do not run update" msgstr "Aktualisierung nicht durchführen" #: init/completions/apt-build.fish:28 msgid "Specify sources.list file" msgstr "Sources.list-Datei angeben" #: init/completions/apt-cache.fish:3 msgid "Build apt cache" msgstr "Apt-Zwischenspeicher erstellen" #: init/completions/apt-cache.fish:4 msgid "Show package info" msgstr "Paket-Information zeigen" #: init/completions/apt-cache.fish:5 msgid "Show cache statistics" msgstr "Zwischenspeicherstatistik zeigen" #: init/completions/apt-cache.fish:6 msgid "Show source package" msgstr "Quellpaket zeigen" #: init/completions/apt-cache.fish:7 msgid "Show packages in cache" msgstr "Pakete im Zwischenspeicher anzeigen" #: init/completions/apt-cache.fish:8 msgid "Print available list" msgstr "Verfügbare Liste anzeigen" #: init/completions/apt-cache.fish:9 msgid "List unmet dependencies in cache" msgstr "Nicht aufgelöste Abhängigkeiten im Zwischenspeicher zeigen" #: init/completions/apt-cache.fish:10 msgid "Display package record" msgstr "Paket-Satz zeigen" #: init/completions/apt-cache.fish:11 msgid "Search packagename by REGEX" msgstr "Paketname mittels regulärem Ausdruck suchen" #: init/completions/apt-cache.fish:12 msgid "Search full package name" msgstr "Vollständigen Paketnamen suchen" #: init/completions/apt-cache.fish:13 msgid "Search packagename only" msgstr "Nur Paketname suchen" #: init/completions/apt-cache.fish:14 msgid "List dependencies for the package" msgstr "Abhängigkeiten für dieses Paket anzeigen" #: init/completions/apt-cache.fish:15 msgid "List reverse dependencies for the package" msgstr "Umgekehrte Abhängigkeiten für das Paket anzeigen" #: init/completions/apt-cache.fish:16 msgid "Print package name by prefix" msgstr "" #: init/completions/apt-cache.fish:17 msgid "Generate dotty output for packages" msgstr "Punktierte Ausgabe für Pakete erzeugen" #: init/completions/apt-cache.fish:18 msgid "Debug preferences file" msgstr "Einstellungsdatei prüfen" #: init/completions/apt-cache.fish:19 msgid "Select file to store package cache" msgstr "Datei zum Speichern des Paketzwischenspeichers wählen" #: init/completions/apt-cache.fish:20 msgid "Select file to store source cache" msgstr "Datei zum Speichern des Quellenzwischenspeichers wählen" #: init/completions/apt-cache.fish:21 init/completions/apt-ftparchive.fish:10 #: init/completions/apt-get.fish:39 init/completions/configure.fish:3 #: init/completions/gpg.fish:130 init/completions/make.fish:23 #: init/completions/ping.fish:17 init/completions/rpm.fish:6 #: init/completions/ssh.fish:98 init/completions/valgrind.fish:27 #: init/completions/wget.fish:12 init/completions/zip.fish:13 msgid "Quiet mode" msgstr "Stiller Modus" #: init/completions/apt-cache.fish:22 msgid "Print important dependencies" msgstr "Wichtige Abhängigkeiten anzeigen" #: init/completions/apt-cache.fish:23 msgid "Print full records" msgstr "Vollständige Datensätze anzeigen" #: init/completions/apt-cache.fish:24 msgid "Auto-gen package cache" msgstr "" #: init/completions/apt-cache.fish:25 msgid "Print all names" msgstr "Alle Namen anzeigen" #: init/completions/apt-cache.fish:26 msgid "Dep and rdep recursive" msgstr "" #: init/completions/apt-cache.fish:27 msgid "Limit to installed" msgstr "" #: init/completions/apt-cache.fish:29 init/completions/apt-cdrom.fish:12 #: init/completions/apt-config.fish:6 msgid "Specify config file" msgstr "Konfigurationsdatei angeben" #: init/completions/apt-cache.fish:30 init/completions/apt-cdrom.fish:13 #: init/completions/apt-config.fish:7 #: init/completions/apt-extracttemplates.fish:6 #: init/completions/apt-zip-list.fish:10 msgid "Specify options" msgstr "Optionen angeben" #: init/completions/apt-cdrom.fish:3 msgid "Add new disc to source list" msgstr "Neue Platte zur Quellenliste hinzufügen" #: init/completions/apt-cdrom.fish:4 msgid "Report identity of disc" msgstr "Kennung der Platte anzeigen" #: init/completions/apt-cdrom.fish:5 init/completions/mount.fish:45 #: init/completions/umount.fish:13 msgid "Mount point" msgstr "Einhängepunkt" #: init/completions/apt-cdrom.fish:6 msgid "Rename a disc" msgstr "Eine Platte umbenennen" #: init/completions/apt-cdrom.fish:7 msgid "No mounting" msgstr "Nicht einhängen" #: init/completions/apt-cdrom.fish:8 msgid "Fast copy" msgstr "Schnelle Kopie" #: init/completions/apt-cdrom.fish:9 msgid "Thorough package scan" msgstr "Gründlicher Paket-Scan" #: init/completions/apt-cdrom.fish:10 msgid "No changes" msgstr "Keine Änderungen" #: init/completions/apt-config.fish:3 msgid "Access config file from shell" msgstr "Über die Shell auf Konfigurationsdatei zugreifen" #: init/completions/apt-config.fish:4 msgid "Dump contents of config file" msgstr "Inhalt der Konfigurationsdatei ausgeben" #: init/completions/apt-extracttemplates.fish:4 msgid "Set temp dir" msgstr "temp-Verzeichnis setzen" #: init/completions/apt-extracttemplates.fish:5 msgid "Specifiy config file" msgstr "Konfigurationsdatei angeben" #: init/completions/apt-file.fish:3 msgid "Resync package contents from source" msgstr "Paketinhalte aus der Quelle neu synchronisieren" #: init/completions/apt-file.fish:4 msgid "Search package containing pattern" msgstr "Paket entsprechend Muster suchen" #: init/completions/apt-file.fish:5 msgid "List contents of a package matching pattern" msgstr "Inhalte eines Paketes anzeigen, das dem Muster entspricht" #: init/completions/apt-file.fish:6 msgid "Remove all gz files from cache" msgstr "Alle gz-Dateien aus dem Zwischenspeicher entfernen" #: init/completions/apt-file.fish:7 msgid "Set cache dir" msgstr "Verzeichnis für Zwischenspeicher setzen" #: init/completions/apt-file.fish:9 msgid "Use cdrom-mount-point" msgstr "CDROM-Einhängepunkt verwenden" #: init/completions/apt-file.fish:10 init/completions/apt-file.fish:16 msgid "Do not expand pattern" msgstr "Muster nicht erweitern" #: init/completions/apt-file.fish:11 msgid "Pattern is regexp" msgstr "Muster ist ein regulärer Ausdruck" #: init/completions/apt-file.fish:13 msgid "Set arch" msgstr "Architektur setzen" #: init/completions/apt-file.fish:14 msgid "Set sources.list file" msgstr "sources.list-Datei angeben" #: init/completions/apt-file.fish:15 msgid "Only display package name" msgstr "Nur Paketnamen zeigen" #: init/completions/apt-file.fish:17 msgid "Run in dummy mode" msgstr "Im Dummy-Modus ausführen" #: init/completions/apt-ftparchive.fish:3 msgid "Generate package from source" msgstr "Paket aus Quelle generieren" #: init/completions/apt-ftparchive.fish:4 msgid "Generate source index file" msgstr "Quell-Indexdatei erstellen" #: init/completions/apt-ftparchive.fish:5 msgid "Generate contents file" msgstr "Inhaltsdatei erstellen" #: init/completions/apt-ftparchive.fish:6 msgid "Generate release file" msgstr "Veröffentlichungsdatei erstellen" #: init/completions/apt-ftparchive.fish:7 msgid "Remove records" msgstr "Sätze entfernen" #: init/completions/apt-ftparchive.fish:8 msgid "Generate MD5 sums" msgstr "MD5-Summen erstellen" #: init/completions/apt-ftparchive.fish:9 msgid "Use a binary db" msgstr "Eine Binärdatenbank benutzen" #: init/completions/apt-ftparchive.fish:11 msgid "Perform delinking" msgstr "" #: init/completions/apt-ftparchive.fish:12 msgid "Perform contents generation" msgstr "Inhaltsgenerierung durchführen" #: init/completions/apt-ftparchive.fish:13 msgid "Use source override" msgstr "" #: init/completions/apt-ftparchive.fish:14 msgid "Make caching db readonly" msgstr "Zwischenspeicher-Datenbank schreibschützen" #: init/completions/apt-ftparchive.fish:16 msgid "Use config file" msgstr "Konfigurationsdatei benutzen" #: init/completions/apt-ftparchive.fish:17 #: init/completions/apt-sortpkgs.fish:6 msgid "Set config options" msgstr "Konfigurationsoptionen setzen" #: init/completions/apt-get.fish:3 msgid "Test if apt has yet to be given the subcommand" msgstr "Test, ob an apt noch ein Unterbefehl gegeben werden muss" #: init/completions/apt-get.fish:12 msgid "Test if apt command should have packages as potential completion" msgstr "" #: init/completions/apt-get.fish:24 msgid "Update sources" msgstr "Quellen aktualisieren" #: init/completions/apt-get.fish:25 msgid "Upgrade or install newest packages" msgstr "Neueste Pakete aktualisieren oder installieren" #: init/completions/apt-get.fish:26 msgid "Use with dselect front-end" msgstr "Mit dselect-Oberfläche verwenden" #: init/completions/apt-get.fish:27 msgid "Distro upgrade" msgstr "Aktualisierung der Distribution" #: init/completions/apt-get.fish:28 msgid "Install one or more packages" msgstr "Ein oder mehrere Paket(e) installieren" #: init/completions/apt-get.fish:29 msgid "Remove one or more packages" msgstr "Ein oder mehrere Paket(e) entfernen" #: init/completions/apt-get.fish:30 msgid "Fetch source packages" msgstr "Quell-Pakete abrufen" #: init/completions/apt-get.fish:31 msgid "Install/remove packages for dependencies" msgstr "Pakete für Abhängigkeiten installieren/entfernen" #: init/completions/apt-get.fish:32 msgid "Update cache and check dependencies" msgstr "Zwischenspeicher aktualisieren und Abhängigkeiten prüfen" #: init/completions/apt-get.fish:33 msgid "Clean local caches and packages" msgstr "Lokalen Zwischenspeicher und Pakete bereinigen" #: init/completions/apt-get.fish:34 msgid "Clean packages no longer be downloaded" msgstr "" #: init/completions/apt-get.fish:35 msgid "Download Only" msgstr "Nur abrufen" #: init/completions/apt-get.fish:36 msgid "Correct broken dependencies" msgstr "Zerstörte Abhängigkeiten korrigieren" #: init/completions/apt-get.fish:37 msgid "Ignore missing packages" msgstr "Fehlende Pakete ignorieren" #: init/completions/apt-get.fish:38 msgid "Disable downloading packages" msgstr "Abruf von Paketen deaktivieren" #: init/completions/apt-get.fish:40 msgid "Perform a simulation" msgstr "Simulation durchführen" #: init/completions/apt-get.fish:41 msgid "Automatic yes to prompts" msgstr "Automatisch Ja für Abfragen verwenden" #: init/completions/apt-get.fish:42 msgid "Show upgraded packages" msgstr "Aktualisierte Pakete anzeigen" #: init/completions/apt-get.fish:43 msgid "Show full versions for packages" msgstr "Volle Versionen der Pakete anzeigen" #: init/completions/apt-get.fish:44 init/completions/apt-get.fish:45 msgid "Compile source packages" msgstr "Quell-Pakete kompilieren" #: init/completions/apt-get.fish:46 msgid "Ignore package Holds" msgstr "Gehaltene Pakete ignorieren" #: init/completions/apt-get.fish:47 msgid "Do not upgrade packages" msgstr "Pakete nicht aktualisieren" #: init/completions/apt-get.fish:48 msgid "Force yes" msgstr "Ja erzwingen" #: init/completions/apt-get.fish:49 msgid "Print the URIs" msgstr "URIs anzeigen" #: init/completions/apt-get.fish:51 msgid "Reinstall packages" msgstr "Pakete erneut installieren" #: init/completions/apt-get.fish:52 msgid "Erase obsolete files" msgstr "Veraltete Dateien löschen" #: init/completions/apt-get.fish:53 msgid "Control default input to the policy engine" msgstr "" #: init/completions/apt-get.fish:54 msgid "Only perform operations that are trivial" msgstr "Nur einfache Operationen durchführen" #: init/completions/apt-get.fish:55 msgid "Abort if any packages are to be removed" msgstr "Abbruch, falls irgendwelche Pakete entfernt würden" #: init/completions/apt-get.fish:56 msgid "Only accept source packages" msgstr "Nur Quell-Pakete akzeptieren" #: init/completions/apt-get.fish:57 msgid "Download only diff file" msgstr "Nur diff-Datei abrufen" #: init/completions/apt-get.fish:58 msgid "Download only tar file" msgstr "Nur tar-Datei abrufen" #: init/completions/apt-get.fish:59 msgid "Only process arch-dependant build-dependencies" msgstr "Nur architektur-abhängige Erstellungsabhängigkeiten verarbeiten" #: init/completions/apt-get.fish:60 msgid "Ignore non-authenticated packages" msgstr "Nicht authentifizierte Pakete ignorieren" #: init/completions/apt-get.fish:62 msgid "Specify a config file" msgstr "Konfigurationsdatei angeben" #: init/completions/apt-get.fish:63 msgid "Set a config option" msgstr "Konfigurationsoption setzen" #: init/completions/apt-key.fish:2 msgid "Add a new key" msgstr "Neuen Schlüssel hinzufügen" #: init/completions/apt-key.fish:3 msgid "Remove a key" msgstr "Schlüssel entfernen" #: init/completions/apt-key.fish:4 msgid "List trusted keys" msgstr "Vertraute Schlüssel anzeigen" #: init/completions/apt-listbugs.fish:3 msgid "Set severity" msgstr "Schwere setzen" #: init/completions/apt-listbugs.fish:4 msgid "Tags you want to see" msgstr "Markierungen, die Sie sehen möchten" #: init/completions/apt-listbugs.fish:5 msgid "Bug-status you want to see" msgstr "Bug-Status, die Sie sehen möchten" #: init/completions/apt-listbugs.fish:6 msgid "Ignore bugs in your system" msgstr "Fehler in Ihrem System ignorieren" #: init/completions/apt-listbugs.fish:7 msgid "Ignore newer bugs than upgrade packages" msgstr "" #: init/completions/apt-listbugs.fish:8 msgid "Bugs for downgrade packages" msgstr "" #: init/completions/apt-listbugs.fish:9 msgid "Bug Tracking system" msgstr "Bug-Verfolgungssystem" #: init/completions/apt-listbugs.fish:10 msgid "Specify port for web interface" msgstr "Port für Web-Oberfläche angeben" #: init/completions/apt-listbugs.fish:11 msgid "Use daily bug report" msgstr "Täglichen Fehlerbericht verwenden" #: init/completions/apt-listbugs.fish:12 msgid "Use the raw index.db" msgstr "Die rohe index.db verwenden" #: init/completions/apt-listbugs.fish:13 msgid "Specify index dir" msgstr "Index-Verzeichnis angeben" #: init/completions/apt-listbugs.fish:14 msgid "Specify Pin-Priority value" msgstr "" #: init/completions/apt-listbugs.fish:15 msgid "Specify the title of rss" msgstr "Titel für rss angeben" #: init/completions/apt-listbugs.fish:16 msgid "Retrieve fresh bugs" msgstr "Neue Bugs abrufen" #: init/completions/apt-listbugs.fish:17 init/completions/scp.fish:32 msgid "Do not display progress bar" msgstr "Keinen Verlaufsbalken anzeigen" #: init/completions/apt-listbugs.fish:18 msgid "Specify local cache dir" msgstr "Verzeichnis für lokalen Zwischenspeicher" #: init/completions/apt-listbugs.fish:19 msgid "Specify the expire cache timer" msgstr "Zeitablauf für Zwischenspeicher angeben" #: init/completions/apt-listbugs.fish:20 msgid "Specify apt config file" msgstr "apt-Konfigurationsdatei angeben" #: init/completions/apt-listbugs.fish:22 msgid "Assume no to all questions" msgstr "Für alle Fragen nein annehmen" #: init/completions/apt-listbugs.fish:23 msgid "List bugs from packages" msgstr "Fehler aus Paketen anzeigen" #: init/completions/apt-listbugs.fish:24 msgid "List bugs in rss format" msgstr "Fehler (bugs) im rss-Format anzeigen" #: init/completions/apt-listchanges.fish:3 msgid "Read filenames from pipe" msgstr "Dateinamen über Pipe lesen" #: init/completions/apt-listchanges.fish:5 msgid "Select fronend interface" msgstr "Benutzerschnittstelle auswählen" #: init/completions/apt-listchanges.fish:6 init/completions/darcs.fish:178 msgid "Specify email address" msgstr "Email-Adresse angeben" #: init/completions/apt-listchanges.fish:7 msgid "Ask confirmation" msgstr "Bestätigung erfragen" #: init/completions/apt-listchanges.fish:8 msgid "Display all changelogs" msgstr "Alle Änderungsdateien anzeigen" #: init/completions/apt-listchanges.fish:9 msgid "Avoid changelogs from db in named file" msgstr "" #: init/completions/apt-listchanges.fish:10 msgid "Select display" msgstr "Grafik-Anzeige auswählen" #: init/completions/apt-listchanges.fish:11 msgid "Insert header" msgstr "Header einfügen" #: init/completions/apt-listchanges.fish:12 init/completions/ps.fish:36 msgid "Display debug info" msgstr "Debug-Informationen anzeigen" #: init/completions/apt-listchanges.fish:13 msgid "Select an option profile" msgstr "Options-Profil auswählen" #: init/completions/apt-move.fish:2 msgid "Generate master file" msgstr "Masterdatei erstellen" #: init/completions/apt-move.fish:3 msgid "Alias for 'get'" msgstr "Alias für 'get'" #: init/completions/apt-move.fish:4 msgid "Move packages to local tree" msgstr "Pakete in lokalen Verzeichnisbaum verschieben" #: init/completions/apt-move.fish:5 msgid "Delete obsolete package files" msgstr "Veraltete Paketdateien löschen" #: init/completions/apt-move.fish:6 msgid "Build new local files" msgstr "Neue lokale Dateien erstellen" #: init/completions/apt-move.fish:7 msgid "Rebuild index files" msgstr "Indexdateien neu erstellen" #: init/completions/apt-move.fish:8 msgid "Move packages from cache to local mirror" msgstr "Pakete aus Zwischenspeicher auf lokalen Spiegelserver verschieben" #: init/completions/apt-move.fish:9 msgid "Alias for 'move delete packages'" msgstr "" "Alias für 'move delete packages' " "'" #: init/completions/apt-move.fish:10 msgid "Alias for 'update'" msgstr "Alias für 'update'" #: init/completions/apt-move.fish:11 msgid "Download package missing from mirror" msgstr "Fehlende Pakete vom Spiegelserver abrufen" #: init/completions/apt-move.fish:12 msgid "Sync packages installed" msgstr "Installierte Pakete synchronisieren" #: init/completions/apt-move.fish:14 msgid "Move file specified on commandline" msgstr "Die auf der Befehlszeile angegebene Datei verschieben" #: init/completions/apt-move.fish:15 msgid "List packags that may serve as input to mirrorbin or mirrorsource" msgstr "Pakete anzeigen, die als Quelle für mirrorbin oder mirrorsource dienen können" #: init/completions/apt-move.fish:16 msgid "Fetch package from STDIN" msgstr "Paket über Standardeingabe lesen" #: init/completions/apt-move.fish:17 msgid "Fetch source package from STDIN" msgstr "Quell-Paket über Standardeingabe lesen" #: init/completions/apt-move.fish:18 msgid "Process all packages" msgstr "Alle Pakete verarbeiten" #: init/completions/apt-move.fish:19 msgid "Use specific conffile" msgstr "Angegebene Konfigurationsdatei benutzen" #: init/completions/apt-move.fish:20 msgid "Force deletion" msgstr "Löschung erzwingen" #: init/completions/apt-move.fish:21 msgid "Suppresses normal output" msgstr "Normale Ausgabe unterdrücken" #: init/completions/apt-move.fish:22 msgid "Test run" msgstr "Testdurchlauf" #: init/completions/apt-proxy-import.fish:5 msgid "No message to STDOUT" msgstr "Keine Meldungen auf Standardausgabe" #: init/completions/apt-proxy-import.fish:6 msgid "Recurse into subdir" msgstr "in Unterverzeichnis verzweigen" #: init/completions/apt-proxy-import.fish:7 msgid "Dir to import" msgstr "Zu importierendes Verzeichnis" #: init/completions/apt-proxy-import.fish:8 msgid "Change to user" msgstr "Wechsel zu Anwender" #: init/completions/apt-proxy-import.fish:9 msgid "Debug level[default 0]" msgstr "Debug-Grad [Standard 0]" #: init/completions/apt-rdepends.fish:3 msgid "Show bulid dependencies" msgstr "Erstellungs-Abhängigkeiten anzeigen" #: init/completions/apt-rdepends.fish:4 msgid "Generate a dotty graph" msgstr "Gepunkteten Graph generieren" #: init/completions/apt-rdepends.fish:5 msgid "Show state of dependencies" msgstr "Status der Abhängigkeiten anzeigen" #: init/completions/apt-rdepends.fish:6 msgid "List packages depending on" msgstr "Pakete anzeigen, die abhängen von " #: init/completions/apt-rdepends.fish:7 msgid "Comma-separated list of dependancy types to follow recursively" msgstr "Komma-getrennte Liste der Abhängigkeitstypen, die rekursiv abgearbeitet werden" #: init/completions/apt-rdepends.fish:8 msgid "Comma-separated list of dependancy types to show" msgstr "Komma-getrennte Liste zu zeigender Abhängigkeitstypen" #: init/completions/apt-rdepends.fish:9 msgid "Comma-separated list of package installation states to follow recursively" msgstr "Komma-getrennte Liste von Paket-Installations-Status, die rekursiv verarbeitet werden" #: init/completions/apt-rdepends.fish:10 msgid "Comma-separated list of package installation states to show" msgstr "Komma-getrennte Liste von Paket-Installations-Status, die angezeigt werden sollen" #: init/completions/apt-rdepends.fish:11 msgid "Display man page" msgstr "Handbuchseite anzeigen" #: init/completions/apt-setup.fish:2 msgid "Probe a CD" msgstr "Eine CD testen" #: init/completions/apt-setup.fish:3 msgid "Run in noninteractive mode" msgstr "Im nicht interaktiven Modus ausführen" #: init/completions/apt-show-source.fish:3 #: init/completions/apt-show-source.fish:4 #: init/completions/apt-show-versions.fish:10 #: init/completions/apt-show-versions.fish:11 msgid "Read package from file" msgstr "Paket aus Datei lesen" #: init/completions/apt-show-source.fish:5 #: init/completions/apt-show-source.fish:6 #: init/completions/apt-show-versions.fish:12 #: init/completions/apt-show-versions.fish:13 msgid "Specify APT list dir" msgstr "APT-Listenverzeichnis angeben" #: init/completions/apt-show-source.fish:7 msgid "List PKG info" msgstr "PKG-Information anzeigen" #: init/completions/apt-show-source.fish:9 msgid "Print all source packages with version" msgstr "Alle Quell-Pakete mit Version anzeigen" #: init/completions/apt-show-versions.fish:3 msgid "Print PKG versions" msgstr "PKG-Versionen anzeigen" #: init/completions/apt-show-versions.fish:4 msgid "Using regex" msgstr "Regulären Ausdruck benutzen" #: init/completions/apt-show-versions.fish:5 msgid "Print only upgradeable packages" msgstr "Nur aktualisierbare Pakete anzeigen" #: init/completions/apt-show-versions.fish:6 msgid "Print all versions" msgstr "Alle Versionen anzeigen" #: init/completions/apt-show-versions.fish:7 msgid "Print package name/distro" msgstr "Paketname/Distribution anzeigen" #: init/completions/apt-show-versions.fish:8 msgid "Print verbose info" msgstr "Ausführliche Informationen anzeigen" #: init/completions/apt-show-versions.fish:9 msgid "Init or update cache only" msgstr "Nur Zwischenspeicher initialisieren oder aktualisieren" #: init/completions/apt-sortpkgs.fish:3 msgid "Use source index field" msgstr "Indexfeld der Quelle verwenden" #: init/completions/apt-sortpkgs.fish:5 msgid "Specify conffile" msgstr "Konfigurationsdatei angeben" #: init/completions/apt-spy.fish:3 msgid "Debian distribtion" msgstr "Debian-Distribution" #: init/completions/apt-spy.fish:4 msgid "Servers in the areas" msgstr "Server in diesem Bereich" #: init/completions/apt-spy.fish:5 msgid "Conf file" msgstr "Konfigurationsdatei" #: init/completions/apt-spy.fish:6 msgid "Finish after number of servers" msgstr "Nach Anzahl Server beenden" #: init/completions/apt-spy.fish:7 msgid "File to grab servers" msgstr "" #: init/completions/apt-spy.fish:8 msgid "File as input" msgstr "Datei als Eingabe verwenden" #: init/completions/apt-spy.fish:9 msgid "Mirror-list file" msgstr "Datei mit Spiegelliste" #: init/completions/apt-spy.fish:10 msgid "Output sources.list file" msgstr "sources.list-Datei ausgeben" #: init/completions/apt-spy.fish:11 msgid "Use proxy server" msgstr "Proxy-Server verwenden" #: init/completions/apt-spy.fish:12 msgid "Comma separated country list" msgstr "Komma-getrennte Länderliste" #: init/completions/apt-spy.fish:13 msgid "How long in sec to download" msgstr "Dauer des Abrufs in Sekunden" #: init/completions/apt-spy.fish:14 msgid "Custom URL to get mirror list" msgstr "Angepasste URL zum Abruf der Spiegel-Liste" #: init/completions/apt-spy.fish:15 msgid "Write top servers to file" msgstr "Top-Server in Datei schreiben" #: init/completions/apt-spy.fish:16 msgid "Number of top servers" msgstr "Anzahl der Top-Server" #: init/completions/apt-spy.fish:17 msgid "Update mirror list" msgstr "Spiegel-Liste aktualisieren" #: init/completions/apt-spy.fish:18 msgid "Version number" msgstr "Versionsnummer" #: init/completions/apt-src.fish:3 msgid "Update list of source packages" msgstr "Liste der Quell-Pakete aktualisieren" #: init/completions/apt-src.fish:4 msgid "Install source packages" msgstr "Quell-Pakete installieren" #: init/completions/apt-src.fish:5 msgid "Upgrade source packages" msgstr "Quell-Pakete aktualisieren" #: init/completions/apt-src.fish:6 msgid "Remove source packages" msgstr "Quell-Pakete entfernen" #: init/completions/apt-src.fish:7 init/completions/apt-src.fish:14 msgid "Build source packages" msgstr "Quell-Pakete erstellen" #: init/completions/apt-src.fish:8 msgid "Clean source packages" msgstr "Quellpakete bereinigen" #: init/completions/apt-src.fish:9 msgid "Detect known source tree" msgstr "Bekannte Quellbäume entdecken" #: init/completions/apt-src.fish:10 msgid "List installed source package\\(s\\)" msgstr "Installierte(s) Quellpaket(e) anzeigen" #: init/completions/apt-src.fish:11 msgid "Root source tree" msgstr "Ursprung des Quellbaumes" #: init/completions/apt-src.fish:12 msgid "Version of source package" msgstr "Version des Quell-Paketes" #: init/completions/apt-src.fish:13 msgid "Name of the source package" msgstr "Name des Quell-Paketes" #: init/completions/apt-src.fish:15 msgid "Install after build" msgstr "Nach Erstellung installieren" #: init/completions/apt-src.fish:16 msgid "Patch local changes" msgstr "Lokale Änderungen patchen" #: init/completions/apt-src.fish:17 msgid "Specify a dir" msgstr "Verzeichnis angeben" #: init/completions/apt-src.fish:18 msgid "Run on current dir" msgstr "Im aktuellen Verzeichnis starten" #: init/completions/apt-src.fish:19 msgid "Omit debian version" msgstr "Debian-Version auslassen" #: init/completions/apt-src.fish:20 msgid "Do not del built files" msgstr "Erstellte Dateien nicht löschen" #: init/completions/apt-src.fish:21 msgid "Do not del source files" msgstr "Quelldateien nicht löschen" #: init/completions/apt-src.fish:22 msgid "Source tree version" msgstr "Version des Quellenbaumes" #: init/completions/apt-src.fish:23 msgid "Output to /dev/null" msgstr "Ausgabe nach /dev/null" #: init/completions/apt-src.fish:24 msgid "Output trace" msgstr "Ausgabe-Verfolgung" #: init/completions/apt-zip-inst.fish:4 init/completions/apt-zip-list.fish:4 msgid "Removable medium" msgstr "Wechselbares Medium" #: init/completions/apt-zip-inst.fish:5 init/completions/apt-zip-list.fish:5 msgid "Select an action" msgstr "Eine Aktion wählen" #: init/completions/apt-zip-inst.fish:6 init/completions/apt-zip-list.fish:6 msgid "List of packages to install" msgstr "Liste zu installierender Pakete" #: init/completions/apt-zip-inst.fish:7 init/completions/apt-zip-list.fish:7 msgid "Fix broken option" msgstr "Kaputte Option bereinigen" #: init/completions/apt-zip-inst.fish:8 init/completions/apt-zip-list.fish:8 msgid "Specify a non-mountpoint dir" msgstr "Verzeichnis angeben, das kein Einhäng-Verzeichnis ist" #: init/completions/apt-zip-list.fish:9 msgid "Select a method" msgstr "Eine Methode auswählen" #: init/completions/apt-zip-list.fish:11 msgid "Accept protocols" msgstr "Zu akzeptierende Protokolle" #: init/completions/apt-zip-list.fish:12 msgid "Reject protocols" msgstr "Abzulehnende Protokolle" #: init/completions/arp.fish:3 msgid "Numerical address" msgstr "Numerische Adresse" #: init/completions/arp.fish:4 msgid "Class of hw type" msgstr "Klasse des Hardware-Typs" #: init/completions/arp.fish:5 msgid "Show arp entries" msgstr "Arp-Einträge anzeigen" #: init/completions/arp.fish:6 msgid "Remove an entry for hostname" msgstr "Eintrag für Hostname entfernen" #: init/completions/arp.fish:7 msgid "Use hardware address" msgstr "Hardware-Adresse verwenden" #: init/completions/arp.fish:8 msgid "Select interface" msgstr "Schnittstelle wählen" #: init/completions/arp.fish:9 msgid "Manually create ARP address" msgstr "ARP-Adresse manuell erzeugen" #: init/completions/arp.fish:10 msgid "Take addr from filename, default /etc/ethers" msgstr "Adresse aus Dateiname entnehmen, Standard /etc/ethers" #: init/completions/atd.fish:2 msgid "Limiting load factor" msgstr "" #: init/completions/atd.fish:3 msgid "Minimum interval in seconds" msgstr "Minimal-Intervall in Sekunden" #: init/completions/atd.fish:4 init/completions/make.fish:11 msgid "Debug mode" msgstr "Debug-Modus" #: init/completions/atd.fish:5 msgid "Process at queue only once" msgstr "at-Queue nur einmal verarbeiten" #: init/completions/at.fish:3 init/completions/atq.fish:3 msgid "Use specified queue" msgstr "Angegebene Queue benutzen" #: init/completions/at.fish:4 msgid "Send mail to user" msgstr "Mail an Anwender senden" #: init/completions/at.fish:5 msgid "Read job from file" msgstr "Job aus Datei lesen" #: init/completions/at.fish:6 msgid "Alias for atq" msgstr "Alias für atq" #: init/completions/at.fish:7 msgid "Alias for atrm" msgstr "Alias für atrm" #: init/completions/at.fish:8 msgid "Show the time" msgstr "Zeige Zeit" #: init/completions/at.fish:9 msgid "Print the jobs listed" msgstr "Aufgelistete Jobs anzeigen" #: init/completions/bc.fish:3 msgid "Force interactive mode" msgstr "Interaktiven Modus erzwingen" #: init/completions/bc.fish:4 msgid "Define math library" msgstr "Mathematik-Bibliothek definieren" #: init/completions/bc.fish:5 msgid "Give warnings for extensions to POSIX bc" msgstr "Bei Erweiterungen zu POSIX bc Warnungen ausgeben" #: init/completions/bc.fish:6 msgid "Process exactly POSIX bc" msgstr "" #: init/completions/bc.fish:7 msgid "Do not print the GNU welcome" msgstr "GNU welcome-Meldung nicht anzeigen" #: init/completions/btdownloadheadless.py.fish:4 msgid "Maximum uploads at once" msgstr "Maximale gleichzeitige Übertragungen" #: init/completions/btdownloadheadless.py.fish:5 msgid "Number of seconds between keepalives" msgstr "Anzahl Sekunden zwischen Meldungen zur Aufrechterhaltung der Verbindung" #: init/completions/btdownloadheadless.py.fish:6 msgid "Bytes per request" msgstr "Bytes per Anforderung" #: init/completions/btdownloadheadless.py.fish:7 msgid "Requests per pipe" msgstr "Anforderungen per Pipe" #: init/completions/btdownloadheadless.py.fish:8 msgid "Maximum length prefix encoding" msgstr "" #: init/completions/btdownloadheadless.py.fish:9 msgid "IP to report to the tracker" msgstr "An den Tracker zu sendende IP-Adresse" #: init/completions/btdownloadheadless.py.fish:10 msgid "Minimum port to listen to" msgstr "Niedrigster Port, an dem gelauscht wird" #: init/completions/btdownloadheadless.py.fish:11 msgid "Maximum port to listen to" msgstr "Höchster Port, an dem gelauscht wird" #: init/completions/btdownloadheadless.py.fish:12 msgid "File for server response" msgstr "Datei für Serverantworten" #: init/completions/btdownloadheadless.py.fish:13 msgid "URL to get file from" msgstr "URL zum Dateiabruf" #: init/completions/btdownloadheadless.py.fish:14 msgid "Local file target" msgstr "Target für lokale Datei" #: init/completions/btdownloadheadless.py.fish:15 msgid "Time to close inactive socket" msgstr "Zeit zum Schliessen inaktiver Sockets" #: init/completions/btdownloadheadless.py.fish:16 msgid "Time between checking timeouts" msgstr "Zeit zwischen Zeitablauf-Überprüfung" #: init/completions/btdownloadheadless.py.fish:17 msgid "Maximum outgoing slice length" msgstr "" #: init/completions/btdownloadheadless.py.fish:18 msgid "Maximum time to guess rate" msgstr "" #: init/completions/btdownloadheadless.py.fish:19 msgid "IP to bind to locally" msgstr "Lokal zu bindende IP-Adresse" #: init/completions/btdownloadheadless.py.fish:20 msgid "Time between screen updates" msgstr "Zeit zwischen Bildschirmaktualisierungen" #: init/completions/btdownloadheadless.py.fish:21 msgid "Time to wait between requesting more peers" msgstr "" #: init/completions/btdownloadheadless.py.fish:22 msgid "Minimum number of peers to not do requesting" msgstr "" #: init/completions/btdownloadheadless.py.fish:23 msgid "Number of seconds before assuming http timeout" msgstr "Anzahl Sekunden, bevor ein http-Zeitablauf vermutet wird" #: init/completions/btdownloadheadless.py.fish:24 msgid "Number of peers at which to stop initiating new connections" msgstr "" #: init/completions/btdownloadheadless.py.fish:25 msgid "Maximum number of connections to allow" msgstr "erlaubte Anzahl maximaler Verbindungen" #: init/completions/btdownloadheadless.py.fish:26 msgid "Whether to check hashes on disk" msgstr "Hashes auf der Platte prüfen" #: init/completions/btdownloadheadless.py.fish:27 msgid "Maximum kB/s to upload at" msgstr "Maximale Upload-Geschwindigkeit in kB/s" #: init/completions/btdownloadheadless.py.fish:28 msgid "Seconds to wait for data to come in before assuming choking" msgstr "" #: init/completions/btdownloadheadless.py.fish:29 msgid "Whether to display diagnostic info" msgstr "Sollen diagnostische Informationen angezeigt werden" #: init/completions/btdownloadheadless.py.fish:30 msgid "Number of downloads at which to switch from random to rarest first" msgstr "" #: init/completions/btdownloadheadless.py.fish:31 msgid "Number of uploads to fill out to with optimistic unchokes" msgstr "" #: init/completions/btdownloadheadless.py.fish:32 msgid "Whether to inform the user that hash failures occur" msgstr "" #: init/completions/bunzip2.fish:9 msgid "Decompress to stdout" msgstr "Auf Standardausgabe entkomprimieren" #: init/completions/bunzip2.fish:10 init/completions/bzip2.fish:11 #: init/completions/gunzip.fish:7 init/completions/gzip.fish:9 #: init/completions/zcat.fish:6 msgid "Overwrite" msgstr "Überschreiben" #: init/completions/bunzip2.fish:11 init/completions/bzip2.fish:12 msgid "Do not overwrite" msgstr "Nicht überschreiben" #: init/completions/bunzip2.fish:12 init/completions/bzcat.fish:8 #: init/completions/bzip2.fish:13 msgid "Reduce memory usage" msgstr "Speicherbedarf reduzieren" #: init/completions/bunzip2.fish:13 init/completions/bzip2.fish:15 msgid "Print compression ratios" msgstr "Komprimierungsratio anzeigen" #: init/completions/bunzip2.fish:14 init/completions/bzip2.fish:16 #: init/completions/gunzip.fish:10 init/completions/gzip.fish:12 #: init/completions/zcat.fish:8 msgid "Print license" msgstr "Lizenz ausgeben" #: init/completions/bzip2.fish:1 init/completions/gunzip.fish:1 #: init/completions/gzip.fish:1 msgid "Compress to stdout" msgstr "Auf Standardausgabe komprimieren" #: init/completions/bzip2.fish:9 msgid "Compress file" msgstr "Datei komprimieren" #: init/completions/bzip2.fish:10 init/completions/gunzip.fish:16 #: init/completions/gzip.fish:18 msgid "Check integrity" msgstr "Integrität prüfen" #: init/completions/bzip2.fish:14 init/completions/chgrp.fish:6 #: init/completions/chown.fish:5 msgid "Supress errors" msgstr "Fehler unterdrücken" #: init/completions/bzip2.fish:18 msgid "Small block size" msgstr "Kleine Blockgrösse" #: init/completions/bzip2.fish:19 msgid "Large block size" msgstr "Grosse Blockgrösse" #: init/completions/cat.fish:1 msgid "Escape all non-printing characters" msgstr "Alle nicht druckbaren Zeichen maskieren" #: init/completions/cat.fish:2 msgid "Number nonblank lines" msgstr "Nicht-leere Zeilen nummerieren" #: init/completions/cat.fish:3 msgid "Escape non-printing characters except tab" msgstr "Nicht druckbare Zeichen ausser Tabulator maskieren" #: init/completions/cat.fish:4 msgid "Display $ at end of line" msgstr "$ am Zeilenende anzeigen" #: init/completions/cat.fish:5 msgid "Number all lines" msgstr "Alle Zeilen nummerieren" #: init/completions/cat.fish:6 msgid "Never more than single blank line" msgstr "Nicht mehr als eine leere Zeile" #: init/completions/cat.fish:7 msgid "Escape non-printing characters except newline" msgstr "Nicht druckbare Zeichen ausser Neuer-Zeile maskieren" #: init/completions/cat.fish:8 msgid "Escape tab" msgstr "Tabulator maskieren" #: init/completions/cat.fish:9 msgid "Escape non-printing except newline and tab" msgstr "Nicht druckbare Zeichen ausser Neuer-Zeile und Tabulator maskieren" #: init/completions/chgrp.fish:2 init/completions/chown.fish:1 msgid "Output diagnostic for changed files" msgstr "Informationen über geänderte Dateien ausgeben" #: init/completions/chgrp.fish:3 init/completions/chown.fish:2 msgid "Dereferense symbolic links" msgstr "Symbolische Verweise dereferenzieren" #: init/completions/chgrp.fish:4 init/completions/chown.fish:3 msgid "Do not dereference symbolic links" msgstr "Symbolische Verweise nicht dereferenzieren" #: init/completions/chgrp.fish:5 init/completions/chown.fish:4 msgid "Change from owner/group" msgstr "Von Eigner/Gruppe wechseln" #: init/completions/chgrp.fish:7 init/completions/chown.fish:6 msgid "Use same owner/group as file" msgstr "Eigner/Gruppe wie Datei verwenden" #: init/completions/chgrp.fish:8 init/completions/chown.fish:7 #: init/completions/zip.fish:6 msgid "Operate recursively" msgstr "Rekursiv arbeiten" #: init/completions/chgrp.fish:9 init/completions/chown.fish:8 msgid "Output diagnostic for every file" msgstr "Informationen zu jeder Datei ausgeben" #: init/completions/chown.fish:11 init/completions/chown.fish:12 #: init/completions/w.fish:6 msgid "Username" msgstr "Anwendername" #: init/completions/commandline.fish:1 msgid "Add text to the end of the selected area" msgstr "Text am Ende des selektierten Bereichs anfügen" #: init/completions/commandline.fish:2 msgid "Add text at cursor" msgstr "Text an Cursor-Position hinzufügen" #: init/completions/commandline.fish:3 msgid "Replace selected part" msgstr "selektierten Bereich ersetzen" #: init/completions/commandline.fish:5 msgid "Select job under cursor" msgstr "Job unter Curser selektieren" #: init/completions/commandline.fish:6 msgid "Select process under cursor" msgstr "Prozess unter Cursor selektieren" #: init/completions/commandline.fish:7 msgid "Select token under cursor" msgstr "Token unter dem Cursor selektieren" #: init/completions/commandline.fish:8 msgid "Select entire command line (default)" msgstr "Vollständige Befehlszeile selektieren (Standard)" #: init/completions/commandline.fish:10 msgid "Only return that part of the command line before the cursor" msgstr "Nur Teil der Befehlszeile vor dem Curser zurückgeben" #: init/completions/commandline.fish:11 msgid "Inject readline functions to reader" msgstr "" #: init/completions/complete.fish:1 msgid "Command to add completion to" msgstr "Befehl, bei dem Vervollständigung genutzt werden soll" #: init/completions/complete.fish:2 msgid "Path to add completion to" msgstr "Pfad, bei dem Vervollständigung berücksichtigt werden soll" #: init/completions/complete.fish:3 msgid "Posix-style option to complete" msgstr "zu vervollständigende Option im Posix-Format" #: init/completions/complete.fish:4 msgid "GNU-style option to complete" msgstr "zu vervollständigende Option im GNU-Format" #: init/completions/complete.fish:5 msgid "Old style long option to complete" msgstr "zu vervollständigende lange Option im alten Format" #: init/completions/complete.fish:6 msgid "Do not use file completion" msgstr "Keine Dateinamenvervollständigung benutzen" #: init/completions/complete.fish:7 msgid "Require parameter" msgstr "Parameter anfordern" #: init/completions/complete.fish:8 msgid "Require parameter and do not use file completion" msgstr "Parameter anfordern und keine Dateivervollständigung verwenden" #: init/completions/complete.fish:9 msgid "A list of possible arguments" msgstr "Eine Liste möglicher Argumente" #: init/completions/complete.fish:10 msgid "Description of this completions" msgstr "Beschreibung dieser Vervollständigung" #: init/completions/complete.fish:11 msgid "Option list is not complete" msgstr "Optionsliste ist nicht vollständig" #: init/completions/complete.fish:12 msgid "Remove completion" msgstr "Vervollständigung entfernen" #: init/completions/configure.fish:4 msgid "Cache test results in specified file" msgstr "Testergebnisse in angegebener Datei zwischenspeichern" #: init/completions/configure.fish:5 msgid "Cache test results in file config.cache" msgstr "Testergebnisse in Datei config.cache zwischenspeichern" #: init/completions/configure.fish:6 msgid "Do not create output files" msgstr "Keine Ausgabedateien erstellen" #: init/completions/configure.fish:7 msgid "Set source directory" msgstr "Quellverzeichnis eintragen" #: init/completions/configure.fish:8 msgid "Architecture-independent install directory" msgstr "Architekturunabhängiges Installationsverzeichnis" #: init/completions/configure.fish:9 msgid "Architecture-dependent install directory" msgstr "Architekturabhängiges Installationsverzeichnis" #: init/completions/configure.fish:10 msgid "Configure for building on BUILD" msgstr "Konfiguration für das Erstellen auf BUILD" #: init/completions/configure.fish:11 msgid "Cross-compile to build programs to run on HOST" msgstr "Cross-Compilierung zur Programmerstellung für RECHNER" #: init/completions/configure.fish:12 msgid "Configure for building compilers for TARGET" msgstr "Konfiguration zur Compiler-Erstellung für TARGET" #: init/completions/cut.fish:1 msgid "Ouput byte range" msgstr "Bytebereich ausgeben" #: init/completions/cut.fish:2 msgid "Output character range" msgstr "Zeichenbereich ausgeben" #: init/completions/cut.fish:3 msgid "Select field delimiter" msgstr "Feldbegrenzer wählen" #: init/completions/cut.fish:4 msgid "Select fields" msgstr "Felder wählen" #: init/completions/cut.fish:5 msgid "Dont split mutibyte characters" msgstr "Multibyte-Zeichen nicht trennen" #: init/completions/cut.fish:6 msgid "Do not print lines without delimiter" msgstr "Zeilen nicht ohne Begrenzer ausgeben" #: init/completions/cut.fish:7 msgid "Select output delimiter" msgstr "Ausgabebegrenzer setzen" #: init/completions/cvs.fish:5 msgid "Add a new file/directory to the repository" msgstr "Neue/s Datei/Verzeichnis zum Paketdepot hinzufügen" #: init/completions/cvs.fish:6 msgid "Administration front end for rcs" msgstr "Administrationsoberfläche für rcs" #: init/completions/cvs.fish:7 msgid "Show last revision where each line was modified" msgstr "Letzte Revision zeigen, bei der jede Zeile verändert wurde" #: init/completions/cvs.fish:8 msgid "Checkout sources for editing" msgstr "Quellen zum Editieren auschecken" #: init/completions/cvs.fish:9 msgid "Check files into the repository" msgstr "Dateien in das Paketdepot übertragen" #: init/completions/cvs.fish:10 msgid "Show differences between revisions" msgstr "Unterschiede zwischen Revisionen zeigen" #: init/completions/cvs.fish:11 msgid "Get ready to edit a watched file" msgstr "Vorbereitung zum Editieren einer beobachteten Datei" #: init/completions/cvs.fish:12 msgid "See who is editing a watched file" msgstr "Anzeigen, von wem eine beobachtete Datei editiert wird" #: init/completions/cvs.fish:13 msgid "Export sources from CVS, similar to checkout" msgstr "Quellen aus CVS exportieren, ähnelt checkout" #: init/completions/cvs.fish:14 msgid "Show repository access history" msgstr "Zugriffsverlauf des Paketdepots zeigen" #: init/completions/cvs.fish:15 msgid "Import sources into CVS, using vendor branches" msgstr "" #: init/completions/cvs.fish:16 msgid "Create a CVS repository if it doesnt exist" msgstr "CVS-Paketdepot erstellen, wenn es nicht existiert" #: init/completions/cvs.fish:17 msgid "Kerberos server mode" msgstr "Kerberos-Servermodus" #: init/completions/cvs.fish:18 msgid "Print out history information for files" msgstr "Verlaufsinformationen für Dateien ausgeben" #: init/completions/cvs.fish:19 msgid "Prompt for password for authenticating server" msgstr "Abfrage des Passworts für den Authentifizierungsserver" #: init/completions/cvs.fish:20 msgid "Removes entry in .cvspass for remote repository" msgstr "Einträge in .cvspass für entferntes Paketdepot entfernen" #: init/completions/cvs.fish:21 msgid "Password server mode" msgstr "Passwort für Server-Modus" #: init/completions/cvs.fish:22 msgid "Show last revision where each line of module was modified" msgstr "Zeige letzte Revision, bei der jede Modulzeile verändert wurde" #: init/completions/cvs.fish:23 msgid "Create patch format diffs between releases" msgstr "Erstelle Diffs zwischen Veröffentlichungen im Patch-Format" #: init/completions/cvs.fish:24 msgid "Indicate that a Module is no longer in use" msgstr "Anzeigen, das ein Modul nicht mehr benutzt wird" #: init/completions/cvs.fish:25 msgid "Remove an entry from the repository" msgstr "Einen Eintrag aus dem Paketdepot entfernen" #: init/completions/cvs.fish:26 msgid "Print out history information for a module" msgstr "Verlaufs-Informationen für ein Modul ausgeben" #: init/completions/cvs.fish:27 msgid "Add a symbolic tag to a module" msgstr "Einem Modul eine symbolische Markierung hinzufügen" #: init/completions/cvs.fish:28 msgid "Server mode" msgstr "Server-Modus" #: init/completions/cvs.fish:29 msgid "Display status information on checked out files" msgstr "Statusinformationen zu ausgecheckten Dateien anzeigen" #: init/completions/cvs.fish:30 msgid "Add a symbolic tag to checked out version of files" msgstr "Der Version von ausgecheckten Dateien eine symbolische Markierung hinzufügen" #: init/completions/cvs.fish:31 msgid "Undo an edit command" msgstr "Edit-Befehl rückgängig machen" #: init/completions/cvs.fish:32 msgid "Bring work tree in sync with repository" msgstr "Arbeitsbaum mit Paketdepot synchronisieren" #: init/completions/cvs.fish:34 msgid "Set watches" msgstr "Datei-Beobachtungen einstellen" #: init/completions/cvs.fish:35 msgid "See who is watching a file" msgstr "Anzeigen, wer eine Datei beobachtet" #: init/completions/cvs.fish:37 msgid "Displays usage information for command" msgstr "Zeigt Benutzungsinformation für den Befehl" #: init/completions/cvs.fish:38 msgid "Cause CVS to be really quiet" msgstr "Veranlasst CVS, wirklich still zu sein" #: init/completions/cvs.fish:39 msgid "Cause CVS to be somewhat quiet" msgstr "Veranlasst CVS, etwas stiller zu sein" #: init/completions/cvs.fish:40 msgid "Make checked-out files read-only" msgstr "Ausgecheckte Dateien mit Schreibschutz versehen" #: init/completions/cvs.fish:41 msgid "Make checked-out files read-write (default)" msgstr "Ausgecheckte Dateien beschreibbar machen (Standard)" #: init/completions/cvs.fish:42 msgid "Do not execute anything that will change the disk" msgstr "Nichts ausführen, was Änderungen auf die Platte schreibt" #: init/completions/cvs.fish:43 msgid "Show trace of program execution -- try with -n" msgstr "Programmablauf anzeigen -- versuchen Sie -n" #: init/completions/cvs.fish:45 msgid "Use tmpdir for temporary files" msgstr "tmpdir für temporäre Dateien benutzen" #: init/completions/cvs.fish:46 msgid "Use editor for editing log information" msgstr "Editor zum Editieren der Log-Information verwenden" #: init/completions/cvs.fish:48 msgid "Do not use the ~/.cvsrc file" msgstr "~/.cvsrc-Datei nicht benutzen" #: init/completions/cvs.fish:49 msgid "Compression level for net traffic" msgstr "Komprimierungsgrad für Netzverkehr" #: init/completions/cvs.fish:50 msgid "Encrypt all net traffic" msgstr "Sämtlichen Netzverkehr verschlüsseln" #: init/completions/cvs.fish:51 msgid "Authenticate all net traffic" msgstr "Sämtlichen Netzverkehr authentifizieren" #: init/completions/cvs.fish:52 msgid "Set CVS user variable" msgstr "user-Variable für CVS setzen" #: init/completions/darcs.fish:28 msgid "Create new project" msgstr "Neues Projekt erstellen" #: init/completions/darcs.fish:29 msgid "Create a local copy of another repository" msgstr "Eine lokale Kopie eines weiteren Paketdepots erstellen" #: init/completions/darcs.fish:30 msgid "Add one or more new files or directories" msgstr "Ein/mehrere neue Datei/en oder Verzeichnis/se hinzufügen" #: init/completions/darcs.fish:31 msgid "Remove one or more files or directories from the repository" msgstr "Ein oder mehrere Dateien/Verzeichnisse aus dem Paketdepot entfernen" #: init/completions/darcs.fish:32 msgid "Move/rename one or more files or directories" msgstr "Eine/mehrere Datei/en oder Verzeichnis/se verschieben/umbenennen" #: init/completions/darcs.fish:33 msgid "Replace a token with a new value for that token" msgstr "Merkmal mit einem neuen Wert für dieses Merkmal ersetzen" #: init/completions/darcs.fish:34 msgid "Save changes in the working copy to the repository as a patch" msgstr "Änderungen der Arbeitskopie als Patch zum Paketdepot sichern" #: init/completions/darcs.fish:35 msgid "Copy and apply patches from another repository to this one" msgstr "Patches von einem anderen Paketdepot auf dieses kopieren und anwenden" #: init/completions/darcs.fish:36 msgid "Send by email a bundle of one or more patches" msgstr "Zusammenfassung eines oder mehrerer Patche per E-Mail versenden" #: init/completions/darcs.fish:37 msgid "Apply patches (from an email bundle) to the repository" msgstr "Patches (aus einem Email-Paket) auf das Paketdepot anwenden" #: init/completions/darcs.fish:38 msgid "Copy and apply patches from this repository to another one" msgstr "Patches von diesem Paketdepot auf ein anderes kopieren und anwenden" #: init/completions/darcs.fish:39 msgid "Display unrecorded changes in the working copy" msgstr "Nicht aufgezeichnete Änderungen in der Arbeitskopie anzeigen" #: init/completions/darcs.fish:40 msgid "Gives a changelog style summary of the repo history" msgstr "Gibt eine Zusammenfassung des Depotverlaufs ähnlich einem Changelog" #: init/completions/darcs.fish:41 msgid "Remove recorded patches without changing the working copy" msgstr "Aufgezeichnete Patche entfernen, ohne die Arbeitskopie zu ändern" #: init/completions/darcs.fish:42 msgid "Replace a recorded patch with a better version" msgstr "Einen aufgezeichneten Patch mit einer besseren Version ersetzen" #: init/completions/darcs.fish:43 msgid "Revert to the recorded version (safe the first time only)" msgstr "Zur aufgezeichneten Version zurück (nur beim ersten Mal sicher)" #: init/completions/darcs.fish:44 msgid "Undo the last revert (may fail if changes after the revert)" msgstr "Letzte Rücknahme rückgängig machen (kann versagen, falls nach der Rücknahme Änderungen vorgenommen wurden)" #: init/completions/darcs.fish:45 msgid "Opposite of pull; unsafe if the patch is not in remote repo" msgstr "Gegenstück zu pull, unsicher, wenn der Patch nicht im entfernten Paketdepot ist" #: init/completions/darcs.fish:46 msgid "Record an inverse patch without changing the working copy" msgstr "" #: init/completions/darcs.fish:47 msgid "Tag the contents of the repository with a version name" msgstr "Inhalte des Paketdepots mit einem Versionsnamen markieren" #: init/completions/darcs.fish:48 msgid "Set a value for a preference (test, predist, ...)" msgstr "Wert für eine Einstellung setzen (test, predist, ...)" #: init/completions/darcs.fish:49 msgid "Create a diff between two versions of the repository" msgstr "Diff zwischen zwei Versionen des Paketdepots erstellen" #: init/completions/darcs.fish:50 msgid "Display which patch last modified something" msgstr "Anzeigen, welcher Patch zuletzt etwas veränderte" #: init/completions/darcs.fish:51 msgid "Optimize the repository" msgstr "Paketdepot optimieren" #: init/completions/darcs.fish:52 msgid "Check the repository for consistency" msgstr "Paketdepot auf Konsistenz prüfen" #: init/completions/darcs.fish:53 msgid "Mark any conflicts to the working copy for manual resolution" msgstr "Alle Konflikte in der Arbeitskopie für manuelle Resolution markieren" #: init/completions/darcs.fish:54 msgid "Create a distribution tarball" msgstr "Distributions-Tardatei erstellen" #: init/completions/darcs.fish:55 msgid "Locate the most recent version lacking an error" msgstr "Die aktuellste Version ohne Fehler suchen" #: init/completions/darcs.fish:56 msgid "Repair the corrupted repository" msgstr "Defektes Paketdepot reparieren" #: init/completions/darcs.fish:61 msgid "Shows brief description of command and its arguments" msgstr "Kurze Beschreibung des Befehls und seiner Argumente anzeigen" #: init/completions/darcs.fish:62 msgid "Disable this command" msgstr "Diesen Befehl deaktivieren" #: init/completions/darcs.fish:63 msgid "Specify the repository directory in which to run" msgstr "Das Paketdepot-Verzeichnis angeben, in dem gearbeitet wird" #: init/completions/darcs.fish:71 msgid "Name of patch" msgstr "Name des Patch" #: init/completions/darcs.fish:72 init/completions/darcs.fish:171 msgid "Specify author id" msgstr "Autor-ID angeben" #: init/completions/darcs.fish:73 msgid "Give patch name and comment in file" msgstr "Patch-Name und Kommentar in Datei angeben" #: init/completions/darcs.fish:74 init/completions/darcs.fish:99 #: init/completions/darcs.fish:122 init/completions/darcs.fish:170 msgid "Answer yes to all patches" msgstr "Alle Patches mit ja beantworten" #: init/completions/darcs.fish:75 msgid "In addition to modifications, look for files that are not boring, and thus are potentially pending addition" msgstr "" #: init/completions/darcs.fish:76 msgid "Delete the logfile when done" msgstr "Nach Fertigstellung Logdatei löschen" #: init/completions/darcs.fish:77 init/completions/darcs.fish:130 #: init/completions/darcs.fish:162 msgid "Don't give verbose output" msgstr "Keine ausführliche Ausgabe" #: init/completions/darcs.fish:78 init/completions/darcs.fish:108 #: init/completions/darcs.fish:138 init/completions/darcs.fish:153 msgid "Don't run the test script" msgstr "Das test-Skript nicht ausführen" #: init/completions/darcs.fish:79 init/completions/darcs.fish:107 #: init/completions/darcs.fish:139 init/completions/darcs.fish:154 msgid "Run the test script" msgstr "Das test-Skript ausführen" #: init/completions/darcs.fish:80 init/completions/darcs.fish:141 #: init/completions/darcs.fish:155 msgid "Don't remove the test directory" msgstr "Das test-Verzeichnis nicht entfernen" #: init/completions/darcs.fish:81 init/completions/darcs.fish:142 #: init/completions/darcs.fish:156 msgid "Remove the test directory" msgstr "Das test-Verzeichnis entfernen" #: init/completions/darcs.fish:82 init/completions/darcs.fish:105 #: init/completions/darcs.fish:132 msgid "Create compressed patches" msgstr "Komprimierte Patche erstellen" #: init/completions/darcs.fish:83 init/completions/darcs.fish:106 #: init/completions/darcs.fish:133 msgid "Don't create compressed patches" msgstr "Keine komprimierten Patche erstellen" #: init/completions/darcs.fish:84 msgid "Expect to receive input from a pipe" msgstr "Die Eingabe aus einer Pipe erwarten" #: init/completions/darcs.fish:85 init/completions/darcs.fish:104 #: init/completions/darcs.fish:134 init/completions/darcs.fish:177 msgid "Prompt user interactively" msgstr "Anwender interaktiv fragen" #: init/completions/darcs.fish:86 msgid "Ask for extra dependencies" msgstr "Nach zusätzlichen Abhängigkeiten fragen" #: init/completions/darcs.fish:87 msgid "Don't ask for extra dependencies" msgstr "Nicht nach zusätzlichen Abhängigkeiten fragen" #: init/completions/darcs.fish:88 msgid "Edit the long comment by default" msgstr "Fehlwertmäßig den langen Kommentar editieren" #: init/completions/darcs.fish:89 msgid "Don't give a long comment" msgstr "Keinen langen Kommentar eingeben" #: init/completions/darcs.fish:90 msgid "Prompt for whether to edit the long comment" msgstr "Abfragen, ob der lange Kommentar editiert werden soll" #: init/completions/darcs.fish:91 init/completions/darcs.fish:112 #: init/completions/darcs.fish:131 msgid "Don't trust the file modification times" msgstr "Nicht auf die Veränderungszeiten der Dateien vertrauen" #: init/completions/darcs.fish:92 msgid "Don't look for any files or directories that could be added, and don't add them automatically" msgstr "Nicht nach Dateien und Verzeichnissen suchen, die hinzugefügt werden sollen und diese nicht automatisch hinzufügen " #: init/completions/darcs.fish:97 init/completions/darcs.fish:168 msgid "Select patches matching REGEXP" msgstr "Dem REGEXP entsprechende Patche auswählen" #: init/completions/darcs.fish:98 init/completions/darcs.fish:169 msgid "Select tags matching REGEXP" msgstr "Dem REGEXP entsprechende Markierungen auswählen" #: init/completions/darcs.fish:100 init/completions/darcs.fish:174 msgid "Summarize changes" msgstr "Änderungen zusammenfassen" #: init/completions/darcs.fish:101 init/completions/darcs.fish:149 #: init/completions/darcs.fish:167 msgid "Suppress informational output" msgstr "Informationelle Ausgabe unterdrücken" #: init/completions/darcs.fish:102 init/completions/darcs.fish:176 msgid "Select patches matching PATTERN" msgstr "Patches entsprechend dem MUSTER auswählen" #: init/completions/darcs.fish:103 init/completions/darcs.fish:128 msgid "Use external tool to merge conflicts" msgstr "Externes Programm zum Mischen der Konflikte nutzen" #: init/completions/darcs.fish:109 init/completions/darcs.fish:185 msgid "Don't actually take the action" msgstr "Aktion nicht tatsächlich ausführen" #: init/completions/darcs.fish:110 init/completions/darcs.fish:186 msgid "Don't summarize changes" msgstr "Änderungen nicht zusammenfassen" #: init/completions/darcs.fish:111 init/completions/darcs.fish:152 #: init/completions/darcs.fish:175 msgid "Neither verbose nor quiet output" msgstr "Ausgabe weder ausführlich noch schweigsam" #: init/completions/darcs.fish:113 msgid "Don't automatically fulfill dependencies" msgstr "Nicht automatisch Abhängigkeiten erfüllen" #: init/completions/darcs.fish:114 init/completions/darcs.fish:189 msgid "Set default repository [DEFAULT]" msgstr "Standard-Paketdepot [DEFAULT] setzen" #: init/completions/darcs.fish:115 init/completions/darcs.fish:190 msgid "Don't set default repository" msgstr "Standard-Paketdepot nicht setzen" #: init/completions/darcs.fish:116 init/completions/darcs.fish:143 msgid "Make scripts executable" msgstr "Skripte ausführbar machen" #: init/completions/darcs.fish:117 init/completions/darcs.fish:144 msgid "Don't make scripts executable" msgstr "Skripte nicht ausführbar machen" #: init/completions/darcs.fish:123 msgid "Verify that the patch was signed by a key in PUBRING" msgstr "Überprüfen, das der Patch mit einem Schlüsel aus PUBRING signiert wurde" #: init/completions/darcs.fish:124 msgid "Verify using openSSL with authorized keys from file 'KEYS'" msgstr "Mittels openSSl mit autorisierten Schlüsseln aus Datei 'KEYS' überprüfen" #: init/completions/darcs.fish:125 init/completions/darcs.fish:191 msgid "Specify sendmail command" msgstr "sendmail-Befehl angegeben" #: init/completions/darcs.fish:126 msgid "Reply to email-based patch using FROM address" msgstr "Auf Email-basierten Patch mittels FROM-Adresse antworten" #: init/completions/darcs.fish:127 init/completions/darcs.fish:180 msgid "Mail results to additional EMAIL(s). Requires --reply" msgstr "Ergebnisse an zusätzliche EMAIL(s) senden. Erfordert --reply" #: init/completions/darcs.fish:129 msgid "Don't verify patch signature" msgstr "Patch-Signatur nicht überprüfen" #: init/completions/darcs.fish:135 msgid "Mark conflicts" msgstr "Konflikte markieren" #: init/completions/darcs.fish:136 msgid "Allow conflicts, but don't mark them" msgstr "Konflikte zulassen, sie aber nicht markieren" #: init/completions/darcs.fish:137 msgid "Fail on patches that create conflicts [DEFAULT]" msgstr "Abbruch bei Patchen, die Konflikte erzeugen (Standard)" #: init/completions/darcs.fish:140 msgid "Forward unsigned messages without extra header" msgstr "Unsignierte Nachrichten ohne zusätzliche Header-Zeile weiterleiten" #: init/completions/darcs.fish:150 msgid "Check the entire repository" msgstr "Das ganze Paketdepot prüfen" #: init/completions/darcs.fish:151 msgid "Check patches since latest checkpoint" msgstr "Patches seit letztem Prüfpunkt prüfen" #: init/completions/darcs.fish:161 msgid "Don't refuse to add files differing only in case" msgstr "Hinzufügen von Dateien, die sich nur in Gross-/Kleinschreibung unterscheiden, nicht verweigern" #: init/completions/darcs.fish:172 msgid "Specify output filename" msgstr "Ausgabedateiname angeben" #: init/completions/darcs.fish:173 msgid "Output patch in a darcs-specific format similar to diff -u" msgstr "Patch in einem darcs-spezifischen Format ausgeben, das diff -u entspricht" #: init/completions/darcs.fish:179 msgid "Specify destination email" msgstr "Ziel-Email-Adresse angeben" #: init/completions/darcs.fish:181 msgid "Sign the patch with your gpg key" msgstr "Patch mit Ihrem gpg-Schlüssel signieren" #: init/completions/darcs.fish:182 msgid "Sign the patch with a given keyid" msgstr "Den Patch mit einer angegebenen Schlüssel-ID signieren" #: init/completions/darcs.fish:183 msgid "Sign the patch using openssl with a given private key" msgstr "Den Patch unter Benutzung von openssl mit einem privaten Schlüssel signieren" #: init/completions/darcs.fish:184 msgid "Do not sign the patch" msgstr "Patch nicht signieren" #: init/completions/darcs.fish:187 msgid "Send to context stored in FILENAME" msgstr "" #: init/completions/darcs.fish:188 msgid "Edit the patch bundle description" msgstr "Beschreibung des Patchpaketes editieren" #: init/completions/darcs.fish:195 msgid "Use a plain pristine tree [DEFAULT]" msgstr "Benutze einen unberührten Baum [Standard]" #: init/completions/darcs.fish:196 msgid "Use no pristine tree" msgstr "Keinen unberührten Baum verwenden" #: init/completions/date.fish:1 msgid "Display date described by string" msgstr "Datum gemäss Zeichenkette anzeigen" #: init/completions/date.fish:2 msgid "Display date for each line in file" msgstr "Für jede Zeile der Datei Datum anzeigen" #: init/completions/date.fish:3 msgid "Output in ISO 8601 format" msgstr "Ausgabe im ISO 8601-Format" #: init/completions/date.fish:4 init/completions/touch.fish:9 msgid "Set time" msgstr "Zeit setzen" #: init/completions/date.fish:5 msgid "Output RFC-2822 compliant date string" msgstr "Datumszeichenkette gemäß RFC-2822 ausgeben" #: init/completions/date.fish:6 msgid "Display the last modification time of file" msgstr "Letzte Veränderungszeit der Datei anzeigen" #: init/completions/date.fish:7 init/completions/date.fish:8 msgid "Print or set Coordinated Universal Time" msgstr "Koordinierte Universalzeit (CUT) anzeigen oder setzen" #: init/completions/df.fish:17 init/completions/du.fish:7 #: init/completions/ls.fish:22 msgid "Human readable sizes" msgstr "Lesbare Grössen" #: init/completions/df.fish:18 msgid "List inode information" msgstr "Inode-Information anzeigen" #: init/completions/df.fish:19 init/completions/du.fish:9 msgid "Use 1kB block size" msgstr "Blockgrösse von 1kB verwenden" #: init/completions/df.fish:20 msgid "List only local filesystems" msgstr "Nur lokale Dateisysteme anzeigen" #: init/completions/df.fish:21 msgid "Use Posix format" msgstr "Posix-Format verwenden" #: init/completions/df.fish:22 msgid "Show filesystems of specified type" msgstr "Dateisysteme des angegebenen Typs anzeigen" #: init/completions/df.fish:26 msgid "Include empty filesystems" msgstr "Leere Dateisysteme einschliessen" #: init/completions/df.fish:27 init/completions/du.fish:3 #: init/completions/tar.fish:13 msgid "Block size" msgstr "Blockgrösse" #: init/completions/df.fish:28 init/completions/du.fish:8 #: init/completions/ls.fish:55 msgid "Human readable sizes, powers of 1000" msgstr "Lesbare Grössen, vielfaches von 1000" #: init/completions/df.fish:29 msgid "Do not sync before getting usage info" msgstr "Vor Belegungsabruf keinen sync ausführen" #: init/completions/df.fish:30 msgid "Sync before getting usage info" msgstr "Vor Belegungsabruf sync ausführen" #: init/completions/df.fish:31 msgid "Print filesystem type" msgstr "Dateisystemtyp anzeigen" #: init/completions/df.fish:32 msgid "Excluded filesystem type" msgstr "Dateisystemtyp ausschliessen" #: init/completions/df.fish:38 msgid "Show all filesystems" msgstr "Alle Dateisysteme anzeigen" #: init/completions/df.fish:39 msgid "Show sizes in gigabytes" msgstr "Grösse in Gigabyte anzeigen" #: init/completions/df.fish:40 msgid "Show sizes in megabytes" msgstr "Grösse in Megabyte anzeigen" #: init/completions/df.fish:41 msgid "Print out the previously obtained statistics from the file systems" msgstr "Bisher erhaltene Statistiken über die Dateisysteme ausgeben" #: init/completions/diff.fish:2 msgid "Ignore case differences" msgstr "Unterschiede bei Gross-/Kleinschreibung ignorieren" #: init/completions/diff.fish:3 msgid "Ignore case when comparing file names" msgstr "Gross-/Kleinschreibung beim Dateinamen-Vergleich ignorieren" #: init/completions/diff.fish:4 msgid "Consider case when comparing file names" msgstr "Gross-/Kleinschreibung beim Dateinamen-Vergleich beachten" #: init/completions/diff.fish:5 msgid "Ignore changes due to tab expansion" msgstr "Änderungen aufgrund von Tab-Ausweitung ignorieren" #: init/completions/diff.fish:6 msgid "Ignore changes in the amount of white space" msgstr "Änderung in der Anzahl von Worttrennern ignorieren" #: init/completions/diff.fish:7 msgid "Ignore all white space" msgstr "white space (Worttrenner) ignorieren" #: init/completions/diff.fish:8 msgid "Ignore changes whose lines are all blank" msgstr "Änderungen ignorieren, deren Zeilen alle leer sind" #: init/completions/diff.fish:9 msgid "Ignore changes whose lines match the REGEX" msgstr "Änderungen ignorieren, deren Zeilen dem reg. Ausdruck entsprechen" #: init/completions/diff.fish:10 msgid "Treat all files as text" msgstr "Alle Dateien als Text behandeln" #: init/completions/diff.fish:11 msgid "Recursively compare subdirectories" msgstr "Unterverzeichnisse rekursiv vergleichen" #: init/completions/diff.fish:12 msgid "Treat absent files as empty" msgstr "Nicht vorhandene Dateien als leer behandeln" #: init/completions/diff.fish:13 msgid "Output NUM lines of copied context" msgstr "NUM Zeilen des kopierten Kontextes ausgeben" #: init/completions/diff.fish:14 msgid "Output 3 lines of copied context" msgstr "3 Zeilen des kopierten Kontextes ausgeben" #: init/completions/diff.fish:15 msgid "Output NUM lines of unified context" msgstr "NUM Zeilen des vereinheitlichten Kontextes ausgeben" #: init/completions/diff.fish:16 msgid "Output 3 lines of unified context" msgstr "3 Zeilen des vereinheitlichten Kontextes ausgeben" #: init/completions/diff.fish:17 msgid "Output only whether the files differ" msgstr "Nur Unterschiede der Dateien ausgeben" #: init/completions/diff.fish:18 msgid "Output a normal diff" msgstr "Normalen Diff ausgeben" #: init/completions/diff.fish:19 msgid "Output in two columns" msgstr "Ausgabe in zwei Spalten" #: init/completions/diff.fish:20 msgid "Output at most NUM print columns" msgstr "Gebe maximal NUM Druckspalten aus" #: init/completions/diff.fish:21 msgid "Try to find a smaller set of changes" msgstr "Versuche, eine kleinere Menge Änderungen zu finden" #: init/completions/diff.fish:22 msgid "Compare FILE1 to all operands" msgstr "Vergleiche FILE1 mit allen Operanden" #: init/completions/diff.fish:23 msgid "Compare FILE2 to all operands" msgstr "Vergleiche FILE2 mit allen Operanden" #: init/completions/diff.fish:24 msgid "Pass the output through 'pr'" msgstr "Ausgabe durch 'pr' schicken" #: init/completions/du.fish:1 msgid "Write size for all files" msgstr "Größe für alle Dateien anzeigen" #: init/completions/du.fish:2 msgid "Print file size, not disk usage" msgstr "Dateigröße statt Plattenbelegung anzeigen" #: init/completions/du.fish:4 msgid "Use 1B block size" msgstr "1B-Blockgrösse verwenden" #: init/completions/du.fish:5 msgid "Produce grand total" msgstr "Gesamtsumme erstellen" #: init/completions/du.fish:6 msgid "Dereference file symlinks" msgstr "Symbolische Links für Datei dereferenzieren" #: init/completions/du.fish:10 msgid "Count hard links multiple times" msgstr "Harte Links mehrfach zählen" #: init/completions/du.fish:11 msgid "Dereference all symlinks" msgstr "Alle symbolischen Links dereferenzieren" #: init/completions/du.fish:12 msgid "Do not include subdirectory size" msgstr "Unterverzeichnisgrösse nicht einschliessen" #: init/completions/du.fish:13 msgid "Display only a total for each argument" msgstr "Nur eine Gesamtsumme für jedes Argument anzeigen" #: init/completions/du.fish:14 msgid "Skip other filesystems" msgstr "Andere Dateisysteme überspringen" #: init/completions/du.fish:15 msgid "Exclude files thet match pattern in file" msgstr "Den Mustern in der Datei entsprechende Dateien ausschliessen" #: init/completions/du.fish:16 msgid "Exclude files that match pattern" msgstr "Dem Muster entsprechende Dateien ausschliessen" #: init/completions/du.fish:17 msgid "Recursion limit" msgstr "Rekursionsgrenze" #: init/completions/echo.fish:1 msgid "No newline" msgstr "Kein Neue-Zeile-Zeichen" #: init/completions/echo.fish:2 msgid "Use backslash escaped characters" msgstr "Benutze per 'backslash (\\)'maskierte Zeichen " #: init/completions/echo.fish:3 msgid "Do not use backslash escaped characters" msgstr "Keine per 'backslash (\\)'maskierte Zeichen verwenden" #: init/completions/emacs.fish:4 msgid "Do not load init files" msgstr "Keine Init-Dateien laden" #: init/completions/emacs.fish:5 msgid "Load users init file" msgstr "Init-Datei des Anwenders laden" #: init/completions/emacs.fish:6 msgid "Use file as terminal" msgstr "Datei als Terminal benutzen" #: init/completions/emacs.fish:7 msgid "Execute Lisp function" msgstr "Lisp-Funktion ausführen" #: init/completions/emacs.fish:8 msgid "Load Lisp code from file" msgstr "Lisp-Code aus Datei laden" #: init/completions/emacs.fish:9 msgid "Do not use X interface" msgstr "X-Schnittstelle nicht verwenden" #: init/completions/emacs.fish:10 msgid "Create window on the specified display" msgstr "Fenster auf der angegebenen Anzeige erstellen" #: init/completions/fish.fish:1 msgid "Run fish with this command" msgstr "fish mit diesem Befehl ausführen" #: init/completions/fish.fish:4 msgid "Run in interactive mode" msgstr "Ausführung im interaktiven Modus" #: init/completions/fish.fish:5 msgid "Output profiling information to specified file" msgstr "Profilierungs-Information in angegebene Datei ausgeben" #: init/completions/function.fish:1 init/completions/functions.fish:5 msgid "Set function description" msgstr "Funktionsbeschreibung setzen" #: init/completions/function.fish:4 msgid "Make the function a job exit event handler" msgstr "Funktion zur Ereignisbehandlung bei Jobende verwenden" #: init/completions/function.fish:5 msgid "Make the function a process exit event handler" msgstr "Funktion zur Ereignisbehandlung bei Prozessende verwenden" #: init/completions/function.fish:6 msgid "Make the function a signal event handler" msgstr "Funktion zur Signal-Ereignisbehandlung verwenden" #: init/completions/function.fish:7 msgid "Make the function a variable update event handler" msgstr "Funktion zur Ereignisbehandlung bei Variablenaktualisierung verwenden" #: init/completions/functions.fish:1 msgid "Erase function" msgstr "Funktion löschen" #: init/completions/functions.fish:3 msgid "Show hidden functions" msgstr "Versteckte Funktionen zeigen" #: init/completions/gcc.fish:5 msgid "Language" msgstr "Sprache" #: init/completions/gcc.fish:23 msgid "Pass program exit codes" msgstr "Rückkehr-Codes des Programmes weiterreichen" #: init/completions/gcc.fish:24 msgid "Stop after assembler" msgstr "Nach Assemblierung anhalten" #: init/completions/gcc.fish:25 msgid "Stop after compile" msgstr "Nach Kompilierung anhalten" #: init/completions/gcc.fish:26 msgid "Stop after preprocesswor" msgstr "Nach Präprozessordurchlauf anhalten" #: init/completions/gcc.fish:27 msgid "Output file" msgstr "Ausgabedatei" #: init/completions/gcc.fish:28 msgid "Print commands to stderr" msgstr "Befehle auf Standardfehlerausgabe anzeigen" #: init/completions/gcc.fish:29 msgid "Print quoted commands to stderr, do not run" msgstr "Maskierte Befehle auf Standardfehlerausgabe anzeigen, nicht ausführen" #: init/completions/gcc.fish:30 msgid "Use pipes" msgstr "Pipes benutzen" #: init/completions/gcc.fish:31 msgid "Use ansi mode" msgstr "Ansi-Modus benutzen" #: init/completions/gcc.fish:32 msgid "Standard mode" msgstr "Standardmodus" #: init/completions/gcc.fish:46 msgid "Write prototypes to file" msgstr "Prototypen in Datei schreiben" #: init/completions/gcc.fish:47 msgid "Do not recognize asm, inline or typeof keywords" msgstr "Schlüsselworte asm, inline oder typeof nicht erkennen" #: init/completions/gcc.fish:48 msgid "Do not use builtin functions" msgstr "Keine eingebauten Funktionen verwenden" #: init/completions/gcc.fish:49 msgid "Assert hosted environment" msgstr "" #: init/completions/gcc.fish:50 msgid "Assert freestanding environment" msgstr "" #: init/completions/gcc.fish:51 msgid "Use Microsoft extensions" msgstr "Microsoft-Erweiterungen verwenden" #: init/completions/gcc.fish:52 msgid "Use ANSI trigraphs" msgstr "ANSI-Trigraphen verwenden" #: init/completions/gcc.fish:53 msgid "Do not use integrated preprocessor" msgstr "Integrierten Präprozessor nicht verwenden" #: init/completions/gcc.fish:54 msgid "char is unsigned" msgstr "char ist nicht vorzeichenbehaftet" #: init/completions/gcc.fish:55 msgid "char is signed" msgstr "char ist vorzeichenbehaftet" #: init/completions/gcc.fish:56 msgid "bitfield is unsigned" msgstr "Bitfeld ist nicht vorzeichenbehaftet" #: init/completions/gcc.fish:57 msgid "bitfield is signed" msgstr "Bitfeld ist vorzeichenbehaftet" #: init/completions/gcc.fish:58 msgid "All bitfields are signed" msgstr "Alle Bitfielder sind vorzeichenbehaftet" #: init/completions/gcc.fish:59 msgid "All bitfields are unsigned" msgstr "Alle Bitfielder sind nicht vorzeichenbehaftet" #: init/completions/gcc.fish:60 init/completions/gcc.fish:65 msgid "String constants are not const" msgstr "Zeichenketten-Konstanten sind nicht const" #: init/completions/gcc.fish:61 msgid "C++ ABI version" msgstr "C++ ABI-Version" #: init/completions/gcc.fish:62 msgid "Turn off access checking" msgstr "Zugriffsprüfung abschalten" #: init/completions/gcc.fish:63 msgid "Check pointer returned by new" msgstr "Durch new zurückgegebenen Zeiger prüfen" #: init/completions/gcc.fish:64 msgid "Put globals in the common segment" msgstr "Global-Werte im Common-Segment einfügen" #: init/completions/gcc.fish:66 msgid "Accept $ in identifiers" msgstr "In Bezeichnern $ akzeptieren" #: init/completions/gcc.fish:67 msgid "Reject $ in identifiers" msgstr "In Bezeichnern $ nicht akzeptieren" #: init/completions/gcc.fish:68 msgid "Do not omit unneeded temporarys" msgstr "" #: init/completions/gcc.fish:69 msgid "Allow exception violations" msgstr "Erlaube Ausnahme-Verletzungen" #: init/completions/gcc.fish:70 msgid "Do not extend for-loop scope" msgstr "Bereich für for-Schleife nicht erweitern" #: init/completions/gcc.fish:71 msgid "Extend for-loop scope" msgstr "Bereich für for-Schleife erweitern" #: init/completions/gcc.fish:72 msgid "Do not recognize typeof as keyword" msgstr "typeof nicht als Schlüsselwort erkennen" #: init/completions/gcc.fish:73 msgid "Do not emit code for implicit templates" msgstr "" #: init/completions/gcc.fish:74 msgid "Do not emit code for implicit inline templates" msgstr "" #: init/completions/gcc.fish:75 msgid "Do not emit out-of-line code for inline functions" msgstr "" #: init/completions/gcc.fish:76 msgid "Disable warnings about MFC" msgstr "Warnungen über MFC deaktivieren" #: init/completions/gcc.fish:77 msgid "Disable some built-in functions" msgstr "Einige eingebaute Funktionen deaktivieren" #: init/completions/gcc.fish:78 msgid "Disable operator keywords" msgstr "Operater-Schlüsselworte deaktivieren" #: init/completions/gcc.fish:79 msgid "Disable optional diagnostics" msgstr "Optionale Diagnostikmeldungen deaktivieren" #: init/completions/gcc.fish:80 msgid "Downgrade some errors to warnings" msgstr "Einge Fehler zu Warnungen herabstufen" #: init/completions/gcc.fish:81 msgid "Enable automatic template instantiation at link time" msgstr "Automatische Template-Instanziierung zur Linkzeit aktivieren" #: init/completions/gcc.fish:82 msgid "Disable generation of C++ runtime type information" msgstr "Genererierung von C++-Laufzeit-Typinformationen deaktivieren" #: init/completions/gcc.fish:86 msgid "Set maximum template depth to %s" msgstr "Maximale Mustertiefe auf %s setzen" #: init/completions/gcc.fish:89 msgid "Do not emit code for thread-safe initialization of local statics" msgstr "" #: init/completions/gcc.fish:90 msgid "Use __cxa_atexit for destructors" msgstr "Benutze __cxa_atexit für Destruktoren" #: init/completions/gcc.fish:91 msgid "Hides inline methods from export table" msgstr "Versteckt 'inline'-Methoden aus der Exporttabelle" #: init/completions/gcc.fish:92 msgid "Do not use weak symbol support" msgstr "Unterstützung für schwache Symbole nich verwenden" #: init/completions/gpg.fish:48 msgid "Make a signature" msgstr "Signatur erstellen" #: init/completions/gpg.fish:49 msgid "Make a clear text signature" msgstr "Klartext-Signatur erstellen" #: init/completions/gpg.fish:50 msgid "Make a detached signature" msgstr "Abgehängte Signatur erstellen" #: init/completions/gpg.fish:51 msgid "Encrypt data" msgstr "Daten verschlüsseln" #: init/completions/gpg.fish:52 msgid "Encrypt with a symmetric cipher using a passphrase" msgstr "Verschlüsseln mit einer symmetrischen Chiffre mittels eines Passwortsatzes" #: init/completions/gpg.fish:53 msgid "Store only (make a simple RFC1991 packet)" msgstr "Nur speichern (einfaches RFC1991-Paket erzeugen)" #: init/completions/gpg.fish:54 msgid "Decrypt specified file or stdin" msgstr "Angegebene Datei oder Standardeingabe entschlüsseln" #: init/completions/gpg.fish:55 msgid "Assume specified file or stdin is sigfile and verify it" msgstr "Annehmen das die angegebene Datei oder Standardeingabe eine Signaturdatei ist und überprüfen" #: init/completions/gpg.fish:56 msgid "Modify certain other commands to accept multiple files for processing" msgstr "" #: init/completions/gpg.fish:57 msgid "Identical to '--multifile --verify'" msgstr "Entspricht '--multifile --verify'" #: init/completions/gpg.fish:58 msgid "Identical to '--multifile --encrypt'" msgstr "Entspricht '--multifile --encrypt'" #: init/completions/gpg.fish:59 msgid "Identical to --multifile --decrypt" msgstr "Entspricht '--multifile --decrypt'" #: init/completions/gpg.fish:61 init/completions/gpg.fish:62 msgid "List all keys from the public keyrings, or just the ones given on the command line" msgstr "Alle Schlüssel der öffentlichen Schlüsselringe anzeigen oder nur diejenigen, die auf der Befehlszeile angegeben wurden" #: init/completions/gpg.fish:63 msgid "List all keys from the secret keyrings, or just the ones given on the command line" msgstr "Alle Schlüssel der geheimen Schlüsselringe anzeigen oder nur diejenigen, die auf der Befehlszeilel angegeben wurden" #: init/completions/gpg.fish:64 msgid "Same as --list-keys, but the signatures are listed too" msgstr "Entspricht --list-keys, aber auch die Signaturen werden angezeigt" #: init/completions/gpg.fish:66 msgid "Same as --list-keys, but the signatures are listed and verified" msgstr "Entspricht --list-keys, die Signaturen werden aber angezeigt und überprüft" #: init/completions/gpg.fish:67 msgid "List all keys with their fingerprints" msgstr "Alle Schlüssel mit ihren Fingerabdrücken anzeigen" #: init/completions/gpg.fish:68 msgid "Generate a new key pair" msgstr "Ein neues Schlüsselpaar erstellen" #: init/completions/gpg.fish:70 msgid "Present a menu which enables you to do all key related tasks" msgstr "Bietet ein Menu, das Ihnen die Durchführung aller Schlüssel-relevanten Aufgaben ermöglicht" #: init/completions/gpg.fish:72 msgid "Sign a public key with your secret key" msgstr "Einen öffentlichen Schlüssel mit Ihrem geheimen Schlüssel signieren" #: init/completions/gpg.fish:73 msgid "Sign a public key with your secret key but mark it as non exportable" msgstr "Signiert einen öffentlichen Schlüssel mit Ihrem geheimen Schlüssel, aber markiert ihn als nicht exportierbar" #: init/completions/gpg.fish:75 msgid "Remove key from the public keyring" msgstr "Entferne Schlüssel vom öffentlichen Schlüsselring" #: init/completions/gpg.fish:76 msgid "Remove key from the secret and public keyring" msgstr "Entferne Schlüssel vom geheimen und öffentlichen Schlüsselring" #: init/completions/gpg.fish:77 msgid "Same as --delete-key, but if a secret key exists, it will be removed first" msgstr "Entspricht --delete-key, aber falle ein geheimer Schlüssel existiert, wird dieser zuerst entfernt" #: init/completions/gpg.fish:79 msgid "Generate a revocation certificate for the complete key" msgstr "Generiere ein Widerrufszertifikat für den ganzen Schlüssel" #: init/completions/gpg.fish:80 msgid "Generate a designated revocation certificate for a key" msgstr "Generiere ein vorgesehenes Widerrufszertifikat für einen Schlüssel" #: init/completions/gpg.fish:82 msgid "Export all or the given keys from all keyrings" msgstr "Alle oder angegebene Schlüssel aus allen Schlüsselringen exportieren" #: init/completions/gpg.fish:83 msgid "Same as --export but sends the keys to a keyserver" msgstr "Entspricht --export, aber sendet die Schlüssel an einen Schlüssel-Server" #: init/completions/gpg.fish:84 init/completions/gpg.fish:85 msgid "Same as --export, but exports the secret keys instead" msgstr "Entspricht --export, aber exportiert stattdessen die geheimen Schlüssel" #: init/completions/gpg.fish:87 init/completions/gpg.fish:88 msgid "Import/merge keys" msgstr "Schlüssel importieren/mischen" #: init/completions/gpg.fish:90 msgid "Import the keys with the given key IDs from a keyserver" msgstr "Schlüssel mit den angegebenenn Schlüssel-IDs von einem Schlüssel-Server importieren" #: init/completions/gpg.fish:91 msgid "Request updates from a keyserver for keys that already exist on the local keyring" msgstr "Aktualisierungen für Schlüssel von einem Schlüssel-Server abrufen, die bereits in einem lokalen Schlüsselring vorhanden sind" #: init/completions/gpg.fish:92 msgid "Search the keyserver for the given names" msgstr "Schlüssel-Server nach den angegebenen Namen durchsuchen" #: init/completions/gpg.fish:93 msgid "Do trust database maintenance" msgstr "Wartung der Vertrauens-Datenbank durchführen" #: init/completions/gpg.fish:94 msgid "Do trust database maintenance without user interaction" msgstr "Wartung der Vertrauens-Datenbank ohne Anwender-Beteiligung" #: init/completions/gpg.fish:96 msgid "Send the ownertrust values to stdout" msgstr "Ownertrust-Werte auf Standardausgabe schicken" #: init/completions/gpg.fish:97 msgid "Update the trustdb with the ownertrust values stored in specified files or stdin" msgstr "trustdb mit den ownertrust-Werten der angegebenen Dateien oder Standardeingabe aktualisieren" #: init/completions/gpg.fish:99 msgid "Create signature caches in the keyring" msgstr "Signatur-Cache im Schlüsselring erstellen" #: init/completions/gpg.fish:101 msgid "Print message digest of specified algorithm for all given files or stdin" msgstr "Nachrichten-Extrakt des angegbenen Algorithmus für alle angegebenen Dateien oder Standardeingabe ausgeben" #: init/completions/gpg.fish:102 msgid "Print message digest of all algorithms for all given files or stdin" msgstr "Nachrichten-Extrakt aller Algorithmen für alle angegebenen Dateien oder Standardeingabe ausgeben" #: init/completions/gpg.fish:104 msgid "Emit specified number of random bytes of the given quality level" msgstr "Angegebene Anzahl zufälliger Bytes des gegebenen Qualitätsgrades ausgeben" #: init/completions/gpg.fish:106 msgid "Display version and supported algorithms, and exit" msgstr "Version und unterstützte Algorithmen anzeigen und beenden" #: init/completions/gpg.fish:107 msgid "Display warranty and exit" msgstr "Gewährleistung anzeigen und beenden" #: init/completions/gpg.fish:115 msgid "Create ASCII armored output" msgstr "Erstelle ASCII-bewehrte Ausgabe" #: init/completions/gpg.fish:116 msgid "Write output to specified file" msgstr "Schreibe Ausgabe in die angegebene Datei" #: init/completions/gpg.fish:118 msgid "Sets a limit on the number of bytes that will be generated when processing a file" msgstr "Begrenzt die Anzahl Bytes, die beim Verarbeiten einer Datei generiert werden" #: init/completions/gpg.fish:120 msgid "Use specified key as the key to sign with" msgstr "Angegebenen Schlüssel als Schlüssel zum Signieren verwenden" #: init/completions/gpg.fish:121 msgid "Use specified key as the default key to sign with" msgstr "Angegebenen Schlüssel als Standardschlüssel zum Signieren verwenden" #: init/completions/gpg.fish:123 msgid "Encrypt for specified user id" msgstr "für angegebene Anwender-ID verschlüsseln" #: init/completions/gpg.fish:124 msgid "Encrypt for specified user id, but hide the keyid of the key" msgstr "für angegebene Anwender-ID verschlüsseln, Schlüssel-ID des Schlüssels aber verbergen" #: init/completions/gpg.fish:125 msgid "Use specified user id as default recipient" msgstr "Angegebene Anwender-ID als Standard-Empfänger benutzen" #: init/completions/gpg.fish:126 msgid "Use the default key as default recipient" msgstr "Standard-Schlüssel als Standard-Empfänger benutzen" #: init/completions/gpg.fish:127 msgid "Reset --default-recipient and --default-recipient-self" msgstr "--default-recipient und --default-recipient-self zurücksetzen" #: init/completions/gpg.fish:129 msgid "Give more information during processing" msgstr "Während der Verarbeitung zusätzliche Informationen ausgeben" #: init/completions/gpg.fish:132 init/completions/gpg.fish:133 #: init/completions/gpg.fish:134 msgid "Compression level" msgstr "Komprimierungsgrad" #: init/completions/gpg.fish:135 msgid "Use a different decompression method for BZIP2 compressed files" msgstr "Eine andere Dekomprimierungsmethode für BZIP2-komprimierte Dateien verwenden" #: init/completions/gpg.fish:137 msgid "Treat input files as text and store them in the OpenPGP canonical text form with standard 'CRLF' line endings" msgstr "Behandle Eingabedateien als Text und speichere sie in der anerkannten OpenPGP-Textform mit Standard-Zeilenendungen CRLF" #: init/completions/gpg.fish:138 msgid "Don't treat input files as text and store them in the OpenPGP canonical text form with standard 'CRLF' line endings" msgstr "Behandle Eingabedateien nicht als Text und speichere sie in der anerkannten OpenPGP-Textform mit Standard-Zeilenendungen CRLF" #: init/completions/gpg.fish:140 msgid "Don't make any changes (this is not completely implemented)" msgstr "Keine Änderungen vornehmen (dies ist nicht vollständig implementiert)" #: init/completions/gpg.fish:142 init/completions/mv.fish:3 msgid "Prompt before overwrite" msgstr "Vor Überschreiben nachfragen" #: init/completions/gpg.fish:144 init/completions/scp.fish:28 #: init/completions/top.fish:2 msgid "Batch mode" msgstr "Stapelverarbeitungsmodus" #: init/completions/gpg.fish:145 msgid "Don't use batch mode" msgstr "Stapelverarbeitungsmodus nicht verwenden" #: init/completions/gpg.fish:146 msgid "Never write output to terminal" msgstr "Niemals Ausgaben aufs Terminal schreiben" #: init/completions/gpg.fish:148 msgid "Assume yes on most questions" msgstr "Ja als Standard-Antwort annehmen" #: init/completions/gpg.fish:149 msgid "Assume no on most questions" msgstr "Nein als Standard-Antwort annehmen" #: init/completions/gpg.fish:151 msgid "Prompt for a certification level when making a key signature" msgstr "Nach einem Zertifizierungs-Grad fragen, wenn eine Schlüssel-Signatur erstellt wird" #: init/completions/gpg.fish:152 msgid "Don't prompt for a certification level when making a key signature" msgstr "Nicht nach einem Zertifizierungs-Grad fragen, wenn eine Schlüssel-Signatur erstellt wird" #: init/completions/gpg.fish:153 msgid "The default certification level to use for the level check when signing a key" msgstr "Standard-Zertifizierungsgrad für die Prüfung beim Signieren eines Schlüssels" #: init/completions/gpg.fish:154 msgid "Disregard any signatures with a certification level below specified level when building the trust database" msgstr "Beim Erstellen der Vertrauens-Datenbank alle Signaturen verwerfen, deren Zertifizierungs-Grad unter dem angegebenen liegt" #: init/completions/gpg.fish:156 msgid "Assume that the specified key is as trustworthy as one of your own secret keys" msgstr "Voraussetzen, das der angegebene Schlüssel so vertrauenswürdig ist wie einer Ihrer eigenen geheimen Schlüssel" #: init/completions/gpg.fish:157 msgid "Specify trust model" msgstr "Vertrauensmodell angeben" #: init/completions/gpg.fish:159 msgid "Select how to display key IDs" msgstr "Auswahl: Wie werden Schlüssel-IDs angezeigt" #: init/completions/gpg.fish:161 msgid "Use specified keyserver" msgstr "Angegebenen Schlüssel-Server verwenden" #: init/completions/gpg.fish:162 msgid "Options for the keyserver" msgstr "Optionen für den Schlüssel-Server" #: init/completions/gpg.fish:164 msgid "Options for importing keys" msgstr "Optionen zum Importieren von Schlüsseln" #: init/completions/gpg.fish:165 msgid "Options for exporting keys" msgstr "Optionen zum Exportieren von Schlüsseln" #: init/completions/gpg.fish:166 msgid "Options for listing keys and signatures" msgstr "Optionen zum Anzeigen von Schlüsseln und Signaturen" #: init/completions/gpg.fish:167 msgid "Options for verifying signatures" msgstr "Optionen zum Überprüfen von Signaturen" #: init/completions/gpg.fish:169 msgid "The command line that should be run to view a photo ID" msgstr "Befehlszeile, die zum Betrachten einer Foto-ID benutzt werden soll" #: init/completions/gpg.fish:170 msgid "Sets a list of directories to search for photo viewers and keyserver helpers" msgstr "Setzt eine Liste von Verzeichnissen, die nach Bildbetrachtern und Keyserver-Hilfsprogrammen durchsucht werden" #: init/completions/gpg.fish:172 msgid "Display the keyring name at the head of key listings to show which keyring a given key resides on" msgstr "Schlüsselringname zu Beginn der Schlüsselliste anzeigen, um zu zeigen, in welchen Schlüsselring sich ein gegebener Schlüssel befindet" #: init/completions/gpg.fish:173 msgid "Add specified file to the current list of keyrings" msgstr "Angegebene Datei zur aktuellen Schlüsselring-Liste hinzufügen" #: init/completions/gpg.fish:175 msgid "Add specified file to the current list of secret keyrings" msgstr "Angegebene Datei zur aktuellen Liste geheimer Schlüsselringe hinzufügen" #: init/completions/gpg.fish:176 msgid "Designate specified file as the primary public keyring" msgstr "Angegebene Datei als primären öffentlichen Schlüsselring bestimmen" #: init/completions/gpg.fish:178 msgid "Use specified file instead of the default trustdb" msgstr "Angegebene Datei anstelle der Standard-trustdb nutzen" #: init/completions/gpg.fish:179 msgid "Set the home directory" msgstr "Startverzeichnis setzen" #: init/completions/gpg.fish:180 msgid "Set the native character set" msgstr "Standard-Zeichensatz setzen" #: init/completions/gpg.fish:182 msgid "Assume that following command line arguments are given in UTF8" msgstr "Annehmen, das die folgenden Befehlszeilenargumente in UTF8 kodiert sind" #: init/completions/gpg.fish:183 msgid "Assume that following arguments are encoded in the character set specified by --display-charset" msgstr "Annehmen, das die folgenden Argumente im durch --display-charset spezifizierten Zeichensatz kodiert sind" #: init/completions/gpg.fish:184 msgid "Read options from specified file, do not read the default options file" msgstr "Optionen aus angegebener Datei lesen, Standard-Optionsdatei nicht lesen" #: init/completions/gpg.fish:185 msgid "Shortcut for '--options /dev/null'" msgstr "Abkürzung für '--options /dev/null'" #: init/completions/gpg.fish:186 msgid "Load an extension module" msgstr "Erweiterungsmodul laden" #: init/completions/gpg.fish:188 msgid "Write special status strings to the specified file descriptor" msgstr "Spezielle Statusmeldungen auf den angegebenen Dateideskriptor schreiben" #: init/completions/gpg.fish:189 msgid "Write log output to the specified file descriptor" msgstr "Protokollausgabe auf angegebenen Dateideskriptor schreiben" #: init/completions/gpg.fish:190 msgid "Write attribute subpackets to the specified file descriptor" msgstr "Attribut-Unterpakete auf angegebenen Dateideskriptor schreiben" #: init/completions/gpg.fish:192 msgid "Include secret key comment packets when exporting secret keys" msgstr "Kommentarpakete aus geheimen Schlüsseln bei deren Export einschliessen" #: init/completions/gpg.fish:193 msgid "Don't include secret key comment packets when exporting secret keys" msgstr "Kommentarpakete aus geheimen Schlüsseln bei deren Export nicht einschliessen" #: init/completions/gpg.fish:195 msgid "Use specified string as comment string" msgstr "Angegebene Zeichenkette als Kommentar verwenden" #: init/completions/gpg.fish:196 msgid "Don't use a comment string" msgstr "Keinen Kommentar verwenden" #: init/completions/gpg.fish:198 msgid "Include the version string in ASCII armored output" msgstr "Version in ASCII-bewehrte Ausgabe einfügen" #: init/completions/gpg.fish:199 msgid "Don't include the version string in ASCII armored output" msgstr "Version nicht in ASCII-bewehrter Ausgabe einfügen" #: init/completions/gpg.fish:204 msgid "Put the specified name value pair into the signature as notation data" msgstr "Setze das angegeben Wertepaar als Notationsdaten in die Signatur" #: init/completions/gpg.fish:205 msgid "Set signature policy" msgstr "Signaturregeln einrichten" #: init/completions/gpg.fish:206 msgid "Set certificate policy" msgstr "Zertifikats-Regeln einrichten" #: init/completions/gpg.fish:207 msgid "Set signature and certificate policy" msgstr "Signatur- und Zertifikats-Regeln einrichten" #: init/completions/gpg.fish:208 msgid "Use specified URL as a preferred keyserver for data signatures" msgstr "Angegebene URL als bevorzugten Schlüssel-Server für Datensignaturen nutzen" #: init/completions/gpg.fish:210 msgid "Use specified string as the filename which is stored inside messages" msgstr "Angegebene Zeichenkette als in den Nachrichten gespeicherten Dateinamen verwenden" #: init/completions/gpg.fish:212 msgid "Set the 'for your eyes only' flag in the message" msgstr "Die 'for your eyes only'-Markierung in der Nachricht setzen" #: init/completions/gpg.fish:213 msgid "Clear the 'for your eyes only' flag in the message" msgstr "Die 'for your eyes only'-Markierung in der Nachricht löschen" #: init/completions/gpg.fish:215 msgid "Create file with name as given in data" msgstr "Datei mit in den Daten enthaltenem Namen erstellen" #: init/completions/gpg.fish:216 msgid "Don't create file with name as given in data" msgstr "Datei nicht mit in den Daten enthaltenem Namen erstellen" #: init/completions/gpg.fish:218 msgid "Number of completely trusted users to introduce a new key signer (defaults to 1)" msgstr "" #: init/completions/gpg.fish:219 msgid "Number of marginally trusted users to introduce a new key signer (defaults to 3)" msgstr "" #: init/completions/gpg.fish:221 msgid "Maximum depth of a certification chain (default is 5)" msgstr "Maximale Tiefe einer Zertifizierungskette (Standard 5)" #: init/completions/gpg.fish:223 msgid "Use specified cipher algorithm" msgstr "Benutze angegebenen Chiffrier-Algorithmus" #: init/completions/gpg.fish:224 msgid "Use specified message digest algorithm" msgstr "Angegebenen Message-Digest-Algorithmus verwenden" #: init/completions/gpg.fish:225 msgid "Use specified compression algorithm" msgstr "Benutze angegebenen Komprimierungs-Algorithmus" #: init/completions/gpg.fish:226 msgid "Use specified message digest algorithm when signing a key" msgstr "Benutze angegebenen Message-Digest-Algorithmus zum Signieren eines Schlüssels" #: init/completions/gpg.fish:227 msgid "Use specified cipher algorithm to protect secret keys" msgstr "Benutze angegebenen Chiffrier-Algorithmus zum Schutz geheimer Schlüssel" #: init/completions/gpg.fish:228 msgid "Use specified digest algorithm to mangle the passphrases" msgstr "Benutze angegebenen Digest-Algorithmus zum Verstümmeln der Passwortsätze" #: init/completions/gpg.fish:229 msgid "Selects how passphrases are mangled" msgstr "Auswahl, wie Passwort-Sätze verstümmelt werden" #: init/completions/gpg.fish:231 msgid "Integrity protect secret keys by using a SHA-1 checksum" msgstr "Integrität geheimer Schlüssel mittels SHA-1-Prüfsumme schützen" #: init/completions/gpg.fish:233 msgid "Never allow the use of specified cipher algorithm" msgstr "Niemals die Benutzung des angegebenen Chiffrier-Algorithmus zulassen" #: init/completions/gpg.fish:234 msgid "Never allow the use of specified public key algorithm" msgstr "Niemals die Benutzung des angegebenen Algorithmus für öffentliche Schlüssel zulassen" #: init/completions/gpg.fish:236 msgid "Do not cache the verification status of key signatures" msgstr "Überprüfungsstatus von Schlüsselsignaturen nicht zwischenspeichern" #: init/completions/gpg.fish:237 msgid "Do not verify each signature right after creation" msgstr "Nicht jede Signatur direkt nach der Erstellung verifizieren" #: init/completions/gpg.fish:239 msgid "Automatically run the --check-trustdb command internally when needed" msgstr "Den Befehl --check-trustdb automatisch intern starten, falls erforderlich" #: init/completions/gpg.fish:240 msgid "Never automatically run the --check-trustdb" msgstr "--check-trustdb niemals automatisch ausführen" #: init/completions/gpg.fish:242 msgid "Do not put the recipient keyid into encrypted packets" msgstr "Empfänger-Schlüssel-ID nicht in verschlüsselte Pakete einfügen" #: init/completions/gpg.fish:243 msgid "Put the recipient keyid into encrypted packets" msgstr "Empfänger-Schlüssel-ID in verschlüsselte Pakete einfügen" #: init/completions/gpg.fish:244 msgid "Change the behavior of cleartext signatures so that they can be used for patch files" msgstr "Verhalten von Klartext-Signaturen ändern, damit sie für Patch-Dateien genutzt werden können" #: init/completions/gpg.fish:246 msgid "Mangle From-field of email headers (default)" msgstr "From-Feld aus Email-Kopfzeilen verstümmeln (Standard)" #: init/completions/gpg.fish:247 msgid "Do not mangle From-field of email headers" msgstr "From-Feld aus Email-Kopfzeilen nicht verstümmeln" #: init/completions/gpg.fish:249 msgid "Read passphrase from specified file descriptor" msgstr "Passwort-Satz aus dem angegebenen Dateideskriptor lesen" #: init/completions/gpg.fish:250 msgid "Read user input from specified file descriptor" msgstr "Anwendereingaben aus dem angegebenen Dateideskriptor lesen" #: init/completions/gpg.fish:252 msgid "Try to use the GnuPG-Agent" msgstr "Versuche, den GnuPG-Agenten zu nutzen" #: init/completions/gpg.fish:253 msgid "Do not try to use the GnuPG-Agent" msgstr "Nicht versuchen, den GnuPG-Agenten zu nutzen" #: init/completions/gpg.fish:254 msgid "Override value of GPG_AGENT_INFO environment variable" msgstr "Wert der GPG_AGENT_INFO-Umgebungsvariablen überschreiben" #: init/completions/gpg.fish:256 msgid "Force v3 signatures for signatures on data" msgstr "v3-Signaturen für Datensignaturen erzwingen" #: init/completions/gpg.fish:257 msgid "Do not force v3 signatures for signatures on data" msgstr "Keine v3-Signaturen für Datensignaturen erzwingen" #: init/completions/gpg.fish:259 msgid "Always use v4 key signatures even on v3 keys" msgstr "Stets v4-Schlüsselsignaturen verwenden (auch bei v3-Schlüsseln)" #: init/completions/gpg.fish:260 msgid "Don't use v4 key signatures on v3 keys" msgstr "Keine v4-Schlüsselsignaturen mit v3-Schlüsseln verwenden" #: init/completions/gpg.fish:262 msgid "Force the use of encryption with a modification detection code" msgstr "Verschlüsselungsbenutzung mit einem Veränderungs-Erkennungscode erzwingen" #: init/completions/gpg.fish:263 msgid "Disable the use of the modification detection code" msgstr "Benutzung des Veränderungs-Erkennungscodes deaktivieren" #: init/completions/gpg.fish:265 msgid "Allow the import and use of keys with user IDs which are not self-signed" msgstr "Import und Benutzung von Anwender-IDs zulassen, die nicht selbst-signiert sind" #: init/completions/gpg.fish:266 msgid "Do not allow the import and use of keys with user IDs which are not self-signed" msgstr "Import und Benutzung von Anwender-IDs nicht zulassen, die nicht selbst-signiert sind" #: init/completions/gpg.fish:268 msgid "Disable all checks on the form of the user ID while generating a new one" msgstr "Alle Prüfungen des Anwender-ID-Formats deaktivieren, wenn ein neuer generiert wird" #: init/completions/gpg.fish:270 msgid "Do not fail if signature is older than key" msgstr "Nicht abbrechen, wenn die Signatur älter als der Schlüssel ist" #: init/completions/gpg.fish:271 msgid "Allow subkeys that have a timestamp from the future" msgstr "Unterschlüssel erlauben, deren Zeitstempel in der Zukunft liegt" #: init/completions/gpg.fish:272 msgid "Ignore CRC errors" msgstr "CRC-Fehler ignorieren" #: init/completions/gpg.fish:273 msgid "Do not fail on MDC integrity protection failiure" msgstr "Kein Abbruch beim Versagen des MDC-Integritätsschutzes" #: init/completions/gpg.fish:275 msgid "Lock the databases the first time a lock is requested and do not release the lock until the process terminates" msgstr "Datenbank sperren, sobald eine Sperre angefordert wird und nicht freigeben, bevor der Prozess beendet wird" #: init/completions/gpg.fish:276 msgid "Release the locks every time a lock is no longer needed" msgstr "Sperren freigeben, sobald eine Sperre nicht mehr benötigt wird" #: init/completions/gpg.fish:278 msgid "Do not create an internal pool file for quicker generation of random numbers" msgstr "Keine interne Pooldatei für die schnelle Erstellung von Zufallszahlen erstellen" #: init/completions/gpg.fish:279 msgid "Reset verbose level to 0" msgstr "Geschwätzigkeits-Wert auf 0 zurücksetzen" #: init/completions/gpg.fish:280 msgid "Suppress the initial copyright message" msgstr "Copyright-Meldung beim Start unterdrücken" #: init/completions/gpg.fish:281 msgid "Suppress the warning about 'using insecure memory'" msgstr "Warnung über die Verwendung unsicheren Speichers unterdrücken" #: init/completions/gpg.fish:282 msgid "Suppress the warning about unsafe file and home directory (--homedir) permissions" msgstr "Warnung über unsichere Datei- und Startverzeichnisberechtigungen (--homedir) unterdrücken" #: init/completions/gpg.fish:283 msgid "Suppress the warning about missing MDC integrity protection" msgstr "Warnung über fehlenden MDC-Integritätsschutz unterdrücken" #: init/completions/gpg.fish:285 msgid "Refuse to run if GnuPG cannot get secure memory" msgstr "Nicht starten, wenn GnuPG keinen sicheren Speicher benutzen kann" #: init/completions/gpg.fish:287 msgid "Do not refuse to run if GnuPG cannot get secure memory (default)" msgstr "Starten, obwohl GnuPG nicht im sicheren Speicher laufen kann (Standard)" #: init/completions/gpg.fish:288 msgid "Assume the input data is not in ASCII armored format" msgstr "Voraussetzen, das die Eingabedaten nicht im ASCII-bewehrten Format vorliegen" #: init/completions/gpg.fish:290 msgid "Do not add the default keyrings to the list of keyrings" msgstr "Standard-Schlüsselringe nicht der Keyring-Liste hinzufügen" #: init/completions/gpg.fish:292 msgid "Skip the signature verification step" msgstr "Verifizierung der Signatur überspringen" #: init/completions/gpg.fish:294 msgid "Print key listings delimited by colons" msgstr "Schlüsselauflistungen mit Doppelpunkt getrennt anzeigen" #: init/completions/gpg.fish:295 msgid "Print key listings delimited by colons (like --with-colons) and print the public key data" msgstr "Begrenzt Schlüsselauflistungen mit Doppelpunkt (wie --with-colons) und gibt die Daten des öffentlichen Schlüssels aus" #: init/completions/gpg.fish:296 msgid "Same as the command --fingerprint but changes only the format of the output and may be used together with another command" msgstr "Entspricht dem Befehl --fingerprint, ändert aber nur das Ausgabeformat und kann mit anderen Befehlen zusammen genutzt werden" #: init/completions/gpg.fish:298 msgid "Changes the output of the list commands to work faster" msgstr "Ändert die Ausgabe der List-Befehle für schnellere Abarbeitung" #: init/completions/gpg.fish:299 msgid "Do not merge primary user ID and primary key in --with-colon listing mode and print all timestamps as UNIX timestamps" msgstr "Im Anzeigemodus --with-colon primäre Anwender-ID und primären Schlüssel nicht mischen und alle Zeitstempel als UNIX-Zeitstempel ausgeben" #: init/completions/gpg.fish:301 msgid "Changes the behaviour of some commands. This is like --dry-run but different" msgstr "Ändert das Verhalten einiger Befehle. Ähnlich --dry-run, aber doch anders" #: init/completions/gpg.fish:303 msgid "Display the session key used for one message" msgstr "Zeige den für eine Nachricht benutzten Sitzungsschlüssel an" #: init/completions/gpg.fish:304 msgid "Don't use the public key but the specified session key" msgstr "Nicht den öffentlichen Schlüssel, sondern den angegebenen Sitzungsschlüssel benutzen" #: init/completions/gpg.fish:306 init/completions/gpg.fish:309 msgid "Prompt for an expiration time" msgstr "Nach Ablaufzeit fragen" #: init/completions/gpg.fish:307 init/completions/gpg.fish:310 msgid "Do not prompt for an expiration time" msgstr "Nicht nach einer Ablaufzeit fragen" #: init/completions/gpg.fish:312 msgid "Don't look at the key ID as stored in the message but try all secret keys in turn to find the right decryption key" msgstr "Die in der Nachricht gespeicherte Schlüssel-ID nicht beachten, sondern alle geheimen Schlüssel zum Finden des richtigen Entschlüsselungs-Schlüsseln versuchen" #: init/completions/gpg.fish:313 msgid "Enable a mode in which filenames of the form -&n, where n is a non-negative decimal number, refer to the file descriptor n and not to a file with that name" msgstr "" #: init/completions/gpg.fish:315 msgid "Sets up a named group, which is similar to aliases in email programs" msgstr "Richtet eine benannte Gruppe ein, die einem alias in Email-Programmen entspricht" #: init/completions/gpg.fish:316 msgid "Remove a given entry from the --group list" msgstr "Angegebenen Eintrag aus der --group-Liste entfernen" #: init/completions/gpg.fish:317 msgid "Remove all entries from the --group list" msgstr "Alle Einträge aus der --group-Liste entfernen" #: init/completions/gpg.fish:319 msgid "Don't change the permissions of a secret keyring back to user read/write only" msgstr "Berechtigungen eines geheimen Schlüsselrings nicht auf Lesen/Schreiben für den Eigentümer zurücksetzen" #: init/completions/gpg.fish:321 msgid "Set the list of personal cipher preferences to the specified string" msgstr "Setze die Liste der persönlichen Chiffrier-Einstellungen gemäß der angegebenen Zeichenkette" #: init/completions/gpg.fish:322 msgid "Set the list of personal digest preferences to the specified string" msgstr "Setze die Liste der persönlichen Übersichtseinstellungen gemäß der angegebenen Zeichenkette" #: init/completions/gpg.fish:323 msgid "Set the list of personal compression preferences to the specified string" msgstr "Setze die Liste der persönlichen Komprimierungseinstellungen gemäß der angegebenen Zeichenkette" #: init/completions/gpg.fish:324 msgid "Set the list of default preferences to the specified string" msgstr "Setze die Liste der Standardeinstellungen gemäß der angegebenen Zeichenkette" #: init/completions/gprof.fish:1 msgid "Print annotated source" msgstr "Kommentierte Quelle anzeigen" #: init/completions/gprof.fish:2 msgid "Do not print explanations" msgstr "Keine Erklärungen anzeigen" #: init/completions/gprof.fish:3 msgid "Print tally" msgstr "Zähler ausgeben" #: init/completions/gprof.fish:4 msgid "Display summary" msgstr "Zusammenfassung anzeigen" #: init/completions/gprof.fish:5 msgid "Search directories for source" msgstr "Verzeichnisse nach Quelle durchsuchen" #: init/completions/gprof.fish:6 msgid "No annotated source" msgstr "Keine kommentierte Quelle" #: init/completions/gprof.fish:7 msgid "Print full path of source" msgstr "Vollständigen Quellpfad ausgeben" #: init/completions/gprof.fish:8 msgid "Print flat profile" msgstr "" #: init/completions/gprof.fish:9 msgid "No flat profile" msgstr "" #: init/completions/gprof.fish:10 msgid "Print call graph" msgstr "Aufrufgraph ausgeben" #: init/completions/gprof.fish:11 msgid "No call graph" msgstr "Kein Aufrufgraph" #: init/completions/gprof.fish:12 msgid "Annotate to file" msgstr "Kommentare in Datei" #: init/completions/gprof.fish:13 msgid "No tally" msgstr "Keine Zählung" #: init/completions/gprof.fish:14 msgid "Suggest function ordering" msgstr "Funktionssortierung vorschlagen" #: init/completions/gprof.fish:15 msgid "Suggest file ordering" msgstr "Dateisortierung vorschlagen" #: init/completions/gprof.fish:16 msgid "Traditional mode" msgstr "Traditioneller Modus" #: init/completions/gprof.fish:17 msgid "Set width of output" msgstr "Ausgabebreite setzen" #: init/completions/gprof.fish:18 msgid "Anotate every line" msgstr "Kommentiere jede Zeile" #: init/completions/gprof.fish:19 msgid "Set demangling style" msgstr "Format für Entfernen der Zusatzinformation setzen" #: init/completions/gprof.fish:20 msgid "Turn of demangling" msgstr "Entfernung der Zusatzinformationen abschalten" #: init/completions/gprof.fish:21 msgid "Supress static functions" msgstr "Unterdrücke statische Funktionen" #: init/completions/gprof.fish:23 msgid "Ignore symbols not known to be functions" msgstr "Ignoriere nicht als Funktionen bekannte Symbole" #: init/completions/gprof.fish:24 msgid "Delete arcs from callgraph" msgstr "" #: init/completions/gprof.fish:25 msgid "Line by line profiling" msgstr "Zeilenweise Profilieren" #: init/completions/gprof.fish:26 msgid "Supress output when executed less than specified times" msgstr "Ausgabe unterdrücken, wenn weniger als angegeben ausgeführt" #: init/completions/gprof.fish:27 msgid "Only propagate times for matching symbols" msgstr "Zeiten nur für passende Symbole propagieren" #: init/completions/gprof.fish:28 msgid "Do not propagate times for matching symbols" msgstr "Zeiten für passende Symbole nicht propagieren" #: init/completions/gprof.fish:29 msgid "Mention unused functions in flat profile" msgstr "Unbenutzte Funktionen im pauschalen Profil erwähnen" #: init/completions/gprof.fish:30 msgid "Specify debugging options" msgstr "Debug-Optionen angegeben" #: init/completions/gprof.fish:33 msgid "Profile data format" msgstr "" #: init/completions/gprof.fish:34 msgid "Print summary" msgstr "Zusammenfassung anzeigen" #: init/completions/grep.fish:5 msgid "Print NUM lines of trailing context" msgstr "NUM folgende Kontext-Zeilen anzeigen" #: init/completions/grep.fish:6 msgid "Process binary file as text" msgstr "Binärdateien als Text behandeln" #: init/completions/grep.fish:7 msgid "Print NUM lines of leading context" msgstr "NUM führende Kontext-Zeilen anzeigen" #: init/completions/grep.fish:8 msgid "Print NUM lines of context" msgstr "NUM Kontext-Zeilen anzeigen" #: init/completions/grep.fish:9 msgid "Print byte offset of matches" msgstr "Byte-Offset von Treffern anzeigen" #: init/completions/grep.fish:10 msgid "Assume data type for binary files" msgstr "Datentyp für Binärdateien unterstellen" #: init/completions/grep.fish:13 msgid "Only print number of matches" msgstr "Nur Anzahl von Treffern anzeigen" #: init/completions/grep.fish:14 msgid "Action for devices" msgstr "Aktion für Gerätedateien" #: init/completions/grep.fish:15 msgid "Action for directories" msgstr "Aktion für Verzeichnisse" #: init/completions/grep.fish:16 msgid "Pattern is extended regexp" msgstr "Muster ist ein erweiterter regulärer Ausdruck" #: init/completions/grep.fish:17 msgid "Pattern is a regexp" msgstr "Muster ist ein regulärer Ausdruck" #: init/completions/grep.fish:18 msgid "Pattern is a fixed string" msgstr "Muster ist eine feststehende Zeichenkette" #: init/completions/grep.fish:19 msgid "Use pattern from file" msgstr "Muster aus Datei nutzen" #: init/completions/grep.fish:20 msgid "Pattern is basic regex" msgstr "Muster ist ein einfacher regulärer Ausdruck" #: init/completions/grep.fish:21 msgid "Print filename" msgstr "Dateiname anzeigen" #: init/completions/grep.fish:22 msgid "Supress printing filename" msgstr "Dateinamenanzeige unterdrücken" #: init/completions/grep.fish:24 msgid "Skip binary files" msgstr "Binärdateien überspringen" #: init/completions/grep.fish:25 init/completions/sort.fish:3 msgid "Ignore case" msgstr "Gross-/Kleinschreibung ignorieren" #: init/completions/grep.fish:26 msgid "Print first non-matching file" msgstr "Erste nicht zutreffende Datei anzeigen" #: init/completions/grep.fish:27 msgid "Print first matching file" msgstr "Erste zutreffende Datei anzeigen" #: init/completions/grep.fish:28 msgid "Stop reading after NUM matches" msgstr "Lesen nach NUM Treffern beenden" #: init/completions/grep.fish:29 msgid "Use the mmap system call to read input" msgstr "mmap-Systemaufruf zum Lesen der Eingabe nutzen" #: init/completions/grep.fish:30 msgid "Print linenumber" msgstr "Zeilennummer anzeigen" #: init/completions/grep.fish:31 msgid "Show only matching part" msgstr "Nur zutreffenden Teil zeigen" #: init/completions/grep.fish:32 msgid "Rename stdin" msgstr "Standardeingabe umbenennen" #: init/completions/grep.fish:33 init/completions/sed.fish:36 msgid "Use line buffering" msgstr "Zeilenpufferung benutzen" #: init/completions/grep.fish:34 init/completions/grep.fish:35 msgid "Do not write anything" msgstr "Nichts schreiben" #: init/completions/grep.fish:36 init/completions/grep.fish:37 msgid "Read files under each directory" msgstr "Dateien unter jedem Verzeichnis lesen" #: init/completions/grep.fish:38 msgid "Recurse, search file matching PATTERN" msgstr "Rekursiv, Dateien gemäß MUSTER suchen" #: init/completions/grep.fish:39 msgid "Recurse, skip file matching PATTERN" msgstr "Rekursiv, dem MUSTER entsprechende Dateien überspringen" #: init/completions/grep.fish:40 msgid "Suppress error messages" msgstr "Fehlermeldungen unterdrücken" #: init/completions/grep.fish:41 msgid "Treat files as binary" msgstr "Dateien als binär behandeln" #: init/completions/grep.fish:42 msgid "Report Unix-style byte offsets" msgstr "Byte-Offset im Unix-Format angeben" #: init/completions/grep.fish:44 msgid "Invert the sense of matching" msgstr "Bedeutung der Treffer umkehren" #: init/completions/grep.fish:45 msgid "Only whole matching words" msgstr "Nur vollständig übereinstimmende Worte" #: init/completions/grep.fish:46 msgid "Only whole matching lines" msgstr "Nur vollständig übereinstimmende Zeilen" #: init/completions/grep.fish:47 msgid "Synonym for -i" msgstr "Synonym für -i" #: init/completions/grep.fish:48 msgid "Output a zero byte after filename" msgstr "Ein Null-Byte nach dem Dateinamen ausgeben" #: init/completions/gunzip.fish:9 init/completions/gzip.fish:11 msgid "List compression information" msgstr "Komprimierungsinformation anzeigen" #: init/completions/gunzip.fish:11 init/completions/gzip.fish:13 msgid "Do not save/restore filename" msgstr "Dateiname nciht (zurück)sichern" #: init/completions/gunzip.fish:12 init/completions/gzip.fish:14 msgid "Save/restore filename" msgstr "Dateiname (zurück)sichern" #: init/completions/gunzip.fish:13 init/completions/gzip.fish:15 msgid "Supress warnings" msgstr "Warnungen unterdrücken" #: init/completions/gunzip.fish:14 init/completions/gzip.fish:16 msgid "Recurse directories" msgstr "Verzeichnisse rekursiv durchlaufen" #: init/completions/gunzip.fish:15 init/completions/gzip.fish:17 msgid "Suffix" msgstr "Suffix" #: init/completions/gunzip.fish:17 init/completions/gzip.fish:19 msgid "Display compression ratios" msgstr "Komprimierungsverhältnis anzeigen" #: init/completions/gzip.fish:21 msgid "Use fast setting" msgstr "Einstellung für Schnelligkeit verwenden" #: init/completions/gzip.fish:22 msgid "Use high compression setting" msgstr "Einstellung für hohe Kompression verwenden" #: init/completions/help.fish:6 msgid "Help for the '%s' builtin" msgstr "Hilfe zur eingebauten Funktion '%s'" #: init/completions/help.fish:10 msgid "Help for the '%s' command" msgstr "Hilfe für den Befehl '%s'" #: init/completions/help.fish:14 msgid "Help section on %s" msgstr "Hilfeabschnitt zu %s" #: init/completions/help.fish:17 msgid "Help on how tab-completion works" msgstr "Hilfe zur Tab-Vervollständigung" #: init/completions/help.fish:18 msgid "Help on how job control works" msgstr "Hilfe zur Jobsteuerung" #: init/completions/help.fish:19 msgid "Summary on how fish differs from other shells" msgstr "Zusammenfassung der Unterschiede zwischen fish und anderen shells" #: init/completions/help.fish:21 msgid "Help on how to set the prompt" msgstr "Hilfe zum Setzen des Prompts" #: init/completions/help.fish:22 msgid "Help on how to set the titlebar message" msgstr "Hilfe zum Einrichten der Titelzeilen-Nachricht" #: init/completions/help.fish:23 msgid "Help on how to copy and paste" msgstr "Hilfe zum Kopieren und Einfügen" #: init/completions/help.fish:24 msgid "Help on editor shortcuts" msgstr "Hilfe zu Editor-Tastenkürzeln" #: init/completions/help.fish:25 msgid "Help on environment variables" msgstr "Hilfe zu Umgebungsvariablen" #: init/completions/help.fish:26 msgid "Help on setting syntax highlighting colors" msgstr "Hilfe zur Farbeinrichtung zur Syntaxhervorhebung" #: init/completions/help.fish:27 msgid "A short summary of all builtin commands" msgstr "Kurze Zusammenfassung aller eingebauten Befehle" #: init/completions/help.fish:29 init/completions/help.fish:30 msgid "Help on parameter expansion (Globbing)" msgstr "Hilfe zur Parameter-Expansion (Dateinamen)" #: init/completions/help.fish:31 #, sh-format msgid "Help on variable expansion $VARNAME" msgstr "Hilfe zur Variablen-Expansion $VARNAME" #: init/completions/help.fish:32 msgid "Help on home directory expansion ~USER" msgstr "Hilfe zur Startverzeichnis-Expansion ~USER" #: init/completions/help.fish:33 msgid "Help on brace expansion {a,b,c}" msgstr "Hilfe zur Klammer-Expansion {a,b,c}" #: init/completions/help.fish:34 msgid "Help on wildcard expansion *.*" msgstr "Hilfe zur Muster-Expansion *.*" #: init/completions/help.fish:35 msgid "Help on command substututions (SUBCOMMAND)" msgstr "Hilfe zu Befehlsersetzungen (SUBCOMMAND)" #: init/completions/help.fish:36 msgid "Help on process expansion %JOB" msgstr "Hilfe zur Prozess-Expansion %JOB" #: init/completions/id.fish:1 msgid "Print effective group id" msgstr "Effektive Gruppen-ID anzeigen" #: init/completions/id.fish:2 msgid "Print all group ids" msgstr "Alle Gruppen-IDs anzeigen" #: init/completions/id.fish:3 msgid "Print name, not number" msgstr "Name, nicht Nummer, anzeigen" #: init/completions/id.fish:4 msgid "Print real ID, not effective" msgstr "Reale, nicht effektive ID anzeigen" #: init/completions/id.fish:5 msgid "Print effective user ID" msgstr "Effektive Anwender-ID anzeigen" #: init/completions/ifconfig.fish:1 msgid "Stop interface" msgstr "Schnittstelle stoppen" #: init/completions/ifconfig.fish:2 msgid "Start interface" msgstr "Schnittstelle starten" #: init/completions/ifconfig.fish:25 msgid "Network interface" msgstr "Netzwerkschnittstelle" #: init/completions/jobs.fish:3 msgid "Show the process id of each process in the job" msgstr "Prozess-ID jeden Prozesses im Job zeigen" #: init/completions/jobs.fish:4 msgid "Show group id of job" msgstr "Gruppen-ID des Jobs zeigen" #: init/completions/jobs.fish:5 msgid "Show commandname of each job" msgstr "Befehlsnamen eines jeden Jobs zeigen" #: init/completions/jobs.fish:6 msgid "Only show status for last job to be started" msgstr "Nur Status für zuletzt gestarteten Job zeigen" #: init/completions/kill.fish:34 msgid "List names of available signals" msgstr "Namen der verfügbaren Signale anzeigen" #: init/completions/less.fish:2 msgid "Search after end of screen" msgstr "Über Bildschirmende hinaus suchen" #: init/completions/less.fish:3 msgid "Buffer space" msgstr "Pufferplatz" #: init/completions/less.fish:4 msgid "Disable automtic buffer allocation" msgstr "Automatische Pufferzuordnung deaktivieren" #: init/completions/less.fish:5 msgid "Repaint from top" msgstr "von oben neu anzeigen" #: init/completions/less.fish:6 msgid "Clear and repaint from top" msgstr "Löschen und von oben neu anzeigen" #: init/completions/less.fish:7 msgid "Supress error for lacking terminal capability" msgstr "Fehler für fehlende Terminaleigenschaft unterdrücken" #: init/completions/less.fish:8 msgid "Exit on second EOF" msgstr "Ende bei zweitem EOF" #: init/completions/less.fish:9 msgid "Exit on EOF" msgstr "Bei Dateiende beenden" #: init/completions/less.fish:10 msgid "Open non-regular files" msgstr "Nicht-reguläre Dateien öffnen" #: init/completions/less.fish:11 msgid "Quit if file shorter than one screen" msgstr "Beenden, wenn die Datei kürzer als eine Bildschirmseite ist" #: init/completions/less.fish:12 msgid "Hilight one search target" msgstr "Ein Suchziel hervorheben" #: init/completions/less.fish:13 msgid "No search highlighting" msgstr "Keine Hervorhebung bei Suche" #: init/completions/less.fish:14 msgid "Maximum backward scroll" msgstr "Maximum für Rückwärtsblättern" #: init/completions/less.fish:15 msgid "Search ignores lowercase case" msgstr "Suche ignoriert Kleinschreibung" #: init/completions/less.fish:16 msgid "Search ignores all case" msgstr "Suche ignoriert Gross-/Kleinschreibung " #: init/completions/less.fish:17 msgid "Target line" msgstr "Zielzeile" #: init/completions/less.fish:18 msgid "Display status column" msgstr "Statusspalte anzeigen" #: init/completions/less.fish:19 msgid "Specify key bindings file" msgstr "Datei mit Tastaturbindungen angeben" #: init/completions/less.fish:21 msgid "Prompt with percentage" msgstr "Prompt mit Prozentanzeige" #: init/completions/less.fish:22 msgid "Verbose prompt" msgstr "Ausführlicher Prompt" #: init/completions/less.fish:23 msgid "Display line number" msgstr "Zeilennummer anzeigen" #: init/completions/less.fish:24 msgid "Display line number for each line" msgstr "Zeilennummer für jede Zeile anzeigen" #: init/completions/less.fish:25 msgid "Log input to file" msgstr "Eingabe in Datei protokollieren" #: init/completions/less.fish:26 msgid "Log to file, overwrite" msgstr "Protokoll in Datei, überschreiben" #: init/completions/less.fish:27 msgid "Start at first occorance of pattern" msgstr "Start beim ersten Vorkommen des Musters" #: init/completions/less.fish:28 msgid "Prompt string" msgstr "Prompt-Anzeige" #: init/completions/less.fish:29 init/completions/less.fish:30 #: init/completions/sed.fish:12 init/completions/sed.fish:21 msgid "Silent mode" msgstr "Ruhiger Modus" #: init/completions/less.fish:31 init/completions/less.fish:32 msgid "Completly silent mode" msgstr "Vollständig ruhiger Modus" #: init/completions/less.fish:33 msgid "Display control chars" msgstr "Steuerzeichen anzeigen" #: init/completions/less.fish:34 msgid "Display control chars, guess screen appearance" msgstr "Steuerzeichen anzeigen, Anzeige erraten" #: init/completions/less.fish:35 msgid "Multiple blank lines sqeezed" msgstr "Mehrere Leerzeilen zusammengefasst" #: init/completions/less.fish:36 msgid "Do not fold long lines" msgstr "Lange Zeilen nicht umbrechen" #: init/completions/less.fish:37 msgid "Edit tag" msgstr "Kennzeichnung bearbeiten" #: init/completions/less.fish:38 msgid "Set tag file" msgstr "Kennzeichnungsdatei setzen" #: init/completions/less.fish:39 msgid "Allow backspace and carriage return" msgstr "Rückschritt und Zeilenschaltung zulassen" #: init/completions/less.fish:40 msgid "Allow backspace, tab and carriage return" msgstr "Rückschritt, Tab und Zeilenschaltung zulassen" #: init/completions/less.fish:42 msgid "Highlight first unread line on new page" msgstr "Erste ungelesene Zeile auf neuer Seite hervorheben" #: init/completions/less.fish:43 msgid "Highlight first unread line on any movement" msgstr "Erste ungelesene Zeile bei Verschiebung hervorheben" #: init/completions/less.fish:44 msgid "Set tab stops" msgstr "Tab-Stopps setzen" #: init/completions/less.fish:45 msgid "No termcap init" msgstr "Keine termcap-Initialisierung" #: init/completions/less.fish:46 msgid "No keypad init" msgstr "Keine Ziffernblock-Initialisierung" #: init/completions/less.fish:47 msgid "Maximum forward scroll" msgstr "Maximum für Vorwärtsblättern" #: init/completions/less.fish:48 msgid "Max scroll window" msgstr "Maximale Fenstergrösse für Blättern" #: init/completions/less.fish:49 msgid "Set quote char" msgstr "Markierungszeichen setzen" #: init/completions/less.fish:50 msgid "Lines after EOF are blank" msgstr "Zeilen nach EOF sind leer" #: init/completions/less.fish:51 msgid "Characters to scroll on left/right arrows" msgstr "Anzahl zu blätternde Zeichen bei Links-/Rechts-Pfeilen" #: init/completions/ls.fish:14 msgid "Show hidden" msgstr "Zeige versteckte Dateien" #: init/completions/ls.fish:15 msgid "Show hidden except . and .." msgstr "Zeige versteckte Dateien ausser . und .." #: init/completions/ls.fish:16 init/completions/ls.fish:25 #: init/completions/ls.fish:57 msgid "Append filetype indicator" msgstr "Dateityp-Anzeige anhängen" #: init/completions/ls.fish:17 init/completions/ls.fish:18 msgid "Follow symlinks" msgstr "Symbolischen Links folgen" #: init/completions/ls.fish:19 msgid "List subdirectory recursively" msgstr "Unterverzeichnisse rekursiv anzeigen" #: init/completions/ls.fish:20 init/completions/ls.fish:95 msgid "Octal escapes for non graphic characters" msgstr "Oktaldarstellung für nichtgrafische Zeichen" #: init/completions/ls.fish:21 msgid "List directories, not their content" msgstr "Verzeichnisse, aber nicht deren Inhalt anzeigen" #: init/completions/ls.fish:23 msgid "Print inode number of files" msgstr "Inode-Nummer der Dateien anzeigen" #: init/completions/ls.fish:24 msgid "Long format, numeric IDs" msgstr "Langformat, numerische IDs" #: init/completions/ls.fish:26 msgid "Replace non-graphic characters with '?'" msgstr "nicht darstellbare Zeichen durch '?' ersetzen" #: init/completions/ls.fish:27 msgid "Reverse sort order" msgstr "Sortierreihenfolge umkehren" #: init/completions/ls.fish:28 msgid "Print size of files" msgstr "Größe der Dateien anzeigen" #: init/completions/ls.fish:30 msgid "List by columns" msgstr "Nach Spalten anzeigen" #: init/completions/ls.fish:31 msgid "Sort by size" msgstr "Nach Größe sortieren" #: init/completions/ls.fish:32 msgid "Show and sort by ctime" msgstr "Nach ctime sortieren und anzeigen" #: init/completions/ls.fish:33 msgid "Don't sort" msgstr "Nicht sortieren" #: init/completions/ls.fish:34 msgid "Long format without owner" msgstr "Langformat ohne Eigentümer" #: init/completions/ls.fish:35 msgid "Set blocksize to 1kB" msgstr "Blockgrösse auf 1kB setzen" #: init/completions/ls.fish:36 init/completions/ps.fish:25 msgid "Long format" msgstr "Langformat" #: init/completions/ls.fish:37 msgid "Comma separated format" msgstr "Komma-getrenntes Format" #: init/completions/ls.fish:38 msgid "Sort by modification time" msgstr "Nach Veränderungsdatum sortieren" #: init/completions/ls.fish:39 msgid "Show access time" msgstr "Zugriffszeit zeigen" #: init/completions/ls.fish:40 msgid "List entries by lines" msgstr "" #: init/completions/ls.fish:41 msgid "List one file per line" msgstr "Eine Datei pro Zeile anzeigen" #: init/completions/ls.fish:47 msgid "Print author" msgstr "Autor ausgeben" #: init/completions/ls.fish:48 msgid "Set block size" msgstr "Blockgrösse setzen" #: init/completions/ls.fish:49 msgid "Ignore files ending with ~" msgstr "Dateien ignorieren, die mit ~ enden" #: init/completions/ls.fish:50 init/completions/ls.fish:96 msgid "Use colors" msgstr "Farben benutzen" #: init/completions/ls.fish:51 msgid "Generate dired output" msgstr "dired-Ausgabe erzeugen" #: init/completions/ls.fish:52 msgid "List format" msgstr "Listenformat" #: init/completions/ls.fish:53 msgid "Long format, full-iso time" msgstr "Langformat, volle ISO-Zeit" #: init/completions/ls.fish:54 msgid "Don't print group information" msgstr "Keine Gruppen-Information ausgeben" #: init/completions/ls.fish:58 msgid "Skip entries matching pattern" msgstr "Dem Muster entsprechende Einträge übergehen" #: init/completions/ls.fish:59 init/completions/ls.fish:103 msgid "Print raw entry names" msgstr "" #: init/completions/ls.fish:60 msgid "Long format without groups" msgstr "Langformat ohne Gruppen" #: init/completions/ls.fish:61 msgid "Non graphic as-is" msgstr "Nicht darstellbare Zeichen unverändert lassen" #: init/completions/ls.fish:62 msgid "Enclose entry in quotes" msgstr "Eintrag in Markierungen einschliessen" #: init/completions/ls.fish:63 msgid "Select quoting style" msgstr "Markierungsstil wählen" #: init/completions/ls.fish:64 msgid "Sort criteria" msgstr "Sortier-Kriterien" #: init/completions/ls.fish:75 msgid "Show time type" msgstr "Zeittyp zeigen" #: init/completions/ls.fish:82 msgid "Select time style" msgstr "Zeitformat wählen" #: init/completions/ls.fish:83 msgid "Assume tab stops at each COLS" msgstr "Tab-Stopp bei jeder COLS annehmen" #: init/completions/ls.fish:84 msgid "Do not sort" msgstr "Nicht sortieren" #: init/completions/ls.fish:85 msgid "Sort by version" msgstr "Sortierung nach Version" #: init/completions/ls.fish:86 msgid "Assume screen width" msgstr "Angenommene Bildschirmbreite" #: init/completions/ls.fish:87 msgid "Sort by extension" msgstr "Sortierung nach Erweiterung" #: init/completions/ls.fish:97 msgid "Prevent -A from being automatically set for root" msgstr "Für root nicht automatisch -A setzen" #: init/completions/ls.fish:98 msgid "Don't follow symlinks" msgstr "Symbolischen Links nicht folgen" #: init/completions/ls.fish:99 msgid "Show modification time" msgstr "Änderungsdatum anzeigen" #: init/completions/ls.fish:100 msgid "Show whiteouts when scanning directories" msgstr "" #: init/completions/ls.fish:101 msgid "Display each file's MAC label" msgstr "MAC-Markierung jeder Datei zeigen" #: init/completions/ls.fish:102 msgid "Include the file flags in a long (-l) output" msgstr "Datei-Kennungen in langer (-l) Ausgabe einfügen" #: init/completions/makedepend.fish:1 msgid "Define" msgstr "Definiere" #: init/completions/makedepend.fish:2 msgid "Include directory" msgstr "include-Verzeichnis" #: init/completions/makedepend.fish:3 msgid "Replace include directories" msgstr "include-Verzeichnisse ersetzen" #: init/completions/makedepend.fish:4 msgid "Append dependencies to makefile" msgstr "Abhängigkeiten an makefile anhängen" #: init/completions/makedepend.fish:5 msgid "Specify makefile" msgstr "makefile angeben" #: init/completions/makedepend.fish:6 msgid "Prepend file to input" msgstr "Datei der Eingabe voranstellen" #: init/completions/makedepend.fish:7 msgid "Object file suffix" msgstr "Suffix für Objektdatei" #: init/completions/makedepend.fish:8 msgid "Object file prefix" msgstr "Prefix für Objektdatei" #: init/completions/makedepend.fish:9 msgid "Starting string delimiter" msgstr "Start-Begrenzer für Zeichenketten" #: init/completions/makedepend.fish:10 msgid "Line width" msgstr "Zeilenbreite" #: init/completions/makedepend.fish:12 msgid "Warn about multiple inclusion" msgstr "bei mehrmaligen Einschluss warnen" #: init/completions/make.fish:8 msgid "Target" msgstr "Ziel" #: init/completions/make.fish:9 msgid "Use file as makefile" msgstr "Datei als makefile verwenden" #: init/completions/make.fish:10 init/completions/tar.fish:15 msgid "Change directory" msgstr "Verzeichnis wechseln" #: init/completions/make.fish:12 msgid "Environment before makefile" msgstr "Umgebung vor makefile" #: init/completions/make.fish:13 msgid "Ignore errors" msgstr "Fehler ignorieren" #: init/completions/make.fish:14 msgid "Search directory for makefile" msgstr "Verzeichnis nach makefile durchsuchen" #: init/completions/make.fish:15 msgid "Number of concurrent jobs" msgstr "Anzahl gleichzeitiger Jobs" #: init/completions/make.fish:16 msgid "Continue after an error" msgstr "Fortsetzung nach Fehler" #: init/completions/make.fish:17 msgid "Start when load drops" msgstr "Start, wenn die Systemlast sinkt" #: init/completions/make.fish:18 msgid "Do not execute commands" msgstr "Keine Befehle ausführen" #: init/completions/make.fish:19 msgid "Ignore specified file" msgstr "Angegebene Datei ignorieren" #: init/completions/make.fish:20 msgid "Print database" msgstr "Datenbank ausgeben" #: init/completions/make.fish:21 msgid "Question mode" msgstr "Fragemodus" #: init/completions/make.fish:22 msgid "Eliminate implicit rules" msgstr "implizite Regeln beseitigen" #: init/completions/make.fish:24 msgid "Don't continue after an error" msgstr "Keine Fortsetzung bei Fehlern" #: init/completions/make.fish:25 msgid "Touch files, don't run commands" msgstr "Dateien ändern, keine Befehle ausführen" #: init/completions/make.fish:27 msgid "Print working directory" msgstr "Arbeitsverzeichnis anzeigen" #: init/completions/make.fish:28 msgid "Pretend file is modified" msgstr "" #: init/completions/man.fish:32 msgid "Program section" msgstr "Programm-Sektion" #: init/completions/man.fish:33 msgid "Syscall section" msgstr "Sektion zu Systemaufrufen" #: init/completions/man.fish:34 msgid "Library section" msgstr "Bibliotheks-Sektion" #: init/completions/man.fish:35 msgid "Device section" msgstr "Geräte-Sektion" #: init/completions/man.fish:36 msgid "File format section" msgstr "Sektion für Dateiformate" #: init/completions/man.fish:37 msgid "Games section" msgstr "Spiele-Sektion" #: init/completions/man.fish:38 msgid "Misc section" msgstr "Sektion für sonstiges" #: init/completions/man.fish:39 msgid "Admin section" msgstr "Adminstrations-Sektion" #: init/completions/man.fish:40 msgid "Kernel section" msgstr "Kernel-Sektion" #: init/completions/man.fish:41 msgid "Tcl section" msgstr "Tcl-Sektion" #: init/completions/man.fish:42 msgid "New section" msgstr "Neue Sektion" #: init/completions/man.fish:43 msgid "Local section" msgstr "Lokale Sektion" #: init/completions/man.fish:45 msgid "Old section" msgstr "Alte Sektion" #: init/completions/man.fish:46 init/completions/modprobe.fish:7 #: init/completions/ssh.fish:12 init/completions/yum.fish:51 msgid "Configuration file" msgstr "Konfigurationsdatei" #: init/completions/man.fish:47 msgid "Manpath" msgstr "Pfad für Handbuchseiten" #: init/completions/man.fish:48 msgid "Pager" msgstr "Anzeigeprogramm" #: init/completions/man.fish:49 msgid "Manual sections" msgstr "Handbuch-Sektionen" #: init/completions/man.fish:50 msgid "Display all matches" msgstr "Alle Übereinstimmungen zeigen" #: init/completions/man.fish:51 msgid "Always reformat" msgstr "immer neuformatieren" #: init/completions/man.fish:52 msgid "Debug" msgstr "Debug" #: init/completions/man.fish:53 msgid "Debug and run" msgstr "Debug und Ausführung" #: init/completions/man.fish:54 msgid "Show whatis information" msgstr "whatis-Information zeigen" #: init/completions/man.fish:55 msgid "Format only" msgstr "" #: init/completions/man.fish:57 msgid "Show apropos information" msgstr "apropos-Information zeigen" #: init/completions/man.fish:58 msgid "Search in all man pages" msgstr "In allen Handbuchseiten suchen" #: init/completions/man.fish:59 msgid "Set system" msgstr "System setzen" #: init/completions/man.fish:60 msgid "Preprocessors" msgstr "Preprozessoren" #: init/completions/man.fish:61 msgid "Format for printing" msgstr "Druckformat" #: init/completions/man.fish:62 init/completions/man.fish:63 msgid "Only print locations" msgstr "Nur Lokationen anzeigen" #: init/completions/mimedb.fish:1 msgid "Input is a file, use name and contents to determine mimetype" msgstr "Eingabe ist eine Datei, Namen und Inhalt zur mime-Typbestimmung benutzen" #: init/completions/mimedb.fish:2 msgid "Input is a file, use name to determine mimetype" msgstr "Eingabe ist eine Datei, Namen zur mime-Typbestimmung benutzen" #: init/completions/mimedb.fish:3 msgid "Input is a mimetype" msgstr "Eingabe ist ein mime-Typ" #: init/completions/mimedb.fish:4 msgid "Output mimetype" msgstr "mime-Typ ausgeben" #: init/completions/mimedb.fish:5 msgid "Output description of mimetype" msgstr "Beschreibung des mime-Typs ausgeben" #: init/completions/mimedb.fish:6 msgid "Output default action for mimetype" msgstr "Standardaktion für mime-Typ ausgeben" #: init/completions/mimedb.fish:7 msgid "Launch default action for each file" msgstr "Starte Standardakion für jede Datei" #: init/completions/modprobe.fish:6 msgid "Print messages about what the program is doing" msgstr "Nachrichten über den Programmablauf ausgeben" #: init/completions/modprobe.fish:8 msgid "Dump configuration file" msgstr "Konfigurationsdatei ausgeben" #: init/completions/modprobe.fish:9 msgid "Do not actually insert/remove module" msgstr "Modul nicht wirklich laden/entfernen" #: init/completions/modprobe.fish:10 init/completions/modprobe.fish:11 msgid "Ignore install and remove commands in configuration file" msgstr "Installations- und Löschbefehle der Konfigurationsdatei ignorieren" #: init/completions/modprobe.fish:12 msgid "Ignore bogus module names" msgstr "gefälschte Modulnamen ignorieren" #: init/completions/modprobe.fish:13 msgid "Remove modules" msgstr "Module entfernen" #: init/completions/modprobe.fish:15 msgid "Ignore all version information" msgstr "Sämtliche Versions-Informationen ignorieren" #: init/completions/modprobe.fish:16 msgid "Ignore version magic information" msgstr "" #: init/completions/modprobe.fish:17 msgid "Ignore module interface version" msgstr "Modulschnittstellenversion ignorieren" #: init/completions/modprobe.fish:18 msgid "List all modules matching the given wildcard" msgstr "Alle Module anzeigen, die den angegebenen Mustern entsprechen" #: init/completions/modprobe.fish:19 msgid "Insert modules matching the given wildcard" msgstr "Module einfügen, die den angegebenen Mustern entsprechen" #: init/completions/modprobe.fish:20 msgid "Restrict wildcards to specified directory" msgstr "Jokerzeichen auf angegebenes Verzeichnis beschränken" #: init/completions/modprobe.fish:21 msgid "Send error messages through syslog" msgstr "Fehlermeldungen per syslog senden" #: init/completions/modprobe.fish:22 msgid "Specify kernel version" msgstr "Kernelversion angeben" #: init/completions/modprobe.fish:23 msgid "List dependencies of module" msgstr "Modulabhängigkeiten auflisten" #: init/completions/modprobe.fish:24 msgid "Rename module" msgstr "Modul umbenennen" #: init/completions/modprobe.fish:25 msgid "Fail if inserting already loaded module" msgstr "Abbruch, wenn bereits geladenes Modul eingefügt werden soll" #: init/completions/mount.fish:49 msgid "Mount filesystems in fstab" msgstr "Dateisystems aus fstab einhängen" #: init/completions/mount.fish:50 msgid "Fork process for each mount" msgstr "Für jedes Einhängen neuen Prozess erzeugen" #: init/completions/mount.fish:51 msgid "Fake mounting" msgstr "Einhängen vortäuschen" #: init/completions/mount.fish:52 msgid "Add label to output" msgstr "Ausgabe mit Markierung versehen" #: init/completions/mount.fish:53 msgid "Do not write mtab" msgstr "keine mtab schreiben" #: init/completions/mount.fish:54 msgid "Tolerate sloppy mount options" msgstr "Saloppe Einhäng-Optionen tolerieren" #: init/completions/mount.fish:55 msgid "Read only" msgstr "Nur lesen" #: init/completions/mount.fish:56 msgid "Read/Write mode" msgstr "Lese-/Schreib-Modus" #: init/completions/mount.fish:57 msgid "Mount partition with specified label" msgstr "Partition mit angegebenem Label einhängen" #: init/completions/mount.fish:58 msgid "Mount partition with specified UID" msgstr "Partition mit angegebener UID einhängen" #: init/completions/mount.fish:59 msgid "Exclude filesystems" msgstr "Dateisysteme ausschliessen" #: init/completions/mount.fish:60 msgid "Remount a subtree to a second position" msgstr "" #: init/completions/mount.fish:61 msgid "Move a subtree to a new position" msgstr "Teilbaum zu einer neuen Position verschieben" #: init/completions/mount.fish:62 msgid "Filesystem" msgstr "Dateisystem" #: init/completions/mount.fish:64 msgid "Mount option" msgstr "Einhäng-Option" #: init/completions/mplayer.fish:27 msgid "Dynamically change postprocessing" msgstr "" #: init/completions/mplayer.fish:28 msgid "A/V sync speed" msgstr "" #: init/completions/mplayer.fish:29 init/completions/mplayer.fish:31 msgid "Skip frames to maintain A/V sync" msgstr "Rahmen überspringen, um A/V-Synchronisation zu erhalten" #: init/completions/mplayer.fish:32 msgid "Loop playback" msgstr "Playback-Schleife" #: init/completions/mplayer.fish:33 msgid "Play in random order" msgstr "in zufälliger Reihenfolge spielen" #: init/completions/mplayer.fish:36 msgid "Full screen" msgstr "Vollbildschirm" #: init/completions/mplayer.fish:37 msgid "Set playlist" msgstr "Abspielliste einrichten" #: init/completions/mplayer.fish:38 msgid "Audio language" msgstr "Audio-Sprache" #: init/completions/mplayer.fish:39 msgid "Play audio from file" msgstr "Audio aus Datei spielen" #: init/completions/mplayer.fish:40 msgid "Set default CD-ROM drive" msgstr "Standard-CD-ROM-Gerät setzen" #: init/completions/mplayer.fish:41 msgid "Set number of audio channels" msgstr "Anzahl der Audio-Kanäle setzen" #: init/completions/mplayer.fish:42 msgid "Set start chapter" msgstr "Startkapitel setzen" #: init/completions/mplayer.fish:43 msgid "Set default DVD-ROM drive" msgstr "Standard DVD-ROM-Gerät setzen" #: init/completions/mplayer.fish:44 msgid "Set dvd viewing angle" msgstr "DVD-Betrachtungswinkel setzen" #: init/completions/mplayer.fish:45 msgid "Force rebuilding index" msgstr "Index-Neuerstellung erzwingen" #: init/completions/mplayer.fish:46 msgid "Override framerate" msgstr "Frame-Rate überschreiben" #: init/completions/mplayer.fish:47 msgid "Build index if unavailable" msgstr "Index erstellen, wenn nicht vorhanden" #: init/completions/mplayer.fish:48 msgid "Load index from file" msgstr "Index aus Datei laden" #: init/completions/mplayer.fish:49 msgid "Force non-interleaved AVI parser" msgstr "" #: init/completions/mplayer.fish:50 msgid "Rebuild index and save to file" msgstr "Index neu erstellen und in Datei speichern" #: init/completions/mplayer.fish:51 msgid "Seek to give time position" msgstr "" #: init/completions/mplayer.fish:52 msgid "TV capture mode" msgstr "Tv-Capture-Modus" #: init/completions/mplayer.fish:53 msgid "Subtitle language" msgstr "Untertitel-Sprache" #: init/completions/mplayer.fish:54 msgid "Subtitle file" msgstr "Untertitel-Datei" #: init/completions/mplayer.fish:55 msgid "Handle subtitlefile as unicode" msgstr "Untertitel-Datei als Unicode behandeln" #: init/completions/mplayer.fish:56 msgid "Handle subtitlefile as utf8" msgstr "Untertitel-Datei als utf8 behandeln" #: init/completions/mplayer.fish:58 init/completions/mplayer.fish:76 msgid "Video output" msgstr "Video-Ausgabe" #: init/completions/mplayer.fish:64 init/completions/mplayer.fish:70 msgid "Audio output" msgstr "Audio-Ausgabe" #: init/completions/mv.fish:1 msgid "Make backup of each existing destination file" msgstr "Sicherung jeder existierenden Zieldatei erstellen" #: init/completions/mv.fish:2 msgid "Do not prompt before overwriting" msgstr "Keine Abfrage vor Überschreiben" #: init/completions/mv.fish:4 msgid "Answer for overwrite questions" msgstr "Antwort für Überschreib-Fragen" #: init/completions/mv.fish:5 msgid "Remove trailing slashes from source" msgstr "Angehängte / von der Quelle entfernen" #: init/completions/mv.fish:6 msgid "Backup suffix" msgstr "Endung für Sicherung" #: init/completions/mv.fish:7 msgid "Target directory" msgstr "Zielverzeichnis" #: init/completions/mv.fish:8 msgid "Do not overwrite newer files" msgstr "Neuere Dateien nicht überschreiben" #: init/completions/nextd.fish:1 init/completions/prevd.fish:1 msgid "Also print directory history" msgstr "Auch Verzeichnis-Verlauf anzeigen" #: init/completions/nice.fish:2 msgid "Increment priority by specified number first" msgstr "Priorität zunächst um angegebene Zahl erhöhen" #: init/completions/perl.fish:1 init/completions/ruby.fish:2 msgid "Specify record separator" msgstr "Satztrenner definieren" #: init/completions/perl.fish:2 init/completions/ruby.fish:3 msgid "Turn on autosplit mode" msgstr "Autosplit-Modus aktivieren" #: init/completions/perl.fish:3 init/completions/ruby.fish:4 msgid "Check syntax" msgstr "Syntax prüfen" #: init/completions/perl.fish:4 init/completions/ruby.fish:6 msgid "Debugger" msgstr "Debugger" #: init/completions/perl.fish:5 msgid "Debug option" msgstr "Debug-Option" #: init/completions/perl.fish:6 init/completions/ruby.fish:7 msgid "Execute command" msgstr "Befehl ausführen" #: init/completions/perl.fish:7 init/completions/ruby.fish:9 msgid "Set regexp used to split input" msgstr "Zur Eingabetrennung benutzten regulären Ausdruck setzen" #: init/completions/perl.fish:8 init/completions/ruby.fish:10 msgid "Edit files in-place" msgstr "Original-Dateien editieren" #: init/completions/perl.fish:9 init/completions/ruby.fish:11 msgid "Include path" msgstr "Include-Pfad" #: init/completions/perl.fish:10 init/completions/ruby.fish:12 msgid "Automatic line ending processing" msgstr "Automatische Zeilenende-Verarbeitung" #: init/completions/perl.fish:11 init/completions/ruby.fish:13 msgid "Loop script" msgstr "Schleifen-Skript" #: init/completions/perl.fish:12 init/completions/ruby.fish:14 #, sh-format msgid "Loop script, print $_" msgstr "Schleifen-Skript, zeige $_" #: init/completions/perl.fish:13 msgid "Invoke CPP" msgstr "CPP aufrufen" #: init/completions/perl.fish:14 init/completions/ruby.fish:16 msgid "Define custom switches" msgstr "Angepasste Schalter definieren" #: init/completions/perl.fish:15 init/completions/ruby.fish:17 #, sh-format msgid "Search $PATH for script" msgstr "$PATH nach Skript durchsuchen" #: init/completions/perl.fish:16 init/completions/ruby.fish:18 msgid "Taint checking" msgstr "" #: init/completions/perl.fish:17 msgid "Unsafe mode" msgstr "Unsicherer Modus" #: init/completions/perl.fish:19 init/completions/ruby.fish:22 msgid "Extract script" msgstr "Skript extrahieren" #: init/completions/pine.fish:1 msgid "Open folder" msgstr "Ordner öffnen" #: init/completions/pine.fish:2 msgid "Open file" msgstr "Datei öffnen" #: init/completions/pine.fish:4 msgid "Start in folder index" msgstr "Im Ordner-Index starten" #: init/completions/pine.fish:5 msgid "Initial set of keystrokes" msgstr "Startmenge der Tastendrücke" #: init/completions/pine.fish:6 msgid "Use function keys for commands" msgstr "Funktionstasten für Befehle nutzen" #: init/completions/pine.fish:7 msgid "Expand collections in FOLDER LIST display" msgstr "" #: init/completions/pine.fish:8 msgid "Start with specified current message number" msgstr "Mit angegebener aktueller Nachrichtennummer starten" #: init/completions/pine.fish:9 msgid "Open folder read-only" msgstr "Ordner nur zum Lesen öffnen" #: init/completions/pine.fish:10 msgid "Set configuration file" msgstr "Konfigurationsdatei setzen" #: init/completions/pine.fish:11 msgid "Set global configuration file" msgstr "Globale Konfigurationsdatei setzen" #: init/completions/pine.fish:12 msgid "Restricted mode" msgstr "Beschränkter Modus" #: init/completions/pine.fish:13 msgid "Enable suspention support" msgstr "Unterstützung für Suspension aktivieren" #: init/completions/pine.fish:14 msgid "Produce a sample global configuration file" msgstr "Ein Beispiel für eine globale Konfigurationsdatei erstellen" #: init/completions/pine.fish:15 msgid "Produce sample configuration file" msgstr "Beispiel-Konfigurationsdatei erstellen" #: init/completions/pine.fish:16 msgid "Set mail sort order" msgstr "Mail-Sortierordnung setzen" #: init/completions/pine.fish:26 msgid "Config option" msgstr "Konfigurations-Option" #: init/completions/ping.fish:2 msgid "Audible ping" msgstr "Hörbares ping" #: init/completions/ping.fish:3 msgid "Adaptive ping" msgstr "Anpassendes ping" #: init/completions/ping.fish:4 msgid "Allow pinging a broadcast address" msgstr "Ping an eine Broadcast-Adresse erlauben" #: init/completions/ping.fish:5 msgid "Do not allow ping to change source address of probes" msgstr "Verbiete ping das Ändern der Quell-Adresse der Proben" #: init/completions/ping.fish:6 msgid "Stop after specified number of ECHO_REQUEST packets" msgstr "Stoppe nach der angegebenen Anzahl von ECHO_REQUEST-Paketen" #: init/completions/ping.fish:7 msgid "Set the SO_DEBUG option on the socket being used" msgstr "Setze die Option SO_DEBUG für den benutzten Socket" #: init/completions/ping.fish:8 msgid "Allocate and set 20 bit flow label on ECHO_REQUEST packets" msgstr "20-Bit-Fluss-Markierung für ECHO_REQUEST-Pakete zuweisen und setzen" #: init/completions/ping.fish:9 msgid "Flood ping" msgstr "Ping-Flood" #: init/completions/ping.fish:10 msgid "Wait specified interval of seconds between sending each packet" msgstr "Warte angegebenes Sekundenintervall zwischen dem Senden der Pakete" #: init/completions/ping.fish:11 msgid "Set source address to specified interface address" msgstr "Setze Quell-Adresse auf angegebene Schnittstellen-Adresse" #: init/completions/ping.fish:12 msgid "Send the specified number of packets without waiting for reply" msgstr "Angegebene Zahl von Paketen, ohne auf Antwort zu warten" #: init/completions/ping.fish:13 msgid "Suppress loopback of multicast packets" msgstr "Schleife bei Multicast-Paketen unterdrücken" #: init/completions/ping.fish:14 msgid "Numeric output only" msgstr "nur numerische Ausgabe" #: init/completions/ping.fish:15 msgid "Pad packet with empty bytes" msgstr "Packet mit leeren Bytes auffüllen" #: init/completions/ping.fish:16 msgid "Set Quality of Service -related bits in ICMP datagrams" msgstr "Setze auf 'Quality of Service'-bezogene Bits in ICMP-Datagrammen" #: init/completions/ping.fish:18 msgid "Record route" msgstr "Route aufzeichnen" #: init/completions/ping.fish:19 msgid "Bypass the normal routing tables and send directly to a host on an attached interface" msgstr "Normale Routing-Tabellen umgehen und direkt zu einem Rechner an einer angeschlossenen Schnittstelle senden" #: init/completions/ping.fish:20 msgid "Specifies the number of data bytes to be sent" msgstr "Gibt die Anzahl zu sendender Bytes an" #: init/completions/ping.fish:21 msgid "Set socket buffer size" msgstr "Setze Größe des Socketpuffers" #: init/completions/ping.fish:22 msgid "Set the IP Time to Live" msgstr "Setze die IP-Lebensdauer (TTL)" #: init/completions/ping.fish:23 msgid "Set special IP timestamp options" msgstr "Setze spezielle IP-Zeitstempeloptionen" #: init/completions/ping.fish:24 msgid "Select Path MTU Discovery strategy" msgstr "Wähle Strategie zur Erkennung der Pfad-MTU" #: init/completions/ping.fish:25 msgid "Print full user-to-user latency" msgstr "Volle Anwender-zu-Anwender-Latenz anzeigen" #: init/completions/ping.fish:28 msgid "Specify a timeout, in seconds, before ping exits regardless of how many packets have been sent or received" msgstr "Zeitdauer in Sekunden angegben, nach der ping ohne Rücksicht auf die Anzahl gesendeter/empfangener Pakete abbricht" #: init/completions/ping.fish:29 msgid "Time to wait for a response, in seconds" msgstr "Zeit zum Warten auf eine Antwort, in Sekunden" #: init/completions/ps.fish:3 init/completions/ps.fish:7 msgid "Select all" msgstr "Alle auswählen" #: init/completions/ps.fish:4 msgid "Invert selection" msgstr "Selektion umkehren" #: init/completions/ps.fish:5 msgid "Select all processes except session leaders and terminal-less" msgstr "" #: init/completions/ps.fish:6 msgid "Select all processes except session leaders" msgstr "" #: init/completions/ps.fish:8 msgid "Deselect all processes that do not fulfill conditions" msgstr "Alle Prozesse deselektieren, die nicht die Bedingungen erfüllen" #: init/completions/ps.fish:10 msgid "Select by command" msgstr "Auswahl per Befehl" #: init/completions/ps.fish:11 msgid "Select by group" msgstr "Auswahl per Gruppe" #: init/completions/ps.fish:13 init/completions/ps.fish:14 msgid "Select by user" msgstr "Auswahl per Anwender" #: init/completions/ps.fish:15 msgid "Select by group/session" msgstr "Auswahl per Gruppe/Sitzung" #: init/completions/ps.fish:16 msgid "Select by PID" msgstr "Auswahl per PID" #: init/completions/ps.fish:17 msgid "Select by parent PID" msgstr "Auswahl per Eltern-PID" #: init/completions/ps.fish:18 msgid "Select by session ID" msgstr "Auswahl per Sitzungs-ID" #: init/completions/ps.fish:19 msgid "Select by tty" msgstr "Auswahl per tty" #: init/completions/ps.fish:20 msgid "Extra full format" msgstr "Zusätzliches Vollformat" #: init/completions/ps.fish:21 init/completions/ps.fish:26 msgid "User defined format" msgstr "Benutzerdefiniertes Format" #: init/completions/ps.fish:22 init/completions/ps.fish:28 msgid "Add column for security data" msgstr "Spalte für Sicherheitsdaten hinzufügen" #: init/completions/ps.fish:23 msgid "Full format" msgstr "Volles Format" #: init/completions/ps.fish:24 msgid "Jobs format" msgstr "Job-Format" #: init/completions/ps.fish:27 msgid "Do not show flags" msgstr "Keine Flags zeigen" #: init/completions/ps.fish:29 msgid "Show hierarchy" msgstr "Hierarchie anzeigen" #: init/completions/ps.fish:30 msgid "Set namelist file" msgstr "namelist-Datei setzen" #: init/completions/ps.fish:31 msgid "Wide output" msgstr "breite Ausgabe" #: init/completions/ps.fish:32 init/completions/ps.fish:33 msgid "Show threads" msgstr "Threads anzeigen" #: init/completions/python.fish:1 msgid "Execute argument as command" msgstr "Argument als Befehl ausführen" #: init/completions/python.fish:2 msgid "Debug on" msgstr "Debug einschalten" #: init/completions/python.fish:3 msgid "Ignore environment variables" msgstr "Umgebungsvariablen ignorieren" #: init/completions/python.fish:5 msgid "Interactive mode after executing commands" msgstr "Interaktiver Modus nach Ausführung der Befehle" #: init/completions/python.fish:6 msgid "Enable optimizations" msgstr "Optimierungen aktivieren" #: init/completions/python.fish:7 msgid "Division control" msgstr "" #: init/completions/python.fish:8 msgid "Disable import of site module" msgstr "" #: init/completions/python.fish:9 msgid "Warn on mixed tabs and spaces" msgstr "Warnung bei gemischten Tabulator- und Leerzeichen" #: init/completions/python.fish:10 msgid "Unbuffered input and output" msgstr "ungepufferte Ein-/Ausgabe" #: init/completions/python.fish:13 msgid "Warning control" msgstr "Steuerung für Warnungen" #: init/completions/python.fish:14 msgid "Ignore first line of input" msgstr "Erste Zeile der Eingabe ignorieren" #: init/completions/read.fish:2 msgid "Set prompt command" msgstr "Prompt-Befehl setzen" #: init/completions/read.fish:3 init/completions/set.fish:62 msgid "Export variable to subprocess" msgstr "Variable an Unterprozess exportieren" #: init/completions/read.fish:4 init/completions/set.fish:64 msgid "Make variable scope global" msgstr "Geltungsbereich der Variablen global machen" #: init/completions/read.fish:5 init/completions/set.fish:65 msgid "Make variable scope local" msgstr "Geltungsbereich der Variablen lokal machen" #: init/completions/read.fish:6 init/completions/set.fish:66 msgid "Make variable scope universal, i.e. share variable with all the users fish processes on this computer" msgstr "Variablengeltungsbereich allgemeingültig machen, d. h. die Variable ist für alle fish-Prozesse des Anwenders auf diesem Computer verfügbar" #: init/completions/read.fish:7 init/completions/set.fish:63 msgid "Do not export variable to subprocess" msgstr "Variable nicht an Unterprozess exportieren" #: init/completions/renice.fish:2 msgid "Force following parameters to be process ID's (The default)" msgstr "Erzwinge die Interpretation der folgenden Parameter als Prozess-IDs (Standard)" #: init/completions/renice.fish:3 msgid "Force following parameters to be interpreted as process group ID's" msgstr "Erzwinge die Interpretation der folgenden Parameter als Prozessgruppen-IDs" #: init/completions/renice.fish:4 msgid "Force following parameters to be interpreted as user names" msgstr "Erzwinge die Interpretation der folgenden Parameter als Benutzernamen" #: init/completions/rmdir.fish:3 msgid "Ignore errors from non-empty directories" msgstr "Fehler aus nicht leeren Verzeichnissen ignorieren" #: init/completions/rmdir.fish:4 msgid "Remove each component of path" msgstr "Jede Komponente des Pfades entfernen" #: init/completions/rm.fish:2 msgid "Unlink directory (Only by superuser)" msgstr "Verzeichnis trennen (nur durch root)" #: init/completions/rm.fish:3 msgid "Never prompt before removal" msgstr "Vor Löschung niemals fragen" #: init/completions/rm.fish:4 msgid "Prompt before removal" msgstr "Vor Löschung nachfragen" #: init/completions/rm.fish:5 init/completions/rm.fish:6 msgid "Recursively remove subdirectories" msgstr "Unterverzeichnisse rekursiv entfernen" #: init/completions/rm.fish:7 msgid "Explain what is done" msgstr "Erläutere was geschieht" #: init/completions/rpm.fish:8 msgid "List of rpm configuration files" msgstr "Liste der rpm-Konfigurationsdateien" #: init/completions/rpm.fish:9 msgid "Pipe output through specified command" msgstr "Ausgabe durch angegebenen Befehl schicken" #: init/completions/rpm.fish:10 msgid "Specify directory for rpm database" msgstr "Verzeichnis für rpm-Datenbank angeben" #: init/completions/rpm.fish:15 msgid "Specify root directory for rpm operations" msgstr "root-Verzeichnis für rpm-Operationen angeben" #: init/completions/rpm.fish:22 msgid "Add suggested packages to the transaction set when needed" msgstr "Füge der Transaktionsmenge die vorgeschlagenen Pakete hinzu, falls nötig" #: init/completions/rpm.fish:23 msgid "Installs or upgrades all the files in the package, even if they aren't needed (missingok) and don't exist" msgstr "Installiert oder aktualisiert alle Dateien im Paket, selbst wenn sie nicht erforderlich sind (missingok) und nicht existieren" #: init/completions/rpm.fish:24 msgid "Used with --relocate, permit relocations on all file paths, not just those OLD-PATH's included in the binary package relocation hint(s)" msgstr "" #: init/completions/rpm.fish:25 msgid "Don't install files whose name begins with specified path" msgstr "Keine Dateien installieren, deren Name mit dem angegebenen Pfad beginnen" #: init/completions/rpm.fish:26 msgid "Don't install any files which are marked as documentation" msgstr "Keine Dateien installieren, die als Dokumentation markiert sind" #: init/completions/rpm.fish:27 msgid "Same as using --replacepkgs, --replacefiles, and --oldpackage" msgstr "Entspricht der Benutzung von --replacepkgs, --replacefiles und --oldpackage" #: init/completions/rpm.fish:28 msgid "Print 50 hash marks as the package archive is unpacked" msgstr "Zeige 50 Hash-Markierungen beim Auspackens des Paketarchivs" #: init/completions/rpm.fish:29 msgid "Don't check for sufficient disk space before installation" msgstr "Vor der Installation nicht auf ausreichenden Plattenplatz prüfen" #: init/completions/rpm.fish:30 msgid "Allow installation or upgrading even if the architectures of the binary package and host don't match" msgstr "Installation und Aktualisierung auch dann ermöglichen, wenn die Architekturen des Binärpaketes und des Rechners nicht übereinstimmen" #: init/completions/rpm.fish:31 msgid "Allow installation or upgrading even if the operating systems of the binary package and host don't match" msgstr "Installation und Aktualisierung auch dann ermöglichen, wenn die Betriebssysteme des Binärpaketes und des Rechners nicht übereinstimmen" #: init/completions/rpm.fish:32 msgid "Install documentation files (default)" msgstr "Dokumentationsdateien installieren (Standard)" #: init/completions/rpm.fish:33 msgid "Update only the database, not the filesystem" msgstr "Nur die Datenbank, nicht das Dateisystem aktualisieren" #: init/completions/rpm.fish:34 init/completions/rpm.fish:94 msgid "Don't verify package or header digests when reading" msgstr "Beim Lesen keine Paket- oder Header-Prüfsummen überprüfen" #: init/completions/rpm.fish:35 init/completions/rpm.fish:97 msgid "Don't verify package or header signatures when reading" msgstr "Beim Lesen keine Paket- oder Header-Signaturen überprüfen" #: init/completions/rpm.fish:36 msgid "Don't do a dependency check" msgstr "Keine Abhängigkeiten prüfen" #: init/completions/rpm.fish:37 msgid "Don't suggest package(s) that provide a missing dependency" msgstr "Keine Pakete vorschlagen, die fehlende Abhängigkeiten bereitstellen" #: init/completions/rpm.fish:38 msgid "Don't change the package installation order" msgstr "Paket-Installationsreihenfolge nicht ändern" #: init/completions/rpm.fish:39 msgid "Don't execute scripts" msgstr "Keine Skrpte ausführen" #: init/completions/rpm.fish:40 msgid "Don't execute pre scripts" msgstr "Keine pre-Skripte ausführen" #: init/completions/rpm.fish:41 msgid "Don't execute post scripts" msgstr "Keine post-Skripte ausführen" #: init/completions/rpm.fish:42 msgid "Don't execute preun scripts" msgstr "Prerun-Skripte nicht ausführen" #: init/completions/rpm.fish:43 msgid "Don't execute postun scripts" msgstr "Postrun-Skripte nicht ausführen" #: init/completions/rpm.fish:44 init/completions/rpm.fish:115 msgid "Don't execute trigger scriptlets" msgstr "Trigger-Skripte nicht ausführen" #: init/completions/rpm.fish:45 msgid "Don't execute triggerin scriptlets" msgstr "Triggerin-Skripte nicht ausführen" #: init/completions/rpm.fish:46 init/completions/rpm.fish:116 msgid "Don't execute triggerun scriptlets" msgstr "Triggerun-Skripte nicht ausführen" #: init/completions/rpm.fish:47 init/completions/rpm.fish:117 msgid "Don't execute triggerpostun scriptlets" msgstr "Triggerpostun-Skripte nicht ausführen" #: init/completions/rpm.fish:48 msgid "Allow an upgrade to replace a newer package with an older one" msgstr "Erlaube einer Aktualisierung das Ersetzen eines neueren Paketes durch ein älteres" #: init/completions/rpm.fish:49 msgid "Print percentages as files are unpacked from the package archive. This is intended to make rpm easy to run from other tools" msgstr "Prozentwert anzeigen, während Dateien aus dem Paketarchiv ausgepackt werden. Dies soll das Ausführen von rpm aus anderen Programmen heraus erleichtern" #: init/completions/rpm.fish:50 msgid "For relocatable binary packages, translate all file paths that start with the installation prefix in the package relocation hint(s) to NEWPATH" msgstr "" #: init/completions/rpm.fish:51 msgid "Translate all paths that start with first half of following parameter to second half of following parameter" msgstr "Übersetze alle Pfade, die mit der ersten Hälfte des folgenden Parameters beginnen, mit der zweiten Hälfte des folgenden Parameters" #: init/completions/rpm.fish:52 init/completions/rpm.fish:118 msgid "Re-package the files before erasing" msgstr "Dateien vor dem Löschen umpacken" #: init/completions/rpm.fish:53 msgid "Install the packages even if they replace files from other, already installed, packages" msgstr "Installiere diese Pakete, selbst wenn sie Dateien aus anderen, bereits installierten Paketen ersetzen" #: init/completions/rpm.fish:54 msgid "Install the packages even if some of them are already installed on this system" msgstr "Installiere diese Pakete, selbst wenn einige von ihnen auf diesem System bereits installiert sind" #: init/completions/rpm.fish:55 msgid "Don't install the package, simply check for and report potential conflicts" msgstr "Paket nicht installieren, nur auf mögliche Konflikte testen und diese anzeigen" #: init/completions/rpm.fish:59 msgid "Display change information for the package" msgstr "Zeigt Änderungsinformationen zu dem Paket an" #: init/completions/rpm.fish:60 msgid "List only configuration files (implies -l)" msgstr "Zeigt nur Konfigurationsdateien (impliziert -l)" #: init/completions/rpm.fish:61 msgid "List only documentation files (implies -l)" msgstr "Nur Dokumentationsdateien anzeigen (impliziert -l)" #: init/completions/rpm.fish:62 msgid "Dump file information. Must be used with at least one of -l, -c, -d" msgstr "Gibt Dateiinformationen aus. Muss mit einem von -l, -c, -d benutzt werden" #: init/completions/rpm.fish:63 msgid "List all the files in each selected package" msgstr "Zeigt alle Dateien in jedem gewählten Paket an" #: init/completions/rpm.fish:64 msgid "Display package information, including name, version, and description. Uses --queryformat if specified" msgstr "Zeit Paketinformation einschließlich Name, Version und Beschreibung. Benutzt --queryformat falls angegeben" #: init/completions/rpm.fish:65 msgid "Orders the package listing by install time" msgstr "Ordnet die angezeigten Paketen entsprechend der Installationszeit" #: init/completions/rpm.fish:66 msgid "List files in package" msgstr "Dateien im Paket anzeigen" #: init/completions/rpm.fish:67 msgid "List capabilities this package provides" msgstr "Eigenschaften anzeigen, die dieses Paket bereitstellt" #: init/completions/rpm.fish:68 msgid "List packages on which this package depends" msgstr "Pakete anzeigen, von denen dieses Paket abhängt" #: init/completions/rpm.fish:69 msgid "List the package specific scriptlets" msgstr "Die Paket-spezifischen Skripte anzeigen" #: init/completions/rpm.fish:70 msgid "Display the states of files in the package. The state of each file is one of normal, not installed, or replaced" msgstr "Zeigt den Status der Dateien im Paket. Status einer jeden Datei ist entweder normal, nicht installiert oder ersetzt" #: init/completions/rpm.fish:71 init/completions/rpm.fish:72 msgid "Display the trigger scripts contained in the package" msgstr "Die im Paket enthaltenen Auslöser-Skripte anzeigen" #: init/completions/rpm.fish:78 msgid "Query all installed packages" msgstr "Alle installierten Pakete abfragen" #: init/completions/rpm.fish:79 msgid "Query package owning specified file" msgstr "Paket abfragen, zu dem die angegebene Datei gehört" #: init/completions/rpm.fish:80 msgid "Query package that contains a given file identifier, i.e. the MD5 digest of the file contents" msgstr "Frage nach Paketen, die einen gegebenen Datei-Identifikator enthalten, z. B. den MD5-Digest der Dateiinhalte" #: init/completions/rpm.fish:81 msgid "Query packages with the specified group" msgstr "Pakete mit der angegebenen Gruppe abfragen" #: init/completions/rpm.fish:82 msgid "Query package that contains a given header identifier, i.e. the SHA1 digest of the immutable header region" msgstr "Frage nach Paketen, die einen gegebenen Header-Bezeichner enthalten, z. B. den SHA1-Digest des unveränderlichen Header-Bereichs" #: init/completions/rpm.fish:83 msgid "Query an (uninstalled) package in specified file" msgstr "Ein (deinstalliertes) Paket in der angegebenen Datei abfragen" #: init/completions/rpm.fish:84 msgid "Query package that contains a given package identifier, i.e. the MD5 digest of the combined header and payload contents" msgstr "Paket abfragen, das einen gegebenen Paket-Bezeichner enthält, z. B. die MD5-Prüfsumme des kombinierten Headers und des Nutzdateninhaltes" #: init/completions/rpm.fish:85 msgid "Parse and query specified spec-file as if it were a package" msgstr "Angegebene spec-Datei auswerten, als ob es ein Paket wäre" #: init/completions/rpm.fish:86 msgid "Query package(s) that have the specified TID (transaction identifier)" msgstr "Paket(e) abfragen, die den angegebenen TID (Transaktions-Bezeichner) besitzen" #: init/completions/rpm.fish:87 msgid "Query packages that are triggered by the specified packages" msgstr "Pakete abfragen, die von den angegebenen Paketen aktiviert werden" #: init/completions/rpm.fish:88 msgid "Query all packages that provide the specified capability" msgstr "Alle Pakete abfragen, die die angegebene Eigenschaft bereitstellen" #: init/completions/rpm.fish:89 msgid "Query all packages that requires the specified capability for functioning" msgstr "Alle Pakete abfragen, die die angegebene Eigenschaft für die Funktionsfähigkeit erfordern" #: init/completions/rpm.fish:93 msgid "Don't verify dependencies of packages" msgstr "Abhängigkeiten der Pakete nicht prüfen" #: init/completions/rpm.fish:95 msgid "Don't verify any attributes of package files" msgstr "Keine Attribute der Paketdateien prüfen" #: init/completions/rpm.fish:96 msgid "Don't execute the %verifyscript scriptlet" msgstr "Das Skript %verifyscript nicht ausführen" #: init/completions/rpm.fish:98 msgid "Don't verify linkto attribute" msgstr "Verweis(linkto)-Attribute nicht prüfen" #: init/completions/rpm.fish:99 msgid "Don't verify md5 attribute" msgstr "md5-Attribute nicht prüfen" #: init/completions/rpm.fish:100 msgid "Don't verify size attribute" msgstr "Grössen-Attribute nicht prüfen" #: init/completions/rpm.fish:101 msgid "Don't verify user attribute" msgstr "Anwender-Attribute nicht prüfen" #: init/completions/rpm.fish:102 msgid "Don't verify group attribute" msgstr "Gruppen-Attribute nicht prüfen" #: init/completions/rpm.fish:103 msgid "Don't verify time attribute" msgstr "Zeit-Attribute nicht prüfen" #: init/completions/rpm.fish:104 msgid "Don't verify mode attribute" msgstr "Modus-Attribute nicht prüfen" #: init/completions/rpm.fish:105 msgid "Don't verify dev attribute" msgstr "Geräte-Attribute nicht prüfen" #: init/completions/rpm.fish:110 msgid "Remove all versions of the package which match specified string" msgstr "Alle Paketversionen entfernen, die der Zeichenkette entsprechen" #: init/completions/rpm.fish:111 msgid "Don't check dependencies before uninstalling the packages" msgstr "Vor dem Deinstallieren der Pakete keine Abhängigkeiten prüfen" #: init/completions/rpm.fish:112 msgid "Don't execute scriplets" msgstr "Skripte nicht ausführen" #: init/completions/rpm.fish:113 msgid "Don't execute preun scriptlet" msgstr "Preun-Skripte nicht ausführen" #: init/completions/rpm.fish:114 msgid "Don't execute postun scriptlet" msgstr "Postun-Skripte nicht ausführen" #: init/completions/rpm.fish:119 msgid "Don't really uninstall anything" msgstr "Nicht wirklich deinstallieren" #: init/completions/rpm.fish:123 msgid "Install new package" msgstr "Neues Paket installieren" #: init/completions/rpm.fish:124 msgid "Upgrade existing package" msgstr "Bestehendes Paket aktualisieren" #: init/completions/rpm.fish:125 msgid "Upgrade package if already installed" msgstr "Paket aktualisieren, wenn es bereits installiert ist" #: init/completions/rpm.fish:126 msgid "Query installed packages" msgstr "Installierte Pakete abfragen" #: init/completions/rpm.fish:127 msgid "Verify package integrety" msgstr "Paketintegrität verifizieren" #: init/completions/rpm.fish:128 msgid "Erase package" msgstr "Paket löschen" #: init/completions/ruby.fish:5 msgid "Kanji code-set" msgstr "Kanji-Codeset" #: init/completions/ruby.fish:15 msgid "Require file" msgstr "Datei erfordern" #: init/completions/ruby.fish:20 msgid "Verbose mode without message" msgstr "Wortreicher Modus ohne Nachricht" #: init/completions/ruby.fish:24 msgid "Compiler debug mode" msgstr "Compiler-Debug-Modus" #: init/completions/scp.fish:29 msgid "Bandwidth limit" msgstr "Bandbreitenbegrenzung" #: init/completions/scp.fish:30 init/completions/ssh.fish:97 msgid "Port" msgstr "Port" #: init/completions/scp.fish:31 msgid "Preserves modification times, access times, and modes from the original file" msgstr "Erhält Modifizierungs- und Zugriffszeit und Modi der Originaldatei" #: init/completions/scp.fish:33 msgid "Recursively copy" msgstr "Rekursive Kopie" #: init/completions/scp.fish:34 msgid "Encyption program" msgstr "Verschlüsselungsprogramm" #: init/completions/screen.fish:1 msgid "Print a list of running screen sessions" msgstr "Liste laufender screen-Sitzungen anzeigen" #: init/completions/sed.fish:13 msgid "Evaluate expression" msgstr "Ausdruck auswerten" #: init/completions/sed.fish:14 msgid "Evalute file" msgstr "Datei auswerten" #: init/completions/sed.fish:15 msgid "Edit files in place" msgstr "Originaldateien editieren" #: init/completions/sed.fish:22 msgid "Specify line-length" msgstr "Zeilenlänge angeben" #: init/completions/sed.fish:23 msgid "Disable all GNU extensions" msgstr "Alle GNU-Erweiterungen deaktivieren" #: init/completions/sed.fish:24 init/completions/sed.fish:34 msgid "Use extended regexp" msgstr "Erweiterte reguläre Ausdrücke benutzen" #: init/completions/sed.fish:25 msgid "Consider files as separate" msgstr "Siehe Dateien als separat an" #: init/completions/sed.fish:26 msgid "Use minimal IO buffers" msgstr "Minimale IO-Puffer benutzen" #: init/completions/sed.fish:35 msgid "Delay opening files until a command containing the related 'w' function is applied" msgstr "Verzögere die Dateiöffnung, bis ein Befehl angewandt wird, der die entsprechende 'w'-Funktion enthält" #: init/completions/service.fish:3 msgid "Service name" msgstr "Dienstname" #: init/completions/set_color.fish:1 init/completions/set.fish:74 msgid "Color" msgstr "Farbe" #: init/completions/set_color.fish:2 msgid "Change background color" msgstr "Hintergrundfarbe ändern" #: init/completions/set_color.fish:3 msgid "Make font bold" msgstr "Zeichensatz fett" #: init/completions/set.fish:61 msgid "Erase variable" msgstr "Variable löschen" #: init/completions/set.fish:67 msgid "Test if variable is defined" msgstr "Test, ob Variable definiert ist" #: init/completions/set.fish:78 msgid "Locale" msgstr "Locale" #: init/completions/sort.fish:1 msgid "Ignore leading blanks" msgstr "Führende Leerzeichen ignorieren" #: init/completions/sort.fish:2 msgid "Consider only blanks and alphanumerics" msgstr "Nur Leerzeichen und alfanumerische Zeichen beachten" #: init/completions/sort.fish:4 msgid "Compare general numeric value" msgstr "Vergleiche generelle numerische Werte" #: init/completions/sort.fish:5 msgid "Consider only printable" msgstr "Beachte nur druckbare Zeichen" #: init/completions/sort.fish:6 msgid "Compare month names" msgstr "Vergleiche Monatsnamen" #: init/completions/sort.fish:7 msgid "Compare string numerical value" msgstr "Vergleiche numerische Werte als Zeichenkette" #: init/completions/sort.fish:8 msgid "Reverse results" msgstr "Ergebnisse umkehren" #: init/completions/sort.fish:9 msgid "Only check if sorted" msgstr "Nur auf Sortierung testen" #: init/completions/sort.fish:10 msgid "Define key" msgstr "Schlüssel definieren" #: init/completions/sort.fish:11 msgid "Merge sorted files" msgstr "Sortierte Dateien mischen" #: init/completions/sort.fish:12 msgid "Write to file" msgstr "In Datei schreiben" #: init/completions/sort.fish:13 msgid "Stabilize sort" msgstr "Sort stabilisieren" #: init/completions/sort.fish:14 msgid "Set memory buffer size" msgstr "Speicherpuffer-Grösse setzen" #: init/completions/sort.fish:15 msgid "Field separator" msgstr "Feldtrenner" #: init/completions/sort.fish:16 msgid "Set temporary directory" msgstr "Temporäres Verzeichnis setzen" #: init/completions/sort.fish:17 msgid "Output only first of equal lines" msgstr "Nur die ersten von gleichen Zeilen ausgeben" #: init/completions/sort.fish:18 msgid "Lines end with 0 byte" msgstr "Zeilen enden mit Null-Byte" #: init/completions/ssh.fish:6 msgid "Protocoll version 1 only" msgstr "Nur Protokoll-Version 1" #: init/completions/ssh.fish:7 msgid "Protocoll version 2 only" msgstr "Nur Protokoll-Version 2" #: init/completions/ssh.fish:8 msgid "IPv4 addresses only" msgstr "Nur IPv4-Adressen" #: init/completions/ssh.fish:9 msgid "IPv6 addresses only" msgstr "Nur IPv6-Adressen" #: init/completions/ssh.fish:10 msgid "Compress all data" msgstr "Alle Daten komprimieren" #: init/completions/ssh.fish:11 msgid "Encryption algorithm" msgstr "Verschlüsselungs-Algorithmus" #: init/completions/ssh.fish:13 msgid "Identity file" msgstr "Datei identifizieren" #: init/completions/ssh.fish:14 msgid "Options" msgstr "Optionen" #: init/completions/ssh.fish:80 msgid "Disables forwarding of the authentication agent" msgstr "Deaktiviert Weiterleitung des Authentifizierungs-Agenten" #: init/completions/ssh.fish:81 msgid "Enables forwarding of the authentication agent" msgstr "Aktiviert Weiterleitung des Authentifizierungs-Agenten" #: init/completions/ssh.fish:82 msgid "Interface to transmit from" msgstr "Schnittstelle zur Übertragung" #: init/completions/ssh.fish:88 msgid "Escape character" msgstr "Escape-Zeichen" #: init/completions/ssh.fish:89 msgid "Go to background" msgstr "In Hintergrund verzweigen" #: init/completions/ssh.fish:90 msgid "Allow remote host to connect to local forwarded ports" msgstr "Entfernten Rechnern Verbindung zu lokal weitergeleiteten Ports erlauben" #: init/completions/ssh.fish:91 msgid "Smartcard device" msgstr "Smartcard-Gerät" #: init/completions/ssh.fish:92 msgid "Disable forwarding of Kerberos tickets" msgstr "Weiterleitung von Kerberos-Tickets deaktivieren" #: init/completions/ssh.fish:93 msgid "User" msgstr "Benutzer" #: init/completions/ssh.fish:94 msgid "MAC algorithm" msgstr "MAC-Algorithmus" #: init/completions/ssh.fish:95 msgid "Prevent reading from stdin" msgstr "Lesen über Standardeingabe verhindern" #: init/completions/ssh.fish:96 msgid "Do not execute remote command" msgstr "Entfernten Befehl nicht ausführen" #: init/completions/ssh.fish:99 msgid "Subsystem" msgstr "Subsystem" #: init/completions/ssh.fish:100 msgid "Force pseudo-tty allocation" msgstr "Pseudo-tty-Zuordnung erzwingen" #: init/completions/ssh.fish:101 msgid "Disable pseudo-tty allocation" msgstr "Pseudo-tty-Zuordnung deaktivieren" #: init/completions/ssh.fish:102 msgid "Disable X11 forwarding" msgstr "X11-Weiterleitung deaktivieren" #: init/completions/ssh.fish:103 msgid "Enable X11 forwarding" msgstr "X11-Weiterleitung aktivieren" #: init/completions/ssh.fish:104 msgid "Locally forwarded ports" msgstr "Lokal weitergeleitete Ports" #: init/completions/ssh.fish:105 msgid "Remotely forwarded ports" msgstr "entfernt weitergeleitete Ports" #: init/completions/ssh.fish:106 msgid "Dynamic port forwarding" msgstr "Dynamische Port-Weiterleitung" #: init/completions/su.fish:4 msgid "Make login shell" msgstr "Login-Shell erstellen" #: init/completions/su.fish:5 msgid "Pass command to shell" msgstr "Befehl an die Shell übergeben" #: init/completions/su.fish:6 msgid "Pass -f to the shell" msgstr "-f an die Shell weitergeben" #: init/completions/su.fish:7 init/completions/su.fish:8 msgid "Preserve environment" msgstr "Umgebung erhalten" #: init/completions/tar.fish:1 init/completions/tar.fish:2 msgid "Append archive to archive" msgstr "Archiv an Archiv anhängen" #: init/completions/tar.fish:3 msgid "Create archive" msgstr "Archiv erstellen" #: init/completions/tar.fish:4 init/completions/tar.fish:5 msgid "Compare archive and filesystem" msgstr "Archiv und Dateisystem vergleichen" #: init/completions/tar.fish:6 msgid "Delete from archive" msgstr "Aus Archiv löschen" #: init/completions/tar.fish:7 msgid "Append files to archive" msgstr "Dateien an Archiv anhängen" #: init/completions/tar.fish:8 msgid "List archive" msgstr "Archiv anzeigen" #: init/completions/tar.fish:9 msgid "Append new files" msgstr "Neue Dateien anfügen" #: init/completions/tar.fish:10 init/completions/tar.fish:11 msgid "Extract from archive" msgstr "Aus Archiv extrahieren" #: init/completions/tar.fish:12 msgid "Keep access time" msgstr "Zugriffszeit behalten" #: init/completions/tar.fish:14 msgid "Reblock while reading" msgstr "Während des Lesens umblocken" #: init/completions/tar.fish:16 msgid "Print directory names" msgstr "Verzeichnis-Namen anzeigen" #: init/completions/tar.fish:17 msgid "Archive file" msgstr "Archiv-Datei" #: init/completions/tar.fish:18 msgid "Archive is local" msgstr "Archiv ist lokal" #: init/completions/tar.fish:19 msgid "Run script at end of tape" msgstr "Bei Bandende Skript ausführen" #: init/completions/tar.fish:20 msgid "Use old incremental GNU format" msgstr "altes inkrementelles GNU-Format benutzen" #: init/completions/tar.fish:21 msgid "Use new incremental GNU format" msgstr "Neues inkrementelles GNU-Format benutzen" #: init/completions/tar.fish:22 msgid "Derefrerence symlinks" msgstr "Symbolische Links dereferenzieren" #: init/completions/tar.fish:23 msgid "Ignore zero block in archive" msgstr "Nullblock im Archiv ignorieren" #: init/completions/tar.fish:24 msgid "Filter through bzip2" msgstr "Durch bzip2 filtern" #: init/completions/tar.fish:25 msgid "Don't exit on unreadable files" msgstr "Bei unlesbaren Dateien nicht abbrechen" #: init/completions/tar.fish:26 msgid "Don't overwrite" msgstr "Nicht überschreiben" #: init/completions/tar.fish:27 msgid "Starting file in archive" msgstr "Startdatei im Archiv" #: init/completions/tar.fish:28 msgid "Stay in local filesystem" msgstr "Im lokalen Dateisystem bleiben" #: init/completions/tar.fish:29 msgid "Tape length" msgstr "Band-Länge" #: init/completions/tar.fish:30 msgid "Don't extract modification time" msgstr "Modifizierungszeit nicht extrahieren" #: init/completions/tar.fish:31 msgid "Multi volume archive" msgstr "Mehr-Volume-Archiv" #: init/completions/tar.fish:32 msgid "Only store newer files" msgstr "Nur neuere Dateien speichern" #: init/completions/tar.fish:33 init/completions/tar.fish:34 msgid "Use V7 format" msgstr "V7-Format verwenden" #: init/completions/tar.fish:35 msgid "Extract to stdout" msgstr "Auf stdout extrahieren" #: init/completions/tar.fish:36 init/completions/tar.fish:37 msgid "Extract all permissions" msgstr "Alle Rechte extrahieren" #: init/completions/tar.fish:38 msgid "Don't strip leading /" msgstr "Führenden / nicht entfernen" #: init/completions/tar.fish:39 msgid "Preserve all permissions and do not sort file arguments" msgstr "Alle Rechte bewahren und Datei-Argumente nicht sortieren" #: init/completions/tar.fish:40 msgid "Show record number" msgstr "Satznummer anzeigen" #: init/completions/tar.fish:41 msgid "Remove files after adding to archive" msgstr "Dateien nach Archivierung entfernen" #: init/completions/tar.fish:42 init/completions/tar.fish:43 msgid "Do not sort file arguments" msgstr "Dateiargumente nicht sortieren" #: init/completions/tar.fish:44 msgid "Preserve file ownership" msgstr "Dateieigentümer erhalten" #: init/completions/tar.fish:45 msgid "Handle sparse files" msgstr "Sparse-Dateien bearbeiten" #: init/completions/tar.fish:46 msgid "Extract file from file" msgstr "Datei aus Datei extrahieren" #: init/completions/tar.fish:47 msgid "-T has null-terminated names" msgstr "-T enthält null-terminierte Namen" #: init/completions/tar.fish:48 msgid "Print total bytes written" msgstr "Gesamtzahl geschriebener Bytes anzeigen" #: init/completions/tar.fish:50 msgid "Set volume name" msgstr "Volume-Namen setzen" #: init/completions/tar.fish:52 init/completions/tar.fish:53 msgid "Ask for confirmation" msgstr "Nach Bestätigung fragen" #: init/completions/tar.fish:54 msgid "Verify archive" msgstr "Archiv prüfen" #: init/completions/tar.fish:55 msgid "Exclude file" msgstr "Datei ausschliessen" #: init/completions/tar.fish:56 msgid "Exclude files listed in specified file" msgstr "die in der angegebenen Datei aufgeführten Dateien ausschliessen" #: init/completions/tar.fish:57 init/completions/tar.fish:58 msgid "Filter through compress" msgstr "durch compress filtern" #: init/completions/tar.fish:59 init/completions/tar.fish:60 msgid "Filter through gzip" msgstr "durch gzip filtern" #: init/completions/tar.fish:61 msgid "Filter through specified program" msgstr "durch angegebenes Programm filtern" #: init/completions/test.fish:4 msgid "Negate expression" msgstr "Ausdruck negieren" #: init/completions/test.fish:5 msgid "Logical and" msgstr "Logisches Und" #: init/completions/test.fish:6 msgid "Logical or" msgstr "Logisches Oder" #: init/completions/test.fish:7 msgid "String length is non-zero" msgstr "Länge der Zeichenkette ist nicht 0" #: init/completions/test.fish:8 msgid "String length is zero" msgstr "Länge der Zeichenkette ist 0" #: init/completions/test.fish:9 msgid "Strings are equal" msgstr "Zeichenketten sind gleich" #: init/completions/test.fish:10 msgid "Strings are not equal" msgstr "Zeichenketten sind nicht gleich" #: init/completions/test.fish:11 msgid "Integers are equal" msgstr "Ganzzahlen sind gleich" #: init/completions/test.fish:12 msgid "Left integer larger than or equal to right integer" msgstr "Linke Ganzzahl ist größer oder gleich zur rechten Ganzzahl" #: init/completions/test.fish:13 msgid "Left integer larger than right integer" msgstr "Linke Ganzzahl ist größer als rechte Ganzzahl" #: init/completions/test.fish:14 msgid "Left integer less than or equal to right integer" msgstr "Linke Ganzzahl ist kleiner oder gleich als rechte Ganzzahl" #: init/completions/test.fish:15 msgid "Left integer less than right integer" msgstr "Linke Ganzzahl ist kleiner als rechte Ganzzahl" #: init/completions/test.fish:16 msgid "Left integer not equal to right integer" msgstr "linke Ganzzahl von rechter verschieden" #: init/completions/test.fish:17 msgid "Left file equal to right file" msgstr "Linke Datei gleich der rechten Datei" #: init/completions/test.fish:18 msgid "Left file newer than right file" msgstr "Linke Datei jünger als rechte Datei" #: init/completions/test.fish:19 msgid "Left file older than right file" msgstr "Linke Datei älter als rechte Datei" #: init/completions/test.fish:20 msgid "File is block device" msgstr "Datei ist ein Block-Gerät" #: init/completions/test.fish:21 msgid "File is character device" msgstr "Datei ist ein Zeichengerät" #: init/completions/test.fish:22 msgid "File is directory" msgstr "Datei ist ein Verzeichnis" #: init/completions/test.fish:23 msgid "File exists" msgstr "Datei ist vorhanden" #: init/completions/test.fish:24 msgid "File is regular" msgstr "reguläre Datei" #: init/completions/test.fish:25 msgid "File is set-group-ID" msgstr "Datei ist set-group-ID" #: init/completions/test.fish:26 init/completions/test.fish:29 msgid "File is symlink" msgstr "Datei ist symbolischer Link" #: init/completions/test.fish:27 msgid "File owned by effective group ID" msgstr "Datei gehört effektiver Gruppen-ID" #: init/completions/test.fish:28 msgid "File has sticky bit set" msgstr "Sticky-Bit der Datei ist gesetzt" #: init/completions/test.fish:30 msgid "File owned by effective user ID" msgstr "Datei gehört effektiver Anwender-ID" #: init/completions/test.fish:31 msgid "File is named pipe" msgstr "Datei ist eine benannte Pipe" #: init/completions/test.fish:32 msgid "File is readable" msgstr "Datei ist lesbar" #: init/completions/test.fish:33 msgid "File size is non-zero" msgstr "Dateigröße ist nicht 0" #: init/completions/test.fish:34 msgid "File is socket" msgstr "Datei ist Socket" #: init/completions/test.fish:35 msgid "FD is terminal" msgstr "FD ist ein Terminal" #: init/completions/test.fish:36 msgid "File set-user-ID bit is set" msgstr "set-user-ID-Bit der Datei ist gesetzt" #: init/completions/test.fish:37 msgid "File is writable" msgstr "Datei ist schreibbar" #: init/completions/test.fish:38 msgid "File is executable" msgstr "Datei ist ausführbar" #: init/completions/top.fish:3 msgid "Toggle command line/program name" msgstr "Befehlszeile/Programmname umschalten" #: init/completions/top.fish:4 msgid "Update interval" msgstr "Aktualisierungs-Intervall" #: init/completions/top.fish:6 msgid "Toggle idle processes" msgstr "Anzeige wartender Prozesse umschalten" #: init/completions/top.fish:7 msgid "Maximium iterations" msgstr "Maximale Wiederholungen" #: init/completions/top.fish:8 msgid "Monitor effective UID" msgstr "tatsächliche UID beobachten" #: init/completions/top.fish:9 msgid "Monitor user" msgstr "Anwender beobachten" #: init/completions/top.fish:10 msgid "Monitor PID" msgstr "PID beobachten" #: init/completions/top.fish:11 msgid "Secure mode" msgstr "Sicherer Modus" #: init/completions/top.fish:12 msgid "Cumulative mode" msgstr "Kumulativer Modus" #: init/completions/touch.fish:1 msgid "Change access time" msgstr "Zugriffszeit ändern" #: init/completions/touch.fish:2 msgid "Set date back" msgstr "Datum zurücksetzen" #: init/completions/touch.fish:3 msgid "Do not create file" msgstr "Datei nicht erstellen" #: init/completions/touch.fish:4 init/completions/touch.fish:8 msgid "Set date" msgstr "Datum setzen" #: init/completions/touch.fish:5 msgid "Set date forward" msgstr "Datum in Zukunft setzen" #: init/completions/touch.fish:6 msgid "Change modification time" msgstr "Modifikationszeit ändern" #: init/completions/touch.fish:7 msgid "Use this files times" msgstr "" #: init/completions/trap.fish:2 msgid "Display names of all signals" msgstr "Namen aller Signale anzeigen" #: init/completions/trap.fish:3 msgid "Display all currently defined trap handlers" msgstr "Alle derzeit definierten Trap-Handler anzeigen" #: init/completions/type.fish:3 msgid "Print all possible definitions of the specified name" msgstr "Alle möglichen Definitionen des angegebenen Namens anzeigen" #: init/completions/type.fish:4 msgid "Supress function and builtin lookup" msgstr "Unterdrücke Nachschlagen von Funktionen und eingebauten Befehlen" #: init/completions/type.fish:5 msgid "Print command type" msgstr "Befehlstyp anzeigen" #: init/completions/type.fish:6 msgid "Print path to command, or nothing if name is not a command" msgstr "Pfad zu Befehl anzeigen oder nichts, wenn es kein Befehl ist" #: init/completions/type.fish:7 msgid "Print path to command" msgstr "Pfad zu Befehl anzeigen" #: init/completions/ulimit.fish:2 msgid "Set or get all current limits" msgstr "Setzen/Anzeigen aller aktuellen Begrenzungen" #: init/completions/ulimit.fish:3 msgid "Maximum size of core files created" msgstr "Maximalgröße von erstellten core-Dateien" #: init/completions/ulimit.fish:4 msgid "Maximum size of a process's data segment" msgstr "Maximalgröße des Datensegmentes eines Prozesses" #: init/completions/ulimit.fish:5 msgid "Maximum size of files created by the shell" msgstr "Maximalgröße der von der Shell angelegten Dateien" #: init/completions/ulimit.fish:6 msgid "Maximum size that may be locked into memory" msgstr "" #: init/completions/ulimit.fish:7 msgid "Maximum resident set size" msgstr "" #: init/completions/ulimit.fish:8 msgid "Maximum number of open file descriptors" msgstr "Maximale Zahl offener Datei-Deskriptoren" #: init/completions/ulimit.fish:9 msgid "Maximum stack size" msgstr "Maximale Stackgröße" #: init/completions/ulimit.fish:10 msgid "Maximum amount of cpu time in seconds" msgstr "Maximalanzahl CPU-Zeit in Sekunden" #: init/completions/ulimit.fish:11 msgid "Maximum number of processes available to a single user" msgstr "Maximale Anzahl an Prozessen, die für einen einzelnen Anwender verfügbar sind" #: init/completions/ulimit.fish:12 msgid "Maximum amount of virtual memory available to the shell" msgstr "Maximaler virtueller Speicher, der der Shell zur Verfügung steht" #: init/completions/umount.fish:18 msgid "Unmount without writing in /etc/mtab" msgstr "Aushängen ohne Aktualisierung von /etc/mtab" #: init/completions/umount.fish:19 msgid "In case unmounting fails, try to remount read-only" msgstr "Wenn das Aushängen fehlschläft, erneutes Einhängen im Nur-Lese-Modus versuchen" #: init/completions/umount.fish:20 msgid "In case the unmounted device was a loop device, also free this loop device" msgstr "Falls das ausgehängte Gerät ein Loop-Gerät war, auch das Loop-Gerät freigeben" #: init/completions/umount.fish:21 msgid "Don't call the /sbin/umount. helper even if it exists" msgstr "/sbin/umount.-Hilfsprogramm nicht aufrufen, auch wenn es existiert" #: init/completions/umount.fish:22 msgid "Unmount all of the file systems described in /etc/mtab" msgstr "Alle in /etc/mtab definierten Dateisysteme aushängen" #: init/completions/umount.fish:23 msgid "Actions should only be taken on file systems of the specified type" msgstr "Aktionen sollen nur auf Dateisysteme des angegebenen Typs angewendet werden" #: init/completions/umount.fish:24 msgid "Actions should only be taken on file systems with the specified options in /etc/fstab" msgstr "Aktionen sollen nur auf Dateisysteme mit den angegebenen Optionen in /etc/fstab angewendet werden" #: init/completions/umount.fish:25 msgid "Force unmount (in case of an unreachable NFS system)" msgstr "unmount erzwingen (falls ein NFS-System nicht erreichbar ist)" #: init/completions/umount.fish:26 msgid "Detach the filesystem from the filesystem hierarchy now, and cleanup all references to the filesystem as soon as it is not busy" msgstr "Das Dateisystem jetzt aus der Dateisystemhierarchie aushängen und alle Referenzen zum Dateisystem bereinigen, sobald es nicht mehr benutzt wird." #: init/completions/uname.fish:1 msgid "Print all information" msgstr "Alle Informationen anzeigen" #: init/completions/uname.fish:2 msgid "Print kernel name" msgstr "Kernel-Name anzeigen" #: init/completions/uname.fish:3 msgid "Print network node hostname" msgstr "Rechnernamen des Netzwerkknotens anzeigen" #: init/completions/uname.fish:4 msgid "Print kernel release" msgstr "Kernel-Release anzeigen" #: init/completions/uname.fish:5 msgid "Print kernel version" msgstr "Kernel-Version anzeigen" #: init/completions/uname.fish:6 msgid "Print machine name" msgstr "Maschinenname anzeigen" #: init/completions/uname.fish:7 msgid "Print processor" msgstr "Prozessor anzeigen" #: init/completions/uname.fish:8 msgid "Print harware platform" msgstr "Hardware-Plattform anzeigen" #: init/completions/uname.fish:9 msgid "Print operating system" msgstr "Betriebssystem anzeigen" #: init/completions/uniq.fish:1 msgid "Print number of occurences" msgstr "Anzahl Vorkommen anzeigen" #: init/completions/uniq.fish:2 msgid "Only print duplicates" msgstr "Nur doppelte Zeilen ausgeben" #: init/completions/uniq.fish:3 msgid "Remove non-duplicate lines" msgstr "Nicht doppelte Zeilen entfernen" #: init/completions/uniq.fish:8 msgid "Avoid comparing first N fields" msgstr "Erste N Felder nicht vergleichen" #: init/completions/uniq.fish:9 msgid "Case insensitive" msgstr "Groß-/Klein-Schreibung nicht unterscheiden" #: init/completions/uniq.fish:10 msgid "Avoid comparing first N characters" msgstr "Erste N Zeichen nicht vergleichen" #: init/completions/uniq.fish:11 msgid "Only print unique lines" msgstr "Nur einmalige Zeilen anzeigen" #: init/completions/uniq.fish:12 msgid "Compare only specified number of characters" msgstr "Nur angegebene Anzahl Zeichen vergleichen" #: init/completions/valgrind.fish:12 msgid "Skin" msgstr "Oberfläche" #: init/completions/valgrind.fish:25 msgid "Display help and debug options" msgstr "Hilfe- und Debug-Optionen anzeigen" #: init/completions/valgrind.fish:29 msgid "Valgrind-ise children" msgstr "" #: init/completions/valgrind.fish:30 msgid "Track file descriptors" msgstr "Datei-Deskriptoren beobachten" #: init/completions/valgrind.fish:31 msgid "Log to file descriptor" msgstr "Log auf Datei-Deskriptor ausgeben" #: init/completions/valgrind.fish:32 msgid "Log to file" msgstr "Log in Datei schreiben" #: init/completions/valgrind.fish:33 msgid "Log to socket" msgstr "Log auf Socket ausgeben" #: init/completions/valgrind.fish:35 msgid "Callers in stack trace" msgstr "" #: init/completions/valgrind.fish:36 msgid "Stop showing errors if too many" msgstr "Bei zu vielen Fehlern Anzeige beenden" #: init/completions/valgrind.fish:37 msgid "Continue trace below main()" msgstr "Trace unter main() fortsetzen" #: init/completions/valgrind.fish:38 msgid "Supress errors from file" msgstr "Fehler aus Datei unterdrücken" #: init/completions/valgrind.fish:39 msgid "Print suppressions for detected errors" msgstr "Unterdrückungen für entdeckte Fehler anzeigen" #: init/completions/valgrind.fish:40 msgid "Start debugger on error" msgstr "Bei Fehler Debugger starten" #: init/completions/valgrind.fish:41 msgid "Debugger command" msgstr "Debugger-Befehl" #: init/completions/valgrind.fish:42 msgid "File descriptor for input" msgstr "Datei-Deskriptor für Eingabe" #: init/completions/valgrind.fish:46 init/completions/valgrind.fish:55 msgid "Check for memory leaks" msgstr "Test auf Speicher-Lecks" #: init/completions/valgrind.fish:47 init/completions/valgrind.fish:56 msgid "Show reachable leaked memory" msgstr "" #: init/completions/valgrind.fish:48 msgid "Determines how willing Memcheck is to consider different backtraces to be the same" msgstr "" #: init/completions/valgrind.fish:49 init/completions/valgrind.fish:58 msgid "Set size of freed memory pool" msgstr "Setze Grösse des freigegebenen Speicher-Pools" #: init/completions/valgrind.fish:57 msgid "Determines how willing Addrcheck is to consider different backtraces to be the same" msgstr "" #: init/completions/valgrind.fish:63 msgid "Type of L1 instruction cache" msgstr "Typ des L1-Anweisungs-Cache" #: init/completions/valgrind.fish:64 msgid "Type of L1 data cache" msgstr "Typ des L1-Daten-Cache" #: init/completions/valgrind.fish:65 msgid "Type of L2 cache" msgstr "Typ des L2-Cache" #: init/completions/valgrind.fish:69 msgid "Specify a function that allocates memory" msgstr "Eine Funktion angeben, die Speicher zuordnet" #: init/completions/valgrind.fish:71 msgid "The number of bytes of heap overhead per allocation" msgstr "Anzahl Bytes als Heap-Mehrverbrauch pro Zuordnung " #: init/completions/valgrind.fish:72 msgid "Profile stack usage" msgstr "" #: init/completions/valgrind.fish:73 msgid "Depth of call chain" msgstr "Tiefe der Aufrufkette" #: init/completions/valgrind.fish:74 msgid "Profiling output format" msgstr "Ausgabeformat für Profilierung" #: init/completions/wc.fish:1 msgid "Print byte counts" msgstr "Anzahl Bytes anzeigen" #: init/completions/wc.fish:2 msgid "Print character counts" msgstr "Anzahl Buchstaben anzeigen" #: init/completions/wc.fish:3 msgid "Print newline counts" msgstr "Anzahl Zeilenendezeichen anzeigen" #: init/completions/wc.fish:4 msgid "Print length of longest line" msgstr "Länge der längsten Zeile anzeigen" #: init/completions/wc.fish:5 msgid "Print word counts" msgstr "Wortzählung anzeigen" #: init/completions/w.fish:1 msgid "Dont print header" msgstr "Header nicht anzeigen" #: init/completions/w.fish:2 msgid "Ignore username for time calculations" msgstr "Anwendername fün Zeitberechungen ignorieren" #: init/completions/w.fish:3 msgid "Short format" msgstr "Kurzes Format" #: init/completions/w.fish:4 msgid "Toggle printing of remote hostname" msgstr "Anzeige des entfernten Rechners ein/ausschalten" #: init/completions/wget.fish:7 msgid "Go to background immediately after startup" msgstr "Direkt nach Start im Hintergrund arbeiten" #: init/completions/wget.fish:8 msgid "Execute command as if part of .wgetrc" msgstr "Befehl ausführen, als ob es Teil von .wgetrc wäre" #: init/completions/wget.fish:9 msgid "Log all messages to logfile" msgstr "Alle Nachrichten in Logdatei speichern" #: init/completions/wget.fish:10 msgid "Append all messages to logfile" msgstr "Alle Nachrichten an Logdatei anhängen" #: init/completions/wget.fish:11 msgid "Turn on debug output" msgstr "Debug-Ausgabe aktivieren" #: init/completions/wget.fish:14 init/completions/wget.fish:15 msgid "Turn off verbose without being completely quiet" msgstr "verbose-Modus abschalten, jedoch nicht vollkommen ruhig" #: init/completions/wget.fish:16 msgid "Read URLs from file" msgstr "URLs aus Datei lesen" #: init/completions/wget.fish:17 msgid "Force input to be treated as HTML" msgstr "Erzwinge die Behandlung der Eingabe als HTML" #: init/completions/wget.fish:18 msgid "Prepend string to relative links" msgstr "Zeichenkette vor relative Links setzen" #: init/completions/wget.fish:19 msgid "Bind address on local machine" msgstr "Adresse an lokale Maschine binden" #: init/completions/wget.fish:20 msgid "Set number of retries to number" msgstr "Anzahl Versuche auf Anzahl setzen" #: init/completions/wget.fish:21 msgid "Concatenate output to file" msgstr "Ausgabe an Datei anfügen" #: init/completions/wget.fish:22 init/completions/wget.fish:23 msgid "Never overwrite files with same name" msgstr "Dateien gleichen Namens niemals überschreiben" #: init/completions/wget.fish:24 msgid "Continue getting a partially-downloaded file" msgstr "Abruf einer teilweise übertragenen Datei fortsetzen" #: init/completions/wget.fish:25 msgid "Select progress meter type" msgstr "Typ der Verlaufsanzeige wählen" #: init/completions/wget.fish:32 msgid "Turn on time-stamping" msgstr "Zeitstempel aktivieren" #: init/completions/wget.fish:33 msgid "Print the headers/responses sent by servers" msgstr "Von Servern gesendete Kopfzeilen/Antworten anzeigen" #: init/completions/wget.fish:34 msgid "Do not download the pages, just check that they are there" msgstr "Seiten nicht abrufen, nur auf Verfügbarkeit testen" #: init/completions/wget.fish:35 msgid "Set the network timeout" msgstr "Zeitablauf für Netzwerk setzen" #: init/completions/wget.fish:36 msgid "Set the DNS lookup timeout" msgstr "Zeitablauf für DNS-Abfragen setzen" #: init/completions/wget.fish:37 msgid "Set the connect timeout" msgstr "Verbindungszeitablauf setzen" #: init/completions/wget.fish:38 msgid "Set the read (and write) timeout" msgstr "Lese- (und Schreib-)Zeitablauf setzen" #: init/completions/wget.fish:39 msgid "Limit the download speed" msgstr "Abruf-Geschwindigkeit begrenzen" #: init/completions/wget.fish:40 msgid "Wait the specified number of seconds between the retrievals" msgstr "angegebene Sekundenanzahl zwischen den Abrufen warten" #: init/completions/wget.fish:41 msgid "Wait time between retries" msgstr "Wartezeiten zwischen Abrufversuchen" #: init/completions/wget.fish:42 msgid "Wait random amount of time between retrievals" msgstr "Zufällige Zeitspanne zwischen Abrufen warten" #: init/completions/wget.fish:43 msgid "Toggle proxy support" msgstr "Proxy-Unterstützung ein/ausschalten" #: init/completions/wget.fish:44 msgid "Specify download quota for automatic retrievals" msgstr "Abruf-Quote für automatische Abrufe festlegen" #: init/completions/wget.fish:45 msgid "Turn off caching of DNS lookups" msgstr "Zwischenspeicherung von DNS-Abfragen abschalten" #: init/completions/wget.fish:46 msgid "Change which characters found in remote URLs may show up in local file names" msgstr "Festlegung, welche Zeichen aus URLs in lokalen Dateinamen vorkommen dürfen" #: init/completions/wget.fish:53 init/completions/wget.fish:54 msgid "Do not create a hierarchy of directories" msgstr "Keine Verzeichnis-Hierarchie erstellen" #: init/completions/wget.fish:55 msgid "Force creation of a hierarchy of directories" msgstr "Erstellung einer Verzeichnis-Hierarchie erzwingen" #: init/completions/wget.fish:56 init/completions/wget.fish:57 msgid "Disable generation of host-prefixed directories" msgstr "Generierung von Verzeichnissen mit Host-Prefix deaktivieren" #: init/completions/wget.fish:58 msgid "Use the protocol name as a directory component" msgstr "Protokollname als Verzeichnisbestandteil benutzen" #: init/completions/wget.fish:59 msgid "Ignore specified number of directory components" msgstr "Angegebene Anzahl von Verzeichniskomponenten ignorieren" #: init/completions/wget.fish:60 msgid "Set directory prefix" msgstr "Verzeichnis-Prefix setzen" #: init/completions/wget.fish:61 msgid "Force html files to have html extension" msgstr "html-Erweiterung für html-Dateien erzwingen" #: init/completions/wget.fish:62 msgid "Specify the http username" msgstr "http-Anwendername angeben" #: init/completions/wget.fish:63 msgid "Specify the http password" msgstr "http-Passwort angeben" #: init/completions/wget.fish:64 msgid "Disable server-side cache" msgstr "Server-seitigen Cache deaktivieren" #: init/completions/wget.fish:65 msgid "Disable the use of cookies" msgstr "Cookie-Benutzung deaktivieren" #: init/completions/wget.fish:66 msgid "Load cookies from file" msgstr "Cookies aus Datei laden" #: init/completions/wget.fish:67 msgid "Save cookies to file" msgstr "Cookies in Datei speichern" #: init/completions/wget.fish:68 msgid "Save session cookies" msgstr "Session-Cookies speichern" #: init/completions/wget.fish:69 msgid "Ignore 'Content-Length' header" msgstr "Header für 'Content-Length' ignorieren" #: init/completions/wget.fish:70 msgid "Define an additional-header to be passed to the HTTP servers" msgstr "Zusätzliche Headerzeile definieren, die an HTTP-Server geschickt wird" #: init/completions/wget.fish:71 msgid "Specify the proxy username" msgstr "Proxy-Anwendername angeben" #: init/completions/wget.fish:72 msgid "Specify the proxy password" msgstr "Proxy-Passwort angeben" #: init/completions/wget.fish:73 msgid "Set referer URL" msgstr "Referer-URL setzen" #: init/completions/wget.fish:74 msgid "Save the headers sent by the HTTP server" msgstr "Vom HTTP-Server gesendete Kopfzeilen speichern" #: init/completions/wget.fish:75 msgid "Identify as agent-string" msgstr "Zeichenkette für User-Agent setzen" #: init/completions/wget.fish:76 init/completions/wget.fish:77 msgid "Use POST as the method for all HTTP requests and send the specified data in the request body" msgstr "POST-Methode für alle HTTP-Anforderungen benutzen und die angebenen Daten im Anforderungsteil senden" #: init/completions/wget.fish:78 msgid "Turn off keep-alive for http downloads" msgstr "keep-alive-Option für http-Abrufe abschalten" #: init/completions/wget.fish:82 msgid "Don't remove the temporary .listing files generated" msgstr "Die temporären .listing-Dateien nicht entfernen" #: init/completions/wget.fish:83 msgid "Turn off FTP globbing" msgstr "FTP-Mustererkennung abschalten" #: init/completions/wget.fish:84 msgid "Use the passive FTP retrieval scheme" msgstr "Passiven FTP-Modus benutzen" #: init/completions/wget.fish:85 msgid "Traverse symlinks and retrive pointed-to files" msgstr "Symlinks folgen und die Dateien abrufen" #: init/completions/wget.fish:89 msgid "Turn on recursive retrieving" msgstr "Rekursiven Abruf aktivieren" #: init/completions/wget.fish:90 msgid "Specify recursion maximum depth" msgstr "Maximale Rekursionstiefe angeben" #: init/completions/wget.fish:91 msgid "Delete every single file downloaded" msgstr "Jede einzelne abgerufene Datei löschen" #: init/completions/wget.fish:92 msgid "Convert the links in the document to make them suitable for local viewing" msgstr "Links im Dokument für die lokale Anzeige konvertieren" #: init/completions/wget.fish:93 msgid "Back up the original version" msgstr "Sicherung der Original-Version" #: init/completions/wget.fish:94 msgid "Turn on options suitable for mirroring" msgstr "Optionen aktivieren, die zum Spiegeln geeignet sind" #: init/completions/wget.fish:95 msgid "Download all the files that are necessary to properly display a given HTML page" msgstr "Abruf aller zur korrekten Anzeige einer HTML-Seite erforderlichen Dateien" #: init/completions/wget.fish:96 msgid "Turn on strict parsing of HTML comments" msgstr "Strenge Auswertung von HTML-Kommentaren aktivieren" #: init/completions/wget.fish:100 msgid "Comma-separated lists of file name suffixes or patterns to accept" msgstr "Komma-getrennte Liste von Dateinamen-Endungen oder Mustern, die akzeptiert werden" #: init/completions/wget.fish:101 msgid "Comma-separated lists of file name suffixes or patterns to reject" msgstr "Komma-getrennte Liste von Dateinamen-Endungen oder Mustern, die zurückgewiesen werden" #: init/completions/wget.fish:102 msgid "Set domains to be followed" msgstr "Domain-Namen angeben, die beachtet werden" #: init/completions/wget.fish:103 msgid "Specify the domains that are not to be followed" msgstr "Domain-Namen angeben, die ignoriert werden sollen" #: init/completions/wget.fish:104 msgid "Follow FTP links from HTML documents" msgstr "FTP-Links in HTML-Dokumenten folgen" #: init/completions/wget.fish:105 msgid "HTML tags to follow" msgstr "zu beachtende HTML-Markierungen" #: init/completions/wget.fish:106 msgid "HTML tags to ignore" msgstr "zu ignorierenden HTML-Markierungen" #: init/completions/wget.fish:107 msgid "Enable spanning across hosts" msgstr "" #: init/completions/wget.fish:108 msgid "Follow relative links only" msgstr "Nur relativen Links folgen" #: init/completions/wget.fish:109 msgid "Specify a comma-separated list of directories you wish to follow" msgstr "Geben Sie eine Komma-getrennte Liste von Verzeichnissen an, denen gefolgt werden soll" #: init/completions/wget.fish:110 msgid "Specify a comma-separated list of directories you wish to exclude" msgstr "Geben Sie eine Komma-getrennte Liste von Verzeichnissen an, die ausgeschlossen werden soll" #: init/completions/wget.fish:111 init/completions/wget.fish:112 msgid "Do not ever ascend to the parent directory" msgstr "Nie ins übergeordnete Verzeichnis wechseln" #: init/completions/who.fish:1 msgid "Same as -b -d --login -p -r -t -T -u" msgstr "Entspricht -b -d --login -p -r -t -T -u" #: init/completions/who.fish:2 msgid "Print time of last boot" msgstr "Zeit des letzten Neustarts zeigen" #: init/completions/who.fish:3 msgid "Print dead processes" msgstr "Tote Prozesse anzeigen" #: init/completions/who.fish:4 msgid "Print line of headings" msgstr "Überschrift anzeigen" #: init/completions/who.fish:5 msgid "Print idle time" msgstr "inaktiv-Zeit anzeigen" #: init/completions/who.fish:6 msgid "Print login process" msgstr "Anmeldeprozess anzeigen" #: init/completions/who.fish:7 msgid "Canonicalize hostnames via DNS" msgstr "Rechnernamen per DNS auflösen" #: init/completions/who.fish:8 msgid "Print hostname and user for stdin" msgstr "Hostname und Anwender für Standardeingabe anzeigen" #: init/completions/who.fish:9 msgid "Print active processes spawned by init" msgstr "Zeige von init gestartete aktive Prozesse" #: init/completions/who.fish:10 msgid "Print all login names and number of users logged on" msgstr "Zeige alle Anmelde-Namen und Anzahl angemeldeter Anwender" #: init/completions/who.fish:11 msgid "Print current runlevel" msgstr "Zeige aktuelle Systemebene" #: init/completions/who.fish:12 msgid "Print name, line, and time" msgstr "Zeige Name, Zeile und Zeit" #: init/completions/who.fish:13 msgid "Print last system clock change" msgstr "" #: init/completions/who.fish:14 init/completions/who.fish:15 #: init/completions/who.fish:16 msgid "Print users message status as +, - or ?" msgstr "Nachrichtenstatus des Anwenders als +, - oder ?" #: init/completions/who.fish:17 msgid "List users logged in" msgstr "Angemeldete Anwender anzeigen" #: init/completions/xprop.fish:3 msgid "Display grammar and exit" msgstr "Grammatik anzeigen und beenden" #: init/completions/xprop.fish:4 msgid "Select window by id" msgstr "Fenster über ID wählen" #: init/completions/xprop.fish:5 msgid "Select window by name" msgstr "Fenster über Name wählen" #: init/completions/xprop.fish:6 msgid "Display font properties" msgstr "Zeichensatzeigenschaften anzeigen" #: init/completions/xprop.fish:7 msgid "Select root window" msgstr "Root-Fenster wählen" #: init/completions/xprop.fish:8 msgid "Specify X server" msgstr "X Server angeben" #: init/completions/xprop.fish:9 msgid "Maximum display length" msgstr "Maximale Anzeigelänge" #: init/completions/xprop.fish:10 msgid "Do not show property type" msgstr "Eigenschaftstyp nicht anzeigen" #: init/completions/xprop.fish:11 msgid "Set format file" msgstr "Formatdatei setzen" #: init/completions/xprop.fish:12 msgid "Select a window by clicking on its frame" msgstr "Fenster durck Klicken auf den Rahmen wählen" #: init/completions/xprop.fish:13 msgid "Remove property" msgstr "Eigenschaft entfernen" #: init/completions/xprop.fish:19 msgid "Set property" msgstr "Eigenschaft setzen" #: init/completions/xprop.fish:25 msgid "Examine property updates forever" msgstr "" #: init/completions/xprop.fish:26 msgid "Set format" msgstr "Format setzen" #: init/completions/xsel.fish:1 msgid "Append input to selection" msgstr "Eingabe an Auswahl anfügen" #: init/completions/xsel.fish:2 msgid "Append to selection as input grows" msgstr "Neue Eingabedaten an Auswahl anfügen" #: init/completions/xsel.fish:3 msgid "Read into selection" msgstr "In Auswahl einlesen" #: init/completions/xsel.fish:4 msgid "Write selection" msgstr "Auswahl schreiben" #: init/completions/xsel.fish:5 msgid "Clear selection" msgstr "Auswahl zurücksetzen" #: init/completions/xsel.fish:6 msgid "Delete selection" msgstr "Auswahl löschen" #: init/completions/xsel.fish:7 msgid "Use primary selection" msgstr "Primäre Auswahl verwenden" #: init/completions/xsel.fish:8 msgid "Use secondary selection" msgstr "Sekundäre Auswahl verwenden" #: init/completions/xsel.fish:9 msgid "Use clipboard selection" msgstr "Clipboard-Auswahl verwenden" #: init/completions/xsel.fish:10 msgid "Make current selections persistent after program exit" msgstr "Aktuelle Selektionen nach Programmende erhalten" #: init/completions/xsel.fish:11 msgid "Exchange primary and secondary selections" msgstr "Primäre und sekundäre Selektion tauschen" #: init/completions/xsel.fish:12 msgid "X server display" msgstr "X Server-Anzeige" #: init/completions/xsel.fish:13 msgid "Timeout for retrieving selection" msgstr "Zeitablauf für Abruf der Auswahl" #: init/completions/xsel.fish:14 msgid "Error log" msgstr "Fehler-Protokolldatei" #: init/completions/xsel.fish:15 msgid "Do not detach from the controlling terminal" msgstr "Nicht vom steuernden Terminal trennen" #: init/completions/xsel.fish:17 msgid "Print informative messages" msgstr "Informative Nachrichten ausgeben" #: init/completions/yum.fish:52 msgid "Set debug level" msgstr "Debug-Grad setzen" #: init/completions/yum.fish:53 msgid "Set error level" msgstr "Fehler-Grad setzen" #: init/completions/yum.fish:54 msgid "Be tolerant of errors in commandline" msgstr "Fehler in der Befehlszeile tolerieren" #: init/completions/yum.fish:55 msgid "Set maximum delay between commands" msgstr "Maximale Verzögerung zwischen Befehlen setzen" #: init/completions/yum.fish:56 msgid "Run commands from cache" msgstr "Befehle aus dem Cache starten" #: init/completions/yum.fish:58 msgid "Specify installroot" msgstr "installroot-Verzeichnis angeben" #: init/completions/yum.fish:59 msgid "Enable repository" msgstr "Depot aktivieren" #: init/completions/yum.fish:60 msgid "Disable repository" msgstr "Depot deaktivieren" #: init/completions/yum.fish:61 msgid "Enables obsolets processing logic" msgstr "Aktiviert veraltete Verarbeitungslogik" #: init/completions/yum.fish:62 msgid "Output rss-data to file" msgstr "rss-Data in Datei ausgeben" #: init/completions/yum.fish:63 msgid "Exclude specified package from updates" msgstr "Angegebenes Paket von Aktualisierung ausschliessen" #: init/completions/zip.fish:2 msgid "Freshen: only changed files" msgstr "Aktualisieren: nur geänderte Dateien" #: init/completions/zip.fish:3 msgid "Delete entries in zipfile" msgstr "Einträge in Zip-Datei löschen" #: init/completions/zip.fish:4 msgid "Update: only changed or newer files" msgstr "Aktualisierung: nur neuere oder geänderte Dateien" #: init/completions/zip.fish:5 msgid "Move into zipfile (delete files)" msgstr "In Zip-Datei verschieben (Dateien löschen)" #: init/completions/zip.fish:7 msgid "Do not store directory names" msgstr "Verzeichnisnamen nicht speichern" #: init/completions/zip.fish:8 msgid "Do not compress at all" msgstr "Nicht komprimieren" #: init/completions/zip.fish:9 msgid "Convert LF to CR LF" msgstr "LF nach LF/CR wandeln" #: init/completions/zip.fish:10 msgid "Convert CR LF to LF" msgstr "CR/LF nach LF wandeln" #: init/completions/zip.fish:11 msgid "Compress faster" msgstr "Schnellere Kompromierung" #: init/completions/zip.fish:12 msgid "Compress better" msgstr "Bessere Komprimierung" #: init/completions/zip.fish:15 msgid "Add one-line comments" msgstr "Einzeilige Kommentare hinzufügen" #: init/completions/zip.fish:16 msgid "Add zipfile comments" msgstr "Zip-Dateikommentar hinzufügen" #: init/completions/zip.fish:17 msgid "Read names from stdin" msgstr "Namen über Standardeingabe lesen" #: init/completions/zip.fish:18 msgid "Make zipfile as old as the latest entry" msgstr "Zip-Datei erhält Datum des jüngsten Eintrages" #: init/completions/zip.fish:19 msgid "Exclude the following names" msgstr "Folgende Namen ausschliessen" #: init/completions/zip.fish:20 msgid "Include only the following names" msgstr "Nur die folgenden Namen einschliessen" #: init/completions/zip.fish:21 msgid "Fix zipfile" msgstr "Zip-Datei korrigieren" #: init/completions/zip.fish:22 msgid "Fix zipfile (try harder)" msgstr "Zip-Datei korrigieren (intensiver)" #: init/completions/zip.fish:23 msgid "Adjust offsets to suit self-extracting exe" msgstr "Offsets für selbstextrahierende Programme anpassen" #: init/completions/zip.fish:24 msgid "Strip prepended data" msgstr "Vorangestellte Daten entfernen" #: init/completions/zip.fish:25 msgid "Test zipfile integrity" msgstr "Integrität der Zip-Datei testen" #: init/completions/zip.fish:26 msgid "Exclude extra file attributes" msgstr "Zusätzliche Dateiattribute ausschliessen" #: init/completions/zip.fish:27 msgid "Store symbolic links as links" msgstr "Symbolische Links als Links speichern" #: init/completions/zip.fish:28 msgid "PKZIP recursion" msgstr "PKZIP-Rekursion" #: init/completions/zip.fish:29 msgid "Encrypt" msgstr "Verschlüsseln" #: init/completions/zip.fish:30 msgid "Don't compress files with these suffixes" msgstr "Dateien mit diesen Endungen nicht komprimieren" fish/po/en.po000066400000000000000000012377241214535744100134150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: fish 1.21.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-10-27 11:34+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Axel Liljencrantz \n" "Language-Team: English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: builtin.c:83 #, c-format msgid "Send job %d, '%ls' to foreground\n" msgstr "Send job %d, “%ls†to foreground\n" #: builtin.c:352 #, c-format msgid "" "%ls: Type 'help %ls' for related documentation\n" "\n" msgstr "" "%ls: Type “help %ls†for related documentation\n" "\n" #: builtin.c:498 #, c-format msgid "%ls: No key with name '%ls' found\n" msgstr "%ls: No key with name “%ls†found\n" #: builtin.c:504 #, c-format msgid "%ls: Key with name '%ls' does not have any mapping\n" msgstr "%ls: Key with name “%ls†does not have any mapping\n" #: builtin.c:510 #, c-format msgid "%ls: Unknown error trying to bind to key named '%ls'\n" msgstr "%ls: Unknown error trying to bind to key named “%lsâ€\n" #: builtin.c:701 #, c-format msgid "%ls: Expected zero or two parameters, got %d" msgstr "" #: builtin.c:725 #, c-format msgid "%ls: Invalid state\n" msgstr "" #: builtin.c:830 #, c-format msgid "%ls: Can not specify scope when removing block\n" msgstr "" #: builtin.c:836 #, c-format msgid "%ls: No blocks defined\n" msgstr "" #: builtin.c:1328 builtin.h:29 #, c-format msgid "%ls: Invalid combination of options\n" msgstr "%ls: Invalid combination of options\n" #: builtin.c:1350 #, c-format msgid "%ls: Expected exactly one function name\n" msgstr "%ls: Expected exactly one function name\n" #: builtin.c:1360 #, c-format msgid "%ls: Function '%ls' does not exist\n" msgstr "%ls: Function “%ls†does not exist\n" #: builtin.c:1534 #, c-format msgid "%ls: Unknown signal '%ls'\n" msgstr "%ls: Unknown signal “%lsâ€\n" #: builtin.c:1558 builtin.c:1728 #, c-format msgid "%ls: Invalid variable name '%ls'\n" msgstr "%ls: Invalid variable name “%lsâ€\n" #: builtin.c:1624 #, c-format msgid "%ls: Cannot find calling job for event handler\n" msgstr "%ls: Cannot find calling job for event handler\n" #: builtin.c:1642 #, c-format msgid "%ls: Invalid process id %ls\n" msgstr "%ls: Invalid process id %ls\n" #: builtin.c:1693 #, c-format msgid "%ls: Expected function name\n" msgstr "%ls: Expected function name\n" #: builtin.c:1700 #, c-format msgid "%ls: Illegal function name '%ls'\n" msgstr "%ls: Illegal function name “%lsâ€\n" #: builtin.c:1710 #, c-format msgid "" "%ls: The name '%ls' is reserved,\n" "and can not be used as a function name\n" msgstr "" "%ls: The name “%ls†is reserved,\n" "and can not be used as a function name\n" #: builtin.c:1741 #, c-format msgid "%ls: Expected one argument, got %d\n" msgstr "%ls: Expected one argument, got %d\n" #: builtin.c:1757 msgid "Current functions are: " msgstr "Current functions are: " #: builtin.c:1901 #, c-format msgid "%ls: Seed value '%ls' is not a valid number\n" msgstr "%ls: Seed value “%ls†is not a valid number\n" #: builtin.c:1915 #, c-format msgid "%ls: Expected zero or one argument, got %d\n" msgstr "%ls: Expected zero or one argument, got %d\n" #: builtin.c:2421 main.c:389 parser.c:1208 msgid "Standard input" msgstr "Standard input" #: builtin.c:2464 msgid "This is a login shell\n" msgstr "This is a login shell\n" #: builtin.c:2466 msgid "This is not a login shell\n" msgstr "This is not a login shell\n" #: builtin.c:2468 #, c-format msgid "Job control: %ls\n" msgstr "Job control: %ls\n" #: builtin.c:2469 msgid "Only on interactive jobs" msgstr "Only on interactive jobs" #: builtin.c:2470 msgid "Never" msgstr "Never" #: builtin.c:2470 msgid "Always" msgstr "Always" #: builtin.c:2506 builtin.c:3443 #, c-format msgid "%ls: Argument '%ls' must be an integer\n" msgstr "%ls: Argument “%ls†must be an integer\n" #: builtin.c:2566 #, c-format msgid "%ls: Could not find home directory\n" msgstr "%ls: Could not find home directory\n" #: builtin.c:2580 builtin.c:2636 #, c-format msgid "%ls: '%ls' is not a directory\n" msgstr "%ls: “%ls†is not a directory\n" #: builtin.c:2587 #, c-format msgid "%ls: The directory '%ls' does not exist\n" msgstr "%ls: The directory “%ls†does not exist\n" #: builtin.c:2594 #, c-format msgid "%ls: '%ls' is a rotten symlink\n" msgstr "%ls: “%ls†is a rotten symlink\n" #: builtin.c:2602 #, c-format msgid "%ls: Unknown error trying to locate directory '%ls'\n" msgstr "%ls: Unknown error trying to locate directory “%lsâ€\n" #: builtin.c:2627 #, c-format msgid "%ls: Permission denied: '%ls'\n" msgstr "%ls: Permission denied: “%lsâ€\n" #: builtin.c:2653 #, c-format msgid "%ls: Could not set PWD variable\n" msgstr "%ls: Could not set PWD variable\n" #: builtin.c:2739 #, c-format msgid "%ls: Key not specified\n" msgstr "%ls: Key not specified\n" #: builtin.c:2784 builtin.c:2798 #, c-format msgid "%ls: Error encountered while sourcing file '%ls':\n" msgstr "%ls: Error encountered while sourcing file “%lsâ€:\n" #: builtin.c:2792 #, c-format msgid "%ls: '%ls' is not a file\n" msgstr "%ls: “%ls†is not a file\n" #: builtin.c:2831 #, c-format msgid "%ls: Error while reading file '%ls'\n" msgstr "%ls: Error while reading file “%lsâ€\n" #: builtin.c:2903 builtin.c:3083 #, c-format msgid "%ls: There are no suitable jobs\n" msgstr "%ls: There are no suitable jobs\n" #: builtin.c:2932 #, c-format msgid "%ls: Ambiguous job\n" msgstr "%ls: Ambiguous job\n" #: builtin.c:2938 builtin.c:3106 builtin_jobs.c:301 #, c-format msgid "%ls: '%ls' is not a job\n" msgstr "%ls: “%ls†is not a job\n" #: builtin.c:2969 builtin_jobs.c:316 #, c-format msgid "%ls: No suitable job: %d\n" msgstr "%ls: No suitable job: %d\n" #: builtin.c:2978 #, c-format msgid "" "%ls: Can't put job %d, '%ls' to foreground because it is not under job " "control\n" msgstr "" "%ls: Can't put job %d, “%ls†to foreground because it is not under job " "control\n" #: builtin.c:3032 #, c-format msgid "%ls: Unknown job '%ls'\n" msgstr "%ls: Unknown job “%lsâ€\n" #: builtin.c:3041 #, c-format msgid "" "%ls: Can't put job %d, '%ls' to background because it is not under job " "control\n" msgstr "" "%ls: Can't put job %d, “%ls†to background because it is not under job " "control\n" #: builtin.c:3051 #, c-format msgid "Send job %d '%ls' to background\n" msgstr "Send job %d “%ls†to background\n" #: builtin.c:3089 msgid "(default)" msgstr "(default)" #: builtin.c:3218 #, c-format msgid "%ls: Not inside of block\n" msgstr "%ls: Not inside of block\n" #: builtin.c:3308 #, c-format msgid "%ls: Missing function definition information." msgstr "%ls: Missing function definition information." #: builtin.c:3339 #, c-format msgid "%ls: Not inside of 'if' block\n" msgstr "%ls: Not inside of “if†block\n" #: builtin.c:3391 #, c-format msgid "%ls: Not inside of loop\n" msgstr "%ls: Not inside of loop\n" #: builtin.c:3453 builtin_complete.c:601 builtin.h:76 #, c-format msgid "%ls: Too many arguments\n" msgstr "%ls: Too many arguments\n" #: builtin.c:3469 #, c-format msgid "%ls: Not inside of function\n" msgstr "%ls: Not inside of function\n" #: builtin.c:3499 #, c-format msgid "%ls: Expected exactly one argument, got %d\n" msgstr "%ls: Expected exactly one argument, got %d\n" #: builtin.c:3531 #, c-format msgid "%ls: 'case' command while not in switch block\n" msgstr "%ls: “case†command while not in switch block\n" #: builtin.c:3575 msgid "Temporarily block delivery of events" msgstr "Temporarily block delivery of events" #: builtin.c:3579 msgid "Run a builtin command instead of a function" msgstr "Run a builtin command instead of a function" #: builtin.c:3583 msgid "Change working directory" msgstr "Change working directory" #: builtin.c:3587 msgid "Count the number of arguments" msgstr "Count the number of arguments" #: builtin.c:3591 msgid "Search for a specified string in a list" msgstr "" #: builtin.c:3595 msgid "Emit an event" msgstr "Emit an event" #: builtin.c:3599 msgid "Exit the shell" msgstr "Exit the shell" #: builtin.c:3603 msgid "Define a new function" msgstr "Define a new function" #: builtin.c:3607 msgid "List or remove functions" msgstr "List or remove functions" #: builtin.c:3611 msgid "Edit command specific completions" msgstr "Edit command specific completions" #: builtin.c:3615 msgid "End a block of commands" msgstr "End a block of commands" #: builtin.c:3619 msgid "Evaluate block if condition is false" msgstr "Evaluate block if condition is false" #: builtin.c:3623 msgid "Perform a set of commands multiple times" msgstr "Perform a set of commands multiple times" #: builtin.c:3627 msgid "Evaluate contents of file" msgstr "Evaluate contents of file" #: builtin.c:3631 msgid "Handle environment variables" msgstr "Handle environment variables" #: builtin.c:3635 msgid "Send job to foreground" msgstr "Send job to foreground" #: builtin.c:3639 msgid "Send job to background" msgstr "Send job to background" #: builtin.c:3643 msgid "Print currently running jobs" msgstr "Print currently running jobs" #: builtin.c:3647 msgid "Read a line of input into variables" msgstr "Read a line of input into variables" #: builtin.c:3651 msgid "Stop the innermost loop" msgstr "Stop the innermost loop" #: builtin.c:3655 msgid "Skip the rest of the current lap of the innermost loop" msgstr "Skip the rest of the current lap of the innermost loop" #: builtin.c:3659 msgid "Stop the currently evaluated function" msgstr "Stop the currently evaluated function" #: builtin.c:3663 msgid "Set or get the commandline" msgstr "Set or get the commandline" #: builtin.c:3667 builtin.c:3671 msgid "Conditionally execute a block of commands" msgstr "Conditionally execute a block of commands" #: builtin.c:3675 msgid "Handle fish key bindings" msgstr "Handle fish key bindings" #: builtin.c:3679 msgid "Generate random number" msgstr "Generate random number" #: builtin.c:3683 msgid "Return status information about fish" msgstr "Return status information about fish" #: builtin.c:3687 msgid "Set or get the shells resource usage limits" msgstr "Set or get the shells resource usage limits" #: builtin.c:3691 msgid "Create a block of code" msgstr "Create a block of code" #: builtin.c:3695 msgid "" "Temporarily halt execution of a script and launch an interactive debug prompt" msgstr "" "Temporarily halt execution of a script and launch an interactive debug prompt" #: builtin.c:3705 msgid "Run a program instead of a function or builtin" msgstr "Run a program instead of a function or builtin" #: builtin.c:3709 msgid "Evaluate block if condition is true" msgstr "Evaluate block if condition is true" #: builtin.c:3713 msgid "Perform a command multiple times" msgstr "Perform a command multiple times" #: builtin.c:3717 msgid "Negate exit status of job" msgstr "Negate exit status of job" #: builtin.c:3721 msgid "Execute command if previous command suceeded" msgstr "Execute command if previous command suceeded" #: builtin.c:3725 msgid "Execute command if previous command failed" msgstr "Execute command if previous command failed" #: builtin.c:3729 msgid "Run command in current process" msgstr "Run command in current process" #: builtin.c:3817 parser.c:63 #, c-format msgid "Unknown builtin '%ls'" msgstr "Unknown builtin “%lsâ€" #: builtin_commandline.c:464 #, c-format msgid "%ls: Unknown input function '%ls'\n" msgstr "%ls: Unknown input function “%lsâ€\n" #: builtin_complete.c:313 #, c-format msgid "%ls: Command only available in interactive sessions" msgstr "%ls: Command only available in interactive sessions" #: builtin_jobs.c:87 msgid "Job\tGroup\t" msgstr "Job\tGroup\t" #: builtin_jobs.c:89 msgid "CPU\t" msgstr "CPU\t" #: builtin_jobs.c:91 msgid "State\tCommand\n" msgstr "State\tCommand\n" #: builtin_jobs.c:100 proc.c:661 msgid "stopped" msgstr "stopped" #: builtin_jobs.c:100 msgid "running" msgstr "running" #: builtin_jobs.c:115 msgid "Group\n" msgstr "Group\n" #: builtin_jobs.c:128 msgid "Procces\n" msgstr "Procces\n" #: builtin_jobs.c:145 msgid "Command\n" msgstr "Command\n" #: builtin_jobs.c:342 #, c-format msgid "%ls: There are no jobs\n" msgstr "%ls: There are no jobs\n" #: builtin_set.c:158 #, c-format msgid "%ls: Tried to change the read-only variable '%ls'\n" msgstr "%ls: Tried to change the read-only variable “%lsâ€\n" #: builtin_set.c:165 #, c-format msgid "%ls: Unknown error" msgstr "%ls: Unknown error" #: builtin_set.c:217 #, c-format msgid "%ls: Multiple variable names specified in single call (%ls and %.*ls)\n" msgstr "" "%ls: Multiple variable names specified in single call (%ls and %.*ls)\n" #: builtin_set.c:244 #, c-format msgid "%ls: Invalid index starting at '%ls'\n" msgstr "%ls: Invalid index starting at “%lsâ€\n" #: builtin_set.c:689 #, c-format msgid "" "%ls: Erase needs a variable name\n" "%ls\n" msgstr "" "%ls: Erase needs a variable name\n" "%ls\n" #: builtin_set.c:733 #, c-format msgid "%ls: Can not specify scope when erasing array slice\n" msgstr "%ls: Can not specify scope when erasing array slice\n" #: builtin_set.c:847 #, c-format msgid "%ls: Values cannot be specfied with erase\n" msgstr "%ls: Values cannot be specfied with erase\n" #: common.c:1756 #, msgid "This is a bug. " msgstr "This is a bug. " #: complete.c:61 #, c-format msgid "Home for %s" msgstr "" #: complete.c:66 #, c-format msgid "Variable: %ls" msgstr "Variable: %ls" #: complete.c:808 complete.c:826 msgid "Unknown option: " msgstr "Unknown option: " #: complete.c:831 msgid "Multiple matches for option: " msgstr "Multiple matches for option: " #: env.c:238 msgid "Could not get user information" msgstr "Could not get user information" #: env.c:340 env.c:344 msgid "Changing language to English" msgstr "Changing language to English" #: env.c:1309 msgid "Tried to pop empty environment stack." msgstr "Tried to pop empty environment stack." #: env_universal_common.c:510 #, c-format msgid "Could not convert message '%s' to wide character string" msgstr "Could not convert message “%s†to wide character string" #: event.c:225 #, c-format msgid "signal handler for %ls (%ls)" msgstr "signal handler for %ls (%ls)" #: event.c:229 #, c-format msgid "handler for variable '%ls'" msgstr "handler for variable “%lsâ€" #: event.c:235 #, c-format msgid "exit handler for process %d" msgstr "exit handler for process %d" #: event.c:241 event.c:252 #, c-format msgid "exit handler for job %d, '%ls'" msgstr "exit handler for job %d, “%lsâ€" #: event.c:243 #, c-format msgid "exit handler for job with process group %d" msgstr "exit handler for job with process group %d" #: event.c:254 #, c-format msgid "exit handler for job with job id %d" msgstr "exit handler for job with job id %d" #: event.c:260 #, c-format msgid "handler for generic event '%ls'" msgstr "handler for generic event “%lsâ€" #: event.c:264 #, msgid "Unknown event type" msgstr "Unknown event type" #: event.c:588 msgid "Signal list overflow. Signals have been ignored." msgstr "Signal list overflow. Signals have been ignored." #: exec.c:54 #, c-format msgid "An error occurred while redirecting file descriptor %d" msgstr "An error occurred while redirecting file descriptor %d" #: exec.c:59 #, c-format msgid "An error occurred while redirecting file '%ls'" msgstr "An error occurred while redirecting file “%lsâ€" #: exec.c:64 #, c-format msgid "The file '%ls' already exists" msgstr "The file “%ls†already exists" #: exec.c:69 msgid "Could not create child process - exiting" msgstr "Could not create child process - exiting" #: exec.c:289 #, c-format msgid "Failed to close file descriptor %d" msgstr "Failed to close file descriptor %d" #: exec.c:509 #, c-format msgid "Failed to execute process '%ls'" msgstr "Failed to execute process “%lsâ€" #: exec.c:689 #, c-format msgid "" "Could not send process %d, '%ls' in job %d, '%ls' from group %d to group %d" msgstr "" "Could not send process %d, “%ls†in job %d, “%ls†from group %d to group %d" #: exec.c:711 proc.c:893 proc.c:905 #, c-format msgid "Could not send job %d ('%ls') to foreground" msgstr "Could not send job %d (“%lsâ€) to foreground" #: exec.c:1047 #, c-format msgid "Unknown function '%ls'" msgstr "Unknown function “%lsâ€" #: exec.c:1167 #, c-format msgid "Unknown input redirection type %d" msgstr "Unknown input redirection type %d" #: expand.c:53 #, c-format msgid "" "The '$' character begins a variable name. The character '%lc', which " "directly followed a '$', is not allowed as a part of a variable name, and " "variable names may not be zero characters long. To learn more about variable " "expansion in fish, type 'help expand-variable'." msgstr "" "The “$†character begins a variable name. The character “%lcâ€, which " "directly followed a “$â€, is not allowed as a part of a variable name, and " "variable names may not be zero characters long. To learn more about variable " "expansion in fish, type “help expand-variableâ€." #: expand.c:58 msgid "" "The '$' begins a variable name. It was given at the end of an argument. " "Variable names may not be zero characters long. To learn more about variable " "expansion in fish, type 'help expand-variable'." msgstr "" "The “$†begins a variable name. It was given at the end of an argument. " "Variable names may not be zero characters long. To learn more about variable " "expansion in fish, type “help expand-variableâ€." #: expand.c:63 #, c-format msgid "" "Did you mean %ls{$%ls}%ls? The '$' character begins a variable name. A " "bracket, which directly followed a '$', is not allowed as a part of a " "variable name, and variable names may not be zero characters long. To learn " "more about variable expansion in fish, type 'help expand-variable'." msgstr "" "Did you mean %ls{$%ls}%ls? The “$†character begins a variable name. A " "bracket, which directly followed a “$â€, is not allowed as a part of a " "variable name, and variable names may not be zero characters long. To learn " "more about variable expansion in fish, type “help expand-variableâ€." #: expand.c:68 msgid "" "Did you mean (COMMAND)? In fish, the '$' character is only used for " "accessing variables. To learn more about command substitution in fish, type " "'help expand-command-substitution'." msgstr "" "Did you mean (COMMAND)? In fish, the “$†character is only used for " "accessing variables. To learn more about command substitution in fish, type " "“help expand-command-substitutionâ€." #: expand.c:73 msgid "Child process" msgstr "Child process" #: expand.c:78 msgid "Process" msgstr "Process" #: expand.c:83 msgid "Job" msgstr "Job" #: expand.c:88 #, c-format msgid "Job: %ls" msgstr "Job: %ls" #: expand.c:93 msgid "Shell process" msgstr "Shell process" #: expand.c:98 msgid "Last background job" msgstr "Last background job" #: expand.c:1185 msgid "Mismatched brackets" msgstr "Mismatched brackets" #: fish_indent.c:310 #, c-format msgid "%ls, version %s\n" msgstr "%ls, version %s\n" #: fish_pager.c:118 #, c-format msgid "%ls: Argument '%s' is not a valid file descriptor\n" msgstr "%ls: Argument “%s†is not a valid file descriptor\n" #: fish_pager.c:706 #, c-format msgid " %d to %d of %d" msgstr "" #: fish_pager.c:1041 msgid "Could not set up output file descriptors for pager" msgstr "" #: fish_pager.c:1047 #, msgid "Could not set up input file descriptors for pager" msgstr "Could not set up input file descriptors for pager" #: fish_pager.c:1053 msgid "Could not open tty for pager" msgstr "Could not open tty for pager" #: fish_pager.c:1060 msgid "Could not initialize result pipe" msgstr "" #: fish_pager.c:1111 input.c:336 msgid "Could not set up terminal" msgstr "Could not set up terminal" #: fish_pager.c:1135 input.c:362 set_color.c:335 #, c-format msgid "Error while closing terminfo" msgstr "Error while closing terminfo" #: fish_pager.c:1347 msgid "Unspecified file descriptors" msgstr "Unspecified file descriptors" #: fish_pager.c:1359 #, msgid "Could not read completions" msgstr "Could not read completions" #: fishd.c:465 path.c:286 msgid "" "Unable to create a configuration directory for fish. Your personal settings " "will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory " "where the current user has write access." msgstr "" #: io.c:87 #, c-format msgid "" "An error occured while reading output from code block on file descriptor %d" msgstr "" "An error occured while reading output from code block on file descriptor %d" #: main.c:219 #, c-format msgid "Invalid value '%s' for debug level switch" msgstr "Invalid value “%s†for debug level switch" #: main.c:258 mimedb.c:1286 set_color.c:226 #, c-format msgid "%s, version %s\n" msgstr "%s, version %s\n" #: main.c:310 msgid "Can not use the no-execute mode when running an interactive session" msgstr "Can not use the no-execute mode when running an interactive session" #: main.c:388 #, c-format msgid "Error while reading file %ls\n" msgstr "Error while reading file %ls\n" #: mimedb.c:157 mimedb.c:171 mimedb.c:1114 #, c-format msgid "%s: Out of memory\n" msgstr "%s: Out of memory\n" #: mimedb.c:406 #, c-format msgid "%s: Unknown error in munge()\n" msgstr "%s: Unknown error in munge()\n" #: mimedb.c:424 #, c-format msgid "%s: Locale string too long\n" msgstr "%s: Locale string too long\n" #: mimedb.c:494 mimedb.c:502 #, c-format msgid "%s: Could not compile regular expressions %s with error %s\n" msgstr "%s: Could not compile regular expressions %s with error %s\n" #: mimedb.c:615 #, c-format msgid "%s: No description for type %s\n" msgstr "%s: No description for type %s\n" #: mimedb.c:679 #, c-format msgid "%s: Could not parse launcher string '%s'\n" msgstr "%s: Could not parse launcher string “%sâ€\n" #: mimedb.c:712 #, c-format msgid "%s: Default launcher '%s' does not specify how to start\n" msgstr "%s: Default launcher “%s†does not specify how to start\n" #: mimedb.c:1093 #, c-format msgid "%s: Unsupported switch '%c' in launch string '%s'\n" msgstr "%s: Unsupported switch “%c†in launch string “%sâ€\n" #: mimedb.c:1297 #, c-format msgid "%s: Can not launch a mimetype\n" msgstr "%s: Can not launch a mimetype\n" #: mimedb.c:1329 #, c-format msgid "%s: Could not parse mimetype from argument '%s'\n" msgstr "%s: Could not parse mimetype from argument “%sâ€\n" #: mimedb.c:1349 signal.c:407 signal.c:422 msgid "Unknown" msgstr "Unknown" #: mimedb.c:1410 #, c-format msgid "%s: Unknown error\n" msgstr "%s: Unknown error\n" #: parse_util.c:892 #, c-format msgid "Could not autoload item '%ls', it is already being autoloaded. " msgstr "Could not autoload item “%lsâ€, it is already being autoloaded. " #: parser.c:68 msgid "This command can not be used in a pipeline" msgstr "This command can not be used in a pipeline" #: parser.c:74 #, c-format msgid "Tokenizer error: '%ls'" msgstr "Tokenizer error: “%lsâ€" #: parser.c:79 msgid "An additional command is required" msgstr "An additional command is required" #: parser.c:84 msgid "Maximum recursion depth reached. Accidental infinite loop?" msgstr "Maximum recursion depth reached. Accidental infinite loop?" #: parser.c:89 msgid "" "Could not locate end of block. The 'end' command is missing, misspelled or a " "';' is missing." msgstr "" "Could not locate end of block. The “end†command is missing, misspelled or a " "“;†is missing." #: parser.c:94 msgid "Maximum number of nested blocks reached." msgstr "Maximum number of nested blocks reached." #: parser.c:99 #, c-format msgid "Expected a command name, got token of type '%ls'" msgstr "Expected a command name, got token of type “%lsâ€" #: parser.c:104 #, c-format msgid "" "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; or " "COMMAND'? See the help section for the 'or' builtin command by typing 'help " "or'." msgstr "" "Expected a command name, got token of type “%lsâ€. Did you mean “COMMAND; or " "COMMANDâ€? See the help section for the “or†builtin command by typing “help " "orâ€." #: parser.c:109 #, c-format msgid "" "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; and " "COMMAND'? See the help section for the 'and' builtin command by typing 'help " "and'." msgstr "" "Expected a command name, got token of type “%lsâ€. Did you mean “COMMAND; and " "COMMANDâ€? See the help section for the “and†builtin command by typing “help " "andâ€." #: parser.c:114 #, c-format msgid "Illegal command name '%ls'" msgstr "Illegal command name “%lsâ€" #: parser.c:119 #, c-format msgid "Illegal file descriptor '%ls'" msgstr "Illegal file descriptor “%lsâ€" #: parser.c:124 #, c-format msgid "Warning: No match for wildcard '%ls'. The command will not be executed." msgstr "" "Warning: No match for wildcard “%lsâ€. The command will not be executed." #: parser.c:129 msgid "'case' builtin not inside of switch block" msgstr "“case†builtin not inside of switch block" #: parser.c:134 msgid "Loop control command while not inside of loop" msgstr "Loop control command while not inside of loop" #: parser.c:139 msgid "'return' builtin command outside of function definition" msgstr "“return†builtin command outside of function definition" #: parser.c:144 msgid "'else' builtin not inside of if block" msgstr "“else†builtin not inside of if block" #: parser.c:149 msgid "'end' command outside of block" msgstr "“end†command outside of block" #: parser.c:154 #, c-format msgid "" "Unknown command '%ls'. Did you mean 'set %ls %ls'? For information on " "assigning values to variables, see the help section on the set command by " "typing 'help set'." msgstr "" "Unknown command “%lsâ€. Did you mean “set %ls %lsâ€? For information on " "assigning values to variables, see the help section on the set command by " "typing “help setâ€." #: parser.c:159 #, c-format msgid "Expected redirection specification, got token of type '%ls'" msgstr "Expected redirection specification, got token of type “%lsâ€" #: parser.c:164 msgid "" "Encountered redirection when expecting a command name. Fish does not allow a " "redirection operation before a command." msgstr "" "Encountered redirection when expecting a command name. Fish does not allow a " "redirection operation before a command." #: parser.c:169 msgid "Tried to evaluate null pointer." msgstr "Tried to evaluate null pointer." #: parser.c:174 #, c-format msgid "Tried to evaluate commands using invalid block type '%ls'" msgstr "Tried to evaluate commands using invalid block type “%lsâ€" #: parser.c:180 #, c-format msgid "Unexpected token of type '%ls'" msgstr "Unexpected token of type “%lsâ€" #: parser.c:185 msgid "'while' block" msgstr "“while†block" #: parser.c:190 msgid "'for' block" msgstr "“for†block" #: parser.c:195 msgid "Block created by breakpoint" msgstr "Block created by breakpoint" #: parser.c:202 msgid "'if' conditional block" msgstr "“if†conditional block" #: parser.c:208 msgid "function definition block" msgstr "function definition block" #: parser.c:214 msgid "function invocation block" msgstr "function invocation block" #: parser.c:219 msgid "function invocation block with no variable shadowing" msgstr "function invocation block with no variable shadowing" #: parser.c:225 msgid "'switch' block" msgstr "“switch†block" #: parser.c:231 msgid "unexecutable block" msgstr "unexecutable block" #: parser.c:237 msgid "global root block" msgstr "global root block" #: parser.c:243 msgid "command substitution block" msgstr "command substitution block" #: parser.c:249 msgid "'begin' unconditional block" msgstr "“begin†unconditional block" #: parser.c:255 msgid "Block created by the . builtin" msgstr "Block created by the . builtin" #: parser.c:260 msgid "event handler block" msgstr "event handler block" #: parser.c:266 msgid "unknown/invalid block" msgstr "unknown/invalid block" #: parser.c:761 #, c-format msgid "Could not write profiling information to file '%s'" msgstr "Could not write profiling information to file “%sâ€" #: parser.c:767 msgid "Time\tSum\tCommand\n" msgstr "Time\tSum\tCommand\n" #: parser.c:945 #, c-format msgid "in event handler: %ls\n" msgstr "in event handler: %ls\n" #: parser.c:972 #, c-format msgid "in . (source) call of file '%ls',\n" msgstr "in . (source) call of file “%lsâ€,\n" #: parser.c:977 #, c-format msgid "in function '%ls',\n" msgstr "in function “%lsâ€,\n" #: parser.c:982 msgid "in command substitution\n" msgstr "in command substitution\n" #: parser.c:992 #, c-format msgid "\tcalled on line %d of file '%ls',\n" msgstr "\tcalled on line %d of file “%lsâ€,\n" #: parser.c:999 msgid "\tcalled on standard input,\n" msgstr "\tcalled on standard input,\n" #: parser.c:1013 #, c-format msgid "\twith parameter list '%ls'\n" msgstr "\twith parameter list “%lsâ€\n" #: parser.c:1202 #, c-format msgid "%ls (line %d): " msgstr "%ls (line %d): " #: parser.c:1424 #, c-format msgid "Could not expand string '%ls'" msgstr "Could not expand string “%lsâ€" #: parser.c:1541 msgid "Invalid IO redirection" msgstr "Invalid IO redirection" #: parser.c:1595 #, c-format msgid "Requested redirection to something that is not a file descriptor %ls" msgstr "Requested redirection to something that is not a file descriptor %ls" #: parser.c:2046 #, c-format msgid "" "Variables may not be used as commands. Instead, define a function like " "'function %ls; %ls $argv; end'. See the help section for the function " "command by typing 'help function'." msgstr "" "Variables may not be used as commands. Instead, define a function like " "“function %ls; %ls $argv; endâ€. See the help section for the function " "command by typing “help functionâ€." #: parser.c:2054 msgid "" "Variables may not be used as commands. Instead, define a function. See the " "help section for the function command by typing 'help function'." msgstr "" "Variables may not be used as commands. Instead, define a function. See the " "help section for the function command by typing “help functionâ€." #: parser.c:2061 #, c-format msgid "" "Commands may not contain variables. Use the eval builtin instead, like 'eval " "%ls'. See the help section for the eval command by typing 'help eval'." msgstr "" "Commands may not contain variables. Use the eval builtin instead, like “eval " "%lsâ€. See the help section for the eval command by typing “help evalâ€." #: parser.c:2068 #, c-format msgid "Unknown command '%ls'" msgstr "Unknown command “%lsâ€" #: parser.c:2551 msgid "End of block mismatch. Program terminating." msgstr "End of block mismatch. Program terminating." #: path.c:26 #, c-format msgid "Error while searching for command '%ls'" msgstr "Error while searching for command “%lsâ€" #: proc.c:155 msgid "Job inconsistency" msgstr "Job inconsistency" #: proc.c:523 #, c-format msgid "Job %d, '%ls' has %ls" msgstr "Job %d, “%ls†has %ls" #: proc.c:609 #, c-format msgid "%ls: Job %d, '%ls' terminated by signal %ls (%ls)" msgstr "%ls: Job %d, “%ls†terminated by signal %ls (%ls)" #: proc.c:617 #, c-format msgid "" "%ls: Process %d, '%ls' from job %d, '%ls' terminated by signal %ls (%ls)" msgstr "" "%ls: Process %d, “%ls†from job %d, “%ls†terminated by signal %ls (%ls)" #: proc.c:646 msgid "ended" msgstr "ended" #: proc.c:873 msgid "An error occured while reading output from code block" msgstr "An error occured while reading output from code block" #: proc.c:923 proc.c:933 proc.c:943 msgid "Could not return shell to foreground" msgstr "Could not return shell to foreground" #: proc.c:1149 msgid "Job command" msgstr "Job command" #: proc.c:1152 proc.c:1179 msgid "Process list pointer" msgstr "Process list pointer" #: proc.c:1155 msgid "Job list pointer" msgstr "Job list pointer" #: proc.c:1166 #, c-format msgid "More than one job in foreground: job 1: '%ls' job 2: '%ls'" msgstr "More than one job in foreground: job 1: “%ls†job 2: “%lsâ€" #: proc.c:1177 msgid "Process argument list" msgstr "Process argument list" #: proc.c:1178 msgid "Process name" msgstr "Process name" #: proc.c:1180 msgid "Process command" msgstr "Process command" #: proc.c:1185 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'stopped'=%d" msgstr "Job “%lsâ€, process “%ls†has inconsistent state “stoppedâ€=%d" #: proc.c:1195 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'completed'=%d" msgstr "Job “%lsâ€, process “%ls†has inconsistent state “completedâ€=%d" #: reader.c:341 msgid "Could not set terminal mode for new job" msgstr "Could not set terminal mode for new job" #: reader.c:365 msgid "Could not set terminal mode for shell" msgstr "Could not set terminal mode for shell" #: reader.c:1486 msgid "Couldn't put the shell in its own process group" msgstr "Couldn't put the shell in its own process group" #: reader.c:1496 msgid "Couldn't grab control of terminal" msgstr "Couldn't grab control of terminal" #: reader.c:2077 msgid "Pop null reader block" msgstr "Pop null reader block" #: reader.c:2215 msgid "There are stopped jobs\n" msgstr "There are stopped jobs\n" #: reader.c:2964 #, c-format msgid "Unknown keybinding %d" msgstr "Unknown keybinding %d" #: reader.c:3053 msgid "Error while reading from file descriptor" msgstr "Error while reading from file descriptor" #: reader.c:3073 msgid "Error while closing input stream" msgstr "Error while closing input stream" #: reader.c:3101 #, c-format msgid "Could not convert input. Read %d bytes." msgstr "Could not convert input. Read %d bytes." #: reader.c:3107 msgid "Could not read input stream" msgstr "Could not read input stream" #: reader.c:3116 msgid "Error while opening input stream" msgstr "Error while opening input stream" #: sanity.c:37 msgid "Errors detected, shutting down" msgstr "Errors detected, shutting down" #: sanity.c:65 #, c-format msgid "The pointer '%ls' is invalid" msgstr "The pointer “%ls†is invalid" #: sanity.c:71 #, c-format msgid "The pointer '%ls' is null" msgstr "The pointer “%ls†is null" #: set_color.c:253 #, c-format msgid "%s: Too many arguments\n" msgstr "%s: Too many arguments\n" #: set_color.c:260 #, c-format msgid "%s: Expected an argument\n" msgstr "%s: Expected an argument\n" #: set_color.c:269 set_color.c:277 #, c-format msgid "%s: Unknown color '%s'\n" msgstr "%s: Unknown color “%sâ€\n" #: signal.c:69 msgid "Terminal hung up" msgstr "Terminal hung up" #: signal.c:77 msgid "Quit request from job control (^C)" msgstr "Quit request from job control (^C)" #: signal.c:85 msgid "Quit request from job control with core dump (^\\)" msgstr "Quit request from job control with core dump (^\\)" #: signal.c:93 msgid "Illegal instruction" msgstr "Illegal instruction" #: signal.c:101 msgid "Trace or breakpoint trap" msgstr "Trace or breakpoint trap" #: signal.c:109 msgid "Abort" msgstr "Abort" #: signal.c:117 msgid "Misaligned address error" msgstr "Misaligned address error" #: signal.c:125 msgid "Floating point exception" msgstr "Floating point exception" #: signal.c:133 msgid "Forced quit" msgstr "Forced quit" #: signal.c:141 msgid "User defined signal 1" msgstr "User defined signal 1" #: signal.c:148 msgid "User defined signal 2" msgstr "User defined signal 2" #: signal.c:156 msgid "Address boundary error" msgstr "Address boundary error" #: signal.c:164 msgid "Broken pipe" msgstr "Broken pipe" #: signal.c:172 msgid "Timer expired" msgstr "Timer expired" #: signal.c:180 msgid "Polite quit request" msgstr "Polite quit request" #: signal.c:188 msgid "Child process status changed" msgstr "Child process status changed" #: signal.c:196 msgid "Continue previously stopped process" msgstr "Continue previously stopped process" #: signal.c:204 msgid "Forced stop" msgstr "Forced stop" #: signal.c:212 msgid "Stop request from job control (^Z)" msgstr "Stop request from job control (^Z)" #: signal.c:220 msgid "Stop from terminal input" msgstr "Stop from terminal input" #: signal.c:228 msgid "Stop from terminal output" msgstr "Stop from terminal output" #: signal.c:236 msgid "Urgent socket condition" msgstr "Urgent socket condition" #: signal.c:244 msgid "CPU time limit exceeded" msgstr "CPU time limit exceeded" #: signal.c:252 msgid "File size limit exceeded" msgstr "File size limit exceeded" #: signal.c:260 msgid "Virtual timer expired" msgstr "Virtual timer expired" #: signal.c:268 msgid "Profiling timer expired" msgstr "Profiling timer expired" #: signal.c:276 signal.c:284 msgid "Window size change" msgstr "Window size change" #: signal.c:292 msgid "I/O on asynchronous file descriptor is possible" msgstr "I/O on asynchronous file descriptor is possible" #: signal.c:300 msgid "Power failure" msgstr "Power failure" #: signal.c:308 msgid "Bad system call" msgstr "Bad system call" #: signal.c:316 msgid "Information request" msgstr "Information request" #: signal.c:324 msgid "Stack fault" msgstr "Stack fault" #: signal.c:332 msgid "Emulator trap" msgstr "Emulator trap" #: signal.c:340 msgid "Abort (Alias for SIGABRT)" msgstr "Abort (Alias for SIGABRT)" #: signal.c:348 msgid "Unused signal" msgstr "Unused signal" #: signal.c:667 msgid "Signal block mismatch" msgstr "" #: tokenizer.c:30 msgid "Unexpected end of string, quotes are not balanced" msgstr "Unexpected end of string, quotes are not balanced" #: tokenizer.c:35 msgid "Unexpected end of string, parenthesis do not match" msgstr "Unexpected end of string, parenthesis do not match" #: tokenizer.c:40 msgid "Invalid input/output redirection" msgstr "Invalid input/output redirection" #: tokenizer.c:45 msgid "Can not use fd 0 as pipe output" msgstr "Can not use fd 0 as pipe output" #: tokenizer.c:62 msgid "Tokenizer not yet initialized" msgstr "Tokenizer not yet initialized" #: tokenizer.c:63 msgid "Tokenizer error" msgstr "Tokenizer error" #: tokenizer.c:64 msgid "Invalid token" msgstr "Invalid token" #: tokenizer.c:65 msgid "String" msgstr "String" #: tokenizer.c:66 msgid "Pipe" msgstr "Pipe" #: tokenizer.c:67 msgid "End of command" msgstr "End of command" #: tokenizer.c:68 msgid "Redirect output to file" msgstr "Redirect output to file" #: tokenizer.c:69 msgid "Append output to file" msgstr "Append output to file" #: tokenizer.c:70 msgid "Redirect input to file" msgstr "Redirect input to file" #: tokenizer.c:71 msgid "Redirect to file descriptor" msgstr "Redirect to file descriptor" #: tokenizer.c:72 msgid "Redirect output to file if file does not exist" msgstr "Redirect output to file if file does not exist" #: tokenizer.c:73 msgid "Run job in background" msgstr "Run job in background" #: tokenizer.c:74 msgid "Comment" msgstr "Comment" #: tokenizer.c:512 msgid "Invalid token type" msgstr "Invalid token type" #: wgetopt.c:542 #, c-format msgid "%ls: Option '%ls' is ambiguous\n" msgstr "%ls: Option “%ls†is ambiguous\n" #: wgetopt.c:566 #, c-format msgid "%ls: Option '--%ls' doesn't allow an argument\n" msgstr "%ls: Option “--%ls†doesn't allow an argument\n" #: wgetopt.c:571 #, c-format msgid "%ls: Option '%lc%ls' doesn't allow an argument\n" msgstr "%ls: Option “%lc%ls†doesn't allow an argument\n" #: wgetopt.c:585 #, c-format msgid "%ls: Option '%ls' requires an argument\n" msgstr "%ls: Option “%ls†requires an argument\n" #: wgetopt.c:613 #, c-format msgid "%ls: Unrecognized option '--%ls'\n" msgstr "%ls: Unrecognized option “--%lsâ€\n" #: wgetopt.c:617 #, c-format msgid "%ls: Unrecognized option '%lc%ls'\n" msgstr "%ls: Unrecognized option “%lc%lsâ€\n" #: wgetopt.c:642 #, c-format msgid "%ls: Illegal option -- %lc\n" msgstr "%ls: Illegal option -- %lc\n" #: wgetopt.c:644 #, c-format msgid "%ls: Invalid option -- %lc\n" msgstr "%ls: Invalid option -- %lc\n" #: wgetopt.c:678 #, c-format msgid "%ls: Option requires an argument -- %lc\n" msgstr "%ls: Option requires an argument -- %lc\n" #: wildcard.c:58 msgid "Executable" msgstr "Executable" #: wildcard.c:62 msgid "Executable link" msgstr "Executable link" #: wildcard.c:67 msgid "File" msgstr "File" #: wildcard.c:71 msgid "Character device" msgstr "Character device" #: wildcard.c:75 msgid "Block device" msgstr "Block device" #: wildcard.c:79 msgid "Fifo" msgstr "Fifo" #: wildcard.c:83 msgid "Symbolic link" msgstr "Symbolic link" #: wildcard.c:87 msgid "Symbolic link to directory" msgstr "Symbolic link to directory" #: wildcard.c:91 msgid "Rotten symbolic link" msgstr "Rotten symbolic link" #: wildcard.c:95 msgid "Symbolic link loop" msgstr "Symbolic link loop" #: wildcard.c:99 msgid "Socket" msgstr "Socket" #: wildcard.c:103 share/completions/ruby.fish:23 #: share/functions/__fish_complete_directories.fish:8 msgid "Directory" msgstr "Directory" #: wildcard.c:737 msgid "empty" msgstr "empty" #: builtin.h:24 #, c-format msgid "%ls: Expected argument\n" msgstr "%ls: Expected argument\n" #: builtin.h:34 #, c-format msgid "" "%ls: Invalid combination of options,\n" "%ls\n" msgstr "" "%ls: Invalid combination of options,\n" "%ls\n" #: builtin.h:39 #, c-format msgid "%ls: Variable scope can only be one of universal, global and local\n" msgstr "%ls: Variable scope can only be one of universal, global and local\n" #: builtin.h:44 #, fuzzy, c-format msgid "%ls: Variable can't be both exported and unexported\n" msgstr "%ls: Variable can't be both exported and unexported\n" #: builtin.h:49 #, c-format msgid "%ls: Unknown option '%ls'\n" msgstr "%ls: Unknown option “%lsâ€\n" #: builtin.h:54 #, c-format msgid "" "%ls: Invalid character '%lc' in variable name. Only alphanumerical " "characters and underscores are valid in a variable name.\n" msgstr "" "%ls: Invalid character “%lc†in variable name. Only alphanumerical " "characters and underscores are valid in a variable name.\n" #: builtin.h:59 #, c-format msgid "%ls: Variable name can not be the empty string\n" msgstr "%ls: Variable name can not be the empty string\n" #: builtin.h:64 #, c-format msgid "%ls: Second argument must be 'in'\n" msgstr "%ls: Second argument must be “inâ€\n" #: builtin.h:69 #, c-format msgid "%ls: Expected at least two arguments, got %d\n" msgstr "%ls: Expected at least two arguments, got %d\n" #: builtin.h:71 #, c-format msgid "%ls: '%ls' is not a valid variable name\n" msgstr "%ls: “%ls†is not a valid variable name\n" #: builtin.h:81 #, c-format msgid "%ls: Block mismatch: '%ls' vs. '%ls'\n" msgstr "%ls: Block mismatch: '%ls' vs. “%lsâ€\n" #: builtin.h:86 #, fuzzy, c-format msgid "%ls: Unknown block type '%ls'\n" msgstr "%ls: Unknown block type “%lsâ€\n" #: builtin.h:88 #, c-format msgid "%ls: Argument '%ls' is not a number\n" msgstr "%ls: Argument “%ls†is not a number\n" #: common.h:100 #, c-format msgid "function %s called with null value for argument %s. " msgstr "" #: common.h:140 #, c-format msgid "function %s called while blocking signals. " msgstr "" #: exec.h:19 msgid "An error occurred while setting up pipe" msgstr "An error occurred while setting up pipe" #: expand.h:118 msgid "Array index out of bounds" msgstr "Array index out of bounds" #: output.h:87 #, c-format msgid "" "Tried to use terminfo string %s on line %d of %s, which is undefined in " "terminal of type \"%ls\". Please report this error to %s" msgstr "" #: share/completions/apm.fish:2 share/completions/apropos.fish:20 #: share/completions/apt-build.fish:29 share/completions/apt-cache.fish:28 #: share/completions/apt-cdrom.fish:11 share/completions/apt-config.fish:5 #: share/completions/apt-file.fish:12 share/completions/apt-ftparchive.fish:15 #: share/completions/apt-proxy-import.fish:3 #: share/completions/apt-rdepends.fish:12 #: share/completions/apt-show-source.fish:8 #: share/completions/apt-sortpkgs.fish:4 share/completions/apt-zip-inst.fish:3 #: share/completions/apt-zip-list.fish:3 share/completions/at.fish:2 #: share/completions/atq.fish:2 share/completions/atrm.fish:2 #: share/functions/__fish_complete_ls.fish:96 #: share/functions/__fish_complete_tex.fish:5 msgid "Display version and exit" msgstr "Display version and exit" #: share/completions/apm.fish:3 msgid "Print APM info" msgstr "Print APM info" #: share/completions/apm.fish:4 msgid "Print time remaining" msgstr "Print time remaining" #: share/completions/apm.fish:5 msgid "Monitor status info" msgstr "Monitor status info" #: share/completions/apm.fish:6 msgid "Request APM standby mode" msgstr "Request APM standby mode" #: share/completions/apm.fish:7 msgid "Request APM suspend mode" msgstr "Request APM suspend mode" #: share/completions/apm.fish:8 msgid "APM status debugging info" msgstr "APM status debugging info" #: share/completions/apropos.fish:12 msgid "Print debugging info" msgstr "Print debugging info" #: share/completions/apropos.fish:13 share/completions/apt-file.fish:8 #: share/completions/apt-listchanges.fish:4 #: share/completions/apt-proxy-import.fish:4 #: share/completions/apt-show-source.fish:10 #: share/functions/__fish_complete_ssh.fish:59 #: share/functions/__fish_complete_vi.fish:106 msgid "Verbose mode" msgstr "Verbose mode" #: share/completions/apropos.fish:14 msgid "Keyword as regex" msgstr "Keyword as regex" #: share/completions/apropos.fish:15 msgid "Keyword as wildcards" msgstr "Keyword as wildcards" #: share/completions/apropos.fish:16 msgid "Keyword as exactly match" msgstr "Keyword as exactly match" #: share/completions/apropos.fish:17 msgid "Search for other system" msgstr "Search for other system" #: share/completions/apropos.fish:18 msgid "Specify man path" msgstr "Specify man path" #: share/completions/apropos.fish:19 msgid "Specify a configuration file" msgstr "Specify a configuration file" #: share/completions/apt-build.fish:4 msgid "Update list of packages" msgstr "Update list of packages" #: share/completions/apt-build.fish:5 msgid "Upgrade packages" msgstr "Upgrade packages" #: share/completions/apt-build.fish:6 msgid "Rebuild your system" msgstr "Rebuild your system" #: share/completions/apt-build.fish:7 msgid "Build and install a new package" msgstr "Build and install a new package" #: share/completions/apt-build.fish:8 msgid "Download and extract a source" msgstr "Download and extract a source" #: share/completions/apt-build.fish:9 msgid "Info on a package" msgstr "Info on a package" #: share/completions/apt-build.fish:10 msgid "Remove packages" msgstr "Remove packages" #: share/completions/apt-build.fish:11 msgid "Erase built packages" msgstr "Erase built packages" #: share/completions/apt-build.fish:12 msgid "Build source without install" msgstr "Build source without install" #: share/completions/apt-build.fish:13 msgid "Clean source directories" msgstr "Clean source directories" #: share/completions/apt-build.fish:14 msgid "Update source and rebuild" msgstr "Update source and rebuild" #: share/completions/apt-build.fish:15 msgid "Update the repository" msgstr "Update the repository" #: share/completions/apt-build.fish:16 msgid "Do not use gcc wrapper" msgstr "Do not use gcc wrapper" #: share/completions/apt-build.fish:17 msgid "Remove build-dep" msgstr "Remove build-dep" #: share/completions/apt-build.fish:18 msgid "Do not download source" msgstr "Do not download source" #: share/completions/apt-build.fish:19 msgid "Specify build-dir" msgstr "Specify build-dir" #: share/completions/apt-build.fish:20 msgid "Rebuild a package" msgstr "Rebuild a package" #: share/completions/apt-build.fish:21 msgid "Rebuild and install an installed package" msgstr "Rebuild and install an installed package" #: share/completions/apt-build.fish:23 msgid "Apply patch" msgstr "Apply patch" #: share/completions/apt-build.fish:28 msgid "Specify sources.list file" msgstr "Specify sources.list file" #: share/completions/apt-cache.fish:3 msgid "Build apt cache" msgstr "Build apt cache" #: share/completions/apt-cache.fish:4 msgid "Show package info" msgstr "Show package info" #: share/completions/apt-cache.fish:5 msgid "Show cache statistics" msgstr "Show cache statistics" #: share/completions/apt-cache.fish:6 msgid "Show source package" msgstr "Show source package" #: share/completions/apt-cache.fish:7 msgid "Show packages in cache" msgstr "Show packages in cache" #: share/completions/apt-cache.fish:8 msgid "Print available list" msgstr "Print available list" #: share/completions/apt-cache.fish:9 msgid "List unmet dependencies in cache" msgstr "List unmet dependencies in cache" #: share/completions/apt-cache.fish:10 msgid "Display package record" msgstr "Display package record" #: share/completions/apt-cache.fish:11 msgid "Search packagename by REGEX" msgstr "Search packagename by REGEX" #: share/completions/apt-cache.fish:13 msgid "Search packagename only" msgstr "Search packagename only" #: share/completions/apt-cache.fish:14 msgid "List dependencies for the package" msgstr "List dependencies for the package" #: share/completions/apt-cache.fish:15 msgid "List reverse dependencies for the package" msgstr "List reverse dependencies for the package" #: share/completions/apt-cache.fish:16 msgid "Print package name by prefix" msgstr "Print package name by prefix" #: share/completions/apt-cache.fish:17 msgid "Generate dotty output for packages" msgstr "Generate dotty output for packages" #: share/completions/apt-cache.fish:18 msgid "Debug preferences file" msgstr "Debug preferences file" #: share/completions/apt-cache.fish:19 msgid "Select file to store package cache" msgstr "Select file to store package cache" #: share/completions/apt-cache.fish:20 msgid "Select file to store source cache" msgstr "Select file to store source cache" #: share/completions/apt-cache.fish:21 #: share/completions/apt-ftparchive.fish:10 msgid "Quiet mode" msgstr "Quiet mode" #: share/completions/apt-cache.fish:22 msgid "Print important dependencies" msgstr "Print important dependencies" #: share/completions/apt-cache.fish:23 msgid "Print full records" msgstr "Print full records" #: share/completions/apt-cache.fish:24 msgid "Auto-gen package cache" msgstr "Auto-gen package cache" #: share/completions/apt-cache.fish:25 msgid "Print all names" msgstr "Print all names" #: share/completions/apt-cache.fish:26 msgid "Dep and rdep recursive" msgstr "Dep and rdep recursive" #: share/completions/apt-cache.fish:27 msgid "Limit to installed" msgstr "Limit to installed" #: share/completions/apt-cache.fish:29 share/completions/apt-cdrom.fish:12 #: share/completions/apt-config.fish:6 msgid "Specify config file" msgstr "Specify config file" #: share/completions/apt-cache.fish:30 share/completions/apt-cdrom.fish:13 #: share/completions/apt-config.fish:7 #: share/completions/apt-extracttemplates.fish:6 msgid "Specify options" msgstr "Specify options" #: share/completions/apt-cdrom.fish:3 msgid "Add new disc to source list" msgstr "Add new disc to source list" #: share/completions/apt-cdrom.fish:4 msgid "Report identity of disc" msgstr "Report identity of disc" #: share/completions/apt-cdrom.fish:5 share/completions/mount.fish:7 msgid "Mount point" msgstr "Mount point" #: share/completions/apt-cdrom.fish:6 msgid "Rename a disc" msgstr "Rename a disc" #: share/completions/apt-cdrom.fish:7 msgid "No mounting" msgstr "No mounting" #: share/completions/apt-cdrom.fish:8 msgid "Fast copy" msgstr "Fast copy" #: share/completions/apt-cdrom.fish:9 msgid "Thorough package scan" msgstr "Thorough package scan" #: share/completions/apt-cdrom.fish:10 msgid "No changes" msgstr "No changes" #: share/completions/apt-config.fish:4 msgid "Dump contents of config file" msgstr "Dump contents of config file" #: share/completions/apt-extracttemplates.fish:4 msgid "Set temp dir" msgstr "Set temp dir" #: share/completions/apt-extracttemplates.fish:5 msgid "Specifiy config file" msgstr "Specifiy config file" #: share/completions/apt-file.fish:3 msgid "Resync package contents from source" msgstr "Resync package contents from source" #: share/completions/apt-file.fish:4 msgid "Search package containing pattern" msgstr "Search package containing pattern" #: share/completions/apt-file.fish:5 msgid "List contents of a package matching pattern" msgstr "List contents of a package matching pattern" #: share/completions/apt-file.fish:6 msgid "Remove all gz files from cache" msgstr "Remove all gz files from cache" #: share/completions/apt-file.fish:7 msgid "Set cache dir" msgstr "Set cache dir" #: share/completions/apt-file.fish:10 share/completions/apt-file.fish:16 msgid "Do not expand pattern" msgstr "Do not expand pattern" #: share/completions/apt-file.fish:11 msgid "Pattern is regexp" msgstr "Pattern is regexp" #: share/completions/apt-file.fish:13 msgid "Set arch" msgstr "Set arch" #: share/completions/apt-file.fish:14 msgid "Set sources.list file" msgstr "Set sources.list file" #: share/completions/apt-file.fish:15 msgid "Only display package name" msgstr "Only display package name" #: share/completions/apt-file.fish:17 msgid "Run in dummy mode" msgstr "Run in dummy mode" #: share/completions/apt-ftparchive.fish:3 msgid "Generate package from source" msgstr "Generate package from source" #: share/completions/apt-ftparchive.fish:4 msgid "Generate source index file" msgstr "Generate source index file" #: share/completions/apt-ftparchive.fish:5 msgid "Generate contents file" msgstr "Generate contents file" #: share/completions/apt-ftparchive.fish:6 msgid "Generate release file" msgstr "Generate release file" #: share/completions/apt-ftparchive.fish:7 msgid "Remove records" msgstr "Remove records" #: share/completions/apt-ftparchive.fish:8 msgid "Generate MD5 sums" msgstr "Generate MD5 sums" #: share/completions/apt-ftparchive.fish:9 msgid "Use a binary db" msgstr "Use a binary db" #: share/completions/apt-ftparchive.fish:11 msgid "Perform delinking" msgstr "Perform delinking" #: share/completions/apt-ftparchive.fish:12 msgid "Perform contents generation" msgstr "Perform contents generation" #: share/completions/apt-ftparchive.fish:14 msgid "Make caching db readonly" msgstr "Make caching db readonly" #: share/completions/apt-ftparchive.fish:16 msgid "Use config file" msgstr "Use config file" #: share/completions/apt-ftparchive.fish:17 msgid "Set config options" msgstr "Set config options" #: share/completions/apt-get.fish:3 msgid "Test if apt has yet to be given the subcommand" msgstr "Test if apt has yet to be given the subcommand" #: share/completions/apt-get.fish:12 msgid "Test if apt command should have packages as potential completion" msgstr "Test if apt command should have packages as potential completion" #: share/completions/apt-get.fish:24 msgid "Update sources" msgstr "Update sources" #: share/completions/apt-get.fish:25 msgid "Upgrade or install newest packages" msgstr "Upgrade or install newest packages" #: share/completions/apt-get.fish:26 msgid "Use with dselect front-end" msgstr "Use with dselect front-end" #: share/completions/apt-get.fish:27 msgid "Distro upgrade" msgstr "Distro upgrade" #: share/completions/apt-get.fish:28 msgid "Install one or more packages" msgstr "Install one or more packages" #: share/completions/apt-get.fish:29 msgid "Remove one or more packages" msgstr "Remove one or more packages" #: share/completions/apt-get.fish:30 msgid "Fetch source packages" msgstr "Fetch source packages" #: share/completions/apt-get.fish:31 msgid "Install/remove packages for dependencies" msgstr "Install/remove packages for dependencies" #: share/completions/apt-get.fish:32 msgid "Update cache and check dependencies" msgstr "Update cache and check dependencies" #: share/completions/apt-get.fish:33 msgid "Clean local caches and packages" msgstr "Clean local caches and packages" #: share/completions/apt-get.fish:34 msgid "Clean packages no longer be downloaded" msgstr "Clean packages no longer be downloaded" #: share/completions/apt-get.fish:62 msgid "Specify a config file" msgstr "Specify a config file" #: share/completions/apt-get.fish:63 msgid "Set a config option" msgstr "Set a config option" #: share/completions/apt-key.fish:2 msgid "Add a new key" msgstr "Add a new key" #: share/completions/apt-key.fish:3 msgid "Remove a key" msgstr "Remove a key" #: share/completions/apt-key.fish:4 msgid "List trusted keys" msgstr "List trusted keys" #: share/completions/apt-listbugs.fish:3 msgid "Set severity" msgstr "Set severity" #: share/completions/apt-listbugs.fish:4 msgid "Tags you want to see" msgstr "Tags you want to see" #: share/completions/apt-listbugs.fish:5 msgid "Bug-status you want to see" msgstr "Bug-status you want to see" #: share/completions/apt-listbugs.fish:6 msgid "Ignore bugs in your system" msgstr "Ignore bugs in your system" #: share/completions/apt-listbugs.fish:7 msgid "Ignore newer bugs than upgrade packages" msgstr "Ignore newer bugs than upgrade packages" #: share/completions/apt-listbugs.fish:8 msgid "Bugs for downgrade packages" msgstr "Bugs for downgrade packages" #: share/completions/apt-listbugs.fish:9 msgid "Bug Tracking system" msgstr "Bug Tracking system" #: share/completions/apt-listbugs.fish:10 msgid "Specify port for web interface" msgstr "Specify port for web interface" #: share/completions/apt-listbugs.fish:11 msgid "Use daily bug report" msgstr "Use daily bug report" #: share/completions/apt-listbugs.fish:12 msgid "Use the raw index.db" msgstr "Use the raw index.db" #: share/completions/apt-listbugs.fish:13 msgid "Specify index dir" msgstr "Specify index dir" #: share/completions/apt-listbugs.fish:14 msgid "Specify Pin-Priority value" msgstr "Specify Pin-Priority value" #: share/completions/apt-listbugs.fish:15 msgid "Specify the title of rss" msgstr "Specify the title of rss" #: share/completions/apt-listbugs.fish:16 msgid "Retrieve fresh bugs" msgstr "Retrieve fresh bugs" #: share/completions/apt-listbugs.fish:17 msgid "Do not display progress bar" msgstr "Do not display progress bar" #: share/completions/apt-listbugs.fish:18 msgid "Specify local cache dir" msgstr "Specify local cache dir" #: share/completions/apt-listbugs.fish:19 msgid "Specify the expire cache timer" msgstr "Specify the expire cache timer" #: share/completions/apt-listbugs.fish:21 msgid "Assume yes to all questions" msgstr "Assume yes to all questions" #: share/completions/apt-listbugs.fish:22 msgid "Assume no to all questions" msgstr "Assume no to all questions" #: share/completions/apt-listchanges.fish:5 msgid "Select frontend interface" msgstr "Select frontend interface" #: share/completions/apt-listchanges.fish:7 msgid "Ask confirmation" msgstr "Ask confirmation" #: share/completions/apt-listchanges.fish:8 msgid "Display all changelogs" msgstr "Display all changelogs" #: share/completions/apt-listchanges.fish:9 msgid "Avoid changelogs from db in named file" msgstr "Avoid changelogs from db in named file" #: share/completions/apt-listchanges.fish:11 msgid "Insert header" msgstr "Insert header" #: share/completions/apt-listchanges.fish:12 msgid "Display debug info" msgstr "Display debug info" #: share/completions/apt-listchanges.fish:13 msgid "Select an option profile" msgstr "Select an option profile" #: share/completions/apt-move.fish:4 msgid "Move packages to local tree" msgstr "Move packages to local tree" #: share/completions/apt-move.fish:5 msgid "Delete obsolete package files" msgstr "Delete obsolete package files" #: share/completions/apt-move.fish:6 msgid "Build new local files" msgstr "Build new local files" #: share/completions/apt-move.fish:7 msgid "Rebuild index files" msgstr "Rebuild index files" #: share/completions/apt-move.fish:8 msgid "Move packages from cache to local mirror" msgstr "Move packages from cache to local mirror" #: share/completions/apt-move.fish:9 msgid "Alias for 'move delete packages'" msgstr "Alias for “move delete packagesâ€" #: share/completions/apt-move.fish:10 msgid "Alias for 'update'" msgstr "Alias for “updateâ€" #: share/completions/apt-move.fish:11 msgid "Download package missing from mirror" msgstr "Download package missing from mirror" #: share/completions/apt-move.fish:12 msgid "Sync packages installed" msgstr "Sync packages installed" #: share/completions/apt-move.fish:15 msgid "List packages that may serve as input to mirrorbin or mirrorsource" msgstr "List packages that may serve as input to mirrorbin or mirrorsource" #: share/completions/apt-move.fish:16 msgid "Fetch package from STDIN" msgstr "Fetch package from STDIN" #: share/completions/apt-move.fish:17 msgid "Fetch source package from STDIN" msgstr "Fetch source package from STDIN" #: share/completions/apt-move.fish:18 msgid "Process all packages" msgstr "Process all packages" #: share/completions/apt-move.fish:20 msgid "Force deletion" msgstr "Force deletion" #: share/completions/apt-move.fish:21 msgid "Suppresses normal output" msgstr "Suppresses normal output" #: share/completions/apt-move.fish:22 msgid "Test run" msgstr "Test run" #: share/completions/apt-proxy-import.fish:5 msgid "No message to STDOUT" msgstr "No message to STDOUT" #: share/completions/apt-proxy-import.fish:6 msgid "Recurse into subdir" msgstr "Recurse into subdir" #: share/completions/apt-proxy-import.fish:7 msgid "Dir to import" msgstr "Dir to import" #: share/completions/apt-proxy-import.fish:8 msgid "Change to user" msgstr "Change to user" #: share/completions/apt-proxy-import.fish:9 msgid "Debug level[default 0]" msgstr "Debug level[default 0]" #: share/completions/apt-rdepends.fish:3 msgid "Show build dependencies" msgstr "Show build dependencies" #: share/completions/apt-rdepends.fish:4 msgid "Generate a dotty graph" msgstr "Generate a dotty graph" #: share/completions/apt-rdepends.fish:5 msgid "Show state of dependencies" msgstr "Show state of dependencies" #: share/completions/apt-rdepends.fish:6 msgid "List packages depending on" msgstr "List packages depending on" #: share/completions/apt-rdepends.fish:11 msgid "Display man page" msgstr "Display man page" #: share/completions/apt-show-source.fish:3 #: share/completions/apt-show-source.fish:4 #: share/completions/apt-show-versions.fish:10 #: share/completions/apt-show-versions.fish:11 msgid "Read package from file" msgstr "Read package from file" #: share/completions/apt-show-source.fish:5 #: share/completions/apt-show-source.fish:6 #: share/completions/apt-show-versions.fish:12 #: share/completions/apt-show-versions.fish:13 msgid "Specify APT list dir" msgstr "Specify APT list dir" #: share/completions/apt-show-source.fish:7 msgid "List PKG info" msgstr "List PKG info" #: share/completions/apt-show-source.fish:9 msgid "Print all source packages with version" msgstr "Print all source packages with version" #: share/completions/apt-show-versions.fish:3 msgid "Print PKG versions" msgstr "Print PKG versions" #: share/completions/apt-show-versions.fish:4 msgid "Using regex" msgstr "Using regex" #: share/completions/apt-show-versions.fish:5 msgid "Print only upgradeable packages" msgstr "Print only upgradeable packages" #: share/completions/apt-show-versions.fish:6 msgid "Print all versions" msgstr "Print all versions" #: share/completions/apt-show-versions.fish:7 msgid "Print package name/distro" msgstr "Print package name/distro" #: share/completions/apt-show-versions.fish:8 msgid "Print verbose info" msgstr "Print verbose info" #: share/completions/apt-show-versions.fish:9 msgid "Init or update cache only" msgstr "Init or update cache only" #: share/completions/apt-sortpkgs.fish:3 msgid "Use source index field" msgstr "Use source index field" #: share/completions/apt-sortpkgs.fish:5 msgid "Specify conffile" msgstr "Specify conffile" #: share/completions/apt-spy.fish:3 msgid "Debian distribution" msgstr "Debian distribution" #: share/completions/apt-spy.fish:4 msgid "Servers in the areas" msgstr "Servers in the areas" #: share/completions/apt-spy.fish:6 msgid "Finish after number of servers" msgstr "Finish after number of servers" #: share/completions/apt-spy.fish:11 msgid "Use proxy server" msgstr "Use proxy server" #: share/completions/apt-spy.fish:12 msgid "Comma separated country list" msgstr "Comma separated country list" #: share/completions/apt-spy.fish:13 msgid "How long in sec to download" msgstr "How long in sec to download" #: share/completions/apt-spy.fish:14 msgid "Custom URL to get mirror list" msgstr "Custom URL to get mirror list" #: share/completions/apt-spy.fish:16 msgid "Number of top servers" msgstr "Number of top servers" #: share/completions/apt-spy.fish:17 msgid "Update mirror list" msgstr "Update mirror list" #: share/completions/apt-spy.fish:18 msgid "Version number" msgstr "Version number" #: share/completions/apt-src.fish:3 msgid "Update list of source packages" msgstr "Update list of source packages" #: share/completions/apt-src.fish:4 msgid "Install source packages" msgstr "Install source packages" #: share/completions/apt-src.fish:5 msgid "Upgrade source packages" msgstr "Upgrade source packages" #: share/completions/apt-src.fish:6 msgid "Remove source packages" msgstr "Remove source packages" #: share/completions/apt-src.fish:7 share/completions/apt-src.fish:14 msgid "Build source packages" msgstr "Build source packages" #: share/completions/apt-src.fish:8 msgid "Clean source packages" msgstr "Clean source packages" #: share/completions/apt-src.fish:9 msgid "Detect known source tree" msgstr "Detect known source tree" #: share/completions/apt-src.fish:10 msgid "List installed source package\\(s\\)" msgstr "List installed source package\\(s\\)" #: share/completions/apt-src.fish:11 msgid "Root source tree" msgstr "Root source tree" #: share/completions/apt-src.fish:12 msgid "Version of source package" msgstr "Version of source package" #: share/completions/apt-src.fish:13 msgid "Name of the source package" msgstr "Name of the source package" #: share/completions/apt-src.fish:15 msgid "Install after build" msgstr "Install after build" #: share/completions/apt-src.fish:16 msgid "Patch local changes" msgstr "Patch local changes" #: share/completions/apt-src.fish:17 msgid "Specify a dir" msgstr "Specify a dir" #: share/completions/apt-src.fish:19 #, msgid "Omit debian version" msgstr "Omit debian version" #: share/completions/apt-src.fish:20 msgid "Do not del built files" msgstr "Do not del built files" #: share/completions/apt-src.fish:21 msgid "Do not del source files" msgstr "Do not del source files" #: share/completions/apt-src.fish:22 msgid "Source tree version" msgstr "Source tree version" #: share/completions/apt-src.fish:23 msgid "Output to /dev/null" msgstr "Output to /dev/null" #: share/completions/apt-src.fish:24 msgid "Output trace" msgstr "Output trace" #: share/completions/apt-zip-inst.fish:5 share/completions/apt-zip-list.fish:5 msgid "Select an action" msgstr "Select an action" #: share/completions/apt-zip-inst.fish:7 share/completions/apt-zip-list.fish:7 msgid "Fix broken option" msgstr "Fix broken option" #: share/completions/aptitude.fish:3 msgid "Test if aptitude has yet to be given the subcommand" msgstr "Test if aptitude has yet to be given the subcommand" #: share/completions/aptitude.fish:12 msgid "Test if aptitude command should have packages as potential completion" msgstr "Test if aptitude command should have packages as potential completion" #: share/completions/aptitude.fish:24 #, fuzzy msgid "Remove any cached packages which can no longer be downloaded" msgstr "Clean packages no longer be downloaded" #: share/completions/aptitude.fish:25 msgid "Remove all downloaded .deb files from the package cache directory" msgstr "" #: share/completions/aptitude.fish:26 msgid "Forget all internal information about what packages are \\new" msgstr "" #: share/completions/aptitude.fish:27 msgid "Cancel all scheduled actions on all packages" msgstr "" #: share/completions/aptitude.fish:28 msgid "Update the list of available packages from the apt sources" msgstr "" #: share/completions/aptitude.fish:29 #, fuzzy msgid "Upgrade installed packages to their most recent version" msgstr "Updates packages to the best version available" #: share/completions/aptitude.fish:30 #, fuzzy msgid "Download and displays the Debian changelog for the packages" msgstr "Display change information for the package" #: share/completions/aptitude.fish:31 #, fuzzy msgid "Upgrade, removing or installing packages as necessary" msgstr "Upgrade or install newest packages" #: share/completions/aptitude.fish:32 #, fuzzy msgid "Download the packages to the current directory" msgstr "Do not ever ascend to the parent directory" #: share/completions/aptitude.fish:33 msgid "Forbid the upgrade to a particular version" msgstr "" #: share/completions/aptitude.fish:34 msgid "Ignore the packages by future upgrade commands" msgstr "" #: share/completions/aptitude.fish:35 #, fuzzy msgid "Install the packages" msgstr "Install new package" #: share/completions/aptitude.fish:36 #, fuzzy msgid "Cancel any scheduled actions on the packages" msgstr "Display change information for the package" #: share/completions/aptitude.fish:37 #, fuzzy msgid "Mark packages as automatically installed" msgstr "Upgrade package if already installed" #: share/completions/aptitude.fish:38 msgid "Remove and delete all associated configuration and data files" msgstr "" #: share/completions/aptitude.fish:39 #, fuzzy msgid "Reinstall the packages" msgstr "Reinstall packages" #: share/completions/aptitude.fish:40 #, fuzzy msgid "Remove the packages" msgstr "Remove packages" #: share/completions/aptitude.fish:41 #, fuzzy msgid "Display detailed information about the packages" msgstr "Display change information for the package" #: share/completions/aptitude.fish:42 msgid "Consider the packages by future upgrade commands" msgstr "" #: share/completions/aptitude.fish:43 #, fuzzy msgid "Mark packages as manually installed" msgstr "Upgrade package if already installed" #: share/completions/aptitude.fish:44 #, fuzzy msgid "Search for packages matching one of the patterns" msgstr "Search package containing pattern" #: share/completions/aptitude.fish:45 msgid "Display brief summary of the available commands and options" msgstr "" #: share/completions/arp.fish:4 msgid "Class of hw type" msgstr "Class of hw type" #: share/completions/arp.fish:5 msgid "Show arp entries" msgstr "Show arp entries" #: share/completions/arp.fish:6 msgid "Remove an entry for hostname" msgstr "Remove an entry for hostname" #: share/completions/arp.fish:8 msgid "Select interface" msgstr "Select interface" #: share/completions/arp.fish:9 msgid "Manually create ARP address" msgstr "Manually create ARP address" #: share/completions/arp.fish:10 msgid "Take addr from filename, default /etc/ethers" msgstr "Take addr from filename, default /etc/ethers" #: share/completions/at.fish:3 share/completions/atq.fish:3 msgid "Use specified queue" msgstr "Use specified queue" #: share/completions/at.fish:4 msgid "Send mail to user" msgstr "Send mail to user" #: share/completions/at.fish:5 msgid "Read job from file" msgstr "Read job from file" #: share/completions/at.fish:6 msgid "Alias for atq" msgstr "Alias for atq" #: share/completions/at.fish:7 msgid "Alias for atrm" msgstr "Alias for atrm" #: share/completions/at.fish:8 msgid "Show the time" msgstr "Show the time" #: share/completions/at.fish:9 msgid "Print the jobs listed" msgstr "Print the jobs listed" #: share/completions/atd.fish:2 msgid "Limiting load factor" msgstr "Limiting load factor" #: share/completions/atd.fish:3 msgid "Minimum interval in seconds" msgstr "Minimum interval in seconds" #: share/completions/atd.fish:4 msgid "Debug mode" msgstr "Debug mode" #: share/completions/atd.fish:5 msgid "Process at queue only once" msgstr "Process at queue only once" #: share/completions/configure.fish:1 #: share/functions/__fish_complete_ls.fish:95 #: share/functions/__fish_complete_tex.fish:4 msgid "Display help and exit" msgstr "Display help and exit" #: share/completions/configure.fish:4 msgid "Cache test results in specified file" msgstr "Cache test results in specified file" #: share/completions/cp.fish:10 share/completions/mv.fish:6 msgid "Backup suffix" msgstr "Backup suffix" #: share/completions/cp.fish:20 msgid "Don't preserve the specified attributes" msgstr "Don't preserve the specified attributes" #: share/completions/cp.fish:24 msgid "Control creation of sparse files" msgstr "Control creation of sparse files" #: share/completions/cp.fish:28 msgid "Set security context of copy to CONTEXT" msgstr "Set security context of copy to CONTEXT" #: share/completions/cut.fish:1 msgid "Output byte range" msgstr "Output byte range" #: share/completions/cut.fish:2 msgid "Output character range" msgstr "Output character range" #: share/completions/cut.fish:3 msgid "Select field delimiter" msgstr "Select field delimiter" #: share/completions/cut.fish:4 msgid "Select fields" msgstr "Select fields" #: share/completions/cvs.fish:25 #, fuzzy msgid "Use \\tmpdir for temporary files." msgstr "Use tmpdir for temporary files" #: share/completions/cvs.fish:26 #, fuzzy msgid "Use \\editor for editing log information." msgstr "Use editor for editing log information" #: share/completions/cvs.fish:27 #, sh-format msgid "Overrides $CVSROOT as the root of the CVS tree." msgstr "" #: share/completions/cvs.fish:29 #, fuzzy msgid "Use compression level \\# for net traffic." msgstr "Compression level for net traffic" #: share/completions/cvs.fish:34 #, fuzzy msgid "Set CVS user variable." msgstr "Set CVS user variable" #: share/completions/cvs.fish:40 msgid "Add a new file/directory to the repository" msgstr "Add a new file/directory to the repository" #: share/completions/cvs.fish:41 msgid "Administration front end for rcs" msgstr "Administration front end for rcs" #: share/completions/cvs.fish:42 msgid "Show last revision where each line was modified" msgstr "Show last revision where each line was modified" #: share/completions/cvs.fish:43 msgid "Checkout sources for editing" msgstr "Checkout sources for editing" #: share/completions/cvs.fish:44 msgid "Check files into the repository" msgstr "Check files into the repository" #: share/completions/cvs.fish:45 msgid "Show differences between revisions" msgstr "Show differences between revisions" #: share/completions/cvs.fish:46 msgid "Get ready to edit a watched file" msgstr "Get ready to edit a watched file" #: share/completions/cvs.fish:47 msgid "See who is editing a watched file" msgstr "See who is editing a watched file" #: share/completions/cvs.fish:48 msgid "Export sources from CVS, similar to checkout" msgstr "Export sources from CVS, similar to checkout" #: share/completions/cvs.fish:49 msgid "Show repository access history" msgstr "Show repository access history" #: share/completions/cvs.fish:50 msgid "Import sources into CVS, using vendor branches" msgstr "Import sources into CVS, using vendor branches" #: share/completions/cvs.fish:51 #, fuzzy msgid "Create a CVS repository if it doesn\\t" msgstr "Create a CVS repository if it doesnt exist" #: share/completions/cvs.fish:88 msgid "Set comment leader." msgstr "" #: share/completions/cvs.fish:91 #, fuzzy msgid "Set keyword substitution mode:" msgstr "Set the default keyword substitution" #: share/completions/cvs.fish:94 #, fuzzy msgid "Replace revision\\s" msgstr "Merge revisions" #: share/completions/cvs.fish:132 msgid "Check out revision or tag. (implies -P) (is sticky)" msgstr "" #: share/completions/cvs.fish:133 msgid "Check out revisions as of date. (implies -P) (is sticky)" msgstr "" #: share/completions/cvs.fish:134 msgid "Check out into dir instead of module name." msgstr "" #: share/completions/cvs.fish:135 msgid "Use RCS kopt -k option on checkout. (is sticky)" msgstr "" #: share/completions/cvs.fish:136 msgid "Merge in changes made between current revision and rev." msgstr "" #: share/completions/cvs.fish:146 #, fuzzy msgid "Read the log message from file." msgstr "Read log message from file" #: share/completions/cvs.fish:147 #, fuzzy msgid "Log message." msgstr "Replace a log message" #: share/completions/cvs.fish:148 msgid "Commit to this branch or trunk revision." msgstr "" #: share/completions/cvs.fish:157 #, fuzzy msgid "Specify keyword expansion mode." msgstr "Specify kernel version" #: share/completions/cvs.fish:158 msgid "Diff revision for date against working file." msgstr "" #: share/completions/cvs.fish:159 msgid "Diff rev1/date1 against date2." msgstr "" #: share/completions/cvs.fish:160 msgid "Diff revision for rev1 against working file." msgstr "" #: share/completions/cvs.fish:161 msgid "Diff rev1/date1 against rev2." msgstr "" #: share/completions/cvs.fish:166 #, fuzzy msgid "--ignore-matching-lines=RE Ignore changes whose lines all match RE." msgstr "Ignore changes whose lines match the REGEX" #: share/completions/cvs.fish:172 msgid "--label LABEL Use LABEL instead of file name." msgstr "" #: share/completions/cvs.fish:174 msgid "--show-function-line=RE Show the most recent line matching RE." msgstr "" #: share/completions/cvs.fish:180 msgid "--width=NUM Output at most NUM (default 130) characters per line." msgstr "" #: share/completions/cvs.fish:222 #, fuzzy msgid "Export tagged revisions." msgstr "Merge revisions" #: share/completions/cvs.fish:223 msgid "Export revisions as of date." msgstr "" #: share/completions/cvs.fish:224 msgid "Export into dir instead of module name." msgstr "" #: share/completions/cvs.fish:225 msgid "Use RCS kopt -k option on checkout." msgstr "" #: share/completions/cvs.fish:235 msgid "Look for specified module (repeatable)" msgstr "" #: share/completions/cvs.fish:236 #, fuzzy msgid "Extract by record type" msgstr "Specify record type" #: share/completions/cvs.fish:241 #, fuzzy msgid "Since date (Many formats)" msgstr "Profile data format" #: share/completions/cvs.fish:242 msgid "Back to record with str in module/file/repos field" msgstr "" #: share/completions/cvs.fish:243 msgid "Specified file (same as command line) (repeatable)" msgstr "" #: share/completions/cvs.fish:244 msgid "In module (repeatable)" msgstr "" #: share/completions/cvs.fish:245 msgid "In repository (repeatable)" msgstr "" #: share/completions/cvs.fish:246 msgid "Since rev or tag (looks inside RCS files!)" msgstr "" #: share/completions/cvs.fish:247 msgid "Since tag record placed in history file (by anyone)." msgstr "" #: share/completions/cvs.fish:248 msgid "For user name (repeatable)" msgstr "" #: share/completions/cvs.fish:249 msgid "Output for time zone (e.g. -z -0700)" msgstr "" #: share/completions/darcs.fish:19 #, fuzzy msgid "Display help for darcs or a single commands" msgstr "Displays usage information for command" #: share/completions/darcs.fish:20 msgid "Add one or more new files or directories" msgstr "Add one or more new files or directories" #: share/completions/darcs.fish:21 msgid "Remove one or more files or directories from the repository" msgstr "Remove one or more files or directories from the repository" #: share/completions/darcs.fish:22 msgid "Move/rename one or more files or directories" msgstr "Move/rename one or more files or directories" #: share/completions/darcs.fish:23 msgid "Replace a token with a new value for that token" msgstr "Replace a token with a new value for that token" #: share/completions/darcs.fish:24 msgid "Revert to the recorded version (safe the first time only)" msgstr "Revert to the recorded version (safe the first time only)" #: share/completions/darcs.fish:25 msgid "Undo the last revert (may fail if changes after the revert)" msgstr "Undo the last revert (may fail if changes after the revert)" #: share/completions/darcs.fish:26 msgid "Display unrecorded changes in the working copy" msgstr "Display unrecorded changes in the working copy" #: share/completions/darcs.fish:27 msgid "Save changes in the working copy to the repository as a patch" msgstr "Save changes in the working copy to the repository as a patch" #: share/completions/darcs.fish:28 msgid "Remove recorded patches without changing the working copy" msgstr "Remove recorded patches without changing the working copy" #: share/completions/darcs.fish:29 #, fuzzy msgid "Replace a patch with a better version before it leaves your repository" msgstr "Replace a recorded patch with a better version" #: share/completions/darcs.fish:30 msgid "Mark any conflicts to the working copy for manual resolution" msgstr "Mark any conflicts to the working copy for manual resolution" #: share/completions/darcs.fish:31 msgid "Tag the contents of the repository with a version name" msgstr "Tag the contents of the repository with a version name" #: share/completions/darcs.fish:32 msgid "Set a value for a preference (test, predist, ...)" msgstr "Set a value for a preference (test, predist, ...)" #: share/completions/darcs.fish:33 #, fuzzy msgid "Record an inverse patch without changing the working directory" msgstr "Record an inverse patch without changing the working copy" #: share/completions/darcs.fish:34 msgid "Create a diff between two versions of the repository" msgstr "Create a diff between two versions of the repository" #: share/completions/darcs.fish:35 #, fuzzy msgid "Gives a changelog-style summary of the repository history" msgstr "Gives a changelog style summary of the repo history" #: share/completions/darcs.fish:36 msgid "Display which patch last modified something" msgstr "Display which patch last modified something" #: share/completions/darcs.fish:37 msgid "Create a distribution tarball" msgstr "Create a distribution tarball" #: share/completions/darcs.fish:38 msgid "Locate the most recent version lacking an error" msgstr "Locate the most recent version lacking an error" #: share/completions/darcs.fish:39 msgid "Query information which is stored by darcs" msgstr "" #: share/completions/darcs.fish:40 msgid "Copy and apply patches from another repository to this one" msgstr "Copy and apply patches from another repository to this one" #: share/completions/darcs.fish:41 #, fuzzy msgid "Opposite of pull; unsafe if patch is not in remote repository" msgstr "Opposite of pull; unsafe if the patch is not in remote repo" #: share/completions/darcs.fish:42 msgid "Delete selected patches from the repository. (UNSAFE!)" msgstr "" #: share/completions/darcs.fish:43 msgid "Copy and apply patches from this repository to another one" msgstr "Copy and apply patches from this repository to another one" #: share/completions/darcs.fish:44 msgid "Send by email a bundle of one or more patches" msgstr "Send by email a bundle of one or more patches" #: share/completions/darcs.fish:45 msgid "Apply patches (from an email bundle) to the repository" msgstr "Apply patches (from an email bundle) to the repository" #: share/completions/darcs.fish:46 msgid "Create a local copy of another repository" msgstr "Create a local copy of another repository" #: share/completions/darcs.fish:47 #, fuzzy msgid "Makes a copy of the repository" msgstr "Create a local copy of another repository" #: share/completions/darcs.fish:48 msgid "Initialize a new source tree as a darcs repository" msgstr "" #: share/completions/darcs.fish:49 msgid "Optimize the repository" msgstr "Optimize the repository" #: share/completions/darcs.fish:50 msgid "Check the repository for consistency" msgstr "Check the repository for consistency" #: share/completions/darcs.fish:51 msgid "Repair the corrupted repository" msgstr "Repair the corrupted repository" #: share/completions/darcs.fish:85 share/completions/darcs.fish:228 #: share/completions/darcs.fish:252 share/completions/darcs.fish:410 #: share/completions/darcs.fish:434 share/completions/darcs.fish:465 #: share/completions/darcs.fish:510 share/completions/darcs.fish:560 #: share/completions/darcs.fish:593 share/completions/darcs.fish:636 #: share/completions/darcs.fish:674 share/completions/darcs.fish:704 msgid "Specify command to run after this darcs command" msgstr "" #: share/completions/darcs.fish:225 share/completions/darcs.fish:249 #: share/completions/darcs.fish:405 share/completions/darcs.fish:431 #: share/completions/darcs.fish:462 share/completions/darcs.fish:557 #: share/completions/darcs.fish:632 share/completions/darcs.fish:700 #: share/completions/darcs.fish:717 msgid "Specify the repository directory in which to run" msgstr "Specify the repository directory in which to run" #: share/completions/darcs.fish:238 share/completions/darcs.fish:520 msgid "Select changes starting with a patch matching PATTERN" msgstr "Select changes starting with a patch matching PATTERN" #: share/completions/darcs.fish:239 share/completions/darcs.fish:521 msgid "Select changes starting with a patch matching REGEXP" msgstr "Select changes starting with a patch matching REGEXP" #: share/completions/darcs.fish:240 share/completions/darcs.fish:522 msgid "Select changes starting with a tag matching REGEXP" msgstr "Select changes starting with a tag matching REGEXP" #: share/completions/darcs.fish:241 share/completions/darcs.fish:523 msgid "Select the last NUMBER patches" msgstr "Select the last NUMBER patches" #: share/completions/darcs.fish:242 share/completions/darcs.fish:482 #: share/completions/darcs.fish:524 share/completions/darcs.fish:573 #: share/completions/darcs.fish:606 msgid "Select patches matching PATTERN" msgstr "Select patches matching PATTERN" #: share/completions/darcs.fish:243 share/completions/darcs.fish:483 #: share/completions/darcs.fish:525 share/completions/darcs.fish:574 #: share/completions/darcs.fish:607 msgid "Select patches matching REGEXP" msgstr "Select patches matching REGEXP" #: share/completions/darcs.fish:244 share/completions/darcs.fish:484 #: share/completions/darcs.fish:526 share/completions/darcs.fish:575 #: share/completions/darcs.fish:608 msgid "Select tags matching REGEXP" msgstr "Select tags matching REGEXP" #: share/completions/darcs.fish:262 share/completions/darcs.fish:427 msgid "Select patch matching PATTERN" msgstr "Select patch matching PATTERN" #: share/completions/darcs.fish:263 share/completions/darcs.fish:428 msgid "Select patch matching REGEXP" msgstr "Select patch matching REGEXP" #: share/completions/darcs.fish:404 msgid "Specify the repository URL" msgstr "Specify the repository URL" #: share/completions/darcs.fish:429 share/completions/darcs.fish:689 #: share/completions/darcs.fish:720 msgid "Select tag matching REGEXP" msgstr "Select tag matching REGEXP" #: share/completions/darcs.fish:430 msgid "Specify hash of creator patch (see docs)" msgstr "Specify hash of creator patch (see docs)" #: share/completions/darcs.fish:444 #, fuzzy msgid "Name of version" msgstr "Negate expression" #: share/completions/darcs.fish:489 msgid "Use external tool to merge conflicts" msgstr "Use external tool to merge conflicts" #: share/completions/darcs.fish:578 share/completions/darcs.fish:722 msgid "Apply patch as another user using sudo" msgstr "" #: share/completions/darcs.fish:611 msgid "Specify email address" msgstr "Specify email address" #: share/completions/darcs.fish:612 msgid "Specify author id" msgstr "Specify author id" #: share/completions/darcs.fish:613 msgid "Specify destination email" msgstr "Specify destination email" #: share/completions/darcs.fish:614 msgid "Mail results to additional EMAIL(s). Requires --reply" msgstr "Mail results to additional EMAIL(s). Requires --reply" #: share/completions/darcs.fish:615 #, fuzzy msgid "Specify mail subject" msgstr "Specify makefile" #: share/completions/darcs.fish:616 msgid "Specify output filename" msgstr "Specify output filename" #: share/completions/darcs.fish:618 msgid "Sign the patch with a given keyid" msgstr "Sign the patch with a given keyid" #: share/completions/darcs.fish:619 msgid "Sign the patch using openssl with a given private key" msgstr "Sign the patch using openssl with a given private key" #: share/completions/darcs.fish:625 msgid "Send to context stored in FILENAME" msgstr "Send to context stored in FILENAME" #: share/completions/darcs.fish:633 msgid "Specify sendmail command" msgstr "Specify sendmail command" #: share/completions/darcs.fish:646 msgid "Verify that the patch was signed by a key in PUBRING" msgstr "Verify that the patch was signed by a key in PUBRING" #: share/completions/darcs.fish:647 #, fuzzy msgid "Verify using openSSL with authorized keys from file KEYS" msgstr "Verify using openSSL with authorized keys from specified file" #: share/completions/darcs.fish:684 #, fuzzy msgid "Path of output directory" msgstr "Set source directory" #: share/completions/darcs.fish:687 share/completions/darcs.fish:718 msgid "Select changes up to a patch matching PATTERN" msgstr "Select changes up to a patch matching PATTERN" #: share/completions/darcs.fish:688 share/completions/darcs.fish:719 msgid "Select changes up to a patch matching REGEXP" msgstr "Select changes up to a patch matching REGEXP" #: share/completions/darcs.fish:690 share/completions/darcs.fish:721 #, fuzzy msgid "Version specified by the context in FILENAME" msgstr "Send to context stored in FILENAME" #: share/completions/darcs.fish:758 msgid "Name of version to checkpoint" msgstr "" #: share/completions/dcop.fish:34 #, fuzzy msgid "Show help about options" msgstr "Display help and debug options" #: share/completions/dcop.fish:35 msgid "Connect to the given user's DCOP server" msgstr "" #: share/completions/dcop.fish:36 msgid "Send the same DCOP call to all users with a running DCOP server" msgstr "" #: share/completions/dcop.fish:37 msgid "List all active KDE session for a user or all users" msgstr "" #: share/completions/dcop.fish:38 #, fuzzy msgid "Send to the given KDE session" msgstr "Seek to given time position" #: share/completions/dcop.fish:39 msgid "Don't update the user activity timestamp in the called application" msgstr "" #: share/completions/dcop.fish:40 #, fuzzy msgid "Call DCOP for each line read from stdin" msgstr "Prevent reading from stdin" #: share/completions/df.fish:17 msgid "Show filesystems of specified type" msgstr "Show filesystems of specified type" #: share/completions/df.fish:22 msgid "Block size" msgstr "Block size" #: share/completions/diff.fish:9 msgid "Ignore changes whose lines match the REGEX" msgstr "Ignore changes whose lines match the REGEX" #: share/completions/diff.fish:13 msgid "Output NUM lines of copied context" msgstr "Output NUM lines of copied context" #: share/completions/diff.fish:15 msgid "Output NUM lines of unified context" msgstr "Output NUM lines of unified context" #: share/completions/diff.fish:20 msgid "Output at most NUM print columns" msgstr "Output at most NUM print columns" #: share/completions/diff.fish:22 msgid "Compare FILE1 to all operands" msgstr "Compare FILE1 to all operands" #: share/completions/diff.fish:23 msgid "Compare FILE2 to all operands" msgstr "Compare FILE2 to all operands" #: share/completions/du.fish:15 msgid "Exclude files thet match pattern in file" msgstr "Exclude files thet match pattern in file" #: share/completions/du.fish:16 msgid "Exclude files that match pattern" msgstr "Exclude files that match pattern" #: share/completions/du.fish:17 msgid "Recursion limit" msgstr "Recursion limit" #: share/completions/emerge.fish:5 share/completions/equery.fish:5 msgid "" "Prints completions for installed packages on the system from /var/db/pkg" msgstr "" "Prints completions for installed packages on the system from /var/db/pkg" #: share/completions/emerge.fish:12 share/completions/equery.fish:12 #, fuzzy msgid "" "Prints completions for all available packages on the system from /usr/portage" msgstr "" "Prints completions for installed packages on the system from /var/db/pkg" #: share/completions/emerge.fish:19 #, fuzzy msgid "" "Tests if emerge command should have an installed package as potential " "completion" msgstr "Test if emerge command should have packages as potential completion" #: share/completions/emerge.fish:30 share/completions/emerge.fish:31 #, fuzzy msgid "All base system packages" msgstr "Erase built packages" #: share/completions/emerge.fish:30 share/completions/emerge.fish:31 #, fuzzy msgid "All packages in world" msgstr "Sync packages installed" #: share/completions/emerge.fish:30 #, fuzzy msgid "Installed package" msgstr "Install new package" #: share/completions/emerge.fish:31 #: share/functions/__fish_print_packages.fish:13 msgid "Package" msgstr "Package" #: share/completions/emerge.fish:35 msgid "Usage overview of emerge" msgstr "" #: share/completions/emerge.fish:35 msgid "Help on subject system" msgstr "" #: share/completions/emerge.fish:35 #, fuzzy msgid "Help on subject config" msgstr "Help section" #: share/completions/emerge.fish:35 #, fuzzy msgid "Help on subject sync" msgstr "Help section" #: share/completions/emerge.fish:57 #, fuzzy msgid "Use colors in output" msgstr "Use colors" #: share/completions/emerge.fish:57 msgid "Don't use colors in output" msgstr "" #: share/completions/emerge.fish:81 #, fuzzy msgid "Pull in build time dependencies" msgstr "Show build dependencies" #: share/completions/emerge.fish:81 #, fuzzy msgid "Don't pull in build time dependencies" msgstr "Don't automatically fulfill dependencies" #: share/completions/env.fish:2 #, fuzzy msgid "Redefine variable" msgstr "Erase variable" #: share/completions/equery.fish:19 #, fuzzy msgid "" "Prints completions for all available categories on the system from /usr/" "portage" msgstr "" "Prints completions for installed packages on the system from /var/db/pkg" #: share/completions/equery.fish:38 #, fuzzy msgid "list all packages owning file(s)" msgstr "List packages depending on" #: share/completions/equery.fish:39 msgid "check MD5sums and timestamps of package" msgstr "" #: share/completions/equery.fish:40 #, fuzzy msgid "list all packages depending on specified package" msgstr "List packages depending on" #: share/completions/equery.fish:41 #, fuzzy msgid "display a dependency tree for package" msgstr "List dependencies for the package" #: share/completions/equery.fish:42 #, fuzzy msgid "list files owned by package" msgstr "List files in package" #: share/completions/equery.fish:43 #, fuzzy msgid "list all packages with specified useflag" msgstr "Query an (uninstalled) package in specified file" #: share/completions/equery.fish:44 #, fuzzy msgid "list all packages matching pattern" msgstr "List contents of a package matching pattern" #: share/completions/equery.fish:45 #, fuzzy msgid "print size of files contained in package" msgstr "Display the trigger scripts contained in the package" #: share/completions/equery.fish:46 #, fuzzy msgid "display USE flags for package" msgstr "Display change information for the package" #: share/completions/equery.fish:47 #, fuzzy msgid "print full path to ebuild for package" msgstr "Print full path of source" #: share/completions/fusermount.fish:15 share/completions/sshfs.fish:27 msgid "Mount options" msgstr "Mount options" #: share/completions/gcc.fish:25 msgid "Set maximum template depth" msgstr "Set maximum template depth" #: share/completions/gcc.fish:31 share/completions/gcc.fish:513 msgid "Use dir as the logical root directory for headers and libraries" msgstr "" #: share/completions/gcc.fish:261 msgid "" "Print the full absolute name of the library file library that would be used " "when linking---and don\\t" msgstr "" #: share/completions/gcc.fish:512 msgid "" "Process file after the compiler reads in the standard specs file, in order " "to override the defaults that the gcc driver program uses when determining " "what switches to pass to cc1, cc1plus, as, ld, etc" msgstr "" #: share/completions/gcc.fish:539 share/completions/gcc.fish:540 #: share/completions/gcc.fish:541 msgid "" "This specifies what floating point hardware (or hardware emulation) is " "available on the target" msgstr "" #: share/completions/gcc.fish:542 msgid "" "The size of all structures and unions will be rounded up to a multiple of " "the number of bits set by this option" msgstr "" #: share/completions/gcc.fish:548 msgid "Specify the register to be used for PIC addressing" msgstr "" #: share/completions/gcc.fish:556 msgid "Specify the access model for the thread local storage pointer" msgstr "" #: share/completions/gcc.fish:557 msgid "Specify ATMEL AVR instruction set or MCU type" msgstr "" #: share/completions/gcc.fish:559 msgid "" "Specify the initial stack address, which may be a symbol or numeric value, " "__stack is the default" msgstr "" #: share/completions/gcc.fish:574 msgid "" "Specified the identification number of the ID based shared library being " "compiled" msgstr "" #: share/completions/gem.fish:12 msgid "Build a gem from a gemspec" msgstr "" #: share/completions/gem.fish:13 msgid "Adjust RubyGems certificate settings" msgstr "" #: share/completions/gem.fish:14 #, fuzzy msgid "Check installed gems" msgstr "Query installed packages" #: share/completions/gem.fish:15 #, fuzzy msgid "Cleanup old versions of installed gems in the local repository" msgstr "Commit an unversioned file or tree into the repository" #: share/completions/gem.fish:16 #, fuzzy msgid "Display the contents of the installed gems" msgstr "Display the pretend output in a tabular form" #: share/completions/gem.fish:17 #, fuzzy msgid "Show the dependencies of an installed gem" msgstr "Don't check dependencies before uninstalling the packages" #: share/completions/gem.fish:18 #, fuzzy msgid "Display RubyGems environmental information" msgstr "Display update information" #: share/completions/gem.fish:19 #, fuzzy msgid "Provide help on the 'gem' command" msgstr "Help for the specified command" #: share/completions/gem.fish:20 #, fuzzy msgid "Install a gem into the local repository" msgstr "Check files into the repository" #: share/completions/gem.fish:21 msgid "Display all gems whose name starts with STRING" msgstr "" #: share/completions/gem.fish:22 #, fuzzy msgid "Query gem information in local or remote repositories" msgstr "Display information about a local or remote item" #: share/completions/gem.fish:23 msgid "Generates RDoc for pre-installed gems" msgstr "" #: share/completions/gem.fish:24 msgid "Display all gems whose name contains STRING" msgstr "" #: share/completions/gem.fish:25 #, fuzzy msgid "Display gem specification (in yaml)" msgstr "Display the last modification time of file" #: share/completions/gem.fish:26 #, fuzzy msgid "Uninstall a gem from the local repository" msgstr "Remove an entry from the repository" #: share/completions/gem.fish:27 #, fuzzy msgid "Unpack an installed gem to the current directory" msgstr "Do not ever ascend to the parent directory" #: share/completions/gem.fish:28 msgid "Update the named gem (or all installed gems) in the local repository" msgstr "" #: share/completions/gem.fish:35 msgid "Use URL as the remote source for gems" msgstr "" #: share/completions/gem.fish:36 msgid "Use the given HTTP proxy for remote operations" msgstr "" #: share/completions/gem.fish:37 #, fuzzy msgid "Use no HTTP proxy for remote operations" msgstr "Specify root directory for rpm operations" #: share/completions/gem.fish:38 #, fuzzy msgid "Get help on this command" msgstr "Set prompt command" #: share/completions/gem.fish:39 #, fuzzy msgid "Set the verbose level of output" msgstr "Reset verbose level to 0" #: share/completions/gem.fish:40 #, fuzzy msgid "Use this config file instead of default" msgstr "Use specified file instead of the default trustdb" #: share/completions/gem.fish:41 msgid "Show stack backtrace on errors" msgstr "" #: share/completions/gem.fish:42 #, fuzzy msgid "Turn on Ruby debugging" msgstr "Turn of demangling" #: share/completions/gem.fish:47 msgid "Add a trusted certificate" msgstr "" #: share/completions/gem.fish:48 #, fuzzy msgid "List trusted certificates" msgstr "List trusted keys" #: share/completions/gem.fish:49 msgid "Remove trusted certificates containing STRING" msgstr "" #: share/completions/gem.fish:50 msgid "Build private key and self-signed certificate for EMAIL_ADDR" msgstr "" #: share/completions/gem.fish:51 msgid "Certificate for --sign command" msgstr "" #: share/completions/gem.fish:52 #, fuzzy msgid "Private key for --sign command" msgstr "Print the type of a command" #: share/completions/gem.fish:53 msgid "Sign a certificate with my key and certificate" msgstr "" #: share/completions/gem.fish:58 msgid "Verify gem file against its internal checksum" msgstr "" #: share/completions/gem.fish:59 #, fuzzy msgid "Report 'unmanaged' or rogue files in the gem repository" msgstr "Remove one or more files or directories from the repository" #: share/completions/gem.fish:60 msgid "Run unit tests for gem" msgstr "" #: share/completions/gem.fish:61 #, fuzzy msgid "Specify version for which to run unit tests" msgstr "Specify the repository directory in which to run" #: share/completions/gem.fish:66 #, fuzzy msgid "Don't really cleanup" msgstr "Don't really uninstall anything" #: share/completions/gem.fish:71 #, fuzzy msgid "List the files inside a Gem" msgstr "List files in package" #: share/completions/gem.fish:72 #, fuzzy msgid "Specify version for gem to view" msgstr "Specify users for query" #: share/completions/gem.fish:73 #, fuzzy msgid "Search for gems under specific paths" msgstr "Set driver specific options" #: share/completions/gem.fish:74 msgid "Be verbose when showing status" msgstr "" #: share/completions/gem.fish:79 share/completions/gem.fish:172 #, fuzzy msgid "Specify version of gem to uninstall" msgstr "List of packages to install" #: share/completions/gem.fish:80 #, fuzzy msgid "Include reverse dependencies in the output" msgstr "List reverse dependencies for the package" #: share/completions/gem.fish:81 #, fuzzy msgid "Don't include reverse dependencies in the output" msgstr "List reverse dependencies for the package" #: share/completions/gem.fish:82 msgid "Pipe Format (name --version ver)" msgstr "" #: share/completions/gem.fish:87 #, fuzzy msgid "display the package version" msgstr "Display package record" #: share/completions/gem.fish:87 msgid "display the path where gems are installed" msgstr "" #: share/completions/gem.fish:87 #, fuzzy msgid "display path used to search for gems" msgstr "Display the session key used for one message" #: share/completions/gem.fish:87 #, fuzzy msgid "display the gem format version" msgstr "Display update information" #: share/completions/gem.fish:87 #, fuzzy msgid "display the remote gem servers" msgstr "File to grab servers" #: share/completions/gem.fish:92 #, fuzzy msgid "list all 'gem' commands" msgstr "Disable this command" #: share/completions/gem.fish:92 msgid "show some examples of usage" msgstr "" #: share/completions/gem.fish:97 #, fuzzy msgid "Specify version of gem to install" msgstr "List of packages to install" #: share/completions/gem.fish:98 share/completions/gem.fish:121 #: share/completions/gem.fish:131 share/completions/gem.fish:150 #: share/completions/gem.fish:158 msgid "Restrict operations to the LOCAL domain (default)" msgstr "" #: share/completions/gem.fish:99 share/completions/gem.fish:122 #: share/completions/gem.fish:132 share/completions/gem.fish:151 #: share/completions/gem.fish:159 msgid "Restrict operations to the REMOTE domain" msgstr "" #: share/completions/gem.fish:100 share/completions/gem.fish:123 #: share/completions/gem.fish:133 share/completions/gem.fish:152 #: share/completions/gem.fish:160 msgid "Allow LOCAL and REMOTE operations" msgstr "" #: share/completions/gem.fish:101 share/completions/gem.fish:182 msgid "Gem repository directory to get installed gems" msgstr "" #: share/completions/gem.fish:102 share/completions/gem.fish:183 msgid "Generate RDoc documentation for the gem on install" msgstr "" #: share/completions/gem.fish:103 share/completions/gem.fish:184 msgid "Don't generate RDoc documentation for the gem on install" msgstr "" #: share/completions/gem.fish:104 share/completions/gem.fish:185 msgid "Generate RI documentation for the gem on install" msgstr "" #: share/completions/gem.fish:105 share/completions/gem.fish:186 msgid "Don't generate RI documentation for the gem on install" msgstr "" #: share/completions/gem.fish:106 share/completions/gem.fish:187 msgid "Force gem to install, bypassing dependency checks" msgstr "" #: share/completions/gem.fish:107 share/completions/gem.fish:188 #, fuzzy msgid "Don't force gem to install, bypassing dependency checks" msgstr "Don't do a dependency check" #: share/completions/gem.fish:108 share/completions/gem.fish:189 msgid "Run unit tests prior to installation" msgstr "" #: share/completions/gem.fish:109 share/completions/gem.fish:190 #, fuzzy msgid "Don't run unit tests prior to installation" msgstr "Don't check for sufficient disk space before installation" #: share/completions/gem.fish:110 share/completions/gem.fish:191 #, fuzzy msgid "Use bin wrappers for executables" msgstr "File is executable" #: share/completions/gem.fish:111 share/completions/gem.fish:192 #, fuzzy msgid "Don't use bin wrappers for executables" msgstr "Don't make scripts executable" #: share/completions/gem.fish:112 share/completions/gem.fish:193 #, fuzzy msgid "Specify gem trust policy" msgstr "Specify trust model" #: share/completions/gem.fish:113 share/completions/gem.fish:194 msgid "Do not install any required dependent gems" msgstr "" #: share/completions/gem.fish:114 share/completions/gem.fish:195 msgid "Unconditionally install the required dependent gems" msgstr "" #: share/completions/gem.fish:119 share/completions/gem.fish:129 #: share/completions/gem.fish:148 #, fuzzy msgid "Display detailed information of gem(s)" msgstr "Display update information" #: share/completions/gem.fish:120 share/completions/gem.fish:130 #: share/completions/gem.fish:149 #, fuzzy msgid "Don't display detailed information of gem(s)" msgstr "Display update information" #: share/completions/gem.fish:128 msgid "Name of gem(s) to query on matches the provided REGEXP" msgstr "" #: share/completions/gem.fish:138 msgid "Generate RDoc/RI documentation for all installed gems" msgstr "" #: share/completions/gem.fish:139 msgid "Include RDoc generated documents" msgstr "" #: share/completions/gem.fish:140 msgid "Don't include RDoc generated documents" msgstr "" #: share/completions/gem.fish:141 msgid "Include RI generated documents" msgstr "" #: share/completions/gem.fish:142 msgid "Don't include RI generated documents" msgstr "" #: share/completions/gem.fish:143 #, fuzzy msgid "Specify version of gem to rdoc" msgstr "Specify users for query" #: share/completions/gem.fish:157 #, fuzzy msgid "Specify version of gem to examine" msgstr "Specify destination email" #: share/completions/gem.fish:161 msgid "Output specifications for all versions of the gem" msgstr "" #: share/completions/gem.fish:166 #, fuzzy msgid "Uninstall all matching versions" msgstr "Print all versions" #: share/completions/gem.fish:167 #, fuzzy msgid "Don't uninstall all matching versions" msgstr "Don't really uninstall anything" #: share/completions/gem.fish:168 msgid "Ignore dependency requirements while uninstalling" msgstr "" #: share/completions/gem.fish:169 #, fuzzy msgid "Don't ignore dependency requirements while uninstalling" msgstr "Don't check dependencies before uninstalling the packages" #: share/completions/gem.fish:170 msgid "Uninstall applicable executables without confirmation" msgstr "" #: share/completions/gem.fish:171 msgid "Don't uninstall applicable executables without confirmation" msgstr "" #: share/completions/gem.fish:177 msgid "Specify version of gem to unpack" msgstr "" #: share/completions/gem.fish:196 msgid "Update the RubyGems system software" msgstr "" #: share/completions/gpg.fish:116 msgid "Write output to specified file" msgstr "Write output to specified file" #: share/completions/gpg.fish:161 msgid "Use specified keyserver" msgstr "Use specified keyserver" #: share/completions/gpg.fish:169 msgid "The command line that should be run to view a photo ID" msgstr "The command line that should be run to view a photo ID" #: share/completions/gpg.fish:170 msgid "" "Sets a list of directories to search for photo viewers and keyserver helpers" msgstr "" "Sets a list of directories to search for photo viewers and keyserver helpers" #: share/completions/gpg.fish:173 msgid "Add specified file to the current list of keyrings" msgstr "Add specified file to the current list of keyrings" #: share/completions/gpg.fish:175 msgid "Add specified file to the current list of secret keyrings" msgstr "Add specified file to the current list of secret keyrings" #: share/completions/gpg.fish:176 msgid "Designate specified file as the primary public keyring" msgstr "Designate specified file as the primary public keyring" #: share/completions/gpg.fish:178 msgid "Use specified file instead of the default trustdb" msgstr "Use specified file instead of the default trustdb" #: share/completions/gpg.fish:184 msgid "Read options from specified file, do not read the default options file" msgstr "Read options from specified file, do not read the default options file" #: share/completions/gpg.fish:186 msgid "Load an extension module" msgstr "Load an extension module" #: share/completions/gpg.fish:188 msgid "Write special status strings to the specified file descriptor" msgstr "Write special status strings to the specified file descriptor" #: share/completions/gpg.fish:189 msgid "Write log output to the specified file descriptor" msgstr "Write log output to the specified file descriptor" #: share/completions/gpg.fish:195 msgid "Use specified string as comment string" msgstr "Use specified string as comment string" #: share/completions/gpg.fish:204 msgid "Put the specified name value pair into the signature as notation data" msgstr "Put the specified name value pair into the signature as notation data" #: share/completions/gpg.fish:205 msgid "Set signature policy" msgstr "Set signature policy" #: share/completions/gpg.fish:206 msgid "Set certificate policy" msgstr "Set certificate policy" #: share/completions/gpg.fish:207 msgid "Set signature and certificate policy" msgstr "Set signature and certificate policy" #: share/completions/gpg.fish:208 msgid "Use specified URL as a preferred keyserver for data signatures" msgstr "Use specified URL as a preferred keyserver for data signatures" #: share/completions/gpg.fish:210 msgid "Use specified string as the filename which is stored inside messages" msgstr "Use specified string as the filename which is stored inside messages" #: share/completions/gpg.fish:218 msgid "" "Number of completely trusted users to introduce a new key signer (defaults " "to 1)" msgstr "" "Number of completely trusted users to introduce a new key signer (defaults " "to 1)" #: share/completions/gpg.fish:219 msgid "" "Number of marginally trusted users to introduce a new key signer (defaults " "to 3)" msgstr "" "Number of marginally trusted users to introduce a new key signer (defaults " "to 3)" #: share/completions/gpg.fish:221 msgid "Maximum depth of a certification chain (default is 5)" msgstr "Maximum depth of a certification chain (default is 5)" #: share/completions/gpg.fish:249 msgid "Read passphrase from specified file descriptor" msgstr "Read passphrase from specified file descriptor" #: share/completions/gpg.fish:250 msgid "Read user input from specified file descriptor" msgstr "Read user input from specified file descriptor" #: share/completions/gpg.fish:254 msgid "Override value of GPG_AGENT_INFO environment variable" msgstr "Override value of GPG_AGENT_INFO environment variable" #: share/completions/gpg.fish:304 msgid "Don't use the public key but the specified session key" msgstr "Don't use the public key but the specified session key" #: share/completions/gpg.fish:315 msgid "Sets up a named group, which is similar to aliases in email programs" msgstr "Sets up a named group, which is similar to aliases in email programs" #: share/completions/gpg.fish:321 msgid "Set the list of personal cipher preferences to the specified string" msgstr "Set the list of personal cipher preferences to the specified string" #: share/completions/gpg.fish:322 msgid "Set the list of personal digest preferences to the specified string" msgstr "Set the list of personal digest preferences to the specified string" #: share/completions/gpg.fish:323 msgid "" "Set the list of personal compression preferences to the specified string" msgstr "" "Set the list of personal compression preferences to the specified string" #: share/completions/gpg.fish:324 msgid "Set the list of default preferences to the specified string" msgstr "Set the list of default preferences to the specified string" #: share/completions/gprof.fish:24 msgid "Delete arcs from callgraph" msgstr "Delete arcs from callgraph" #: share/completions/gprof.fish:26 msgid "Supress output when executed less than specified times" msgstr "Supress output when executed less than specified times" #: share/completions/gprof.fish:33 msgid "Profile data format" msgstr "Profile data format" #: share/completions/grep.fish:14 msgid "Action for devices" msgstr "Action for devices" #: share/completions/grep.fish:15 msgid "Action for directories" msgstr "Action for directories" #: share/completions/grep.fish:19 msgid "Use pattern from file" msgstr "Use pattern from file" #: share/completions/gunzip.fish:15 share/completions/gzip.fish:17 msgid "Suffix" msgstr "Suffix" #: share/completions/help.fish:6 msgid "Help for the specified command" msgstr "Help for the specified command" #: share/completions/help.fish:9 msgid "Introduction to the fish syntax" msgstr "" #: share/completions/help.fish:10 msgid "Incomplete aspects of fish" msgstr "" #: share/completions/help.fish:11 msgid "Known fish bugs" msgstr "" #: share/completions/help.fish:12 msgid "Help on how to reuse previously entered commands" msgstr "" #: share/completions/help.fish:14 msgid "Help on how tab-completion works" msgstr "Help on how tab-completion works" #: share/completions/help.fish:15 msgid "Help on how job control works" msgstr "Help on how job control works" #: share/completions/help.fish:16 msgid "Summary on how fish differs from other shells" msgstr "Summary on how fish differs from other shells" #: share/completions/help.fish:18 msgid "Help on how to set the prompt" msgstr "Help on how to set the prompt" #: share/completions/help.fish:19 msgid "Help on how to set the titlebar message" msgstr "Help on how to set the titlebar message" #: share/completions/help.fish:20 msgid "Help on how to copy and paste" msgstr "Help on how to copy and paste" #: share/completions/help.fish:21 msgid "Help on editor shortcuts" msgstr "Help on editor shortcuts" #: share/completions/help.fish:22 msgid "Help on environment variables" msgstr "Help on environment variables" #: share/completions/help.fish:23 msgid "Help on setting syntax highlighting colors" msgstr "Help on setting syntax highlighting colors" #: share/completions/help.fish:25 share/completions/help.fish:26 msgid "Help on parameter expansion (Globbing)" msgstr "Help on parameter expansion (Globbing)" #: share/completions/help.fish:27 #, sh-format msgid "Help on variable expansion $VARNAME" msgstr "Help on variable expansion $VARNAME" #: share/completions/help.fish:28 msgid "Help on home directory expansion ~USER" msgstr "Help on home directory expansion ~USER" #: share/completions/help.fish:29 msgid "Help on brace expansion {a,b,c}" msgstr "Help on brace expansion {a,b,c}" #: share/completions/help.fish:30 msgid "Help on wildcard expansion *.*" msgstr "Help on wildcard expansion *.*" #: share/completions/help.fish:31 msgid "Help on command substitution (SUBCOMMAND)" msgstr "Help on command substitution (SUBCOMMAND)" #: share/completions/help.fish:32 msgid "Help on process expansion %JOB" msgstr "Help on process expansion %JOB" #: share/completions/hg.fish:17 #, fuzzy msgid "add the specified files on the next commit" msgstr "Add specified file to the current list of keyrings" #: share/completions/hg.fish:18 #, fuzzy msgid "show changeset information per file line" msgstr "Display change information for the package" #: share/completions/hg.fish:19 msgid "create unversioned archive of a repository revision" msgstr "" #: share/completions/hg.fish:20 msgid "reverse effect of earlier changeset" msgstr "" #: share/completions/hg.fish:21 #, fuzzy msgid "create a changegroup file" msgstr "Read package from file" #: share/completions/hg.fish:22 #, fuzzy msgid "output the latest or given revisions of files" msgstr "Show the log messages for a set of revision(s) and/or file(s)" #: share/completions/hg.fish:23 #, fuzzy msgid "make a copy of an existing repository" msgstr "Create a local copy of another repository" #: share/completions/hg.fish:24 #, fuzzy msgid "commit the specified files or all outstanding changes" msgstr "Decrypt specified file or stdin" #: share/completions/hg.fish:25 msgid "mark files as copied for the next commit" msgstr "" #: share/completions/hg.fish:26 msgid "diff repository (or selected files)" msgstr "" #: share/completions/hg.fish:27 msgid "dump the header and diffs for one or more changesets" msgstr "" #: share/completions/hg.fish:28 msgid "search for a pattern in specified files and revisions" msgstr "" #: share/completions/hg.fish:29 msgid "show current repository heads" msgstr "" #: share/completions/hg.fish:30 msgid "show help for a command, extension, or list of commands" msgstr "" #: share/completions/hg.fish:31 #, fuzzy msgid "print information about the working copy" msgstr "Output extra information about the work being done" #: share/completions/hg.fish:32 #, fuzzy msgid "import an ordered set of patches" msgstr "Print byte offset of matches" #: share/completions/hg.fish:33 msgid "show new changesets found in source" msgstr "" #: share/completions/hg.fish:34 #, fuzzy msgid "create a new repository in the given directory" msgstr "Create a CVS repository if it doesnt exist" #: share/completions/hg.fish:35 #, fuzzy msgid "locate files matching specific patterns" msgstr "Exclude files that match pattern" #: share/completions/hg.fish:36 msgid "show revision history of entire repository or files" msgstr "" #: share/completions/hg.fish:37 msgid "output the latest or given revision of the project manifest" msgstr "" #: share/completions/hg.fish:38 msgid "Merge working directory with another revision" msgstr "" #: share/completions/hg.fish:39 msgid "show changesets not found in destination" msgstr "" #: share/completions/hg.fish:40 msgid "show the parents of the working dir or revision" msgstr "" #: share/completions/hg.fish:41 msgid "show definition of symbolic path names" msgstr "" #: share/completions/hg.fish:42 #, fuzzy msgid "pull changes from the specified source" msgstr "Query packages with the specified group" #: share/completions/hg.fish:43 #, fuzzy msgid "push changes to the specified destination" msgstr "Query packages with the specified group" #: share/completions/hg.fish:44 msgid "roll back an interrupted transaction" msgstr "" #: share/completions/hg.fish:45 #, fuzzy msgid "remove the specified files on the next commit" msgstr "Move file specified on commandline" #: share/completions/hg.fish:46 msgid "rename files; equivalent of copy + remove" msgstr "" #: share/completions/hg.fish:47 msgid "revert files or dirs to their states as of some revision" msgstr "" #: share/completions/hg.fish:48 msgid "roll back the last transaction in this repository" msgstr "" #: share/completions/hg.fish:49 msgid "print the root (top) of the current working dir" msgstr "" #: share/completions/hg.fish:50 #, fuzzy msgid "export the repository via HTTP" msgstr "Update the repository" #: share/completions/hg.fish:51 #, fuzzy msgid "show changed files in the working directory" msgstr "Change working directory" #: share/completions/hg.fish:52 msgid "add a tag for the current tip or a given revision" msgstr "" #: share/completions/hg.fish:53 #, fuzzy msgid "list repository tags" msgstr "Disable repository" #: share/completions/hg.fish:54 #, fuzzy msgid "show the tip revision" msgstr "Show the time" #: share/completions/hg.fish:55 #, fuzzy msgid "apply a changegroup file" msgstr "Read package from file" #: share/completions/hg.fish:56 #, fuzzy msgid "update or merge working directory" msgstr "Change working directory" #: share/completions/hg.fish:57 #, fuzzy msgid "verify the integrity of the repository" msgstr "Remove an entry from the repository" #: share/completions/hg.fish:58 #, fuzzy msgid "output version and copyright information" msgstr "Ignore version magic information" #: share/completions/hg.fish:100 #, fuzzy msgid "Remembers the parent of the working directory" msgstr "Change working directory" #: share/completions/ifconfig.fish:1 msgid "Stop interface" msgstr "Stop interface" #: share/completions/ifconfig.fish:2 msgid "Start interface" msgstr "Start interface" #: share/completions/ifconfig.fish:25 msgid "Network interface" msgstr "Network interface" #: share/completions/less.fish:3 msgid "Buffer space" msgstr "Buffer space" #: share/completions/locate.fish:22 msgid "Search the file name databases in these directories" msgstr "" #: share/completions/locate.fish:23 #, fuzzy msgid "Limit the number of matches" msgstr "Only print number of matches" #: share/completions/make.fish:12 msgid "Target" msgstr "Target" #: share/completions/make.fish:13 msgid "Use file as makefile" msgstr "Use file as makefile" #: share/completions/make.fish:18 msgid "Search directory for makefile" msgstr "Search directory for makefile" #: share/completions/make.fish:19 msgid "Number of concurrent jobs" msgstr "Number of concurrent jobs" #: share/completions/make.fish:23 msgid "Ignore specified file" msgstr "Ignore specified file" #: share/completions/make.fish:32 msgid "Pretend file is modified" msgstr "Pretend file is modified" #: share/completions/makedepend.fish:1 msgid "Define" msgstr "Define" #: share/completions/makedepend.fish:2 msgid "Include directory" msgstr "Include directory" #: share/completions/makedepend.fish:3 msgid "Replace include directories" msgstr "Replace include directories" #: share/completions/makedepend.fish:5 msgid "Specify makefile" msgstr "Specify makefile" #: share/completions/makedepend.fish:6 msgid "Prepend file to input" msgstr "Prepend file to input" #: share/completions/makedepend.fish:7 msgid "Object file suffix" msgstr "Object file suffix" #: share/completions/makedepend.fish:8 msgid "Object file prefix" msgstr "Object file prefix" #: share/completions/makedepend.fish:9 msgid "Starting string delimiter" msgstr "Starting string delimiter" #: share/completions/makedepend.fish:10 msgid "Line width" msgstr "Line width" #: share/completions/mount.fish:19 msgid "Mount partition with specified label" msgstr "Mount partition with specified label" #: share/completions/mount.fish:20 msgid "Mount partition with specified UID" msgstr "Mount partition with specified UID" #: share/completions/mount.fish:21 msgid "Exclude filesystems" msgstr "Exclude filesystems" #: share/completions/mount.fish:22 msgid "Remount a subtree to a second position" msgstr "Remount a subtree to a second position" #: share/completions/mount.fish:23 msgid "Move a subtree to a new position" msgstr "Move a subtree to a new position" #: share/completions/mount.fish:24 msgid "Filesystem" msgstr "Filesystem" #: share/completions/mount.fish:26 msgid "Mount option" msgstr "Mount option" #: share/completions/mplayer.fish:28 msgid "A/V sync speed" msgstr "A/V sync speed" #: share/completions/mplayer.fish:32 msgid "Loop playback" msgstr "Loop playback" #: share/completions/mplayer.fish:58 share/completions/mplayer.fish:76 msgid "Video output" msgstr "Video output" #: share/completions/mplayer.fish:64 share/completions/mplayer.fish:70 msgid "Audio output" msgstr "Audio output" #: share/completions/mutt.fish:14 msgid "An expanded version of the given alias is passed to stdout" msgstr "" #: share/completions/mutt.fish:15 msgid "Attach a file to your message using MIME" msgstr "" #: share/completions/mutt.fish:16 msgid "Specify a blind-carbon-copy (BCC) recipient" msgstr "" #: share/completions/mutt.fish:17 msgid "Specify a carbon-copy (CC) recipient" msgstr "" #: share/completions/mutt.fish:18 msgid "Run command after processing of initialization files" msgstr "" #: share/completions/mutt.fish:19 #, fuzzy msgid "Specify which mailbox to load" msgstr "Specify sendmail command" #: share/completions/mutt.fish:20 msgid "Specify an initialization file to read instead of ~/.muttrc" msgstr "" #: share/completions/mutt.fish:21 msgid "Specify a draft file containing header and body for the message" msgstr "" #: share/completions/mutt.fish:22 msgid "Specify a file to include into the body of a message" msgstr "" #: share/completions/mutt.fish:23 #, fuzzy msgid "Specify a default mailbox type" msgstr "Specify destination email" #: share/completions/mutt.fish:24 #, fuzzy msgid "Query a configuration variables value" msgstr "Specify a configuration file" #: share/completions/mutt.fish:25 #, fuzzy msgid "Specify the subject of the message" msgstr "Specify commit message" #: share/completions/mv.fish:4 msgid "Answer for overwrite questions" msgstr "Answer for overwrite questions" #: share/completions/perl.fish:5 msgid "Debug option" msgstr "Debug option" #: share/completions/perl.fish:6 share/completions/ruby.fish:7 msgid "Execute command" msgstr "Execute command" #: share/completions/python.fish:1 msgid "Execute argument as command" msgstr "Execute argument as command" #: share/completions/python.fish:7 msgid "Division control" msgstr "Division control" #: share/completions/python.fish:13 msgid "Warning control" msgstr "Warning control" #: share/completions/rpm.fish:22 msgid "Add suggested packages to the transaction set when needed" msgstr "Add suggested packages to the transaction set when needed" #: share/completions/rpm.fish:23 msgid "" "Installs or upgrades all the files in the package, even if they aren't " "needed (missingok) and don't exist" msgstr "" "Installs or upgrades all the files in the package, even if they aren't " "needed (missingok) and don't exist" #: share/completions/rpm.fish:24 msgid "" "Used with --relocate, permit relocations on all file paths, not just those " "OLD-PATH's included in the binary package relocation hint(s)" msgstr "" "Used with --relocate, permit relocations on all file paths, not just those " "OLD-PATH's included in the binary package relocation hint(s)" #: share/completions/rpm.fish:25 msgid "Don't install files whose name begins with specified path" msgstr "Don't install files whose name begins with specified path" #: share/completions/rpm.fish:26 msgid "Don't install any files which are marked as documentation" msgstr "Don't install any files which are marked as documentation" #: share/completions/rpm.fish:27 msgid "Same as using --replacepkgs, --replacefiles, and --oldpackage" msgstr "Same as using --replacepkgs, --replacefiles, and --oldpackage" #: share/completions/rpm.fish:28 msgid "Print 50 hash marks as the package archive is unpacked" msgstr "Print 50 hash marks as the package archive is unpacked" #: share/completions/rpm.fish:29 msgid "Don't check for sufficient disk space before installation" msgstr "Don't check for sufficient disk space before installation" #: share/completions/rpm.fish:30 msgid "" "Allow installation or upgrading even if the architectures of the binary " "package and host don't match" msgstr "" "Allow installation or upgrading even if the architectures of the binary " "package and host don't match" #: share/completions/rpm.fish:31 msgid "" "Allow installation or upgrading even if the operating systems of the binary " "package and host don't match" msgstr "" "Allow installation or upgrading even if the operating systems of the binary " "package and host don't match" #: share/completions/rpm.fish:32 msgid "Install documentation files (default)" msgstr "Install documentation files (default)" #: share/completions/rpm.fish:33 msgid "Update only the database, not the filesystem" msgstr "Update only the database, not the filesystem" #: share/completions/rpm.fish:34 share/completions/rpm.fish:94 msgid "Don't verify package or header digests when reading" msgstr "Don't verify package or header digests when reading" #: share/completions/rpm.fish:35 share/completions/rpm.fish:97 msgid "Don't verify package or header signatures when reading" msgstr "Don't verify package or header signatures when reading" #: share/completions/rpm.fish:36 msgid "Don't do a dependency check" msgstr "Don't do a dependency check" #: share/completions/rpm.fish:37 msgid "Don't suggest package(s) that provide a missing dependency" msgstr "Don't suggest package(s) that provide a missing dependency" #: share/completions/rpm.fish:38 msgid "Don't change the package installation order" msgstr "Don't change the package installation order" #: share/completions/rpm.fish:39 msgid "Don't execute scripts" msgstr "Don't execute scripts" #: share/completions/rpm.fish:40 msgid "Don't execute pre scripts" msgstr "Don't execute pre scripts" #: share/completions/rpm.fish:41 msgid "Don't execute post scripts" msgstr "Don't execute post scripts" #: share/completions/rpm.fish:42 msgid "Don't execute preun scripts" msgstr "Don't execute preun scripts" #: share/completions/rpm.fish:43 msgid "Don't execute postun scripts" msgstr "Don't execute postun scripts" #: share/completions/rpm.fish:44 share/completions/rpm.fish:115 msgid "Don't execute trigger scriptlets" msgstr "Don't execute trigger scriptlets" #: share/completions/rpm.fish:45 msgid "Don't execute triggerin scriptlets" msgstr "Don't execute triggerin scriptlets" #: share/completions/rpm.fish:46 share/completions/rpm.fish:116 msgid "Don't execute triggerun scriptlets" msgstr "Don't execute triggerun scriptlets" #: share/completions/rpm.fish:47 share/completions/rpm.fish:117 msgid "Don't execute triggerpostun scriptlets" msgstr "Don't execute triggerpostun scriptlets" #: share/completions/rpm.fish:48 msgid "Allow an upgrade to replace a newer package with an older one" msgstr "Allow an upgrade to replace a newer package with an older one" #: share/completions/rpm.fish:49 msgid "" "Print percentages as files are unpacked from the package archive. This is " "intended to make rpm easy to run from other tools" msgstr "" "Print percentages as files are unpacked from the package archive. This is " "intended to make rpm easy to run from other tools" #: share/completions/rpm.fish:50 msgid "" "For relocatable binary packages, translate all file paths that start with " "the installation prefix in the package relocation hint(s) to NEWPATH" msgstr "" "For relocatable binary packages, translate all file paths that start with " "the installation prefix in the package relocation hint(s) to NEWPATH" #: share/completions/rpm.fish:52 share/completions/rpm.fish:118 msgid "Re-package the files before erasing" msgstr "Re-package the files before erasing" #: share/completions/rpm.fish:53 msgid "" "Install the packages even if they replace files from other, already " "installed, packages" msgstr "" "Install the packages even if they replace files from other, already " "installed, packages" #: share/completions/rpm.fish:54 msgid "" "Install the packages even if some of them are already installed on this " "system" msgstr "" "Install the packages even if some of them are already installed on this " "system" #: share/completions/rpm.fish:55 msgid "" "Don't install the package, simply check for and report potential conflicts" msgstr "" "Don't install the package, simply check for and report potential conflicts" #: share/completions/rpm.fish:59 msgid "Display change information for the package" msgstr "Display change information for the package" #: share/completions/rpm.fish:60 msgid "List only configuration files (implies -l)" msgstr "List only configuration files (implies -l)" #: share/completions/rpm.fish:61 msgid "List only documentation files (implies -l)" msgstr "List only documentation files (implies -l)" #: share/completions/rpm.fish:62 msgid "Dump file information. Must be used with at least one of -l, -c, -d" msgstr "Dump file information. Must be used with at least one of -l, -c, -d" #: share/completions/rpm.fish:63 msgid "List all the files in each selected package" msgstr "List all the files in each selected package" #: share/completions/rpm.fish:64 msgid "" "Display package information, including name, version, and description. Uses " "--queryformat if specified" msgstr "" "Display package information, including name, version, and description. Uses " "--queryformat if specified" #: share/completions/rpm.fish:65 msgid "Orders the package listing by install time" msgstr "Orders the package listing by install time" #: share/completions/rpm.fish:66 msgid "List files in package" msgstr "List files in package" #: share/completions/rpm.fish:67 msgid "List capabilities this package provides" msgstr "List capabilities this package provides" #: share/completions/rpm.fish:68 msgid "List packages on which this package depends" msgstr "List packages on which this package depends" #: share/completions/rpm.fish:69 msgid "List the package specific scriptlets" msgstr "List the package specific scriptlets" #: share/completions/rpm.fish:70 msgid "" "Display the states of files in the package. The state of each file is one of " "normal, not installed, or replaced" msgstr "" "Display the states of files in the package. The state of each file is one of " "normal, not installed, or replaced" #: share/completions/rpm.fish:71 share/completions/rpm.fish:72 msgid "Display the trigger scripts contained in the package" msgstr "Display the trigger scripts contained in the package" #: share/completions/rpm.fish:78 msgid "Query all installed packages" msgstr "Query all installed packages" #: share/completions/rpm.fish:79 msgid "Query package owning specified file" msgstr "Query package owning specified file" #: share/completions/rpm.fish:80 msgid "" "Query package that contains a given file identifier, i.e. the MD5 digest of " "the file contents" msgstr "" "Query package that contains a given file identifier, i.e. the MD5 digest of " "the file contents" #: share/completions/rpm.fish:81 msgid "Query packages with the specified group" msgstr "Query packages with the specified group" #: share/completions/rpm.fish:82 msgid "" "Query package that contains a given header identifier, i.e. the SHA1 digest " "of the immutable header region" msgstr "" "Query package that contains a given header identifier, i.e. the SHA1 digest " "of the immutable header region" #: share/completions/rpm.fish:83 msgid "Query an (uninstalled) package in specified file" msgstr "Query an (uninstalled) package in specified file" #: share/completions/rpm.fish:84 msgid "" "Query package that contains a given package identifier, i.e. the MD5 digest " "of the combined header and payload contents" msgstr "" "Query package that contains a given package identifier, i.e. the MD5 digest " "of the combined header and payload contents" #: share/completions/rpm.fish:85 msgid "Parse and query specified spec-file as if it were a package" msgstr "Parse and query specified spec-file as if it were a package" #: share/completions/rpm.fish:86 msgid "Query package(s) that have the specified TID (transaction identifier)" msgstr "Query package(s) that have the specified TID (transaction identifier)" #: share/completions/rpm.fish:87 msgid "Query packages that are triggered by the specified packages" msgstr "Query packages that are triggered by the specified packages" #: share/completions/rpm.fish:88 msgid "Query all packages that provide the specified capability" msgstr "Query all packages that provide the specified capability" #: share/completions/rpm.fish:89 msgid "" "Query all packages that requires the specified capability for functioning" msgstr "" "Query all packages that requires the specified capability for functioning" #: share/completions/rpm.fish:93 msgid "Don't verify dependencies of packages" msgstr "Don't verify dependencies of packages" #: share/completions/rpm.fish:95 msgid "Don't verify any attributes of package files" msgstr "Don't verify any attributes of package files" #: share/completions/rpm.fish:96 msgid "Don't execute the %verifyscript scriptlet" msgstr "Don't execute the %verifyscript scriptlet" #: share/completions/rpm.fish:98 msgid "Don't verify linkto attribute" msgstr "Don't verify linkto attribute" #: share/completions/rpm.fish:99 msgid "Don't verify md5 attribute" msgstr "Don't verify md5 attribute" #: share/completions/rpm.fish:100 msgid "Don't verify size attribute" msgstr "Don't verify size attribute" #: share/completions/rpm.fish:101 msgid "Don't verify user attribute" msgstr "Don't verify user attribute" #: share/completions/rpm.fish:102 msgid "Don't verify group attribute" msgstr "Don't verify group attribute" #: share/completions/rpm.fish:103 msgid "Don't verify time attribute" msgstr "Don't verify time attribute" #: share/completions/rpm.fish:104 msgid "Don't verify mode attribute" msgstr "Don't verify mode attribute" #: share/completions/rpm.fish:105 msgid "Don't verify dev attribute" msgstr "Don't verify dev attribute" #: share/completions/rpm.fish:110 msgid "Remove all versions of the package which match specified string" msgstr "Remove all versions of the package which match specified string" #: share/completions/rpm.fish:111 msgid "Don't check dependencies before uninstalling the packages" msgstr "Don't check dependencies before uninstalling the packages" #: share/completions/rpm.fish:112 msgid "Don't execute scriplets" msgstr "Don't execute scriplets" #: share/completions/rpm.fish:113 msgid "Don't execute preun scriptlet" msgstr "Don't execute preun scriptlet" #: share/completions/rpm.fish:114 msgid "Don't execute postun scriptlet" msgstr "Don't execute postun scriptlet" #: share/completions/rpm.fish:119 msgid "Don't really uninstall anything" msgstr "Don't really uninstall anything" #: share/completions/rpm.fish:123 msgid "Install new package" msgstr "Install new package" #: share/completions/rpm.fish:124 msgid "Upgrade existing package" msgstr "Upgrade existing package" #: share/completions/rpm.fish:125 msgid "Upgrade package if already installed" msgstr "Upgrade package if already installed" #: share/completions/rpm.fish:126 msgid "Query installed packages" msgstr "Query installed packages" #: share/completions/rpm.fish:127 msgid "Verify package integrity" msgstr "Verify package integrity" #: share/completions/rpm.fish:128 msgid "Erase package" msgstr "Erase package" #: share/completions/rsync.fish:41 msgid "Force a fixed checksum block-size" msgstr "" #: share/completions/rsync.fish:42 #, fuzzy msgid "Specify the remote shell to use" msgstr "Specify the repository URL" #: share/completions/rsync.fish:43 #, fuzzy msgid "Specify the rsync to run on remote machine" msgstr "Specify root directory for rpm operations" #: share/completions/rsync.fish:69 msgid "Also compare received files relative to DIR" msgstr "" #: share/completions/rsync.fish:70 msgid "" "Also compare received files relative to DIR and include copies of unchanged " "files" msgstr "" #: share/completions/rsync.fish:93 #, fuzzy msgid "Output filenames using the specified format" msgstr "Output profiling information to specified file" #: share/completions/rsync.fish:94 msgid "Read password from FILE" msgstr "" #: share/completions/rsync.fish:96 msgid "Limit I/O bandwidth; KBytes per second" msgstr "" #: share/completions/rsync.fish:97 msgid "Write a batched update to FILE" msgstr "" #: share/completions/rsync.fish:99 #, fuzzy msgid "Read a batched update from FILE" msgstr "Read the patch from patchfile" #: share/completions/rsync.fish:100 msgid "Force an older protocol version to be used" msgstr "" #: share/completions/rsync.fish:101 msgid "Set block/file checksum seed (advanced)" msgstr "" #: share/completions/ruby.fish:15 msgid "Require file" msgstr "Require file" #: share/completions/scp.fish:29 msgid "Bandwidth limit" msgstr "Bandwidth limit" #: share/completions/scp.fish:30 share/completions/ssh.fish:36 #: share/completions/sshfs.fish:25 msgid "Port" msgstr "Port" #: share/completions/screen.fish:1 msgid "Print a list of running screen sessions" msgstr "Print a list of running screen sessions" #: share/completions/sed.fish:13 msgid "Evaluate expression" msgstr "Evaluate expression" #: share/completions/sed.fish:14 msgid "Evalute file" msgstr "Evalute file" #: share/completions/sed.fish:22 msgid "Specify line-length" msgstr "Specify line-length" #: share/completions/set.fish:73 share/completions/set_color.fish:1 msgid "Color" msgstr "Color" #: share/completions/set.fish:74 share/completions/set_color.fish:2 msgid "Change background color" msgstr "Change background color" #: share/completions/set.fish:79 msgid "Locale" msgstr "Locale" #: share/completions/sort.fish:12 msgid "Write to file" msgstr "Write to file" #: share/completions/sort.fish:14 msgid "Set memory buffer size" msgstr "Set memory buffer size" #: share/completions/sort.fish:16 msgid "Set temporary directory" msgstr "Set temporary directory" #: share/completions/ssh.fish:21 msgid "Interface to transmit from" msgstr "Interface to transmit from" #: share/completions/ssh.fish:27 msgid "Escape character" msgstr "Escape character" #: share/completions/ssh.fish:32 msgid "User" msgstr "User" #: share/completions/su.fish:5 msgid "Pass command to shell" msgstr "Pass command to shell" #: share/completions/svn.fish:17 msgid "" "Put files and directories under version control, scheduling them for " "addition to repository. They will be added in next commit." msgstr "" #: share/completions/svn.fish:18 share/completions/svn.fish:19 #: share/completions/svn.fish:20 share/completions/svn.fish:21 #, fuzzy msgid "" "Output the content of specified files or URLs with revision and author " "information in-line." msgstr "Output files/URLs with revision and author information inline" #: share/completions/svn.fish:22 #, fuzzy msgid "Output the content of specified files or URLs." msgstr "Output content of files/URLs" #: share/completions/svn.fish:23 share/completions/svn.fish:24 #, fuzzy msgid "Check out a working copy from a repository." msgstr "Check out a working copy from the repository" #: share/completions/svn.fish:25 msgid "" "Recursively clean up the working copy, removing locks, resuming unfinished " "operations, etc." msgstr "" #: share/completions/svn.fish:26 share/completions/svn.fish:27 #, fuzzy msgid "Send changes from your working copy to the repository." msgstr "Send changes from your working copy to the repository" #: share/completions/svn.fish:28 share/completions/svn.fish:29 #, fuzzy msgid "Duplicate something in working copy or repository, remembering history." msgstr "Move and/or rename something in working copy or repository" #: share/completions/svn.fish:30 share/completions/svn.fish:31 #: share/completions/svn.fish:32 share/completions/svn.fish:33 #, fuzzy msgid "Remove files and directories from version control." msgstr "Place files or directories under version control" #: share/completions/svn.fish:34 share/completions/svn.fish:35 #, fuzzy msgid "Display the differences between two revisions or paths." msgstr "Apply the differences between two sources to a working copy path" #: share/completions/svn.fish:36 msgid "Create an unversioned copy of a tree." msgstr "" #: share/completions/svn.fish:37 share/completions/svn.fish:38 #: share/completions/svn.fish:39 #, fuzzy msgid "Describe the usage of this program or its subcommands." msgstr "Describe the usage of this program or its subcommands" #: share/completions/svn.fish:40 #, fuzzy msgid "Commit an unversioned file or tree into the repository." msgstr "Commit an unversioned file or tree into the repository" #: share/completions/svn.fish:41 #, fuzzy msgid "Display information about a local or remote item." msgstr "Display information about a local or remote item" #: share/completions/svn.fish:42 share/completions/svn.fish:43 #, fuzzy msgid "List directory entries in the repository." msgstr "List directory entries in the repository" #: share/completions/svn.fish:44 #, fuzzy msgid "" "Lock working copy paths or URLs in the repository, so that no other user can " "commit changes to them." msgstr "Lock working copy paths or URLs in the repository" #: share/completions/svn.fish:45 #, fuzzy msgid "Show the log messages for a set of revision(s) and/or file(s)." msgstr "Show the log messages for a set of revision(s) and/or file(s)" #: share/completions/svn.fish:46 #, fuzzy msgid "Apply the differences between two sources to a working copy path." msgstr "Apply the differences between two sources to a working copy path" #: share/completions/svn.fish:47 #, fuzzy msgid "Create a new directory under version control." msgstr "Create a new directory under version control" #: share/completions/svn.fish:48 share/completions/svn.fish:49 #: share/completions/svn.fish:50 share/completions/svn.fish:51 #, fuzzy msgid "Move and/or rename something in working copy or repository." msgstr "Move and/or rename something in working copy or repository" #: share/completions/svn.fish:52 share/completions/svn.fish:53 #: share/completions/svn.fish:54 #, fuzzy msgid "Remove a property from files, dirs, or revisions." msgstr "Remove a property from files, dirs, or revisions" #: share/completions/svn.fish:55 share/completions/svn.fish:56 #: share/completions/svn.fish:57 #, fuzzy msgid "Edit a property with an external editor." msgstr "Edit a property with an external editor on targets" #: share/completions/svn.fish:58 share/completions/svn.fish:59 #: share/completions/svn.fish:60 #, fuzzy msgid "Print the value of a property on files, dirs, or revisions." msgstr "Print value of a property on files, dirs, or revisions" #: share/completions/svn.fish:61 share/completions/svn.fish:62 #: share/completions/svn.fish:63 #, fuzzy msgid "List all properties on files, dirs, or revisions." msgstr "List all properties on files, dirs, or revisions" #: share/completions/svn.fish:64 share/completions/svn.fish:65 #: share/completions/svn.fish:66 #, fuzzy msgid "Set the value of a property on files, dirs, or revisions." msgstr "Print value of a property on files, dirs, or revisions" #: share/completions/svn.fish:67 #, fuzzy msgid "Remove \\conflicted state on working copy files or directories." msgstr "Remove conflicted state on working copy files or directories" #: share/completions/svn.fish:68 #, fuzzy msgid "Restore pristine working copy file (undo most local edits)." msgstr "Restore pristine working copy file" #: share/completions/svn.fish:69 share/completions/svn.fish:70 #: share/completions/svn.fish:71 #, fuzzy msgid "Print the status of working copy files and directories." msgstr "Print the status of working copy files and directories" #: share/completions/svn.fish:72 share/completions/svn.fish:73 #, fuzzy msgid "Update the working copy to a different URL." msgstr "Update the working copy to a different URL" #: share/completions/svn.fish:74 #, fuzzy msgid "Unlock working copy paths or URLs." msgstr "Unlock working copy paths or URLs" #: share/completions/svn.fish:75 share/completions/svn.fish:76 #, fuzzy msgid "Bring changes from the repository into the working copy." msgstr "Bring changes from the repository into the working copy" #: share/completions/svn.fish:83 share/completions/svn.fish:194 #: share/completions/svn.fish:255 share/completions/svn.fish:271 #: share/completions/svn.fish:287 share/completions/svn.fish:303 #: share/completions/svn.fish:406 share/completions/svn.fish:446 #: share/completions/svn.fish:461 share/completions/svn.fish:723 #: share/completions/svn.fish:738 share/completions/svn.fish:753 #: share/completions/svn.fish:767 share/completions/svn.fish:775 #: share/completions/svn.fish:854 #, fuzzy msgid "Pass contents of file ARG as additional args" msgstr "Pass contents of file as additional args" #: share/completions/svn.fish:84 share/completions/svn.fish:102 #: share/completions/svn.fish:116 share/completions/svn.fish:130 #: share/completions/svn.fish:144 share/completions/svn.fish:155 #: share/completions/svn.fish:166 share/completions/svn.fish:178 #: share/completions/svn.fish:187 share/completions/svn.fish:219 #: share/completions/svn.fish:233 share/completions/svn.fish:247 #: share/completions/svn.fish:263 share/completions/svn.fish:279 #: share/completions/svn.fish:295 share/completions/svn.fish:311 #: share/completions/svn.fish:329 share/completions/svn.fish:347 #: share/completions/svn.fish:359 share/completions/svn.fish:368 #: share/completions/svn.fish:375 share/completions/svn.fish:382 #: share/completions/svn.fish:399 share/completions/svn.fish:413 #: share/completions/svn.fish:426 share/completions/svn.fish:439 #: share/completions/svn.fish:453 share/completions/svn.fish:469 #: share/completions/svn.fish:485 share/completions/svn.fish:499 #: share/completions/svn.fish:514 share/completions/svn.fish:529 #: share/completions/svn.fish:544 share/completions/svn.fish:559 #: share/completions/svn.fish:571 share/completions/svn.fish:583 #: share/completions/svn.fish:595 share/completions/svn.fish:610 #: share/completions/svn.fish:625 share/completions/svn.fish:640 #: share/completions/svn.fish:653 share/completions/svn.fish:666 #: share/completions/svn.fish:679 share/completions/svn.fish:691 #: share/completions/svn.fish:703 share/completions/svn.fish:715 #: share/completions/svn.fish:730 share/completions/svn.fish:745 #: share/completions/svn.fish:760 share/completions/svn.fish:768 #: share/completions/svn.fish:776 share/completions/svn.fish:790 #: share/completions/svn.fish:805 share/completions/svn.fish:820 #: share/completions/svn.fish:834 share/completions/svn.fish:847 #: share/completions/svn.fish:859 share/completions/svn.fish:872 #: share/completions/svn.fish:885 #, fuzzy msgid "Read user configuration files from directory ARG" msgstr "Read user config files from named directory" #: share/completions/svn.fish:98 share/completions/svn.fish:112 #: share/completions/svn.fish:126 share/completions/svn.fish:140 #: share/completions/svn.fish:151 share/completions/svn.fish:162 #: share/completions/svn.fish:174 share/completions/svn.fish:215 #: share/completions/svn.fish:229 share/completions/svn.fish:243 #: share/completions/svn.fish:259 share/completions/svn.fish:275 #: share/completions/svn.fish:291 share/completions/svn.fish:307 #: share/completions/svn.fish:325 share/completions/svn.fish:343 #: share/completions/svn.fish:355 share/completions/svn.fish:395 #: share/completions/svn.fish:409 share/completions/svn.fish:422 #: share/completions/svn.fish:435 share/completions/svn.fish:449 #: share/completions/svn.fish:465 share/completions/svn.fish:481 #: share/completions/svn.fish:495 share/completions/svn.fish:510 #: share/completions/svn.fish:525 share/completions/svn.fish:540 #: share/completions/svn.fish:555 share/completions/svn.fish:567 #: share/completions/svn.fish:579 share/completions/svn.fish:591 #: share/completions/svn.fish:603 share/completions/svn.fish:618 #: share/completions/svn.fish:633 share/completions/svn.fish:649 #: share/completions/svn.fish:662 share/completions/svn.fish:675 #: share/completions/svn.fish:687 share/completions/svn.fish:699 #: share/completions/svn.fish:711 share/completions/svn.fish:725 #: share/completions/svn.fish:740 share/completions/svn.fish:755 #: share/completions/svn.fish:786 share/completions/svn.fish:801 #: share/completions/svn.fish:816 share/completions/svn.fish:830 #: share/completions/svn.fish:843 share/completions/svn.fish:855 #: share/completions/svn.fish:868 share/completions/svn.fish:881 #, fuzzy msgid "Specify a username ARG" msgstr "Specify a username" #: share/completions/svn.fish:99 share/completions/svn.fish:113 #: share/completions/svn.fish:127 share/completions/svn.fish:141 #: share/completions/svn.fish:152 share/completions/svn.fish:163 #: share/completions/svn.fish:175 share/completions/svn.fish:216 #: share/completions/svn.fish:230 share/completions/svn.fish:244 #: share/completions/svn.fish:260 share/completions/svn.fish:276 #: share/completions/svn.fish:292 share/completions/svn.fish:308 #: share/completions/svn.fish:326 share/completions/svn.fish:344 #: share/completions/svn.fish:356 share/completions/svn.fish:396 #: share/completions/svn.fish:410 share/completions/svn.fish:423 #: share/completions/svn.fish:436 share/completions/svn.fish:450 #: share/completions/svn.fish:466 share/completions/svn.fish:482 #: share/completions/svn.fish:496 share/completions/svn.fish:511 #: share/completions/svn.fish:526 share/completions/svn.fish:541 #: share/completions/svn.fish:556 share/completions/svn.fish:568 #: share/completions/svn.fish:580 share/completions/svn.fish:592 #: share/completions/svn.fish:604 share/completions/svn.fish:619 #: share/completions/svn.fish:634 share/completions/svn.fish:650 #: share/completions/svn.fish:663 share/completions/svn.fish:676 #: share/completions/svn.fish:688 share/completions/svn.fish:700 #: share/completions/svn.fish:712 share/completions/svn.fish:726 #: share/completions/svn.fish:741 share/completions/svn.fish:756 #: share/completions/svn.fish:787 share/completions/svn.fish:802 #: share/completions/svn.fish:817 share/completions/svn.fish:831 #: share/completions/svn.fish:844 share/completions/svn.fish:856 #: share/completions/svn.fish:869 share/completions/svn.fish:882 #, fuzzy msgid "Specify a password ARG" msgstr "Specify a password" #: share/completions/svn.fish:186 share/completions/svn.fish:479 #: share/completions/svn.fish:828 share/completions/svn.fish:841 #: share/completions/svn.fish:867 share/completions/svn.fish:880 #, fuzzy msgid "Use ARG as merge command" msgstr "Specify merge command" #: share/completions/svn.fish:213 share/completions/svn.fish:227 #: share/completions/svn.fish:241 share/completions/svn.fish:257 #: share/completions/svn.fish:273 share/completions/svn.fish:289 #: share/completions/svn.fish:305 share/completions/svn.fish:392 #: share/completions/svn.fish:493 share/completions/svn.fish:508 #: share/completions/svn.fish:523 share/completions/svn.fish:538 #: share/completions/svn.fish:553 share/completions/svn.fish:608 #: share/completions/svn.fish:623 share/completions/svn.fish:638 #, fuzzy msgid "Use ARG as external editor" msgstr "Specify external editor" #: share/completions/svn.fish:214 share/completions/svn.fish:228 #: share/completions/svn.fish:242 share/completions/svn.fish:258 #: share/completions/svn.fish:274 share/completions/svn.fish:290 #: share/completions/svn.fish:306 share/completions/svn.fish:393 #: share/completions/svn.fish:448 share/completions/svn.fish:494 #: share/completions/svn.fish:509 share/completions/svn.fish:524 #: share/completions/svn.fish:539 share/completions/svn.fish:554 #: share/completions/svn.fish:607 share/completions/svn.fish:622 #: share/completions/svn.fish:637 share/completions/svn.fish:722 #: share/completions/svn.fish:737 share/completions/svn.fish:752 msgid "Treat value as being in charset encoding ARG" msgstr "" #: share/completions/svn.fish:318 share/completions/svn.fish:336 msgid "Use ARG as the older target" msgstr "" #: share/completions/svn.fish:319 share/completions/svn.fish:337 msgid "Use ARG as the newer target" msgstr "" #: share/completions/svn.fish:320 share/completions/svn.fish:338 #, fuzzy msgid "Use ARG as diff command" msgstr "Undo an edit command" #: share/completions/svn.fish:360 msgid "Use a different EOL marker than the standard" msgstr "" #: share/completions/svn.fish:470 msgid "Maximum number of log entries" msgstr "Maximum number of log entries" #: share/completions/sylpheed.fish:8 msgid "Open composition window with address" msgstr "" #: share/completions/sylpheed.fish:9 msgid "Open composition window with attached files" msgstr "" #: share/completions/sylpheed.fish:10 #, fuzzy msgid "Receive new messages" msgstr "Replace a log message" #: share/completions/sylpheed.fish:11 msgid "Receive new messages of all accounts" msgstr "" #: share/completions/sylpheed.fish:12 msgid "Send all queued messages" msgstr "" #: share/completions/sylpheed.fish:13 msgid "Show the total number of messages for folder" msgstr "" #: share/completions/sylpheed.fish:14 msgid "Show the total number of messages for each folder" msgstr "" #: share/completions/sylpheed.fish:15 #, fuzzy msgid "Specify directory with configuration files" msgstr "Specify a configuration file" #: share/completions/tar.fish:19 share/functions/cd.fish:5 msgid "Change directory" msgstr "Change directory" #: share/completions/tar.fish:21 msgid "Archive file" msgstr "Archive file" #: share/completions/tar.fish:31 msgid "Starting file in archive" msgstr "Starting file in archive" #: share/completions/tar.fish:33 msgid "Tape length" msgstr "Tape length" #: share/completions/tar.fish:36 msgid "Only store newer files" msgstr "Only store newer files" #: share/completions/tar.fish:50 msgid "Extract file from file" msgstr "Extract file from file" #: share/completions/tar.fish:54 msgid "Set volume name" msgstr "Set volume name" #: share/completions/tar.fish:59 msgid "Exclude file" msgstr "Exclude file" #: share/completions/tar.fish:60 msgid "Exclude files listed in specified file" msgstr "Exclude files listed in specified file" #: share/completions/tar.fish:65 msgid "Filter through specified program" msgstr "Filter through specified program" #: share/completions/telnet.fish:9 share/completions/telnet.fish:14 msgid "Specifies an 8-bit data path" msgstr "Specifies an 8-bit data path" #: share/completions/telnet.fish:10 msgid "Do not try to negotiate TELNET BINARY option" msgstr "Do not try to negotiate TELNET BINARY option" #: share/completions/telnet.fish:11 msgid "Stops any character from being recognized as an escape character" msgstr "Stops any character from being recognized as an escape character" #: share/completions/telnet.fish:12 msgid "Use local Kerberos authentication, if possible" msgstr "Use local Kerberos authentication, if possible" #: share/completions/telnet.fish:13 msgid "Specifies no automatic login to remote system" msgstr "Specifies no automatic login to remote system" #: share/completions/telnet.fish:15 msgid "Attempt automatic login" msgstr "Attempt automatic login" #: share/completions/telnet.fish:16 msgid "Disables reading user's .telnetrc" msgstr "Disables reading user's .telnetrc" #: share/completions/telnet.fish:17 msgid "Sets debug mode" msgstr "Sets debug mode" #: share/completions/telnet.fish:18 msgid "Sets IP TOS" msgstr "Sets IP TOS" #: share/completions/telnet.fish:19 msgid "Disables specified type of authentication" msgstr "Disables specified type of authentication" #: share/completions/telnet.fish:20 msgid "User login" msgstr "User login" #: share/completions/telnet.fish:21 msgid "Log to tracefile" msgstr "Log to tracefile" #: share/completions/telnet.fish:22 msgid "Turn on encryption" msgstr "Turn on encryption" #: share/completions/telnet.fish:23 msgid "User interface similar to rlogin" msgstr "User interface similar to rlogin" #: share/completions/telnet.fish:24 msgid "Use Kerberos realm for authentication" msgstr "Use Kerberos realm for authentication" #: share/completions/totem.fish:18 msgid "Tell any running totem instance: Add to playlist" msgstr "" #: share/completions/totem.fish:19 msgid "Tell any running totem instance: Play from playlist" msgstr "" #: share/completions/touch.fish:2 msgid "Set date back" msgstr "Set date back" #: share/completions/touch.fish:4 msgid "Set date" msgstr "Set date" #: share/completions/touch.fish:5 msgid "Set date forward" msgstr "Set date forward" #: share/completions/touch.fish:9 msgid "Set time" msgstr "Set time" #: share/completions/unrar.fish:5 #, fuzzy msgid "Extract files to current directory" msgstr "Read files under each directory" #: share/completions/unrar.fish:6 msgid "List archive" msgstr "List archive" #: share/completions/unrar.fish:7 #, fuzzy msgid "List archive (technical)" msgstr "List archive" #: share/completions/unrar.fish:8 #, fuzzy msgid "List archive (bare)" msgstr "List archive" #: share/completions/unrar.fish:9 #, fuzzy msgid "Print file to stdout" msgstr "Pipe files to stdout" #: share/completions/unrar.fish:10 #, fuzzy msgid "Test archive files" msgstr "Archive file" #: share/completions/unrar.fish:11 #, fuzzy msgid "Verbosely list archive" msgstr "Verify archive" #: share/completions/unrar.fish:12 msgid "Verbosely list archive (technical)" msgstr "" #: share/completions/unrar.fish:13 msgid "Verbosely list archive (bare)" msgstr "" #: share/completions/unrar.fish:14 #, fuzzy msgid "Extract files with full path" msgstr "Extract file from file" #: share/completions/update-eix-remote.fish:16 msgid "" "Fetch the eix-caches of some layman overlays into a temporary file resp. " "into FILE and add them to the eix database" msgstr "" #: share/completions/update-eix-remote.fish:16 msgid "Only fetch the overlays into FILE" msgstr "" #: share/completions/update-eix-remote.fish:16 msgid "Only add the overlays from FILE to the eix database" msgstr "" #: share/completions/update-eix-remote.fish:16 msgid "Remove all temporarily added virtual overlays from the eix database" msgstr "" #: share/completions/valgrind.fish:12 msgid "Skin" msgstr "Skin" #: share/completions/valgrind.fish:71 msgid "The number of bytes of heap overhead per allocation" msgstr "The number of bytes of heap overhead per allocation" #: share/completions/valgrind.fish:72 msgid "Profile stack usage" msgstr "Profile stack usage" #: share/completions/valgrind.fish:73 msgid "Depth of call chain" msgstr "Depth of call chain" #: share/completions/valgrind.fish:74 msgid "Profiling output format" msgstr "Profiling output format" #: share/completions/w.fish:6 msgid "Username" msgstr "Username" #: share/completions/wajig.fish:1 #, fuzzy msgid "Test if wajig has yet to be given the subcommand" msgstr "Test if apt has yet to be given the subcommand" #: share/completions/wajig.fish:10 #, fuzzy msgid "Test if wajig command should have packages as potential completion" msgstr "Test if apt command should have packages as potential completion" #: share/completions/wajig.fish:97 #, fuzzy msgid "Download package and any packages it depends on" msgstr "List packages on which this package depends" #: share/completions/wajig.fish:98 msgid "Install package and associated recommended packages" msgstr "" #: share/completions/wajig.fish:99 msgid "Reconfigure the named installed packages or run gkdebconf" msgstr "" #: share/completions/wajig.fish:100 #, fuzzy msgid "Reinstall each of the named packages" msgstr "Install one or more packages" #: share/completions/wajig.fish:101 msgid "Reload daemon configs, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:102 #, fuzzy msgid "Remove one or more packages (see also purge)" msgstr "Remove one or more packages" #: share/completions/wajig.fish:103 msgid "Remove package and its dependees not required by others" msgstr "" #: share/completions/wajig.fish:104 msgid "Remove orphaned libraries (not required by installed packages)" msgstr "" #: share/completions/wajig.fish:105 #, fuzzy msgid "Generate a .deb file for an installed package" msgstr "Rebuild and install an installed package" #: share/completions/wajig.fish:106 msgid "Initialise or reset the JIG archive files" msgstr "" #: share/completions/wajig.fish:107 msgid "Stop then start a daemon, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:108 #, fuzzy msgid "Install a RedHat .rpm package" msgstr "Install new package" #: share/completions/wajig.fish:109 msgid "Convert a RedHat .rpm file to a Debian .deb file" msgstr "" #: share/completions/wajig.fish:110 #, fuzzy msgid "Search for packages containing listed words" msgstr "Search package containing pattern" #: share/completions/wajig.fish:111 msgid "Find local Debian archives suitable for sources.list" msgstr "" #: share/completions/wajig.fish:112 msgid "Configure the sources.list file which locates Debian archives" msgstr "" #: share/completions/wajig.fish:113 msgid "Provide a detailed description of package [same as detail]" msgstr "" #: share/completions/wajig.fish:114 msgid "Trace the steps that a dist-upgrade would perform" msgstr "" #: share/completions/wajig.fish:115 msgid "Trace the steps that an install would perform" msgstr "" #: share/completions/wajig.fish:116 msgid "Trace the steps that a remove would perform" msgstr "" #: share/completions/wajig.fish:117 msgid "Trace the steps that an upgrade would perform" msgstr "" #: share/completions/wajig.fish:118 share/completions/wajig.fish:119 msgid "Print out the size (in K) of all, or listed, installed packages" msgstr "" #: share/completions/wajig.fish:120 msgid "Generates list of package=version for all installed packages" msgstr "" #: share/completions/wajig.fish:121 #, fuzzy msgid "Retrieve and unpack sources for the named packages" msgstr "List reverse dependencies for the package" #: share/completions/wajig.fish:122 msgid "Start a daemon, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:123 #, fuzzy msgid "Show the version and available version of packages" msgstr "Show full versions for packages" #: share/completions/wajig.fish:124 share/completions/wajig.fish:125 msgid "Show the version and available version of matching packages" msgstr "" #: share/completions/wajig.fish:126 msgid "Stop a daemon, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:127 msgid "Install package and associated suggested packages" msgstr "" #: share/completions/wajig.fish:128 msgid "Run the Gnome task selector to install groups of packages" msgstr "" #: share/completions/wajig.fish:129 #, fuzzy msgid "List packages with newer versions available for upgrading" msgstr "Updates packages to the best version available" #: share/completions/wajig.fish:130 msgid "Remove listed packages from hold so they are again upgraded" msgstr "" #: share/completions/wajig.fish:131 msgid "Search for an unofficial Debian package at apt-get.org" msgstr "" #: share/completions/wajig.fish:132 #, fuzzy msgid "Update the list of down-loadable packages" msgstr "Update list of source packages" #: share/completions/wajig.fish:133 msgid "Update default alternative for things like x-window-manager" msgstr "" #: share/completions/wajig.fish:134 msgid "Updates the local list of PCI ids from the internet master list" msgstr "" #: share/completions/wajig.fish:135 msgid "Updates the local list of USB ids from the internet master list" msgstr "" #: share/completions/wajig.fish:136 msgid "Upgrade all of the installed packages or just those listed" msgstr "" #: share/completions/wajig.fish:137 #, fuzzy msgid "List version and distribution of (all) packages." msgstr "Don't verify any attributes of package files" #: share/completions/wajig.fish:138 #, fuzzy msgid "A synonym for describe" msgstr "Synonym for -i" #: share/completions/wajig.fish:139 msgid "Find the package that supplies the given command or file" msgstr "" #: share/completions/wpa_cli.fish:3 msgid "get current WPA/EAPOL/EAP status" msgstr "" #: share/completions/wpa_cli.fish:4 msgid "get MIB variables (dot1x, dot11)" msgstr "" #: share/completions/wpa_cli.fish:5 msgid "show this usage help" msgstr "" #: share/completions/wpa_cli.fish:6 #, fuzzy msgid "show interfaces/select interface" msgstr "Select interface" #: share/completions/wpa_cli.fish:7 #, fuzzy msgid "change debug level" msgstr "Set debug level" #: share/completions/wpa_cli.fish:8 msgid "show full wpa_cli license" msgstr "" #: share/completions/wpa_cli.fish:9 msgid "IEEE 802.1X EAPOL state machine logoff" msgstr "" #: share/completions/wpa_cli.fish:10 msgid "IEEE 802.1X EAPOL state machine logon" msgstr "" #: share/completions/wpa_cli.fish:11 #, fuzzy msgid "set/list variables" msgstr "Erase variable" #: share/completions/wpa_cli.fish:12 msgid "show PMKSA cache" msgstr "" #: share/completions/wpa_cli.fish:13 #, fuzzy msgid "force reassociation" msgstr "Force name/rev association" #: share/completions/wpa_cli.fish:14 msgid "force wpa_supplicant to re-read its config file" msgstr "" #: share/completions/wpa_cli.fish:15 #, fuzzy msgid "force preauthentication" msgstr "Force pseudo-tty allocation" #: share/completions/wpa_cli.fish:16 msgid "configure identity for an SSID" msgstr "" #: share/completions/wpa_cli.fish:17 msgid "configure password for an SSID" msgstr "" #: share/completions/wpa_cli.fish:18 msgid "change password for an SSID" msgstr "" #: share/completions/wpa_cli.fish:19 #, fuzzy msgid "configure pin for an SSID" msgstr "Configure for building on BUILD" #: share/completions/wpa_cli.fish:20 msgid "configure one-time-password for an SSID" msgstr "" #: share/completions/wpa_cli.fish:21 msgid "configure private key passphrase for an SSID" msgstr "" #: share/completions/wpa_cli.fish:22 msgid "set preferred BSSID for an SSID" msgstr "" #: share/completions/wpa_cli.fish:23 msgid "list configured networks" msgstr "" #: share/completions/wpa_cli.fish:24 msgid "select a network (disable others)" msgstr "" #: share/completions/wpa_cli.fish:25 #, fuzzy msgid "enable a network" msgstr "Enable repository" #: share/completions/wpa_cli.fish:26 #, fuzzy msgid "disable a network" msgstr "Disable repository" #: share/completions/wpa_cli.fish:27 #, fuzzy msgid "add a network" msgstr "Add a new key" #: share/completions/wpa_cli.fish:28 #, fuzzy msgid "remove a network" msgstr "Remove a key" #: share/completions/wpa_cli.fish:29 msgid "set/list network variables" msgstr "" #: share/completions/wpa_cli.fish:30 #, fuzzy msgid "get network variables" msgstr "Set CVS user variable" #: share/completions/wpa_cli.fish:31 #, fuzzy msgid "save the current configuration" msgstr "Reload service configuration" #: share/completions/wpa_cli.fish:32 msgid "disconnect and wait for reassociate command before connecting" msgstr "" #: share/completions/wpa_cli.fish:33 msgid "request new BSS scan" msgstr "" #: share/completions/wpa_cli.fish:34 msgid "get latest scan results" msgstr "" #: share/completions/wpa_cli.fish:35 #, fuzzy msgid "get capabilies" msgstr "Set playlist" #: share/completions/wpa_cli.fish:36 msgid "request STAKey negotiation with " msgstr "" #: share/completions/wpa_cli.fish:37 msgid "set ap_scan parameter" msgstr "" #: share/completions/wpa_cli.fish:38 msgid "request STK negotiation with " msgstr "" #: share/completions/wpa_cli.fish:39 msgid "terminate wpa_supplicant" msgstr "" #: share/completions/xprop.fish:4 msgid "Select window by id" msgstr "Select window by id" #: share/completions/xprop.fish:6 msgid "Display font properties" msgstr "Display font properties" #: share/completions/xprop.fish:9 msgid "Maximum display length" msgstr "Maximum display length" #: share/completions/xprop.fish:11 msgid "Set format file" msgstr "Set format file" #: share/completions/xsel.fish:12 msgid "X server display" msgstr "X server display" #: share/completions/xsel.fish:14 msgid "Error log" msgstr "Error log" #: share/completions/xterm.fish:101 msgid "Run program in xterm" msgstr "" #: share/completions/xterm.fish:103 msgid "Blinking cursor will be off for that many milliseconds" msgstr "" #: share/completions/xterm.fish:104 msgid "Blinking cursor will be on for that many milliseconds" msgstr "" #: share/completions/xterm.fish:105 msgid "Override xterm resource class" msgstr "" #: share/completions/xterm.fish:106 msgid "Color for the text cursor" msgstr "" #: share/completions/xterm.fish:107 #, fuzzy msgid "xterm encoding" msgstr "Force encoding" #: share/completions/xterm.fish:108 msgid "Bold font" msgstr "" #: share/completions/xterm.fish:109 msgid "FreeType font pattern" msgstr "" #: share/completions/xterm.fish:110 msgid "FreeType double-width font pattern" msgstr "" #: share/completions/xterm.fish:111 #, fuzzy msgid "Font for active icons" msgstr "Force interactive mode" #: share/completions/xterm.fish:112 msgid "Font size for FreeType font" msgstr "" #: share/completions/xterm.fish:113 msgid "Font for displaying wide text" msgstr "" #: share/completions/xterm.fish:114 msgid "Font for displaying bold wide text" msgstr "" #: share/completions/xterm.fish:115 msgid "Font for the preedit string in \"OverTheSpot\"" msgstr "" #: share/completions/xterm.fish:116 msgid "Color for highlighted text" msgstr "" #: share/completions/xterm.fish:117 msgid "Embed xterm into window" msgstr "" #: share/completions/xterm.fish:118 #, fuzzy msgid "Set keyboard type" msgstr "Specify record type" #: share/completions/xterm.fish:119 msgid "File name for the encoding converter" msgstr "" #: share/completions/xterm.fish:120 #, fuzzy msgid "Log filename" msgstr "Log to file" #: share/completions/xterm.fish:121 msgid "Maximum time in milliseconds between multi-click selections" msgstr "" #: share/completions/xterm.fish:122 msgid "Color for the pointer cursor" msgstr "" #: share/completions/xterm.fish:123 msgid "Distance from the right end for ringing the margin bell" msgstr "" #: share/completions/xterm.fish:124 #, fuzzy msgid "Number of scrolled off lines" msgstr "Number all lines" #: share/completions/xterm.fish:125 #, fuzzy msgid "Terminal identification" msgstr "Print all information" #: share/completions/xterm.fish:126 #, sh-format msgid "Terminal name for $TERM" msgstr "" #: share/completions/xterm.fish:127 #, fuzzy msgid "zIconBeep percentage" msgstr "Prompt with percentage" #: share/completions/xterm.fish:129 #, fuzzy msgid "Size of the inner border" msgstr "Show changes in reverse order" #: share/completions/yum.fish:53 #, fuzzy msgid "Delete cached package files" msgstr "Delete obsolete package files" #: share/completions/yum.fish:54 #, fuzzy msgid "Delete cached header files" msgstr "Delete obsolete package files" #: share/completions/yum.fish:55 #, fuzzy msgid "Delete all cache contents" msgstr "Delete the logfile when done" #: share/completions/zip.fish:19 msgid "Exclude the following names" msgstr "Exclude the following names" #: share/completions/zip.fish:20 msgid "Include only the following names" msgstr "Include only the following names" #: share/completions/zip.fish:30 msgid "Don't compress files with these suffixes" msgstr "Don't compress files with these suffixes" #: share/functions/N_.fish:3 msgid "No-op" msgstr "" #: share/functions/_.fish:8 share/functions/_.fish:12 #, fuzzy msgid "Alias for the gettext command" msgstr "Help for the specified command" #: share/functions/_.fish:9 seq:17 msgid "fish" msgstr "fish" #: share/functions/__fish_complete_bittorrent.fish:9 msgid "IP to report to the tracker" msgstr "IP to report to the tracker" #: share/functions/__fish_complete_bittorrent.fish:10 msgid "Minimum port to listen to" msgstr "Minimum port to listen to" #: share/functions/__fish_complete_bittorrent.fish:11 msgid "Maximum port to listen to" msgstr "Maximum port to listen to" #: share/functions/__fish_complete_command.fish:2 msgid "Complete using all available commands" msgstr "" #: share/functions/__fish_complete_groups.fish:2 msgid "Print a list of local groups, with group members as the description" msgstr "" #: share/functions/__fish_complete_ls.fish:16 msgid "Show hidden" msgstr "Show hidden" #: share/functions/__fish_complete_ls.fish:17 msgid "Show hidden except . and .." msgstr "Show hidden except . and .." #: share/functions/__fish_complete_ls.fish:18 #: share/functions/__fish_complete_ls.fish:27 msgid "Append filetype indicator" msgstr "Append filetype indicator" #: share/functions/__fish_complete_ls.fish:19 #: share/functions/__fish_complete_ls.fish:20 msgid "Follow symlinks" msgstr "Follow symlinks" #: share/functions/__fish_complete_ls.fish:21 msgid "List subdirectory recursively" msgstr "List subdirectory recursively" #: share/functions/__fish_complete_ls.fish:22 #: share/functions/__fish_complete_ls.fish:102 msgid "Octal escapes for non graphic characters" msgstr "Octal escapes for non graphic characters" #: share/functions/__fish_complete_ls.fish:23 msgid "List directories, not their content" msgstr "List directories, not their content" #: share/functions/__fish_complete_ls.fish:24 msgid "Human readable sizes" msgstr "Human readable sizes" #: share/functions/__fish_complete_ls.fish:25 msgid "Print inode number of files" msgstr "Print inode number of files" #: share/functions/__fish_complete_ls.fish:26 msgid "Long format, numeric IDs" msgstr "Long format, numeric IDs" #: share/functions/__fish_complete_ls.fish:28 msgid "Replace non-graphic characters with '?'" msgstr "Replace non-graphic characters with '?'" #: share/functions/__fish_complete_ls.fish:29 msgid "Reverse sort order" msgstr "Reverse sort order" #: share/functions/__fish_complete_ls.fish:30 msgid "Print size of files" msgstr "Print size of files" #: share/functions/__fish_complete_ls.fish:32 msgid "List by columns" msgstr "List by columns" #: share/functions/__fish_complete_ls.fish:33 msgid "Sort by size" msgstr "Sort by size" #: share/functions/__fish_complete_ls.fish:34 msgid "Show and sort by ctime" msgstr "Show and sort by ctime" #: share/functions/__fish_complete_ls.fish:35 msgid "Don't sort" msgstr "Don't sort" #: share/functions/__fish_complete_ls.fish:36 msgid "Long format without owner" msgstr "Long format without owner" #: share/functions/__fish_complete_ls.fish:37 msgid "Set blocksize to 1kB" msgstr "Set blocksize to 1kB" #: share/functions/__fish_complete_ls.fish:38 msgid "Long format" msgstr "Long format" #: share/functions/__fish_complete_ls.fish:39 msgid "Comma separated format" msgstr "Comma separated format" #: share/functions/__fish_complete_ls.fish:40 msgid "Sort by modification time" msgstr "Sort by modification time" #: share/functions/__fish_complete_ls.fish:41 msgid "Show access time" msgstr "Show access time" #: share/functions/__fish_complete_ls.fish:42 msgid "List entries by lines" msgstr "List entries by lines" #: share/functions/__fish_complete_ls.fish:43 msgid "List one file per line" msgstr "List one file per line" #: share/functions/__fish_complete_ls.fish:49 #, fuzzy msgid "Do not list implied entries matching specified shell pattern" msgstr "Skip entries matching pattern" #: share/functions/__fish_complete_ls.fish:50 #, fuzzy msgid "Display security context" msgstr "Display version and exit" #: share/functions/__fish_complete_ls.fish:51 msgid "Display security context so it fits on most displays" msgstr "" #: share/functions/__fish_complete_ls.fish:52 msgid "Display only security context and file name" msgstr "" #: share/functions/__fish_complete_ls.fish:54 msgid "Print author" msgstr "Print author" #: share/functions/__fish_complete_ls.fish:56 msgid "Ignore files ending with ~" msgstr "Ignore files ending with ~" #: share/functions/__fish_complete_ls.fish:58 msgid "Generate dired output" msgstr "Generate dired output" #: share/functions/__fish_complete_ls.fish:60 msgid "Long format, full-iso time" msgstr "Long format, full-iso time" #: share/functions/__fish_complete_ls.fish:61 msgid "Don't print group information" msgstr "Don't print group information" #: share/functions/__fish_complete_ls.fish:62 msgid "Human readable sizes, powers of 1000" msgstr "Human readable sizes, powers of 1000" #: share/functions/__fish_complete_ls.fish:66 #: share/functions/__fish_complete_ls.fish:110 msgid "Print raw entry names" msgstr "Print raw entry names" #: share/functions/__fish_complete_ls.fish:67 msgid "Long format without groups" msgstr "Long format without groups" #: share/functions/__fish_complete_ls.fish:68 msgid "Non graphic as-is" msgstr "Non graphic as-is" #: share/functions/__fish_complete_ls.fish:69 msgid "Enclose entry in quotes" msgstr "Enclose entry in quotes" #: share/functions/__fish_complete_ls.fish:91 msgid "Do not sort" msgstr "Do not sort" #: share/functions/__fish_complete_ls.fish:92 msgid "Sort by version" msgstr "Sort by version" #: share/functions/__fish_complete_ls.fish:94 msgid "Sort by extension" msgstr "Sort by extension" #: share/functions/__fish_complete_ls.fish:103 msgid "Use colors" msgstr "Use colors" #: share/functions/__fish_complete_ls.fish:104 msgid "Prevent -A from being automatically set for root" msgstr "Prevent -A from being automatically set for root" #: share/functions/__fish_complete_ls.fish:105 msgid "Don't follow symlinks" msgstr "Don't follow symlinks" #: share/functions/__fish_complete_ls.fish:106 msgid "Show modification time" msgstr "Show modification time" #: share/functions/__fish_complete_ls.fish:107 msgid "Show whiteouts when scanning directories" msgstr "Show whiteouts when scanning directories" #: share/functions/__fish_complete_ls.fish:108 msgid "Display each file's MAC label" msgstr "Display each file's MAC label" #: share/functions/__fish_complete_ls.fish:109 msgid "Include the file flags in a long (-l) output" msgstr "Include the file flags in a long (-l) output" #: share/functions/__fish_complete_ssh.fish:4 msgid "Protocoll version 1 only" msgstr "Protocoll version 1 only" #: share/functions/__fish_complete_ssh.fish:5 msgid "Protocoll version 2 only" msgstr "Protocoll version 2 only" #: share/functions/__fish_complete_ssh.fish:6 msgid "IPv4 addresses only" msgstr "IPv4 addresses only" #: share/functions/__fish_complete_ssh.fish:7 msgid "IPv6 addresses only" msgstr "IPv6 addresses only" #: share/functions/__fish_complete_ssh.fish:8 msgid "Compress all data" msgstr "Compress all data" #: share/functions/__fish_complete_ssh.fish:9 msgid "Encryption algorithm" msgstr "Encryption algorithm" #: share/functions/__fish_complete_ssh.fish:10 msgid "Configuration file" msgstr "Configuration file" #: share/functions/__fish_complete_ssh.fish:11 msgid "Identity file" msgstr "Identity file" #: share/functions/__fish_complete_ssh.fish:12 msgid "Options" msgstr "Options" #: share/functions/__fish_complete_tar.fish:14 #: share/functions/__fish_complete_tar.fish:21 #: share/functions/__fish_complete_tar.fish:28 #: share/functions/__fish_complete_unrar.fish:14 #, fuzzy msgid "%s\\tArchived file\\n" msgstr "Archive file" #: share/functions/__fish_complete_users.fish:2 msgid "Print a list of local users, with the real user name as a description" msgstr "" #: share/functions/__fish_complete_vi.fish:45 #, fuzzy msgid "Start in Arabic mode" msgstr "Start interface" #: share/functions/__fish_complete_vi.fish:46 #, fuzzy msgid "Start in binary mode" msgstr "Standard mode" #: share/functions/__fish_complete_vi.fish:47 msgid "Behave mostly like vi" msgstr "" #: share/functions/__fish_complete_vi.fish:48 #, fuzzy msgid "Start in diff mode" msgstr "Start in folder index" #: share/functions/__fish_complete_vi.fish:49 #, fuzzy msgid "Debugging mode" msgstr "Debug mode" #: share/functions/__fish_complete_vi.fish:50 #, fuzzy msgid "Start in Ex mode" msgstr "Start in folder index" #: share/functions/__fish_complete_vi.fish:51 #, fuzzy msgid "Start in improved Ex mode" msgstr "Start in folder index" #: share/functions/__fish_complete_vi.fish:52 #: share/functions/__fish_complete_vi.fish:75 #, fuzzy msgid "Start in foreground mode" msgstr "Start in folder index" #: share/functions/__fish_complete_vi.fish:53 #, fuzzy msgid "Start in Farsi mode" msgstr "Standard mode" #: share/functions/__fish_complete_vi.fish:54 #, fuzzy msgid "Start in GUI mode" msgstr "Start in folder index" #: share/functions/__fish_complete_vi.fish:55 #: share/functions/__fish_complete_vi.fish:77 #, fuzzy msgid "Print help message and exit" msgstr "Load the media and exit" #: share/functions/__fish_complete_vi.fish:56 #, fuzzy msgid "Start in Hebrew mode" msgstr "Start in folder index" #: share/functions/__fish_complete_vi.fish:57 msgid "List swap files" msgstr "" #: share/functions/__fish_complete_vi.fish:58 #, fuzzy msgid "Start in lisp mode" msgstr "Start in folder index" #: share/functions/__fish_complete_vi.fish:59 #, fuzzy msgid "Disable file modification" msgstr "Don't trust the file modification times" #: share/functions/__fish_complete_vi.fish:60 #, fuzzy msgid "Disallow file modification" msgstr "Show last modification only" #: share/functions/__fish_complete_vi.fish:61 msgid "Reset compatibility mode" msgstr "" #: share/functions/__fish_complete_vi.fish:62 msgid "Don\\t" msgstr "" #: share/functions/__fish_complete_vi.fish:70 #, fuzzy msgid "Start in easy mode" msgstr "Start interface" #: share/functions/__fish_complete_vi.fish:71 #, fuzzy msgid "Start in restricted mode" msgstr "Restricted mode" #: share/functions/__fish_complete_vi.fish:73 msgid "Become an editor server for NetBeans" msgstr "" #: share/functions/__fish_complete_vi.fish:76 msgid "Echo the Window ID on stdout (GTK GUI only)" msgstr "" #: share/functions/__fish_complete_vi.fish:78 #, fuzzy msgid "Do not expand wildcards" msgstr "Do not expand pattern" #: share/functions/__fish_complete_vi.fish:79 msgid "Skip loading plugins" msgstr "" #: share/functions/__fish_complete_vi.fish:80 #: share/functions/__fish_complete_vi.fish:83 #: share/functions/__fish_complete_vi.fish:84 #: share/functions/__fish_complete_vi.fish:85 #, fuzzy msgid "Edit files on Vim server" msgstr "Edit files in place" #: share/functions/__fish_complete_vi.fish:81 #, fuzzy msgid "Evaluate expr on Vim server" msgstr "Evaluate expression" #: share/functions/__fish_complete_vi.fish:82 #, fuzzy msgid "Send keys to Vim server" msgstr "Send mail to user" #: share/functions/__fish_complete_vi.fish:86 msgid "List all Vim servers that can be found" msgstr "" #: share/functions/__fish_complete_vi.fish:87 #, fuzzy msgid "Set server name" msgstr "Service name" #: share/functions/__fish_complete_vi.fish:88 #, fuzzy msgid "Print version information and exit" msgstr "Ignore all version information" #: share/functions/__fish_complete_vi.fish:99 msgid "Suppress all interactive user feedback" msgstr "" #: share/functions/__fish_complete_vi.fish:100 #: share/functions/__fish_complete_vi.fish:107 msgid "Encrypt/decrypt text" msgstr "" #: share/functions/__fish_complete_vi.fish:101 msgid "Set up for editing LISP programs" msgstr "" #: share/functions/__fish_complete_vi.fish:102 msgid "List saved file names after crash" msgstr "" #: share/functions/__fish_complete_vi.fish:103 #, fuzzy msgid "Readonly mode" msgstr "Read only" #: share/functions/__fish_complete_vi.fish:104 msgid "Use linear search for tags if tag file not sorted" msgstr "" #: share/functions/__fish_complete_vi.fish:105 msgid "Start in display editing state" msgstr "" #: share/functions/__fish_config_interactive.fish:65 #, sh-format msgid "" "\\nWARNING\\n\\nThe location for fish configuration files has changed to %s." "\\nYour old files have been moved to this location.\\nYou can change to a " "different location by changing the value of the variable $XDG_CONFIG_HOME.\\n" "\\n" msgstr "" #: share/functions/__fish_config_interactive.fish:81 #, fuzzy msgid "Welcome to fish, the friendly interactive shell" msgstr "Welcome to fish, the friendly interactive shell\\n" #: share/functions/__fish_config_interactive.fish:82 #, fuzzy msgid "Type %shelp%s for instructions on how to use fish" msgstr "Type %shelp%s for instructions on how to use fish\\n" #: share/functions/__fish_config_interactive.fish:98 msgid "Commands to execute when fish exits" msgstr "Commands to execute when fish exits" #: share/functions/__fish_config_interactive.fish:99 msgid "Good bye\\n" msgstr "Good bye\\n" #: share/functions/__fish_config_interactive.fish:163 msgid "Event handler, repaints the prompt when fish_color_cwd changes" msgstr "Event handler, repaints the prompt when fish_color_cwd changes" #: share/functions/__fish_config_interactive.fish:170 #, fuzzy msgid "Event handler, repaints the prompt when fish_color_cwd_root changes" msgstr "Event handler, repaints the prompt when fish_color_cwd changes" #: share/functions/__fish_config_interactive.fish:182 msgid "Start service" msgstr "Start service" #: share/functions/__fish_config_interactive.fish:183 msgid "Stop service" msgstr "Stop service" #: share/functions/__fish_config_interactive.fish:184 msgid "Print service status" msgstr "Print service status" #: share/functions/__fish_config_interactive.fish:185 msgid "Stop and then start service" msgstr "Stop and then start service" #: share/functions/__fish_config_interactive.fish:186 msgid "Reload service configuration" msgstr "Reload service configuration" #: share/functions/__fish_move_last.fish:9 msgid "Hit end of history...\\n" msgstr "Hit end of history...\\n" #: share/functions/__fish_print_addresses.fish:1 #, fuzzy msgid "Print a list of known network addresses" msgstr "Print a list of running screen sessions" #: share/functions/__fish_print_help.fish:2 #, fuzzy msgid "Print help message for the specified fish function or builtin" msgstr "Print all completions for the specified commandline" #: share/functions/__fish_print_interfaces.fish:1 #, fuzzy msgid "Print a list of known network interfaces" msgstr "Print a list of all accepted color names" #: share/functions/__fish_print_users.fish:2 #, fuzzy msgid "Print a list of local users" msgstr "Print a list of all accepted color names" #: share/functions/__fish_test_arg.fish:2 msgid "Test if the token under the cursor matches the specified wildcard" msgstr "" #: share/functions/alias.fish:2 msgid "" "Legacy function for creating shellscript functions using an alias-like syntax" msgstr "" #: share/functions/alias.fish:26 #, fuzzy msgid "%s: Expected one or two arguments, got %d\\n" msgstr "%s: Expected 1, 2 or 3 arguments, got %d\\n" #: share/functions/dirh.fish:2 msgid "Print the current directory history (the back- and fwd- lists)" msgstr "Print the current directory history (the back- and fwd- lists)" #: share/functions/dirs.fish:1 msgid "Print directory stack" msgstr "Print directory stack" #: share/functions/fish_prompt.fish:5 msgid "Write out the prompt" msgstr "Write out the prompt" #: share/functions/funced.fish:2 #, fuzzy msgid "Edit function definition" msgstr "function definition block" #: share/functions/funced.fish:11 share/functions/nextd.fish:21 #: share/functions/prevd.fish:21 share/functions/vared.fish:16 msgid "%s: Unknown option %s\\n" msgstr "%s: Unknown option %s\\n" #: share/functions/funced.fish:38 #, fuzzy msgid "" "%s: Expected exactly one argument, got %s.\\n\\nSynopsis:\\n\\t%sfunced%s " "FUNCTION\\n" msgstr "" "%s: Expected exactly one argument, got %s.\\n\\nSynopsis:\\n\\t%svared%s " "VARIABLE\\n" #: share/functions/funcsave.fish:2 msgid "Save the current definition of all specified functions to file" msgstr "" #: share/functions/funcsave.fish:24 #, fuzzy msgid "%s: Could not create configuration directory\\n" msgstr "%ls: Could not find home directory\n" #: share/functions/funcsave.fish:35 #, fuzzy msgid "%s: Unknown function '%s'\\n" msgstr "%s: Unknown option “%sâ€\\n" #: share/functions/help.fish:10 msgid "Show help for the fish shell" msgstr "Show help for the fish shell" #: share/functions/help.fish:68 msgid "%s: Could not find a web browser.\\n" msgstr "%s: Could not find a web browser.\\n" #: share/functions/help.fish:69 #, sh-format msgid "" "Please set the variable $BROWSER to a suitable browser and try again\\n\\n" msgstr "" "Please set the variable $BROWSER to a suitable browser and try again\\n\\n" #: share/functions/help.fish:105 msgid "help: Help is being displayed in your default browser\\n" msgstr "" #: share/functions/help.fish:108 msgid "help: Help is being displayed in %s\\n" msgstr "" #: share/functions/la.fish:4 msgid "" "List contents of directory, including hidden files in directory using long " "format" msgstr "" "List contents of directory, including hidden files in directory using long " "format" #: share/functions/ll.fish:4 msgid "List contents of directory using long format" msgstr "List contents of directory using long format" #: share/functions/ls.fish:7 share/functions/ls.fish:24 msgid "List contents of directory" msgstr "List contents of directory" #: share/functions/math.fish:2 #, fuzzy msgid "Perform math calculations in bc" msgstr "Perform a simulation" #: share/functions/nextd.fish:2 msgid "Move forward in the directory history" msgstr "Move forward in the directory history" #: share/functions/nextd.fish:27 msgid "%s: The number of positions to skip must be a non-negative integer\\n" msgstr "%s: The number of positions to skip must be a non-negative integer\\n" #: share/functions/open.fish:8 msgid "Open file in default application" msgstr "Open file in default application" #: share/functions/popd.fish:2 msgid "Pop dir from stack" msgstr "Pop dir from stack" #: share/functions/popd.fish:14 #, fuzzy msgid "%s: Directory stack is empty...\\n" msgstr "%s: Directory stack is empty..." #: share/functions/prevd.fish:2 msgid "Move back in the directory history" msgstr "Move back in the directory history" #: share/functions/prevd.fish:27 msgid "The number of positions to skip must be a non-negative integer\\n" msgstr "The number of positions to skip must be a non-negative integer\\n" #: share/functions/prompt_pwd.fish:3 share/functions/prompt_pwd.fish:12 msgid "Print the current working directory, shortend to fit the prompt" msgstr "Print the current working directory, shortend to fit the prompt" #: share/functions/psub.fish:3 msgid "" "Read from stdin into a file and output the filename. Remove the file when " "the command that called psub exits." msgstr "" "Read from stdin into a file and output the filename. Remove the file when " "the command that called psub exits." #: share/functions/pushd.fish:3 msgid "Push directory to stack" msgstr "Push directory to stack" #: share/functions/pwd.fish:9 share/functions/pwd.fish:14 msgid "Print working directory" msgstr "Print working directory" #: share/functions/setenv.fish:2 msgid "Set global variable. Alias for set -g, made for csh compatibility" msgstr "" #: share/functions/type.fish:2 msgid "Print the type of a command" msgstr "Print the type of a command" #: share/functions/type.fish:73 #, fuzzy msgid "%s is a function with definition\\n" msgstr "%ls: Missing function definition information." #: share/functions/type.fish:77 msgid "function\\n" msgstr "function\\n" #: share/functions/type.fish:94 msgid "%s is a builtin\\n" msgstr "%s is a builtin\\n" #: share/functions/type.fish:97 msgid "builtin\\n" msgstr "builtin\\n" #: share/functions/type.fish:115 msgid "%s is %s\\n" msgstr "%s is %s\\n" #: share/functions/type.fish:118 msgid "file\\n" msgstr "file\\n" #: share/functions/type.fish:129 msgid "%s: Could not find '%s'\\n" msgstr "%s: Could not find “%sâ€\\n" #: share/functions/umask.fish:11 share/functions/umask.fish:69 #: share/functions/umask.fish:76 msgid "%s: Invalid mask '%s'\\n" msgstr "%s: Invalid mask “%sâ€\\n" #: share/functions/umask.fish:137 msgid "Set default file permission mask" msgstr "Set default file permission mask" #: share/functions/umask.fish:204 msgid "%s: Too many arguments\\n" msgstr "%s: Too many arguments\\n" #: share/functions/vared.fish:7 msgid "Edit variable value" msgstr "Edit variable value" #: share/functions/vared.fish:42 msgid "" "%s: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of " "%s\\n" msgstr "" "%s: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of " "%s\\n" #: share/functions/vared.fish:46 msgid "" "%s: Expected exactly one argument, got %s.\\n\\nSynopsis:\\n\\t%svared%s " "VARIABLE\\n" msgstr "" "%s: Expected exactly one argument, got %s.\\n\\nSynopsis:\\n\\t%svared%s " "VARIABLE\\n" #: seq:15 msgid "^/dev/null" msgstr "^/dev/null" #: seq:36 msgid "%s: Expected 1, 2 or 3 arguments, got %d\\n" msgstr "%s: Expected 1, 2 or 3 arguments, got %d\\n" #: seq:43 msgid "%s: '%s' is not a number\\n" msgstr "%s: “%s†is not a number\\n" #~ msgid "" #~ "Current function definitions are:\n" #~ "\n" #~ msgstr "" #~ "Current function definitions are:\n" #~ "\n" #~ msgid "" #~ "%ls: '%ls' is not a directory or you do not have permission to enter it\n" #~ msgstr "" #~ "%ls: “%ls†is not a directory or you do not have permission to enter it\n" #~ msgid "%ls: Expected at least one argument, got %d\n" #~ msgstr "%ls: Expected at least one argument, got %d\n" #~ msgid "Evaluate parameters as a command" #~ msgstr "Evaluate parameters as a command" #~ msgid "User home" #~ msgstr "User home" #~ msgid "Function" #~ msgstr "Function" #~ msgid "Builtin" #~ msgstr "Builtin" #~ msgid "" #~ "Sent null command to subshell. This is a fish bug. If it can be " #~ "reproduced, please send a bug report to %s." #~ msgstr "" #~ "Sent null command to subshell. This is a fish bug. If it can be " #~ "reproduced, please send a bug report to %s." #~ msgid "Invalid Control sequence" #~ msgstr "Invalid Control sequence" #~ msgid "Could not parse sequence '%ls'" #~ msgstr "Could not parse sequence “%lsâ€" #~ msgid "Invalid sequence - no dash after control\n" #~ msgstr "Invalid sequence - no dash after control\n" #~ msgid "Invalid sequence - Control-nothing?\n" #~ msgstr "Invalid sequence - Control-nothing?\n" #~ msgid "Invalid sequence - no dash after meta\n" #~ msgstr "Invalid sequence - no dash after meta\n" #~ msgid "Invalid sequence - Meta-nothing?" #~ msgstr "Invalid sequence - Meta-nothing?" #~ msgid "Invalid sequence - '%ls' expanded to zero characters" #~ msgstr "Invalid sequence - “%ls†expanded to zero characters" #~ msgid "Mismatched $endif in inputrc file" #~ msgstr "Mismatched $endif in inputrc file" #~ msgid "Mismatched quote" #~ msgstr "Mismatched quote" #~ msgid "Expected a ':'" #~ msgstr "Expected a “:â€" #~ msgid "I don't know what '%ls' means" #~ msgstr "I don't know what “%ls†means" #~ msgid "Expected end of line, got '%ls'" #~ msgstr "Expected end of line, got “%lsâ€" #~ msgid "Syntax: set KEY VALUE" #~ msgstr "Syntax: set KEY VALUE" #~ msgid "Unable to parse key binding" #~ msgstr "Unable to parse key binding" #~ msgid "I don't know what %ls means" #~ msgstr "I don't know what %ls means" #~ msgid "Error while reading input information from file '%ls'" #~ msgstr "Error while reading input information from file “%lsâ€" #~ msgid "If this error can be reproduced, please send a bug report to %s." #~ msgstr "If this error can be reproduced, please send a bug report to %s." #~ msgid "Error while reading commands" #~ msgstr "Error while reading commands" #~ msgid "Parenthesis mismatch" #~ msgstr "Parenthesis mismatch" #~ msgid "" #~ "%s: Warning: The directory %s has been removed from your PATH because it " #~ "does not exist\\n" #~ msgstr "" #~ "%s: Warning: The directory %s has been removed from your PATH because it " #~ "does not exist\\n" #~ msgid "whatis entry" #~ msgstr "whatis entry" #~ msgid "Use to build" #~ msgstr "Use to build" #~ msgid "Prefix to strip on patch" #~ msgstr "Prefix to strip on patch" #~ msgid "Use purge instead of remove" #~ msgstr "Use purge instead of remove" #~ msgid "Do not run update" #~ msgstr "Do not run update" #~ msgid "Search full package name" #~ msgstr "Search full package name" #~ msgid "Access config file from shell" #~ msgstr "Access config file from shell" #~ msgid "Use cdrom-mount-point" #~ msgstr "Use cdrom-mount-point" #~ msgid "Use source override" #~ msgstr "Use source override" #~ msgid "Download Only" #~ msgstr "Download Only" #~ msgid "Correct broken dependencies" #~ msgstr "Correct broken dependencies" #~ msgid "Ignore missing packages" #~ msgstr "Ignore missing packages" #~ msgid "Disable downloading packages" #~ msgstr "Disable downloading packages" #~ msgid "Automatic yes to prompts" #~ msgstr "Automatic yes to prompts" #~ msgid "Show upgraded packages" #~ msgstr "Show upgraded packages" #~ msgid "Compile source packages" #~ msgstr "Compile source packages" #~ msgid "Ignore package Holds" #~ msgstr "Ignore package Holds" #~ msgid "Do not upgrade packages" #~ msgstr "Do not upgrade packages" #~ msgid "Force yes" #~ msgstr "Force yes" #~ msgid "Print the URIs" #~ msgstr "Print the URIs" #~ msgid "Erase obsolete files" #~ msgstr "Erase obsolete files" #~ msgid "Control default input to the policy engine" #~ msgstr "Control default input to the policy engine" #~ msgid "Only perform operations that are trivial" #~ msgstr "Only perform operations that are trivial" #~ msgid "Abort if any packages are to be removed" #~ msgstr "Abort if any packages are to be removed" #~ msgid "Only accept source packages" #~ msgstr "Only accept source packages" #~ msgid "Download only diff file" #~ msgstr "Download only diff file" #~ msgid "Download only tar file" #~ msgstr "Download only tar file" #~ msgid "Only process arch-dependant build-dependencies" #~ msgstr "Only process arch-dependant build-dependencies" #~ msgid "Ignore non-authenticated packages" #~ msgstr "Ignore non-authenticated packages" #~ msgid "Specify apt config file" #~ msgstr "Specify apt config file" #~ msgid "List bugs from packages" #~ msgstr "List bugs from packages" #~ msgid "List bugs in rss format" #~ msgstr "List bugs in rss format" #~ msgid "Read filenames from pipe" #~ msgstr "Read filenames from pipe" #~ msgid "Select display" #~ msgstr "Select display" #~ msgid "Generate master file" #~ msgstr "Generate master file" #~ msgid "Alias for 'get'" #~ msgstr "Alias for “getâ€" #~ msgid "Use specific conffile" #~ msgstr "Use specific conffile" #~ msgid "Comma-separated list of dependancy types to follow recursively" #~ msgstr "Comma-separated list of dependancy types to follow recursively" #~ msgid "Comma-separated list of dependancy types to show" #~ msgstr "Comma-separated list of dependancy types to show" #~ msgid "" #~ "Comma-separated list of package installation states to follow recursively" #~ msgstr "" #~ "Comma-separated list of package installation states to follow recursively" #~ msgid "Comma-separated list of package installation states to show" #~ msgstr "Comma-separated list of package installation states to show" #~ msgid "Probe a CD" #~ msgstr "Probe a CD" #~ msgid "Run in noninteractive mode" #~ msgstr "Run in noninteractive mode" #~ msgid "Conf file" #~ msgstr "Conf file" #~ msgid "File as input" #~ msgstr "File as input" #~ msgid "Mirror-list file" #~ msgstr "Mirror-list file" #~ msgid "Output sources.list file" #~ msgstr "Output sources.list file" #~ msgid "Write top servers to file" #~ msgstr "Write top servers to file" #~ msgid "Run on current dir" #~ msgstr "Run on current dir" #~ msgid "Removable medium" #~ msgstr "Removable medium" #~ msgid "Specify a non-mountpoint dir" #~ msgstr "Specify a non-mountpoint dir" #~ msgid "Select a method" #~ msgstr "Select a method" #~ msgid "Accept protocols" #~ msgstr "Accept protocols" #~ msgid "Reject protocols" #~ msgstr "Reject protocols" #~ msgid "Numerical address" #~ msgstr "Numerical address" #~ msgid "Use hardware address" #~ msgstr "Use hardware address" #~ msgid "Define math library" #~ msgstr "Define math library" #~ msgid "Give warnings for extensions to POSIX bc" #~ msgstr "Give warnings for extensions to POSIX bc" #~ msgid "Process exactly POSIX bc" #~ msgstr "Process exactly POSIX bc" #~ msgid "Do not print the GNU welcome" #~ msgstr "Do not print the GNU welcome" #~ msgid "Decompress to stdout" #~ msgstr "Decompress to stdout" #~ msgid "Overwrite" #~ msgstr "Overwrite" #~ msgid "Do not overwrite" #~ msgstr "Do not overwrite" #~ msgid "Reduce memory usage" #~ msgstr "Reduce memory usage" #~ msgid "Print compression ratios" #~ msgstr "Print compression ratios" #~ msgid "Print license" #~ msgstr "Print license" #~ msgid "Compress to stdout" #~ msgstr "Compress to stdout" #~ msgid "Compress file" #~ msgstr "Compress file" #~ msgid "Check integrity" #~ msgstr "Check integrity" #~ msgid "Supress errors" #~ msgstr "Supress errors" #~ msgid "Small block size" #~ msgstr "Small block size" #~ msgid "Large block size" #~ msgstr "Large block size" #~ msgid "Escape all non-printing characters" #~ msgstr "Escape all non-printing characters" #~ msgid "Number nonblank lines" #~ msgstr "Number nonblank lines" #~ msgid "Escape non-printing characters except tab" #~ msgstr "Escape non-printing characters except tab" #~ msgid "Display $ at end of line" #~ msgstr "Display $ at end of line" #~ msgid "Never more than single blank line" #~ msgstr "Never more than single blank line" #~ msgid "Escape non-printing characters except newline" #~ msgstr "Escape non-printing characters except newline" #~ msgid "Escape tab" #~ msgstr "Escape tab" #~ msgid "Escape non-printing except newline and tab" #~ msgstr "Escape non-printing except newline and tab" #~ msgid "Increment the level of general verbosity by one" #~ msgstr "Increment the level of general verbosity by one" #~ msgid "" #~ "Increment the verbose level in respect of SCSI command transport by one" #~ msgstr "" #~ "Increment the verbose level in respect of SCSI command transport by one" #~ msgid "Set the misc debug value to #" #~ msgstr "Set the misc debug value to #" #~ msgid "Increment the misc debug level by one" #~ msgstr "Increment the misc debug level by one" #~ msgid "Do not print out a status report for failed SCSI commands" #~ msgstr "Do not print out a status report for failed SCSI commands" #~ msgid "Force to continue on some errors" #~ msgstr "Force to continue on some errors" #~ msgid "Tell cdrecord to set the SCSI IMMED flag in certain commands" #~ msgstr "Tell cdrecord to set the SCSI IMMED flag in certain commands" #~ msgid "" #~ "Defines the minimum drive buffer fill ratio for the experimental ATAPI " #~ "wait mode intended to free the IDE bus to allow hard disk and CD/DVD " #~ "writer on the same IDE cable" #~ msgstr "" #~ "Defines the minimum drive buffer fill ratio for the experimental ATAPI " #~ "wait mode intended to free the IDE bus to allow hard disk and CD/DVD " #~ "writer on the same IDE cable" #~ msgid "Complete CD/DVD-Recorder recording process with the laser turned off" #~ msgstr "" #~ "Complete CD/DVD-Recorder recording process with the laser turned off" #~ msgid "Tells cdrecord to handle images created by readcd -clone" #~ msgstr "Tells cdrecord to handle images created by readcd -clone" #~ msgid "Set SAO (Session At Once) mode, usually called Disk At Once mode" #~ msgstr "Set SAO (Session At Once) mode, usually called Disk At Once mode" #~ msgid "Set TAO (Track At Once) writing mode" #~ msgstr "Set TAO (Track At Once) writing mode" #~ msgid "Set RAW writing mode" #~ msgstr "Set RAW writing mode" #~ msgid "Select Set RAW writing, the preferred raw writing mode" #~ msgstr "Select Set RAW writing, the preferred raw writing mode" #~ msgid "Select Set RAW writing, the less preferred raw writing mode" #~ msgstr "Select Set RAW writing, the less preferred raw writing mode" #~ msgid "" #~ "Select Set RAW writing, the preferred raw writing mode if raw96r is not " #~ "supported" #~ msgstr "" #~ "Select Set RAW writing, the preferred raw writing mode if raw96r is not " #~ "supported" #~ msgid "Allow multi session CDs to be made" #~ msgstr "Allow multi session CDs to be made" #~ msgid "" #~ "Retrieve multi session info in a form suitable for mkisofs-1.10 or later" #~ msgstr "" #~ "Retrieve multi session info in a form suitable for mkisofs-1.10 or later" #~ msgid "Retrieve and print out the table of content or PMA of a CD" #~ msgstr "Retrieve and print out the table of content or PMA of a CD" #~ msgid "Retrieve and print out the ATIP (absolute Time in Pre-groove) info" #~ msgstr "Retrieve and print out the ATIP (absolute Time in Pre-groove) info" #~ msgid "The disk will only be fixated" #~ msgstr "The disk will only be fixated" #~ msgid "Do not fixate the disk after writing the tracks" #~ msgstr "Do not fixate the disk after writing the tracks" #~ msgid "" #~ "Wait for input to become available on standard input before trying to " #~ "open the SCSI driver" #~ msgstr "" #~ "Wait for input to become available on standard input before trying to " #~ "open the SCSI driver" #~ msgid "Load the media, lock the door and exit" #~ msgstr "Load the media, lock the door and exit" #~ msgid "Eject disk after doing the work" #~ msgstr "Eject disk after doing the work" #~ msgid "Set the speed factor of the writing process to #" #~ msgstr "Set the speed factor of the writing process to #" #~ msgid "Blank a CD-RW and exit or blank a CD-RW before writing" #~ msgstr "Blank a CD-RW and exit or blank a CD-RW before writing" #~ msgid "Format a CD-RW/DVD-RW/DVD+RW disc" #~ msgstr "Format a CD-RW/DVD-RW/DVD+RW disc" #~ msgid "Set the FIFO (ring buffer) size to #" #~ msgstr "Set the FIFO (ring buffer) size to #" #~ msgid "Set the maximum transfer size for a single SCSI command to #" #~ msgstr "Set the maximum transfer size for a single SCSI command to #" #~ msgid "Sets the SCSI target for the CD/DVD-Recorder" #~ msgstr "Sets the SCSI target for the CD/DVD-Recorder" #~ msgid "Set the grace time before starting to write to ># seconds" #~ msgstr "Set the grace time before starting to write to ># seconds" #~ msgid "Set the default SCSI command timeout value to # seconds" #~ msgstr "Set the default SCSI command timeout value to # seconds" #~ msgid "Allows the user to manually select a driver for the device" #~ msgstr "Allows the user to manually select a driver for the device" #~ msgid "" #~ "Set the driveropts specified by driveropts=option list, the speed of the " #~ "drive and the dummy flag and exit" #~ msgstr "" #~ "Set the driveropts specified by driveropts=option list, the speed of the " #~ "drive and the dummy flag and exit" #~ msgid "Checks if a driver for the current drive is present and exit" #~ msgstr "Checks if a driver for the current drive is present and exit" #~ msgid "" #~ "Print the drive capabilities for SCSI-3/mmc compliant drives as obtained " #~ "from mode page 0x2A" #~ msgstr "" #~ "Print the drive capabilities for SCSI-3/mmc compliant drives as obtained " #~ "from mode page 0x2A" #~ msgid "Do an inquiry for the drive, print the inquiry info and exit" #~ msgstr "Do an inquiry for the drive, print the inquiry info and exit" #~ msgid "" #~ "Scan all SCSI devices on all SCSI busses and print the inquiry strings" #~ msgstr "" #~ "Scan all SCSI devices on all SCSI busses and print the inquiry strings" #~ msgid "Try to reset the SCSI bus where the CD recorder is located" #~ msgstr "Try to reset the SCSI bus where the CD recorder is located" #~ msgid "Try to send an abort sequence to the drive" #~ msgstr "Try to send an abort sequence to the drive" #~ msgid "Allow cdrecord to write more than the official size of a medium" #~ msgstr "Allow cdrecord to write more than the official size of a medium" #~ msgid "Ignore the known size of the medium, use for debugging only" #~ msgstr "Ignore the known size of the medium, use for debugging only" #~ msgid "Use *.inf files to overwrite audio options" #~ msgstr "Use *.inf files to overwrite audio options" #~ msgid "Set the default pre-gap size for all tracks except track nr 1" #~ msgstr "Set the default pre-gap size for all tracks except track nr 1" #~ msgid "Set Packet writing mode (experimental interface)" #~ msgstr "Set Packet writing mode (experimental interface)" #~ msgid "Set the packet size to #, forces fixed packet mode (experimental)" #~ msgstr "Set the packet size to #, forces fixed packet mode (experimental)" #~ msgid "" #~ "Do not close the current track, only when in packet writing mode " #~ "(experimental)" #~ msgstr "" #~ "Do not close the current track, only when in packet writing mode " #~ "(experimental)" #~ msgid "Set the Media Catalog Number of the CD" #~ msgstr "Set the Media Catalog Number of the CD" #~ msgid "" #~ "Write CD-Text info based on info taken from a file that contains ascii " #~ "info for the text strings" #~ msgstr "" #~ "Write CD-Text info based on info taken from a file that contains ascii " #~ "info for the text strings" #~ msgid "Write CD-Text based on info found in the binary file filename" #~ msgstr "Write CD-Text based on info found in the binary file filename" #~ msgid "" #~ "Take all recording related info from a CDRWIN compliant CUE sheet file" #~ msgstr "" #~ "Take all recording related info from a CDRWIN compliant CUE sheet file" #~ msgid "Set the International Standard Recording Number for the next track" #~ msgstr "Set the International Standard Recording Number for the next track" #~ msgid "Sets an index list for the next track" #~ msgstr "Sets an index list for the next track" #~ msgid "All subsequent tracks are written in CD-DA audio format" #~ msgstr "All subsequent tracks are written in CD-DA audio format" #~ msgid "Audio data is assumed to be in byte-swapped (little-endian) order" #~ msgstr "Audio data is assumed to be in byte-swapped (little-endian) order" #~ msgid "" #~ "All subsequent tracks are written in CD-ROM mode 1 (Yellow Book) format" #~ msgstr "" #~ "All subsequent tracks are written in CD-ROM mode 1 (Yellow Book) format" #~ msgid "All subsequent tracks are written in CD-ROM mode 2 format" #~ msgstr "All subsequent tracks are written in CD-ROM mode 2 format" #~ msgid "All subsequent tracks are written in CD-ROM XA mode 2 form 1 format" #~ msgstr "All subsequent tracks are written in CD-ROM XA mode 2 form 1 format" #~ msgid "All subsequent tracks are written in CD-ROM XA mode 2 form 2 format" #~ msgstr "All subsequent tracks are written in CD-ROM XA mode 2 form 2 format" #~ msgid "" #~ "All subsequent tracks are written in a way that allows a mix of CD-ROM XA " #~ "mode 2 form 1/2 format" #~ msgstr "" #~ "All subsequent tracks are written in a way that allows a mix of CD-ROM XA " #~ "mode 2 form 1/2 format" #~ msgid "The TOC type for the disk is set to CDI, with XA only" #~ msgstr "The TOC type for the disk is set to CDI, with XA only" #~ msgid "Use the ISO-9660 file system size as the size of the next track" #~ msgstr "Use the ISO-9660 file system size as the size of the next track" #~ msgid "" #~ "15 sectors of zeroed data will be added to the end of this and each " #~ "subsequent data track" #~ msgstr "" #~ "15 sectors of zeroed data will be added to the end of this and each " #~ "subsequent data track" #~ msgid "Set the amount of data to be appended as padding to the next track" #~ msgstr "Set the amount of data to be appended as padding to the next track" #~ msgid "Do not pad the following tracks - the default" #~ msgstr "Do not pad the following tracks - the default" #~ msgid "" #~ "Allow all subsequent tracks to violate the Red Book track length standard " #~ "(min 4 s)" #~ msgstr "" #~ "Allow all subsequent tracks to violate the Red Book track length standard " #~ "(min 4 s)" #~ msgid "Re-enforce the Red Book track length standard (min 4 s)" #~ msgstr "Re-enforce the Red Book track length standard (min 4 s)" #~ msgid "Set the pre-gap size for the next track" #~ msgstr "Set the pre-gap size for the next track" #~ msgid "" #~ "All TOC entries for subsequent audio tracks will indicate that the audio " #~ "data has been sampled with 50/15 microsec pre-emphasis" #~ msgstr "" #~ "All TOC entries for subsequent audio tracks will indicate that the audio " #~ "data has been sampled with 50/15 microsec pre-emphasis" #~ msgid "" #~ "All TOC entries for subsequent audio tracks will indicate that the audio " #~ "data has been mastered with linear data" #~ msgstr "" #~ "All TOC entries for subsequent audio tracks will indicate that the audio " #~ "data has been mastered with linear data" #~ msgid "" #~ "All TOC entries for subsequent audio tracks of the resulting CD will " #~ "indicate that the audio data has permission to be copied without limit" #~ msgstr "" #~ "All TOC entries for subsequent audio tracks of the resulting CD will " #~ "indicate that the audio data has permission to be copied without limit" #~ msgid "" #~ "All TOC entries for subsequent audio tracks of the resulting CD will " #~ "indicate that the audio data has permission to be copied only once for " #~ "personal use" #~ msgstr "" #~ "All TOC entries for subsequent audio tracks of the resulting CD will " #~ "indicate that the audio data has permission to be copied only once for " #~ "personal use" #~ msgid "" #~ "All TOC entries for subsequent audio tracks of the resulting CD will " #~ "indicate that the audio data has no permission to be copied" #~ msgstr "" #~ "All TOC entries for subsequent audio tracks of the resulting CD will " #~ "indicate that the audio data has no permission to be copied" #~ msgid "" #~ "If the master image for the next track has been stored on a raw disk, use " #~ "this option to specify the valid amount of data on this disk" #~ msgstr "" #~ "If the master image for the next track has been stored on a raw disk, use " #~ "this option to specify the valid amount of data on this disk" #~ msgid "Output diagnostic for changed files" #~ msgstr "Output diagnostic for changed files" #~ msgid "Dereferense symbolic links" #~ msgstr "Dereferense symbolic links" #~ msgid "Do not dereference symbolic links" #~ msgstr "Do not dereference symbolic links" #~ msgid "Change from owner/group" #~ msgstr "Change from owner/group" #~ msgid "Use same owner/group as file" #~ msgstr "Use same owner/group as file" #~ msgid "Operate recursively" #~ msgstr "Operate recursively" #~ msgid "Output diagnostic for every file" #~ msgstr "Output diagnostic for every file" #~ msgid "Add text to the end of the selected area" #~ msgstr "Add text to the end of the selected area" #~ msgid "Add text at cursor" #~ msgstr "Add text at cursor" #~ msgid "Replace selected part" #~ msgstr "Replace selected part" #~ msgid "Select job under cursor" #~ msgstr "Select job under cursor" #~ msgid "Select process under cursor" #~ msgstr "Select process under cursor" #~ msgid "Select token under cursor" #~ msgstr "Select token under cursor" #~ msgid "Select entire command line (default)" #~ msgstr "Select entire command line (default)" #~ msgid "Only return that part of the command line before the cursor" #~ msgstr "Only return that part of the command line before the cursor" #~ msgid "Inject readline functions to reader" #~ msgstr "Inject readline functions to reader" #~ msgid "Path to add completion to" #~ msgstr "Path to add completion to" #~ msgid "Posix-style option to complete" #~ msgstr "Posix-style option to complete" #~ msgid "GNU-style option to complete" #~ msgstr "GNU-style option to complete" #~ msgid "Old style long option to complete" #~ msgstr "Old style long option to complete" #~ msgid "Do not use file completion" #~ msgstr "Do not use file completion" #~ msgid "Require parameter" #~ msgstr "Require parameter" #~ msgid "Require parameter and do not use file completion" #~ msgstr "Require parameter and do not use file completion" #~ msgid "A list of possible arguments" #~ msgstr "A list of possible arguments" #~ msgid "Description of this completions" #~ msgstr "Description of this completions" #~ msgid "Option list is not complete" #~ msgstr "Option list is not complete" #~ msgid "Remove completion" #~ msgstr "Remove completion" #~ msgid "" #~ "The completion should only be used if the specified command has a zero " #~ "exit status" #~ msgstr "" #~ "The completion should only be used if the specified command has a zero " #~ "exit status" #~ msgid "Cache test results in file config.cache" #~ msgstr "Cache test results in file config.cache" #~ msgid "Do not create output files" #~ msgstr "Do not create output files" #~ msgid "Architecture-independent install directory" #~ msgstr "Architecture-independent install directory" #~ msgid "Architecture-dependent install directory" #~ msgstr "Architecture-dependent install directory" #~ msgid "Cross-compile to build programs to run on HOST" #~ msgstr "Cross-compile to build programs to run on HOST" #~ msgid "Configure for building compilers for TARGET" #~ msgstr "Configure for building compilers for TARGET" #~ msgid "Same as -dpR" #~ msgstr "Same as -dpR" #~ msgid "Make backup of each existing destination file" #~ msgstr "Make backup of each existing destination file" #~ msgid "Copy contents of special files when recursive" #~ msgstr "Copy contents of special files when recursive" #~ msgid "Same as --no-dereference --preserve=link" #~ msgstr "Same as --no-dereference --preserve=link" #~ msgid "Do not prompt before overwriting" #~ msgstr "Do not prompt before overwriting" #~ msgid "Prompt before overwrite" #~ msgstr "Prompt before overwrite" #~ msgid "Follow command-line symbolic links" #~ msgstr "Follow command-line symbolic links" #~ msgid "Link files instead of copying" #~ msgstr "Link files instead of copying" #~ msgid "Remove trailing slashes from source" #~ msgstr "Remove trailing slashes from source" #~ msgid "Target directory" #~ msgstr "Target directory" #~ msgid "Do not overwrite newer files" #~ msgstr "Do not overwrite newer files" #~ msgid "Always follow symbolic links" #~ msgstr "Always follow symbolic links" #~ msgid "Never follow symbolic links" #~ msgstr "Never follow symbolic links" #~ msgid "Same as --preserve=mode,ownership,timestamps" #~ msgstr "Same as --preserve=mode,ownership,timestamps" #~ msgid "Preserve the specified attributes and security contexts, if possible" #~ msgstr "" #~ "Preserve the specified attributes and security contexts, if possible" #~ msgid "Use full source file name under DIRECTORY" #~ msgstr "Use full source file name under DIRECTORY" #~ msgid "Copy directories recursively" #~ msgstr "Copy directories recursively" #~ msgid "" #~ "Remove each existing destination file before attempting to open it " #~ "(contrast with --force)" #~ msgstr "" #~ "Remove each existing destination file before attempting to open it " #~ "(contrast with --force)" #~ msgid "Make symbolic links instead of copying" #~ msgstr "Make symbolic links instead of copying" #~ msgid "Treat DEST as a normal file" #~ msgstr "Treat DEST as a normal file" #~ msgid "Stay on this file system" #~ msgstr "Stay on this file system" #~ msgid "Dont split mutibyte characters" #~ msgstr "Dont split mutibyte characters" #~ msgid "Do not print lines without delimiter" #~ msgstr "Do not print lines without delimiter" #~ msgid "Select output delimiter" #~ msgstr "Select output delimiter" #~ msgid "Kerberos server mode" #~ msgstr "Kerberos server mode" #~ msgid "Print out history information for files" #~ msgstr "Print out history information for files" #~ msgid "Prompt for password for authenticating server" #~ msgstr "Prompt for password for authenticating server" #~ msgid "Removes entry in .cvspass for remote repository" #~ msgstr "Removes entry in .cvspass for remote repository" #~ msgid "Password server mode" #~ msgstr "Password server mode" #~ msgid "Show last revision where each line of module was modified" #~ msgstr "Show last revision where each line of module was modified" #~ msgid "Create patch format diffs between releases" #~ msgstr "Create patch format diffs between releases" #~ msgid "Indicate that a Module is no longer in use" #~ msgstr "Indicate that a Module is no longer in use" #~ msgid "Print out history information for a module" #~ msgstr "Print out history information for a module" #~ msgid "Add a symbolic tag to a module" #~ msgstr "Add a symbolic tag to a module" #~ msgid "Server mode" #~ msgstr "Server mode" #~ msgid "Display status information on checked out files" #~ msgstr "Display status information on checked out files" #~ msgid "Add a symbolic tag to checked out version of files" #~ msgstr "Add a symbolic tag to checked out version of files" #~ msgid "Bring work tree in sync with repository" #~ msgstr "Bring work tree in sync with repository" #~ msgid "Set watches" #~ msgstr "Set watches" #~ msgid "See who is watching a file" #~ msgstr "See who is watching a file" #~ msgid "Specify legal cvsroot directory." #~ msgstr "Specify legal cvsroot directory." #~ msgid "Authenticate all net traffic" #~ msgstr "Authenticate all net traffic" #~ msgid "Do not use the ~/.cvsrc file" #~ msgstr "Do not use the ~/.cvsrc file" #~ msgid "Do not change any files" #~ msgstr "Do not change any files" #~ msgid "Cause CVS to be really quiet" #~ msgstr "Cause CVS to be really quiet" #~ msgid "Read-only repository mode" #~ msgstr "Read-only repository mode" #~ msgid "Cause CVS to be somewhat quiet" #~ msgstr "Cause CVS to be somewhat quiet" #~ msgid "Make checked-out files read-only" #~ msgstr "Make checked-out files read-only" #~ msgid "Show trace of program execution -- try with -n" #~ msgstr "Show trace of program execution -- try with -n" #~ msgid "Make checked-out files read-write (default)" #~ msgstr "Make checked-out files read-write (default)" #~ msgid "Encrypt all net traffic" #~ msgstr "Encrypt all net traffic" #~ msgid "Use the most recent revision no later than date" #~ msgstr "Use the most recent revision no later than date" #~ msgid "Retrieve files even when no match for tag/date" #~ msgstr "Retrieve files even when no match for tag/date" #~ msgid "Alter default keyword processing" #~ msgstr "Alter default keyword processing" #~ msgid "Don't recurse" #~ msgstr "Don't recurse" #~ msgid "Specify log message instead of invoking editor" #~ msgstr "Specify log message instead of invoking editor" #~ msgid "Don't run any tag programs" #~ msgstr "Don't run any tag programs" #~ msgid "Prune empty directories" #~ msgstr "Prune empty directories" #~ msgid "Process directories recursively" #~ msgstr "Process directories recursively" #~ msgid "Use a specified tag" #~ msgstr "Use a specified tag" #~ msgid "Specify filenames to be filtered" #~ msgstr "Specify filenames to be filtered" #~ msgid "Lock a revision" #~ msgstr "Lock a revision" #~ msgid "Make a name/rev association" #~ msgstr "Make a name/rev association" #~ msgid "Run quietly" #~ msgstr "Run quietly" #~ msgid "Set a state attribute for a revision" #~ msgstr "Set a state attribute for a revision" #~ msgid "Write descriptive text from a file into RCS" #~ msgstr "Write descriptive text from a file into RCS" #~ msgid "Write descriptive text into RCS" #~ msgstr "Write descriptive text into RCS" #~ msgid "Unlock a revision" #~ msgstr "Unlock a revision" #~ msgid "Annotate binary files" #~ msgstr "Annotate binary files" #~ msgid "Reset sticky tags/dates/k-opts" #~ msgstr "Reset sticky tags/dates/k-opts" #~ msgid "Copy module file to stdout" #~ msgstr "Copy module file to stdout" #~ msgid "Name directory for working files" #~ msgstr "Name directory for working files" #~ msgid "For -d. Don't shorten paths" #~ msgstr "For -d. Don't shorten paths" #~ msgid "Force new revision" #~ msgstr "Force new revision" #~ msgid "Treat all files as text" #~ msgstr "Treat all files as text" #~ msgid "Treat all whitespace as one space" #~ msgstr "Treat all whitespace as one space" #~ msgid "Ignore blank line only changes" #~ msgstr "Ignore blank line only changes" #~ msgid "Binary mode" #~ msgstr "Binary mode" #~ msgid "Report only whether files differ" #~ msgstr "Report only whether files differ" #~ msgid "Use context format" #~ msgstr "Use context format" #~ msgid "Set context size" #~ msgstr "Set context size" #~ msgid "Set context format and, optionally, size" #~ msgstr "Set context format and, optionally, size" #~ msgid "Set line group format" #~ msgstr "Set line group format" #~ msgid "Try to find a smaller set of changes" #~ msgstr "Try to find a smaller set of changes" #~ msgid "Make output a valid ed script" #~ msgstr "Make output a valid ed script" #~ msgid "Expand tabs to spaces" #~ msgstr "Expand tabs to spaces" #~ msgid "Output that looks like an ed script" #~ msgstr "Output that looks like an ed script" #~ msgid "Set regexp for context, unified formats" #~ msgstr "Set regexp for context, unified formats" #~ msgid "Speed handling of large files with small changes" #~ msgstr "Speed handling of large files with small changes" #~ msgid "Set horizon lines" #~ msgstr "Set horizon lines" #~ msgid "Ignore changes in case" #~ msgstr "Ignore changes in case" #~ msgid "Ignore changes matching regexp" #~ msgstr "Ignore changes matching regexp" #~ msgid "Make ifdef from diff" #~ msgstr "Make ifdef from diff" #~ msgid "Ignore whitespace" #~ msgstr "Ignore whitespace" #~ msgid "Start lines with a tab" #~ msgstr "Start lines with a tab" #~ msgid "Use label instead of filename in output" #~ msgstr "Use label instead of filename in output" #~ msgid "Print only left column" #~ msgstr "Print only left column" #~ msgid "Use format to produce if-then-else output" #~ msgstr "Use format to produce if-then-else output" #~ msgid "Produce RCS-style diffs" #~ msgstr "Produce RCS-style diffs" #~ msgid "Treat files absent from one dir as empty" #~ msgstr "Treat files absent from one dir as empty" #~ msgid "Specifies line formatting" #~ msgstr "Specifies line formatting" #~ msgid "Identify the C function each change is in" #~ msgstr "Identify the C function each change is in" #~ msgid "Report identical files" #~ msgstr "Report identical files" #~ msgid "Use side-by-side format" #~ msgstr "Use side-by-side format" #~ msgid "Suppress common lines in side-by-side" #~ msgstr "Suppress common lines in side-by-side" #~ msgid "Use unified format" #~ msgstr "Use unified format" #~ msgid "Set context size in unified" #~ msgstr "Set context size in unified" #~ msgid "Set column width for side-by-side format" #~ msgstr "Set column width for side-by-side format" #~ msgid "Report on each commit" #~ msgstr "Report on each commit" #~ msgid "Report on everything" #~ msgstr "Report on everything" #~ msgid "Report on a module" #~ msgstr "Report on a module" #~ msgid "Report on checked-out modules" #~ msgstr "Report on checked-out modules" #~ msgid "Report on all tags" #~ msgstr "Report on all tags" #~ msgid "Show history for all users" #~ msgstr "Show history for all users" #~ msgid "Show only records for this directory" #~ msgstr "Show only records for this directory" #~ msgid "Multiple vendor branch" #~ msgstr "Multiple vendor branch" #~ msgid "Files to ignore during import" #~ msgstr "Files to ignore during import" #~ msgid "Print info about revision on default branch" #~ msgstr "Print info about revision on default branch" #~ msgid "Specify date range for query" #~ msgstr "Specify date range for query" #~ msgid "Print only file info" #~ msgstr "Print only file info" #~ msgid "Do not print tags" #~ msgstr "Do not print tags" #~ msgid "Print only rcs filename" #~ msgstr "Print only rcs filename" #~ msgid "Print only given revisions" #~ msgstr "Print only given revisions" #~ msgid "Suppress header if no revisions found" #~ msgstr "Suppress header if no revisions found" #~ msgid "Specify revision states" #~ msgstr "Specify revision states" #~ msgid "Same as -h, plus descriptive text" #~ msgstr "Same as -h, plus descriptive text" #~ msgid "Use context diff format" #~ msgstr "Use context diff format" #~ msgid "Create summary change report" #~ msgstr "Create summary change report" #~ msgid "diff top two revisions" #~ msgstr "diff top two revisions" #~ msgid "Use unidiff format" #~ msgstr "Use unidiff format" #~ msgid "Delete working copy if release succeeds" #~ msgstr "Delete working copy if release succeeds" #~ msgid "Reset sticky tags, dates, and k-opts" #~ msgstr "Reset sticky tags, dates, and k-opts" #~ msgid "Overwrite modified files with clean copies" #~ msgstr "Overwrite modified files with clean copies" #~ msgid "Create any missing directories" #~ msgstr "Create any missing directories" #~ msgid "Specify files to ignore" #~ msgstr "Specify files to ignore" #~ msgid "Create new project" #~ msgstr "Create new project" #~ msgid "Shows brief description of command and its arguments" #~ msgstr "Shows brief description of command and its arguments" #~ msgid "Neither verbose nor quiet output" #~ msgstr "Neither verbose nor quiet output" #~ msgid "Name of patch" #~ msgstr "Name of patch" #~ msgid "Give patch name and comment in file" #~ msgstr "Give patch name and comment in file" #~ msgid "Answer yes to all patches" #~ msgstr "Answer yes to all patches" #~ msgid "" #~ "In addition to modifications, look for files that are not boring, and " #~ "thus are potentially pending addition" #~ msgstr "" #~ "In addition to modifications, look for files that are not boring, and " #~ "thus are potentially pending addition" #~ msgid "Don't run the test script" #~ msgstr "Don't run the test script" #~ msgid "Run the test script" #~ msgstr "Run the test script" #~ msgid "Don't remove the test directory" #~ msgstr "Don't remove the test directory" #~ msgid "Remove the test directory" #~ msgstr "Remove the test directory" #~ msgid "Create compressed patches" #~ msgstr "Create compressed patches" #~ msgid "Don't create compressed patches" #~ msgstr "Don't create compressed patches" #~ msgid "Expect to receive input from a pipe" #~ msgstr "Expect to receive input from a pipe" #~ msgid "Prompt user interactively" #~ msgstr "Prompt user interactively" #~ msgid "Ask for extra dependencies" #~ msgstr "Ask for extra dependencies" #~ msgid "Don't ask for extra dependencies" #~ msgstr "Don't ask for extra dependencies" #~ msgid "Edit the long comment by default" #~ msgstr "Edit the long comment by default" #~ msgid "Don't give a long comment" #~ msgstr "Don't give a long comment" #~ msgid "Prompt for whether to edit the long comment" #~ msgstr "Prompt for whether to edit the long comment" #~ msgid "" #~ "Don't look for any files or directories that could be added, and don't " #~ "add them automatically" #~ msgstr "" #~ "Don't look for any files or directories that could be added, and don't " #~ "add them automatically" #~ msgid "Summarize changes" #~ msgstr "Summarize changes" #~ msgid "Suppress informational output" #~ msgstr "Suppress informational output" #~ msgid "Don't actually take the action" #~ msgstr "Don't actually take the action" #~ msgid "Don't summarize changes" #~ msgstr "Don't summarize changes" #~ msgid "Set default repository [DEFAULT]" #~ msgstr "Set default repository [DEFAULT]" #~ msgid "Don't set default repository" #~ msgstr "Don't set default repository" #~ msgid "Make scripts executable" #~ msgstr "Make scripts executable" #~ msgid "Reply to email-based patch using FROM address" #~ msgstr "Reply to email-based patch using FROM address" #~ msgid "Don't verify patch signature" #~ msgstr "Don't verify patch signature" #~ msgid "Mark conflicts" #~ msgstr "Mark conflicts" #~ msgid "Allow conflicts, but don't mark them" #~ msgstr "Allow conflicts, but don't mark them" #~ msgid "Fail on patches that create conflicts [DEFAULT]" #~ msgstr "Fail on patches that create conflicts [DEFAULT]" #~ msgid "Forward unsigned messages without extra header" #~ msgstr "Forward unsigned messages without extra header" #~ msgid "Check the entire repository" #~ msgstr "Check the entire repository" #~ msgid "Check patches since latest checkpoint" #~ msgstr "Check patches since latest checkpoint" #~ msgid "Don't refuse to add files differing only in case" #~ msgstr "Don't refuse to add files differing only in case" #~ msgid "Output patch in a darcs-specific format similar to diff -u" #~ msgstr "Output patch in a darcs-specific format similar to diff -u" #~ msgid "Sign the patch with your gpg key" #~ msgstr "Sign the patch with your gpg key" #~ msgid "Do not sign the patch" #~ msgstr "Do not sign the patch" #~ msgid "Edit the patch bundle description" #~ msgstr "Edit the patch bundle description" #~ msgid "Use a plain pristine tree [DEFAULT]" #~ msgstr "Use a plain pristine tree [DEFAULT]" #~ msgid "Use no pristine tree" #~ msgstr "Use no pristine tree" #~ msgid "Give human readable output" #~ msgstr "Give human readable output" #~ msgid "Generate XML formatted output" #~ msgstr "Generate XML formatted output" #~ msgid "Select changes up to a tag matching REGEXP" #~ msgstr "Select changes up to a tag matching REGEXP" #~ msgid "Give output suitable for get --context" #~ msgstr "Give output suitable for get --context" #~ msgid "Give human-readable output" #~ msgstr "Give human-readable output" #~ msgid "Don't skip boring files" #~ msgstr "Don't skip boring files" #~ msgid "Add contents of subdirectories" #~ msgstr "Add contents of subdirectories" #~ msgid "Don't add contents of subdirectories" #~ msgstr "Don't add contents of subdirectories" #~ msgid "Add files with date appended to avoid conflict. [EXPERIMENTAL]" #~ msgstr "Add files with date appended to avoid conflict. [EXPERIMENTAL]" #~ msgid "Don't use experimental date appending trick. [DEFAULT]" #~ msgstr "Don't use experimental date appending trick. [DEFAULT]" #~ msgid "Display date described by string" #~ msgstr "Display date described by string" #~ msgid "Display date for each line in file" #~ msgstr "Display date for each line in file" #~ msgid "Output in ISO 8601 format" #~ msgstr "Output in ISO 8601 format" #~ msgid "Output RFC-2822 compliant date string" #~ msgstr "Output RFC-2822 compliant date string" #~ msgid "Print or set Coordinated Universal Time" #~ msgstr "Print or set Coordinated Universal Time" #~ msgid "List inode information" #~ msgstr "List inode information" #~ msgid "Use 1kB block size" #~ msgstr "Use 1kB block size" #~ msgid "List only local filesystems" #~ msgstr "List only local filesystems" #~ msgid "Use Posix format" #~ msgstr "Use Posix format" #~ msgid "Include empty filesystems" #~ msgstr "Include empty filesystems" #~ msgid "Do not sync before getting usage info" #~ msgstr "Do not sync before getting usage info" #~ msgid "Sync before getting usage info" #~ msgstr "Sync before getting usage info" #~ msgid "Print filesystem type" #~ msgstr "Print filesystem type" #~ msgid "Excluded filesystem type" #~ msgstr "Excluded filesystem type" #~ msgid "Show all filesystems" #~ msgstr "Show all filesystems" #~ msgid "Show sizes in gigabytes" #~ msgstr "Show sizes in gigabytes" #~ msgid "Show sizes in megabytes" #~ msgstr "Show sizes in megabytes" #~ msgid "Print out the previously obtained statistics from the file systems" #~ msgstr "Print out the previously obtained statistics from the file systems" #~ msgid "Ignore case differences" #~ msgstr "Ignore case differences" #~ msgid "Ignore case when comparing file names" #~ msgstr "Ignore case when comparing file names" #~ msgid "Consider case when comparing file names" #~ msgstr "Consider case when comparing file names" #~ msgid "Ignore changes due to tab expansion" #~ msgstr "Ignore changes due to tab expansion" #~ msgid "Ignore changes in the amount of white space" #~ msgstr "Ignore changes in the amount of white space" #~ msgid "Ignore all white space" #~ msgstr "Ignore all white space" #~ msgid "Ignore changes whose lines are all blank" #~ msgstr "Ignore changes whose lines are all blank" #~ msgid "Recursively compare subdirectories" #~ msgstr "Recursively compare subdirectories" #~ msgid "Treat absent files as empty" #~ msgstr "Treat absent files as empty" #~ msgid "Output 3 lines of copied context" #~ msgstr "Output 3 lines of copied context" #~ msgid "Output 3 lines of unified context" #~ msgstr "Output 3 lines of unified context" #~ msgid "Output only whether the files differ" #~ msgstr "Output only whether the files differ" #~ msgid "Output a normal diff" #~ msgstr "Output a normal diff" #~ msgid "Output in two columns" #~ msgstr "Output in two columns" #~ msgid "Pass the output through 'pr'" #~ msgstr "Pass the output through “prâ€" #~ msgid "Write size for all files" #~ msgstr "Write size for all files" #~ msgid "Print file size, not disk usage" #~ msgstr "Print file size, not disk usage" #~ msgid "Use 1B block size" #~ msgstr "Use 1B block size" #~ msgid "Produce grand total" #~ msgstr "Produce grand total" #~ msgid "Dereference file symlinks" #~ msgstr "Dereference file symlinks" #~ msgid "Count hard links multiple times" #~ msgstr "Count hard links multiple times" #~ msgid "Dereference all symlinks" #~ msgstr "Dereference all symlinks" #~ msgid "Do not include subdirectory size" #~ msgstr "Do not include subdirectory size" #~ msgid "Display only a total for each argument" #~ msgstr "Display only a total for each argument" #~ msgid "Skip other filesystems" #~ msgstr "Skip other filesystems" #~ msgid "No newline" #~ msgstr "No newline" #~ msgid "Use backslash escaped characters" #~ msgstr "Use backslash escaped characters" #~ msgid "Do not use backslash escaped characters" #~ msgstr "Do not use backslash escaped characters" #~ msgid "Do not load init files" #~ msgstr "Do not load init files" #~ msgid "Load users init file" #~ msgstr "Load users init file" #~ msgid "Use file as terminal" #~ msgstr "Use file as terminal" #~ msgid "Execute Lisp function" #~ msgstr "Execute Lisp function" #~ msgid "Load Lisp code from file" #~ msgstr "Load Lisp code from file" #~ msgid "Do not use X interface" #~ msgstr "Do not use X interface" #~ msgid "Create window on the specified display" #~ msgstr "Create window on the specified display" #~ msgid "" #~ "Tests if emerge command should have package as potential completion for " #~ "removal" #~ msgstr "" #~ "Tests if emerge command should have package as potential completion for " #~ "removal" #~ msgid "Cleans the system by removing outdated packages" #~ msgstr "Cleans the system by removing outdated packages" #~ msgid "" #~ "Cleans the system by removing packages that are not associated with " #~ "explicitly merged packages" #~ msgstr "" #~ "Cleans the system by removing packages that are not associated with " #~ "explicitly merged packages" #~ msgid "" #~ "Displays important portage variables that will be exported to ebuild.sh " #~ "when performing merges" #~ msgstr "" #~ "Displays important portage variables that will be exported to ebuild.sh " #~ "when performing merges" #~ msgid "" #~ "Causes portage to process all the metacache files as is normally done on " #~ "the tail end of an rsync update using emerge --sync" #~ msgstr "" #~ "Causes portage to process all the metacache files as is normally done on " #~ "the tail end of an rsync update using emerge --sync" #~ msgid "" #~ "Removes all but the most recently installed version of a package from " #~ "your system" #~ msgstr "" #~ "Removes all but the most recently installed version of a package from " #~ "your system" #~ msgid "" #~ "Causes portage to check and update the dependency cache of all ebuilds in " #~ "the portage tree" #~ msgstr "" #~ "Causes portage to check and update the dependency cache of all ebuilds in " #~ "the portage tree" #~ msgid "" #~ "Searches for matches of the supplied string in the current local portage " #~ "tree" #~ msgstr "" #~ "Searches for matches of the supplied string in the current local portage " #~ "tree" #~ msgid "Removes all matching packages completely from your system" #~ msgstr "Removes all matching packages completely from your system" #~ msgid "" #~ "Before performing the merge, display what ebuilds and tbz2s will be " #~ "installed, in the same format as when using --pretend" #~ msgstr "" #~ "Before performing the merge, display what ebuilds and tbz2s will be " #~ "installed, in the same format as when using --pretend" #~ msgid "" #~ "Tell emerge to build binary packages for all ebuilds processed in " #~ "addition to actually merging the packages" #~ msgstr "" #~ "Tell emerge to build binary packages for all ebuilds processed in " #~ "addition to actually merging the packages" #~ msgid "Creates a binary package, but does not merge it to the system" #~ msgstr "Creates a binary package, but does not merge it to the system" #~ msgid "" #~ "When pretending, also display the ChangeLog entries for packages that " #~ "will be upgraded" #~ msgstr "" #~ "When pretending, also display the ChangeLog entries for packages that " #~ "will be upgraded" #~ msgid "Tell emerge to run the ebuild command in --debug mode" #~ msgstr "Tell emerge to run the ebuild command in --debug mode" #~ msgid "" #~ "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" #~ msgstr "" #~ "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" #~ msgid "Virtually tweaks the tree of installed packages to contain nothing" #~ msgstr "Virtually tweaks the tree of installed packages to contain nothing" #~ msgid "" #~ "Instead of doing any package building, just perform fetches for all " #~ "packages (main package as well as all dependencies)" #~ msgstr "" #~ "Instead of doing any package building, just perform fetches for all " #~ "packages (main package as well as all dependencies)" #~ msgid "" #~ "Same as --fetchonly except that all package files, including those not " #~ "required to build the package, will be processed" #~ msgstr "" #~ "Same as --fetchonly except that all package files, including those not " #~ "required to build the package, will be processed" #~ msgid "" #~ "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" #~ msgstr "" #~ "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" #~ msgid "" #~ "This option is identical to -g, except it will not use ANY information " #~ "from the local machine" #~ msgstr "" #~ "This option is identical to -g, except it will not use ANY information " #~ "from the local machine" #~ msgid "" #~ "Tells emerge to include installed packages where USE flags have changed " #~ "since installation" #~ msgstr "" #~ "Tells emerge to include installed packages where USE flags have changed " #~ "since installation" #~ msgid "" #~ "Merge files in CONFIG_PROTECT to the live fs instead of silently dropping " #~ "them" #~ msgstr "" #~ "Merge files in CONFIG_PROTECT to the live fs instead of silently dropping " #~ "them" #~ msgid "Merge specified packages, but don't merge any dependencies" #~ msgstr "Merge specified packages, but don't merge any dependencies" #~ msgid "" #~ "Skip the packages specified on the command-line that have already been " #~ "installed" #~ msgstr "" #~ "Skip the packages specified on the command-line that have already been " #~ "installed" #~ msgid "Disables the spinner regardless of terminal type" #~ msgstr "Disables the spinner regardless of terminal type" #~ msgid "Emerge as normal, but don't add packages to the world profile" #~ msgstr "Emerge as normal, but don't add packages to the world profile" #~ msgid "" #~ "Only merge (or pretend to merge) the dependencies of the specified " #~ "packages, not the packages themselves" #~ msgstr "" #~ "Only merge (or pretend to merge) the dependencies of the specified " #~ "packages, not the packages themselves" #~ msgid "" #~ "Do not merge, display what ebuilds and tbz2s would have been installed" #~ msgstr "" #~ "Do not merge, display what ebuilds and tbz2s would have been installed" #~ msgid "Reduced output from portage's displays" #~ msgstr "Reduced output from portage's displays" #~ msgid "Resumes the last merge operation" #~ msgstr "Resumes the last merge operation" #~ msgid "" #~ "Matches the search string against the description field as well the " #~ "package's name" #~ msgstr "" #~ "Matches the search string against the description field as well the " #~ "package's name" #~ msgid "" #~ "Remove the first package in the resume list so that a merge may continue " #~ "in the presence of an uncorrectable or inconsequential error" #~ msgstr "" #~ "Remove the first package in the resume list so that a merge may continue " #~ "in the presence of an uncorrectable or inconsequential error" #~ msgid "Shows the dependency tree using indentation for dependencies" #~ msgstr "Shows the dependency tree using indentation for dependencies" #~ msgid "" #~ "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" #~ msgstr "" #~ "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" #~ msgid "Increased or expanded display of content in portage's displays" #~ msgstr "Increased or expanded display of content in portage's displays" #~ msgid "" #~ "Displays the currently installed version of portage along with other " #~ "information useful for quick reference on a system" #~ msgstr "" #~ "Displays the currently installed version of portage along with other " #~ "information useful for quick reference on a system" #~ msgid "Run fish with this command" #~ msgstr "Run fish with this command" #~ msgid "Only parse input, do not execute" #~ msgstr "Only parse input, do not execute" #~ msgid "Run in interactive mode" #~ msgstr "Run in interactive mode" #~ msgid "Run in login mode" #~ msgstr "Run in login mode" #~ msgid "Set function description" #~ msgstr "Set function description" #~ msgid "Make the function a job exit event handler" #~ msgstr "Make the function a job exit event handler" #~ msgid "Make the function a process exit event handler" #~ msgstr "Make the function a process exit event handler" #~ msgid "Make the function a signal event handler" #~ msgstr "Make the function a signal event handler" #~ msgid "Make the function a variable update event handler" #~ msgstr "Make the function a variable update event handler" #~ msgid "Allow dash (-) in function name" #~ msgstr "Allow dash (-) in function name" #~ msgid "Erase function" #~ msgstr "Erase function" #~ msgid "Show hidden functions" #~ msgstr "Show hidden functions" #~ msgid "Test if function is defined" #~ msgstr "Test if function is defined" #~ msgid "Unmount" #~ msgstr "Unmount" #~ msgid "Quiet" #~ msgstr "Quiet" #~ msgid "Lazy unmount" #~ msgstr "Lazy unmount" #~ msgid "Language" #~ msgstr "Language" #~ msgid "Pass program exit codes" #~ msgstr "Pass program exit codes" #~ msgid "Stop after assembler" #~ msgstr "Stop after assembler" #~ msgid "Stop after compile" #~ msgstr "Stop after compile" #~ msgid "Stop after preprocessor" #~ msgstr "Stop after preprocessor" #~ msgid "Output file" #~ msgstr "Output file" #~ msgid "Print commands to stderr" #~ msgstr "Print commands to stderr" #~ msgid "Print quoted commands to stderr, do not run" #~ msgstr "Print quoted commands to stderr, do not run" #~ msgid "Use pipes" #~ msgstr "Use pipes" #~ msgid "Use ansi mode" #~ msgstr "Use ansi mode" #~ msgid "Write prototypes to file" #~ msgstr "Write prototypes to file" #~ msgid "Do not recognize asm, inline or typeof keywords" #~ msgstr "Do not recognize asm, inline or typeof keywords" #~ msgid "Do not use builtin functions" #~ msgstr "Do not use builtin functions" #~ msgid "Assert hosted environment" #~ msgstr "Assert hosted environment" #~ msgid "Assert freestanding environment" #~ msgstr "Assert freestanding environment" #~ msgid "Use Microsoft extensions" #~ msgstr "Use Microsoft extensions" #~ msgid "Use ANSI trigraphs" #~ msgstr "Use ANSI trigraphs" #~ msgid "Do not use integrated preprocessor" #~ msgstr "Do not use integrated preprocessor" #~ msgid "char is unsigned" #~ msgstr "char is unsigned" #~ msgid "char is signed" #~ msgstr "char is signed" #~ msgid "bitfield is unsigned" #~ msgstr "bitfield is unsigned" #~ msgid "bitfield is signed" #~ msgstr "bitfield is signed" #~ msgid "All bitfields are signed" #~ msgstr "All bitfields are signed" #~ msgid "All bitfields are unsigned" #~ msgstr "All bitfields are unsigned" #~ msgid "String constants are not const" #~ msgstr "String constants are not const" #~ msgid "C++ ABI version" #~ msgstr "C++ ABI version" #~ msgid "Turn off access checking" #~ msgstr "Turn off access checking" #~ msgid "Check pointer returned by new" #~ msgstr "Check pointer returned by new" #~ msgid "Put globals in the common segment" #~ msgstr "Put globals in the common segment" #~ msgid "Accept $ in identifiers" #~ msgstr "Accept $ in identifiers" #~ msgid "Reject $ in identifiers" #~ msgstr "Reject $ in identifiers" #~ msgid "Do not omit unneeded temporarys" #~ msgstr "Do not omit unneeded temporarys" #~ msgid "Allow exception violations" #~ msgstr "Allow exception violations" #~ msgid "Do not extend for-loop scope" #~ msgstr "Do not extend for-loop scope" #~ msgid "Extend for-loop scope" #~ msgstr "Extend for-loop scope" #~ msgid "Do not recognize typeof as keyword" #~ msgstr "Do not recognize typeof as keyword" #~ msgid "Do not emit code for implicit templates" #~ msgstr "Do not emit code for implicit templates" #~ msgid "Do not emit code for implicit inline templates" #~ msgstr "Do not emit code for implicit inline templates" #~ msgid "Do not emit out-of-line code for inline functions" #~ msgstr "Do not emit out-of-line code for inline functions" #~ msgid "Disable warnings about MFC" #~ msgstr "Disable warnings about MFC" #~ msgid "Disable some built-in functions" #~ msgstr "Disable some built-in functions" #~ msgid "Disable operator keywords" #~ msgstr "Disable operator keywords" #~ msgid "Disable optional diagnostics" #~ msgstr "Disable optional diagnostics" #~ msgid "Downgrade some errors to warnings" #~ msgstr "Downgrade some errors to warnings" #~ msgid "Enable automatic template instantiation at link time" #~ msgstr "Enable automatic template instantiation at link time" #~ msgid "Disable generation of C++ runtime type information" #~ msgstr "Disable generation of C++ runtime type information" #~ msgid "Do not emit code for thread-safe initialization of local statics" #~ msgstr "Do not emit code for thread-safe initialization of local statics" #~ msgid "Use __cxa_atexit for destructors" #~ msgstr "Use __cxa_atexit for destructors" #~ msgid "Hides inline methods from export table" #~ msgstr "Hides inline methods from export table" #~ msgid "Do not use weak symbol support" #~ msgstr "Do not use weak symbol support" #~ msgid "Make a signature" #~ msgstr "Make a signature" #~ msgid "Make a clear text signature" #~ msgstr "Make a clear text signature" #~ msgid "Make a detached signature" #~ msgstr "Make a detached signature" #~ msgid "Encrypt data" #~ msgstr "Encrypt data" #~ msgid "Encrypt with a symmetric cipher using a passphrase" #~ msgstr "Encrypt with a symmetric cipher using a passphrase" #~ msgid "Store only (make a simple RFC1991 packet)" #~ msgstr "Store only (make a simple RFC1991 packet)" #~ msgid "Assume specified file or stdin is sigfile and verify it" #~ msgstr "Assume specified file or stdin is sigfile and verify it" #~ msgid "" #~ "Modify certain other commands to accept multiple files for processing" #~ msgstr "" #~ "Modify certain other commands to accept multiple files for processing" #~ msgid "Identical to '--multifile --verify'" #~ msgstr "Identical to “--multifile --verifyâ€" #~ msgid "Identical to '--multifile --encrypt'" #~ msgstr "Identical to “--multifile --encryptâ€" #~ msgid "Identical to --multifile --decrypt" #~ msgstr "Identical to --multifile --decrypt" #~ msgid "" #~ "List all keys from the public keyrings, or just the ones given on the " #~ "command line" #~ msgstr "" #~ "List all keys from the public keyrings, or just the ones given on the " #~ "command line" #~ msgid "" #~ "List all keys from the secret keyrings, or just the ones given on the " #~ "command line" #~ msgstr "" #~ "List all keys from the secret keyrings, or just the ones given on the " #~ "command line" #~ msgid "Same as --list-keys, but the signatures are listed too" #~ msgstr "Same as --list-keys, but the signatures are listed too" #~ msgid "Same as --list-keys, but the signatures are listed and verified" #~ msgstr "Same as --list-keys, but the signatures are listed and verified" #~ msgid "List all keys with their fingerprints" #~ msgstr "List all keys with their fingerprints" #~ msgid "Generate a new key pair" #~ msgstr "Generate a new key pair" #~ msgid "Present a menu which enables you to do all key related tasks" #~ msgstr "Present a menu which enables you to do all key related tasks" #~ msgid "Sign a public key with your secret key" #~ msgstr "Sign a public key with your secret key" #~ msgid "Sign a public key with your secret key but mark it as non exportable" #~ msgstr "" #~ "Sign a public key with your secret key but mark it as non exportable" #~ msgid "Remove key from the public keyring" #~ msgstr "Remove key from the public keyring" #~ msgid "Remove key from the secret and public keyring" #~ msgstr "Remove key from the secret and public keyring" #~ msgid "" #~ "Same as --delete-key, but if a secret key exists, it will be removed first" #~ msgstr "" #~ "Same as --delete-key, but if a secret key exists, it will be removed first" #~ msgid "Generate a revocation certificate for the complete key" #~ msgstr "Generate a revocation certificate for the complete key" #~ msgid "Generate a designated revocation certificate for a key" #~ msgstr "Generate a designated revocation certificate for a key" #~ msgid "Export all or the given keys from all keyrings" #~ msgstr "Export all or the given keys from all keyrings" #~ msgid "Same as --export but sends the keys to a keyserver" #~ msgstr "Same as --export but sends the keys to a keyserver" #~ msgid "Same as --export, but exports the secret keys instead" #~ msgstr "Same as --export, but exports the secret keys instead" #~ msgid "Import/merge keys" #~ msgstr "Import/merge keys" #~ msgid "Import the keys with the given key IDs from a keyserver" #~ msgstr "Import the keys with the given key IDs from a keyserver" #~ msgid "" #~ "Request updates from a keyserver for keys that already exist on the local " #~ "keyring" #~ msgstr "" #~ "Request updates from a keyserver for keys that already exist on the local " #~ "keyring" #~ msgid "Search the keyserver for the given names" #~ msgstr "Search the keyserver for the given names" #~ msgid "Do trust database maintenance" #~ msgstr "Do trust database maintenance" #~ msgid "Do trust database maintenance without user interaction" #~ msgstr "Do trust database maintenance without user interaction" #~ msgid "Send the ownertrust values to stdout" #~ msgstr "Send the ownertrust values to stdout" #~ msgid "" #~ "Update the trustdb with the ownertrust values stored in specified files " #~ "or stdin" #~ msgstr "" #~ "Update the trustdb with the ownertrust values stored in specified files " #~ "or stdin" #~ msgid "Create signature caches in the keyring" #~ msgstr "Create signature caches in the keyring" #~ msgid "" #~ "Print message digest of specified algorithm for all given files or stdin" #~ msgstr "" #~ "Print message digest of specified algorithm for all given files or stdin" #~ msgid "Print message digest of all algorithms for all given files or stdin" #~ msgstr "Print message digest of all algorithms for all given files or stdin" #~ msgid "Emit specified number of random bytes of the given quality level" #~ msgstr "Emit specified number of random bytes of the given quality level" #~ msgid "Display version and supported algorithms, and exit" #~ msgstr "Display version and supported algorithms, and exit" #~ msgid "Display warranty and exit" #~ msgstr "Display warranty and exit" #~ msgid "Create ASCII armored output" #~ msgstr "Create ASCII armored output" #~ msgid "" #~ "Sets a limit on the number of bytes that will be generated when " #~ "processing a file" #~ msgstr "" #~ "Sets a limit on the number of bytes that will be generated when " #~ "processing a file" #~ msgid "Use specified key as the key to sign with" #~ msgstr "Use specified key as the key to sign with" #~ msgid "Use specified key as the default key to sign with" #~ msgstr "Use specified key as the default key to sign with" #~ msgid "Encrypt for specified user id" #~ msgstr "Encrypt for specified user id" #~ msgid "Encrypt for specified user id, but hide the keyid of the key" #~ msgstr "Encrypt for specified user id, but hide the keyid of the key" #~ msgid "Use specified user id as default recipient" #~ msgstr "Use specified user id as default recipient" #~ msgid "Use the default key as default recipient" #~ msgstr "Use the default key as default recipient" #~ msgid "Reset --default-recipient and --default-recipient-self" #~ msgstr "Reset --default-recipient and --default-recipient-self" #~ msgid "Give more information during processing" #~ msgstr "Give more information during processing" #~ msgid "Compression level" #~ msgstr "Compression level" #~ msgid "Use a different decompression method for BZIP2 compressed files" #~ msgstr "Use a different decompression method for BZIP2 compressed files" #~ msgid "" #~ "Treat input files as text and store them in the OpenPGP canonical text " #~ "form with standard 'CRLF' line endings" #~ msgstr "" #~ "Treat input files as text and store them in the OpenPGP canonical text " #~ "form with standard “CRLF†line endings" #~ msgid "" #~ "Don't treat input files as text and store them in the OpenPGP canonical " #~ "text form with standard 'CRLF' line endings" #~ msgstr "" #~ "Don't treat input files as text and store them in the OpenPGP canonical " #~ "text form with standard “CRLF†line endings" #~ msgid "Don't make any changes (this is not completely implemented)" #~ msgstr "Don't make any changes (this is not completely implemented)" #~ msgid "Batch mode" #~ msgstr "Batch mode" #~ msgid "Don't use batch mode" #~ msgstr "Don't use batch mode" #~ msgid "Never write output to terminal" #~ msgstr "Never write output to terminal" #~ msgid "Assume yes on most questions" #~ msgstr "Assume yes on most questions" #~ msgid "Assume no on most questions" #~ msgstr "Assume no on most questions" #~ msgid "Prompt for a certification level when making a key signature" #~ msgstr "Prompt for a certification level when making a key signature" #~ msgid "Don't prompt for a certification level when making a key signature" #~ msgstr "Don't prompt for a certification level when making a key signature" #~ msgid "" #~ "The default certification level to use for the level check when signing a " #~ "key" #~ msgstr "" #~ "The default certification level to use for the level check when signing a " #~ "key" #~ msgid "" #~ "Disregard any signatures with a certification level below specified level " #~ "when building the trust database" #~ msgstr "" #~ "Disregard any signatures with a certification level below specified level " #~ "when building the trust database" #~ msgid "" #~ "Assume that the specified key is as trustworthy as one of your own secret " #~ "keys" #~ msgstr "" #~ "Assume that the specified key is as trustworthy as one of your own secret " #~ "keys" #~ msgid "Select how to display key IDs" #~ msgstr "Select how to display key IDs" #~ msgid "Options for the keyserver" #~ msgstr "Options for the keyserver" #~ msgid "Options for importing keys" #~ msgstr "Options for importing keys" #~ msgid "Options for exporting keys" #~ msgstr "Options for exporting keys" #~ msgid "Options for listing keys and signatures" #~ msgstr "Options for listing keys and signatures" #~ msgid "Options for verifying signatures" #~ msgstr "Options for verifying signatures" #~ msgid "" #~ "Display the keyring name at the head of key listings to show which " #~ "keyring a given key resides on" #~ msgstr "" #~ "Display the keyring name at the head of key listings to show which " #~ "keyring a given key resides on" #~ msgid "Set the home directory" #~ msgstr "Set the home directory" #~ msgid "Set the native character set" #~ msgstr "Set the native character set" #~ msgid "Assume that following command line arguments are given in UTF8" #~ msgstr "Assume that following command line arguments are given in UTF8" #~ msgid "" #~ "Assume that following arguments are encoded in the character set " #~ "specified by --display-charset" #~ msgstr "" #~ "Assume that following arguments are encoded in the character set " #~ "specified by --display-charset" #~ msgid "Shortcut for '--options /dev/null'" #~ msgstr "Shortcut for '--options /dev/null'" #~ msgid "Write attribute subpackets to the specified file descriptor" #~ msgstr "Write attribute subpackets to the specified file descriptor" #~ msgid "Include secret key comment packets when exporting secret keys" #~ msgstr "Include secret key comment packets when exporting secret keys" #~ msgid "Don't include secret key comment packets when exporting secret keys" #~ msgstr "Don't include secret key comment packets when exporting secret keys" #~ msgid "Don't use a comment string" #~ msgstr "Don't use a comment string" #~ msgid "Include the version string in ASCII armored output" #~ msgstr "Include the version string in ASCII armored output" #~ msgid "Don't include the version string in ASCII armored output" #~ msgstr "Don't include the version string in ASCII armored output" #~ msgid "Set the 'for your eyes only' flag in the message" #~ msgstr "Set the “for your eyes only†flag in the message" #~ msgid "Clear the 'for your eyes only' flag in the message" #~ msgstr "Clear the “for your eyes only†flag in the message" #~ msgid "Create file with name as given in data" #~ msgstr "Create file with name as given in data" #~ msgid "Don't create file with name as given in data" #~ msgstr "Don't create file with name as given in data" #~ msgid "Use specified cipher algorithm" #~ msgstr "Use specified cipher algorithm" #~ msgid "Use specified message digest algorithm" #~ msgstr "Use specified message digest algorithm" #~ msgid "Use specified compression algorithm" #~ msgstr "Use specified compression algorithm" #~ msgid "Use specified message digest algorithm when signing a key" #~ msgstr "Use specified message digest algorithm when signing a key" #~ msgid "Use specified cipher algorithm to protect secret keys" #~ msgstr "Use specified cipher algorithm to protect secret keys" #~ msgid "Use specified digest algorithm to mangle the passphrases" #~ msgstr "Use specified digest algorithm to mangle the passphrases" #~ msgid "Selects how passphrases are mangled" #~ msgstr "Selects how passphrases are mangled" #~ msgid "Integrity protect secret keys by using a SHA-1 checksum" #~ msgstr "Integrity protect secret keys by using a SHA-1 checksum" #~ msgid "Never allow the use of specified cipher algorithm" #~ msgstr "Never allow the use of specified cipher algorithm" #~ msgid "Never allow the use of specified public key algorithm" #~ msgstr "Never allow the use of specified public key algorithm" #~ msgid "Do not cache the verification status of key signatures" #~ msgstr "Do not cache the verification status of key signatures" #~ msgid "Do not verify each signature right after creation" #~ msgstr "Do not verify each signature right after creation" #~ msgid "Automatically run the --check-trustdb command internally when needed" #~ msgstr "" #~ "Automatically run the --check-trustdb command internally when needed" #~ msgid "Never automatically run the --check-trustdb" #~ msgstr "Never automatically run the --check-trustdb" #~ msgid "Do not put the recipient keyid into encrypted packets" #~ msgstr "Do not put the recipient keyid into encrypted packets" #~ msgid "Put the recipient keyid into encrypted packets" #~ msgstr "Put the recipient keyid into encrypted packets" #~ msgid "" #~ "Change the behavior of cleartext signatures so that they can be used for " #~ "patch files" #~ msgstr "" #~ "Change the behavior of cleartext signatures so that they can be used for " #~ "patch files" #~ msgid "Mangle From-field of email headers (default)" #~ msgstr "Mangle From-field of email headers (default)" #~ msgid "Do not mangle From-field of email headers" #~ msgstr "Do not mangle From-field of email headers" #~ msgid "Try to use the GnuPG-Agent" #~ msgstr "Try to use the GnuPG-Agent" #~ msgid "Do not try to use the GnuPG-Agent" #~ msgstr "Do not try to use the GnuPG-Agent" #~ msgid "Force v3 signatures for signatures on data" #~ msgstr "Force v3 signatures for signatures on data" #~ msgid "Do not force v3 signatures for signatures on data" #~ msgstr "Do not force v3 signatures for signatures on data" #~ msgid "Always use v4 key signatures even on v3 keys" #~ msgstr "Always use v4 key signatures even on v3 keys" #~ msgid "Don't use v4 key signatures on v3 keys" #~ msgstr "Don't use v4 key signatures on v3 keys" #~ msgid "Force the use of encryption with a modification detection code" #~ msgstr "Force the use of encryption with a modification detection code" #~ msgid "Disable the use of the modification detection code" #~ msgstr "Disable the use of the modification detection code" #~ msgid "" #~ "Allow the import and use of keys with user IDs which are not self-signed" #~ msgstr "" #~ "Allow the import and use of keys with user IDs which are not self-signed" #~ msgid "" #~ "Do not allow the import and use of keys with user IDs which are not self-" #~ "signed" #~ msgstr "" #~ "Do not allow the import and use of keys with user IDs which are not self-" #~ "signed" #~ msgid "" #~ "Disable all checks on the form of the user ID while generating a new one" #~ msgstr "" #~ "Disable all checks on the form of the user ID while generating a new one" #~ msgid "Do not fail if signature is older than key" #~ msgstr "Do not fail if signature is older than key" #~ msgid "Allow subkeys that have a timestamp from the future" #~ msgstr "Allow subkeys that have a timestamp from the future" #~ msgid "Ignore CRC errors" #~ msgstr "Ignore CRC errors" #~ msgid "Do not fail on MDC integrity protection failure" #~ msgstr "Do not fail on MDC integrity protection failure" #~ msgid "" #~ "Lock the databases the first time a lock is requested and do not release " #~ "the lock until the process terminates" #~ msgstr "" #~ "Lock the databases the first time a lock is requested and do not release " #~ "the lock until the process terminates" #~ msgid "Release the locks every time a lock is no longer needed" #~ msgstr "Release the locks every time a lock is no longer needed" #~ msgid "" #~ "Do not create an internal pool file for quicker generation of random " #~ "numbers" #~ msgstr "" #~ "Do not create an internal pool file for quicker generation of random " #~ "numbers" #~ msgid "Suppress the initial copyright message" #~ msgstr "Suppress the initial copyright message" #~ msgid "Suppress the warning about 'using insecure memory'" #~ msgstr "Suppress the warning about “using insecure memoryâ€" #~ msgid "" #~ "Suppress the warning about unsafe file and home directory (--homedir) " #~ "permissions" #~ msgstr "" #~ "Suppress the warning about unsafe file and home directory (--homedir) " #~ "permissions" #~ msgid "Suppress the warning about missing MDC integrity protection" #~ msgstr "Suppress the warning about missing MDC integrity protection" #~ msgid "Refuse to run if GnuPG cannot get secure memory" #~ msgstr "Refuse to run if GnuPG cannot get secure memory" #~ msgid "Do not refuse to run if GnuPG cannot get secure memory (default)" #~ msgstr "Do not refuse to run if GnuPG cannot get secure memory (default)" #~ msgid "Assume the input data is not in ASCII armored format" #~ msgstr "Assume the input data is not in ASCII armored format" #~ msgid "Do not add the default keyrings to the list of keyrings" #~ msgstr "Do not add the default keyrings to the list of keyrings" #~ msgid "Skip the signature verification step" #~ msgstr "Skip the signature verification step" #~ msgid "Print key listings delimited by colons" #~ msgstr "Print key listings delimited by colons" #~ msgid "" #~ "Print key listings delimited by colons (like --with-colons) and print the " #~ "public key data" #~ msgstr "" #~ "Print key listings delimited by colons (like --with-colons) and print the " #~ "public key data" #~ msgid "" #~ "Same as the command --fingerprint but changes only the format of the " #~ "output and may be used together with another command" #~ msgstr "" #~ "Same as the command --fingerprint but changes only the format of the " #~ "output and may be used together with another command" #~ msgid "Changes the output of the list commands to work faster" #~ msgstr "Changes the output of the list commands to work faster" #~ msgid "" #~ "Do not merge primary user ID and primary key in --with-colon listing mode " #~ "and print all timestamps as UNIX timestamps" #~ msgstr "" #~ "Do not merge primary user ID and primary key in --with-colon listing mode " #~ "and print all timestamps as UNIX timestamps" #~ msgid "" #~ "Changes the behaviour of some commands. This is like --dry-run but " #~ "different" #~ msgstr "" #~ "Changes the behaviour of some commands. This is like --dry-run but " #~ "different" #~ msgid "Prompt for an expiration time" #~ msgstr "Prompt for an expiration time" #~ msgid "Do not prompt for an expiration time" #~ msgstr "Do not prompt for an expiration time" #~ msgid "" #~ "Don't look at the key ID as stored in the message but try all secret keys " #~ "in turn to find the right decryption key" #~ msgstr "" #~ "Don't look at the key ID as stored in the message but try all secret keys " #~ "in turn to find the right decryption key" #~ msgid "" #~ "Enable a mode in which filenames of the form -&n, where n is a non-" #~ "negative decimal number, refer to the file descriptor n and not to a file " #~ "with that name" #~ msgstr "" #~ "Enable a mode in which filenames of the form -&n, where n is a non-" #~ "negative decimal number, refer to the file descriptor n and not to a file " #~ "with that name" #~ msgid "Remove a given entry from the --group list" #~ msgstr "Remove a given entry from the --group list" #~ msgid "Remove all entries from the --group list" #~ msgstr "Remove all entries from the --group list" #~ msgid "" #~ "Don't change the permissions of a secret keyring back to user read/write " #~ "only" #~ msgstr "" #~ "Don't change the permissions of a secret keyring back to user read/write " #~ "only" #~ msgid "Print annotated source" #~ msgstr "Print annotated source" #~ msgid "Do not print explanations" #~ msgstr "Do not print explanations" #~ msgid "Print tally" #~ msgstr "Print tally" #~ msgid "Display summary" #~ msgstr "Display summary" #~ msgid "Search directories for source" #~ msgstr "Search directories for source" #~ msgid "No annotated source" #~ msgstr "No annotated source" #~ msgid "Print flat profile" #~ msgstr "Print flat profile" #~ msgid "No flat profile" #~ msgstr "No flat profile" #~ msgid "Print call graph" #~ msgstr "Print call graph" #~ msgid "No call graph" #~ msgstr "No call graph" #~ msgid "Annotate to file" #~ msgstr "Annotate to file" #~ msgid "No tally" #~ msgstr "No tally" #~ msgid "Suggest function ordering" #~ msgstr "Suggest function ordering" #~ msgid "Suggest file ordering" #~ msgstr "Suggest file ordering" #~ msgid "Traditional mode" #~ msgstr "Traditional mode" #~ msgid "Set width of output" #~ msgstr "Set width of output" #~ msgid "Annotate every line" #~ msgstr "Annotate every line" #~ msgid "Set demangling style" #~ msgstr "Set demangling style" #~ msgid "Supress static functions" #~ msgstr "Supress static functions" #~ msgid "Ignore symbols not known to be functions" #~ msgstr "Ignore symbols not known to be functions" #~ msgid "Line by line profiling" #~ msgstr "Line by line profiling" #~ msgid "Only propagate times for matching symbols" #~ msgstr "Only propagate times for matching symbols" #~ msgid "Do not propagate times for matching symbols" #~ msgstr "Do not propagate times for matching symbols" #~ msgid "Mention unused functions in flat profile" #~ msgstr "Mention unused functions in flat profile" #~ msgid "Specify debugging options" #~ msgstr "Specify debugging options" #~ msgid "Print summary" #~ msgstr "Print summary" #~ msgid "Print NUM lines of trailing context" #~ msgstr "Print NUM lines of trailing context" #~ msgid "Process binary file as text" #~ msgstr "Process binary file as text" #~ msgid "Print NUM lines of leading context" #~ msgstr "Print NUM lines of leading context" #~ msgid "Print NUM lines of context" #~ msgstr "Print NUM lines of context" #~ msgid "Assume data type for binary files" #~ msgstr "Assume data type for binary files" #~ msgid "Pattern is extended regexp" #~ msgstr "Pattern is extended regexp" #~ msgid "Pattern is a regexp" #~ msgstr "Pattern is a regexp" #~ msgid "Pattern is a fixed string" #~ msgstr "Pattern is a fixed string" #~ msgid "Pattern is basic regex" #~ msgstr "Pattern is basic regex" #~ msgid "Print filename" #~ msgstr "Print filename" #~ msgid "Supress printing filename" #~ msgstr "Supress printing filename" #~ msgid "Skip binary files" #~ msgstr "Skip binary files" #~ msgid "Ignore case" #~ msgstr "Ignore case" #~ msgid "Print first non-matching file" #~ msgstr "Print first non-matching file" #~ msgid "Print first matching file" #~ msgstr "Print first matching file" #~ msgid "Stop reading after NUM matches" #~ msgstr "Stop reading after NUM matches" #~ msgid "Use the mmap system call to read input" #~ msgstr "Use the mmap system call to read input" #~ msgid "Print linenumber" #~ msgstr "Print linenumber" #~ msgid "Show only matching part" #~ msgstr "Show only matching part" #~ msgid "Rename stdin" #~ msgstr "Rename stdin" #~ msgid "Use line buffering" #~ msgstr "Use line buffering" #~ msgid "Do not write anything" #~ msgstr "Do not write anything" #~ msgid "Recurse, search file matching PATTERN" #~ msgstr "Recurse, search file matching PATTERN" #~ msgid "Recurse, skip file matching PATTERN" #~ msgstr "Recurse, skip file matching PATTERN" #~ msgid "Suppress error messages" #~ msgstr "Suppress error messages" #~ msgid "Treat files as binary" #~ msgstr "Treat files as binary" #~ msgid "Report Unix-style byte offsets" #~ msgstr "Report Unix-style byte offsets" #~ msgid "Invert the sense of matching" #~ msgstr "Invert the sense of matching" #~ msgid "Only whole matching words" #~ msgstr "Only whole matching words" #~ msgid "Only whole matching lines" #~ msgstr "Only whole matching lines" #~ msgid "Output a zero byte after filename" #~ msgstr "Output a zero byte after filename" #~ msgid "List compression information" #~ msgstr "List compression information" #~ msgid "Do not save/restore filename" #~ msgstr "Do not save/restore filename" #~ msgid "Save/restore filename" #~ msgstr "Save/restore filename" #~ msgid "Supress warnings" #~ msgstr "Supress warnings" #~ msgid "Recurse directories" #~ msgstr "Recurse directories" #~ msgid "Display compression ratios" #~ msgstr "Display compression ratios" #~ msgid "Use fast setting" #~ msgstr "Use fast setting" #~ msgid "Use high compression setting" #~ msgstr "Use high compression setting" #~ msgid "Help for the specified builtin" #~ msgstr "Help for the specified builtin" #~ msgid "A short summary of all builtin commands" #~ msgstr "A short summary of all builtin commands" #~ msgid "Print effective group id" #~ msgstr "Print effective group id" #~ msgid "Print all group ids" #~ msgstr "Print all group ids" #~ msgid "Print name, not number" #~ msgstr "Print name, not number" #~ msgid "Print real ID, not effective" #~ msgstr "Print real ID, not effective" #~ msgid "Print effective user ID" #~ msgstr "Print effective user ID" #~ msgid "Show the process id of each process in the job" #~ msgstr "Show the process id of each process in the job" #~ msgid "Show group id of job" #~ msgstr "Show group id of job" #~ msgid "Show commandname of each job" #~ msgstr "Show commandname of each job" #~ msgid "Only show status for last job to be started" #~ msgstr "Only show status for last job to be started" #~ msgid "List names of available signals" #~ msgstr "List names of available signals" #~ msgid "Search after end of screen" #~ msgstr "Search after end of screen" #~ msgid "Disable automtic buffer allocation" #~ msgstr "Disable automtic buffer allocation" #~ msgid "Repaint from top" #~ msgstr "Repaint from top" #~ msgid "Clear and repaint from top" #~ msgstr "Clear and repaint from top" #~ msgid "Supress error for lacking terminal capability" #~ msgstr "Supress error for lacking terminal capability" #~ msgid "Exit on second EOF" #~ msgstr "Exit on second EOF" #~ msgid "Exit on EOF" #~ msgstr "Exit on EOF" #~ msgid "Open non-regular files" #~ msgstr "Open non-regular files" #~ msgid "Quit if file shorter than one screen" #~ msgstr "Quit if file shorter than one screen" #~ msgid "Hilight one search target" #~ msgstr "Hilight one search target" #~ msgid "No search highlighting" #~ msgstr "No search highlighting" #~ msgid "Maximum backward scroll" #~ msgstr "Maximum backward scroll" #~ msgid "Search ignores lowercase case" #~ msgstr "Search ignores lowercase case" #~ msgid "Search ignores all case" #~ msgstr "Search ignores all case" #~ msgid "Target line" #~ msgstr "Target line" #~ msgid "Display status column" #~ msgstr "Display status column" #~ msgid "Specify key bindings file" #~ msgstr "Specify key bindings file" #~ msgid "Verbose prompt" #~ msgstr "Verbose prompt" #~ msgid "Display line number" #~ msgstr "Display line number" #~ msgid "Display line number for each line" #~ msgstr "Display line number for each line" #~ msgid "Log input to file" #~ msgstr "Log input to file" #~ msgid "Log to file, overwrite" #~ msgstr "Log to file, overwrite" #~ msgid "Start at first occurrence of pattern" #~ msgstr "Start at first occurrence of pattern" #~ msgid "Prompt string" #~ msgstr "Prompt string" #~ msgid "Silent mode" #~ msgstr "Silent mode" #~ msgid "Completly silent mode" #~ msgstr "Completly silent mode" #~ msgid "Display control chars" #~ msgstr "Display control chars" #~ msgid "Display control chars, guess screen appearance" #~ msgstr "Display control chars, guess screen appearance" #~ msgid "Multiple blank lines sqeezed" #~ msgstr "Multiple blank lines sqeezed" #~ msgid "Do not fold long lines" #~ msgstr "Do not fold long lines" #~ msgid "Edit tag" #~ msgstr "Edit tag" #~ msgid "Set tag file" #~ msgstr "Set tag file" #~ msgid "Allow backspace and carriage return" #~ msgstr "Allow backspace and carriage return" #~ msgid "Allow backspace, tab and carriage return" #~ msgstr "Allow backspace, tab and carriage return" #~ msgid "Highlight first unread line on new page" #~ msgstr "Highlight first unread line on new page" #~ msgid "Highlight first unread line on any movement" #~ msgstr "Highlight first unread line on any movement" #~ msgid "Set tab stops" #~ msgstr "Set tab stops" #~ msgid "No termcap init" #~ msgstr "No termcap init" #~ msgid "No keypad init" #~ msgstr "No keypad init" #~ msgid "Maximum forward scroll" #~ msgstr "Maximum forward scroll" #~ msgid "Max scroll window" #~ msgstr "Max scroll window" #~ msgid "Set quote char" #~ msgstr "Set quote char" #~ msgid "Lines after EOF are blank" #~ msgstr "Lines after EOF are blank" #~ msgid "Characters to scroll on left/right arrows" #~ msgstr "Characters to scroll on left/right arrows" #~ msgid "Append dependencies to makefile" #~ msgstr "Append dependencies to makefile" #~ msgid "Warn about multiple inclusion" #~ msgstr "Warn about multiple inclusion" #~ msgid "Environment before makefile" #~ msgstr "Environment before makefile" #~ msgid "Ignore errors" #~ msgstr "Ignore errors" #~ msgid "Continue after an error" #~ msgstr "Continue after an error" #~ msgid "Start when load drops" #~ msgstr "Start when load drops" #~ msgid "Do not execute commands" #~ msgstr "Do not execute commands" #~ msgid "Print database" #~ msgstr "Print database" #~ msgid "Question mode" #~ msgstr "Question mode" #~ msgid "Eliminate implicit rules" #~ msgstr "Eliminate implicit rules" #~ msgid "Don't continue after an error" #~ msgstr "Don't continue after an error" #~ msgid "Touch files, don't run commands" #~ msgstr "Touch files, don't run commands" #~ msgid "Program section" #~ msgstr "Program section" #~ msgid "Syscall section" #~ msgstr "Syscall section" #~ msgid "Library section" #~ msgstr "Library section" #~ msgid "Device section" #~ msgstr "Device section" #~ msgid "File format section" #~ msgstr "File format section" #~ msgid "Games section" #~ msgstr "Games section" #~ msgid "Misc section" #~ msgstr "Misc section" #~ msgid "Admin section" #~ msgstr "Admin section" #~ msgid "Kernel section" #~ msgstr "Kernel section" #~ msgid "Tcl section" #~ msgstr "Tcl section" #~ msgid "New section" #~ msgstr "New section" #~ msgid "Local section" #~ msgstr "Local section" #~ msgid "Old section" #~ msgstr "Old section" #~ msgid "Manpath" #~ msgstr "Manpath" #~ msgid "Pager" #~ msgstr "Pager" #~ msgid "Manual sections" #~ msgstr "Manual sections" #~ msgid "Display all matches" #~ msgstr "Display all matches" #~ msgid "Always reformat" #~ msgstr "Always reformat" #~ msgid "Debug" #~ msgstr "Debug" #~ msgid "Debug and run" #~ msgstr "Debug and run" #~ msgid "Show whatis information" #~ msgstr "Show whatis information" #~ msgid "Format only" #~ msgstr "Format only" #~ msgid "Show apropos information" #~ msgstr "Show apropos information" #~ msgid "Search in all man pages" #~ msgstr "Search in all man pages" #~ msgid "Set system" #~ msgstr "Set system" #~ msgid "Preprocessors" #~ msgstr "Preprocessors" #~ msgid "Format for printing" #~ msgstr "Format for printing" #~ msgid "Only print locations" #~ msgstr "Only print locations" #~ msgid "Input is a file, use name and contents to determine mimetype" #~ msgstr "Input is a file, use name and contents to determine mimetype" #~ msgid "Input is a file, use name to determine mimetype" #~ msgstr "Input is a file, use name to determine mimetype" #~ msgid "Input is a mimetype" #~ msgstr "Input is a mimetype" #~ msgid "Output mimetype" #~ msgstr "Output mimetype" #~ msgid "Output description of mimetype" #~ msgstr "Output description of mimetype" #~ msgid "Output default action for mimetype" #~ msgstr "Output default action for mimetype" #~ msgid "Launch default action for each file" #~ msgstr "Launch default action for each file" #~ msgid "Print messages about what the program is doing" #~ msgstr "Print messages about what the program is doing" #~ msgid "Dump configuration file" #~ msgstr "Dump configuration file" #~ msgid "Do not actually insert/remove module" #~ msgstr "Do not actually insert/remove module" #~ msgid "Ignore install and remove commands in configuration file" #~ msgstr "Ignore install and remove commands in configuration file" #~ msgid "Ignore bogus module names" #~ msgstr "Ignore bogus module names" #~ msgid "Remove modules" #~ msgstr "Remove modules" #~ msgid "Ignore module interface version" #~ msgstr "Ignore module interface version" #~ msgid "List all modules matching the given wildcard" #~ msgstr "List all modules matching the given wildcard" #~ msgid "Insert modules matching the given wildcard" #~ msgstr "Insert modules matching the given wildcard" #~ msgid "Restrict wildcards to specified directory" #~ msgstr "Restrict wildcards to specified directory" #~ msgid "Send error messages through syslog" #~ msgstr "Send error messages through syslog" #~ msgid "List dependencies of module" #~ msgstr "List dependencies of module" #~ msgid "Rename module" #~ msgstr "Rename module" #~ msgid "Fail if inserting already loaded module" #~ msgstr "Fail if inserting already loaded module" #~ msgid "Mount filesystems in fstab" #~ msgstr "Mount filesystems in fstab" #~ msgid "Fork process for each mount" #~ msgstr "Fork process for each mount" #~ msgid "Fake mounting" #~ msgstr "Fake mounting" #~ msgid "Add label to output" #~ msgstr "Add label to output" #~ msgid "Do not write mtab" #~ msgstr "Do not write mtab" #~ msgid "Tolerate sloppy mount options" #~ msgstr "Tolerate sloppy mount options" #~ msgid "Read/Write mode" #~ msgstr "Read/Write mode" #~ msgid "Dynamically change postprocessing" #~ msgstr "Dynamically change postprocessing" #~ msgid "Skip frames to maintain A/V sync" #~ msgstr "Skip frames to maintain A/V sync" #~ msgid "Play in random order" #~ msgstr "Play in random order" #~ msgid "Full screen" #~ msgstr "Full screen" #~ msgid "Audio language" #~ msgstr "Audio language" #~ msgid "Play audio from file" #~ msgstr "Play audio from file" #~ msgid "Set default CD-ROM drive" #~ msgstr "Set default CD-ROM drive" #~ msgid "Set number of audio channels" #~ msgstr "Set number of audio channels" #~ msgid "Set start chapter" #~ msgstr "Set start chapter" #~ msgid "Set default DVD-ROM drive" #~ msgstr "Set default DVD-ROM drive" #~ msgid "Set dvd viewing angle" #~ msgstr "Set dvd viewing angle" #~ msgid "Force rebuilding index" #~ msgstr "Force rebuilding index" #~ msgid "Override framerate" #~ msgstr "Override framerate" #~ msgid "Build index if unavailable" #~ msgstr "Build index if unavailable" #~ msgid "Load index from file" #~ msgstr "Load index from file" #~ msgid "Force non-interleaved AVI parser" #~ msgstr "Force non-interleaved AVI parser" #~ msgid "Rebuild index and save to file" #~ msgstr "Rebuild index and save to file" #~ msgid "TV capture mode" #~ msgstr "TV capture mode" #~ msgid "Subtitle language" #~ msgstr "Subtitle language" #~ msgid "Subtitle file" #~ msgstr "Subtitle file" #~ msgid "Handle subtitlefile as unicode" #~ msgstr "Handle subtitlefile as unicode" #~ msgid "Handle subtitlefile as utf8" #~ msgstr "Handle subtitlefile as utf8" #~ msgid "Also print directory history" #~ msgstr "Also print directory history" #~ msgid "Increment priority by specified number first" #~ msgstr "Increment priority by specified number first" #~ msgid "" #~ "Make backup files, when patching a file, rename or copy the original " #~ "instead of removing it" #~ msgstr "" #~ "Make backup files, when patching a file, rename or copy the original " #~ "instead of removing it" #~ msgid "Back up a file if the patch does not match the file exactly" #~ msgstr "Back up a file if the patch does not match the file exactly" #~ msgid "Do not back up a file if the patch does not match the file exactly" #~ msgstr "Do not back up a file if the patch does not match the file exactly" #~ msgid "" #~ "Prefix pref to a file name when generating its simple backup file name" #~ msgstr "" #~ "Prefix pref to a file name when generating its simple backup file name" #~ msgid "Read and write all files in binary mode" #~ msgstr "Read and write all files in binary mode" #~ msgid "Interpret the patch file as a ordinary context diff" #~ msgstr "Interpret the patch file as a ordinary context diff" #~ msgid "Change to the directory dir immediately" #~ msgstr "Change to the directory dir immediately" #~ msgid "Use the #ifdef ... #endif construct to mark changes" #~ msgstr "Use the #ifdef ... #endif construct to mark changes" #~ msgid "" #~ "Print the results of applying the patches without actually changing any " #~ "files" #~ msgstr "" #~ "Print the results of applying the patches without actually changing any " #~ "files" #~ msgid "Interpret the patch file as an ed script" #~ msgstr "Interpret the patch file as an ed script" #~ msgid "" #~ "Remove output files that are empty after the patches have been applied" #~ msgstr "" #~ "Remove output files that are empty after the patches have been applied" #~ msgid "" #~ "Assume that the user knows exactly what he/she is doing, and do not ask " #~ "questions" #~ msgstr "" #~ "Assume that the user knows exactly what he/she is doing, and do not ask " #~ "questions" #~ msgid "Set the maximum fuzz factor" #~ msgstr "Set the maximum fuzz factor" #~ msgid "" #~ "This option controls patch's actions when a file is under RCS or SCCS " #~ "control, and does not exist or is read-only and matches the default " #~ "version, or when a file is under ClearCase control and does not exist" #~ msgstr "" #~ "This option controls patch's actions when a file is under RCS or SCCS " #~ "control, and does not exist or is read-only and matches the default " #~ "version, or when a file is under ClearCase control and does not exist" #~ msgid "" #~ "Match patterns loosely, in case tabs or spaces have been munged in your " #~ "files" #~ msgstr "" #~ "Match patterns loosely, in case tabs or spaces have been munged in your " #~ "files" #~ msgid "Interpret the patch file as a normal diff" #~ msgstr "Interpret the patch file as a normal diff" #~ msgid "Ignore patches that seem to be reversed or already applied" #~ msgstr "Ignore patches that seem to be reversed or already applied" #~ msgid "Send output to outfile instead of patching files in place" #~ msgstr "Send output to outfile instead of patching files in place" #~ msgid "" #~ "Strip the smallest prefix containing num leading slashes from each file " #~ "name found in the patch file" #~ msgstr "" #~ "Strip the smallest prefix containing num leading slashes from each file " #~ "name found in the patch file" #~ msgid "Conform more strictly to the POSIX standard" #~ msgstr "Conform more strictly to the POSIX standard" #~ msgid "Use style word to quote output names" #~ msgstr "Use style word to quote output names" #~ msgid "Put rejects into rejectfile instead of the default .rej file" #~ msgstr "Put rejects into rejectfile instead of the default .rej file" #~ msgid "" #~ "Assume that this patch was created with the old and new files swapped" #~ msgstr "" #~ "Assume that this patch was created with the old and new files swapped" #~ msgid "Work silently, unless an error occurs" #~ msgstr "Work silently, unless an error occurs" #~ msgid "Suppress questions like -f, but make some different assumptions" #~ msgstr "Suppress questions like -f, but make some different assumptions" #~ msgid "" #~ "Set the modification and access times of patched files from time stamps " #~ "given in context diff headers, local time" #~ msgstr "" #~ "Set the modification and access times of patched files from time stamps " #~ "given in context diff headers, local time" #~ msgid "Interpret the patch file as a unified context diff" #~ msgstr "Interpret the patch file as a unified context diff" #~ msgid "Use method to determine backup file names" #~ msgstr "Use method to determine backup file names" #~ msgid "Set internal debugging flags of interest only to patch patchers" #~ msgstr "Set internal debugging flags of interest only to patch patchers" #~ msgid "" #~ "Prefix pref to the basename of a file name when generating its simple " #~ "backup file name" #~ msgstr "" #~ "Prefix pref to the basename of a file name when generating its simple " #~ "backup file name" #~ msgid "Use suffix as the simple backup suffix" #~ msgstr "Use suffix as the simple backup suffix" #~ msgid "" #~ "Set the modification and access times of patched files from time stamps " #~ "given in context diff headers, UTC, GMT" #~ msgstr "" #~ "Set the modification and access times of patched files from time stamps " #~ "given in context diff headers, UTC, GMT" #~ msgid "Specify record separator" #~ msgstr "Specify record separator" #~ msgid "Turn on autosplit mode" #~ msgstr "Turn on autosplit mode" #~ msgid "Check syntax" #~ msgstr "Check syntax" #~ msgid "Debugger" #~ msgstr "Debugger" #~ msgid "Set regexp used to split input" #~ msgstr "Set regexp used to split input" #~ msgid "Edit files in-place" #~ msgstr "Edit files in-place" #~ msgid "Include path" #~ msgstr "Include path" #~ msgid "Automatic line ending processing" #~ msgstr "Automatic line ending processing" #~ msgid "Loop script" #~ msgstr "Loop script" #~ msgid "Loop script, print $_" #~ msgstr "Loop script, print $_" #~ msgid "Invoke CPP" #~ msgstr "Invoke CPP" #~ msgid "Define custom switches" #~ msgstr "Define custom switches" #~ msgid "Search $PATH for script" #~ msgstr "Search $PATH for script" #~ msgid "Taint checking" #~ msgstr "Taint checking" #~ msgid "Unsafe mode" #~ msgstr "Unsafe mode" #~ msgid "Extract script" #~ msgstr "Extract script" #~ msgid "Open folder" #~ msgstr "Open folder" #~ msgid "Open file" #~ msgstr "Open file" #~ msgid "Initial set of keystrokes" #~ msgstr "Initial set of keystrokes" #~ msgid "Use function keys for commands" #~ msgstr "Use function keys for commands" #~ msgid "Expand collections in FOLDER LIST display" #~ msgstr "Expand collections in FOLDER LIST display" #~ msgid "Start with specified current message number" #~ msgstr "Start with specified current message number" #~ msgid "Open folder read-only" #~ msgstr "Open folder read-only" #~ msgid "Set configuration file" #~ msgstr "Set configuration file" #~ msgid "Set global configuration file" #~ msgstr "Set global configuration file" #~ msgid "Enable suspension support" #~ msgstr "Enable suspension support" #~ msgid "Produce a sample global configuration file" #~ msgstr "Produce a sample global configuration file" #~ msgid "Produce sample configuration file" #~ msgstr "Produce sample configuration file" #~ msgid "Set mail sort order" #~ msgstr "Set mail sort order" #~ msgid "Config option" #~ msgstr "Config option" #~ msgid "Audible ping" #~ msgstr "Audible ping" #~ msgid "Adaptive ping" #~ msgstr "Adaptive ping" #~ msgid "Allow pinging a broadcast address" #~ msgstr "Allow pinging a broadcast address" #~ msgid "Do not allow ping to change source address of probes" #~ msgstr "Do not allow ping to change source address of probes" #~ msgid "Stop after specified number of ECHO_REQUEST packets" #~ msgstr "Stop after specified number of ECHO_REQUEST packets" #~ msgid "Set the SO_DEBUG option on the socket being used" #~ msgstr "Set the SO_DEBUG option on the socket being used" #~ msgid "Allocate and set 20 bit flow label on ECHO_REQUEST packets" #~ msgstr "Allocate and set 20 bit flow label on ECHO_REQUEST packets" #~ msgid "Flood ping" #~ msgstr "Flood ping" #~ msgid "Wait specified interval of seconds between sending each packet" #~ msgstr "Wait specified interval of seconds between sending each packet" #~ msgid "Set source address to specified interface address" #~ msgstr "Set source address to specified interface address" #~ msgid "Send the specified number of packets without waiting for reply" #~ msgstr "Send the specified number of packets without waiting for reply" #~ msgid "Suppress loopback of multicast packets" #~ msgstr "Suppress loopback of multicast packets" #~ msgid "Numeric output only" #~ msgstr "Numeric output only" #~ msgid "Pad packet with empty bytes" #~ msgstr "Pad packet with empty bytes" #~ msgid "Set Quality of Service -related bits in ICMP datagrams" #~ msgstr "Set Quality of Service -related bits in ICMP datagrams" #~ msgid "Record route" #~ msgstr "Record route" #~ msgid "" #~ "Bypass the normal routing tables and send directly to a host on an " #~ "attached interface" #~ msgstr "" #~ "Bypass the normal routing tables and send directly to a host on an " #~ "attached interface" #~ msgid "Specifies the number of data bytes to be sent" #~ msgstr "Specifies the number of data bytes to be sent" #~ msgid "Set socket buffer size" #~ msgstr "Set socket buffer size" #~ msgid "Set the IP Time to Live" #~ msgstr "Set the IP Time to Live" #~ msgid "Set special IP timestamp options" #~ msgstr "Set special IP timestamp options" #~ msgid "Select Path MTU Discovery strategy" #~ msgstr "Select Path MTU Discovery strategy" #~ msgid "Print full user-to-user latency" #~ msgstr "Print full user-to-user latency" #~ msgid "" #~ "Specify a timeout, in seconds, before ping exits regardless of how many " #~ "packets have been sent or received" #~ msgstr "" #~ "Specify a timeout, in seconds, before ping exits regardless of how many " #~ "packets have been sent or received" #~ msgid "Time to wait for a response, in seconds" #~ msgstr "Time to wait for a response, in seconds" #~ msgid "Select all" #~ msgstr "Select all" #~ msgid "Invert selection" #~ msgstr "Invert selection" #~ msgid "Select all processes except session leaders and terminal-less" #~ msgstr "Select all processes except session leaders and terminal-less" #~ msgid "Select all processes except session leaders" #~ msgstr "Select all processes except session leaders" #~ msgid "Deselect all processes that do not fulfill conditions" #~ msgstr "Deselect all processes that do not fulfill conditions" #~ msgid "Select by command" #~ msgstr "Select by command" #~ msgid "Select by group" #~ msgstr "Select by group" #~ msgid "Select by user" #~ msgstr "Select by user" #~ msgid "Select by group/session" #~ msgstr "Select by group/session" #~ msgid "Select by PID" #~ msgstr "Select by PID" #~ msgid "Select by parent PID" #~ msgstr "Select by parent PID" #~ msgid "Select by session ID" #~ msgstr "Select by session ID" #~ msgid "Select by tty" #~ msgstr "Select by tty" #~ msgid "Extra full format" #~ msgstr "Extra full format" #~ msgid "User defined format" #~ msgstr "User defined format" #~ msgid "Add column for security data" #~ msgstr "Add column for security data" #~ msgid "Full format" #~ msgstr "Full format" #~ msgid "Jobs format" #~ msgstr "Jobs format" #~ msgid "Do not show flags" #~ msgstr "Do not show flags" #~ msgid "Show hierarchy" #~ msgstr "Show hierarchy" #~ msgid "Set namelist file" #~ msgstr "Set namelist file" #~ msgid "Wide output" #~ msgstr "Wide output" #~ msgid "Show threads" #~ msgstr "Show threads" #~ msgid "Debug on" #~ msgstr "Debug on" #~ msgid "Ignore environment variables" #~ msgstr "Ignore environment variables" #~ msgid "Interactive mode after executing commands" #~ msgstr "Interactive mode after executing commands" #~ msgid "Enable optimizations" #~ msgstr "Enable optimizations" #~ msgid "Disable import of site module" #~ msgstr "Disable import of site module" #~ msgid "Warn on mixed tabs and spaces" #~ msgstr "Warn on mixed tabs and spaces" #~ msgid "Unbuffered input and output" #~ msgstr "Unbuffered input and output" #~ msgid "Ignore first line of input" #~ msgstr "Ignore first line of input" #~ msgid "Export variable to subprocess" #~ msgstr "Export variable to subprocess" #~ msgid "Make variable scope global" #~ msgstr "Make variable scope global" #~ msgid "Make variable scope local" #~ msgstr "Make variable scope local" #~ msgid "" #~ "Make variable scope universal, i.e. share variable with all the users " #~ "fish processes on this computer" #~ msgstr "" #~ "Make variable scope universal, i.e. share variable with all the users " #~ "fish processes on this computer" #~ msgid "Do not export variable to subprocess" #~ msgstr "Do not export variable to subprocess" #~ msgid "Force following parameters to be process ID's (The default)" #~ msgstr "Force following parameters to be process ID's (The default)" #~ msgid "Force following parameters to be interpreted as process group ID's" #~ msgstr "Force following parameters to be interpreted as process group ID's" #~ msgid "Force following parameters to be interpreted as user names" #~ msgstr "Force following parameters to be interpreted as user names" #~ msgid "Ignore errors from non-empty directories" #~ msgstr "Ignore errors from non-empty directories" #~ msgid "Remove each component of path" #~ msgstr "Remove each component of path" #~ msgid "Unlink directory (Only by superuser)" #~ msgstr "Unlink directory (Only by superuser)" #~ msgid "Never prompt before removal" #~ msgstr "Never prompt before removal" #~ msgid "Prompt before removal" #~ msgstr "Prompt before removal" #~ msgid "Recursively remove subdirectories" #~ msgstr "Recursively remove subdirectories" #~ msgid "Explain what is done" #~ msgstr "Explain what is done" #~ msgid "List of rpm configuration files" #~ msgstr "List of rpm configuration files" #~ msgid "Pipe output through specified command" #~ msgstr "Pipe output through specified command" #~ msgid "Specify directory for rpm database" #~ msgstr "Specify directory for rpm database" #~ msgid "" #~ "Translate all paths that start with first half of following parameter to " #~ "second half of following parameter" #~ msgstr "" #~ "Translate all paths that start with first half of following parameter to " #~ "second half of following parameter" #~ msgid "Kanji code-set" #~ msgstr "Kanji code-set" #~ msgid "Verbose mode without message" #~ msgstr "Verbose mode without message" #~ msgid "Compiler debug mode" #~ msgstr "Compiler debug mode" #~ msgid "" #~ "Preserves modification times, access times, and modes from the original " #~ "file" #~ msgstr "" #~ "Preserves modification times, access times, and modes from the original " #~ "file" #~ msgid "Recursively copy" #~ msgstr "Recursively copy" #~ msgid "Encyption program" #~ msgstr "Encyption program" #~ msgid "Disable all GNU extensions" #~ msgstr "Disable all GNU extensions" #~ msgid "Use extended regexp" #~ msgstr "Use extended regexp" #~ msgid "Consider files as separate" #~ msgstr "Consider files as separate" #~ msgid "Use minimal IO buffers" #~ msgstr "Use minimal IO buffers" #~ msgid "" #~ "Delay opening files until a command containing the related 'w' function " #~ "is applied" #~ msgstr "" #~ "Delay opening files until a command containing the related “w†function " #~ "is applied" #~ msgid "Make font bold" #~ msgstr "Make font bold" #~ msgid "Test if variable is defined" #~ msgstr "Test if variable is defined" #~ msgid "Ignore leading blanks" #~ msgstr "Ignore leading blanks" #~ msgid "Consider only blanks and alphanumerics" #~ msgstr "Consider only blanks and alphanumerics" #~ msgid "Compare general numeric value" #~ msgstr "Compare general numeric value" #~ msgid "Consider only printable" #~ msgstr "Consider only printable" #~ msgid "Compare month names" #~ msgstr "Compare month names" #~ msgid "Compare string numerical value" #~ msgstr "Compare string numerical value" #~ msgid "Reverse results" #~ msgstr "Reverse results" #~ msgid "Only check if sorted" #~ msgstr "Only check if sorted" #~ msgid "Define key" #~ msgstr "Define key" #~ msgid "Merge sorted files" #~ msgstr "Merge sorted files" #~ msgid "Stabilize sort" #~ msgstr "Stabilize sort" #~ msgid "Field separator" #~ msgstr "Field separator" #~ msgid "Output only first of equal lines" #~ msgstr "Output only first of equal lines" #~ msgid "Lines end with 0 byte" #~ msgstr "Lines end with 0 byte" #~ msgid "Disables forwarding of the authentication agent" #~ msgstr "Disables forwarding of the authentication agent" #~ msgid "Enables forwarding of the authentication agent" #~ msgstr "Enables forwarding of the authentication agent" #~ msgid "Go to background" #~ msgstr "Go to background" #~ msgid "Allow remote host to connect to local forwarded ports" #~ msgstr "Allow remote host to connect to local forwarded ports" #~ msgid "Smartcard device" #~ msgstr "Smartcard device" #~ msgid "Disable forwarding of Kerberos tickets" #~ msgstr "Disable forwarding of Kerberos tickets" #~ msgid "MAC algorithm" #~ msgstr "MAC algorithm" #~ msgid "Do not execute remote command" #~ msgstr "Do not execute remote command" #~ msgid "Subsystem" #~ msgstr "Subsystem" #~ msgid "Disable pseudo-tty allocation" #~ msgstr "Disable pseudo-tty allocation" #~ msgid "Disable X11 forwarding" #~ msgstr "Disable X11 forwarding" #~ msgid "Enable X11 forwarding" #~ msgstr "Enable X11 forwarding" #~ msgid "Locally forwarded ports" #~ msgstr "Locally forwarded ports" #~ msgid "Remotely forwarded ports" #~ msgstr "Remotely forwarded ports" #~ msgid "Dynamic port forwarding" #~ msgstr "Dynamic port forwarding" #~ msgid "Compression" #~ msgstr "Compression" #~ msgid "Enable debug" #~ msgstr "Enable debug" #~ msgid "Foreground operation" #~ msgstr "Foreground operation" #~ msgid "Disable multi-threaded operation" #~ msgstr "Disable multi-threaded operation" #~ msgid "Test if a command substitution is currently evaluated" #~ msgstr "Test if a command substitution is currently evaluated" #~ msgid "Test if a code block is currently evaluated" #~ msgstr "Test if a code block is currently evaluated" #~ msgid "Test if this is an interactive shell" #~ msgstr "Test if this is an interactive shell" #~ msgid "Test if this is a login shell" #~ msgstr "Test if this is a login shell" #~ msgid "Test if all new jobs are put under job control" #~ msgstr "Test if all new jobs are put under job control" #~ msgid "Test if only interactive new jobs are put under job control" #~ msgstr "Test if only interactive new jobs are put under job control" #~ msgid "Test if new jobs are never put under job control" #~ msgstr "Test if new jobs are never put under job control" #~ msgid "Set which jobs are out under job control" #~ msgstr "Set which jobs are out under job control" #~ msgid "" #~ "Print a list of all function calls leading up to running the current " #~ "command" #~ msgstr "" #~ "Print a list of all function calls leading up to running the current " #~ "command" #~ msgid "Command to run" #~ msgstr "Command to run" #~ msgid "Validate" #~ msgstr "Validate" #~ msgid "Make login shell" #~ msgstr "Make login shell" #~ msgid "Pass -f to the shell" #~ msgstr "Pass -f to the shell" #~ msgid "Preserve environment" #~ msgstr "Preserve environment" #~ msgid "Recursively clean up the working copy" #~ msgstr "Recursively clean up the working copy" #~ msgid "Specify revision" #~ msgstr "Specify revision" #~ msgid "Print as little as possible" #~ msgstr "Print as little as possible" #~ msgid "Force operation to run" #~ msgstr "Force operation to run" #~ msgid "Enable automatic properties" #~ msgstr "Enable automatic properties" #~ msgid "Disable automatic properties" #~ msgstr "Disable automatic properties" #~ msgid "Print extra info" #~ msgstr "Print extra info" #~ msgid "Don't cache auth tokens" #~ msgstr "Don't cache auth tokens" #~ msgid "Do no interactive prompting" #~ msgstr "Do no interactive prompting" #~ msgid "Don't unlock targets" #~ msgstr "Don't unlock targets" #~ msgid "Read commit message from file" #~ msgstr "Read commit message from file" #~ msgid "Force log message source validity" #~ msgstr "Force log message source validity" #~ msgid "Descend recursively" #~ msgstr "Descend recursively" #~ msgid "Give output suitable for concatenation" #~ msgstr "Give output suitable for concatenation" #~ msgid "Output in XML" #~ msgstr "Output in XML" #~ msgid "Operate on revision property" #~ msgstr "Operate on revision property" #~ msgid "Use strict semantics" #~ msgstr "Use strict semantics" #~ msgid "Ignore externals definitions" #~ msgstr "Ignore externals definitions" #~ msgid "Do not cross copies" #~ msgstr "Do not cross copies" #~ msgid "Make no changes" #~ msgstr "Make no changes" #~ msgid "Ignore ancestry when calculating merge" #~ msgstr "Ignore ancestry when calculating merge" #~ msgid "Disregard ignores" #~ msgstr "Disregard ignores" #~ msgid "Relocate VIA URL-rewriting" #~ msgstr "Relocate VIA URL-rewriting" #~ msgid "Print client version info" #~ msgstr "Print client version info" #~ msgid "Append archive to archive" #~ msgstr "Append archive to archive" #~ msgid "Create archive" #~ msgstr "Create archive" #~ msgid "Compare archive and filesystem" #~ msgstr "Compare archive and filesystem" #~ msgid "Delete from archive" #~ msgstr "Delete from archive" #~ msgid "Append files to archive" #~ msgstr "Append files to archive" #~ msgid "Append new files" #~ msgstr "Append new files" #~ msgid "Extract from archive" #~ msgstr "Extract from archive" #~ msgid "Keep access time" #~ msgstr "Keep access time" #~ msgid "Reblock while reading" #~ msgstr "Reblock while reading" #~ msgid "Print directory names" #~ msgstr "Print directory names" #~ msgid "Archive is local" #~ msgstr "Archive is local" #~ msgid "Run script at end of tape" #~ msgstr "Run script at end of tape" #~ msgid "Use old incremental GNU format" #~ msgstr "Use old incremental GNU format" #~ msgid "Use new incremental GNU format" #~ msgstr "Use new incremental GNU format" #~ msgid "Dereference symlinks" #~ msgstr "Dereference symlinks" #~ msgid "Ignore zero block in archive" #~ msgstr "Ignore zero block in archive" #~ msgid "Filter through bzip2" #~ msgstr "Filter through bzip2" #~ msgid "Don't exit on unreadable files" #~ msgstr "Don't exit on unreadable files" #~ msgid "Don't overwrite" #~ msgstr "Don't overwrite" #~ msgid "Stay in local filesystem" #~ msgstr "Stay in local filesystem" #~ msgid "Don't extract modification time" #~ msgstr "Don't extract modification time" #~ msgid "Multi volume archive" #~ msgstr "Multi volume archive" #~ msgid "Use V7 format" #~ msgstr "Use V7 format" #~ msgid "Extract to stdout" #~ msgstr "Extract to stdout" #~ msgid "Extract all permissions" #~ msgstr "Extract all permissions" #~ msgid "Don't strip leading /" #~ msgstr "Don't strip leading /" #~ msgid "Preserve all permissions and do not sort file arguments" #~ msgstr "Preserve all permissions and do not sort file arguments" #~ msgid "Show record number" #~ msgstr "Show record number" #~ msgid "Remove files after adding to archive" #~ msgstr "Remove files after adding to archive" #~ msgid "Preserve file ownership" #~ msgstr "Preserve file ownership" #~ msgid "Handle sparse files" #~ msgstr "Handle sparse files" #~ msgid "-T has null-terminated names" #~ msgstr "-T has null-terminated names" #~ msgid "Print total bytes written" #~ msgstr "Print total bytes written" #~ msgid "Ask for confirmation" #~ msgstr "Ask for confirmation" #~ msgid "Filter through compress" #~ msgstr "Filter through compress" #~ msgid "Filter through gzip" #~ msgstr "Filter through gzip" #~ msgid "Logical and" #~ msgstr "Logical and" #~ msgid "Logical or" #~ msgstr "Logical or" #~ msgid "String length is non-zero" #~ msgstr "String length is non-zero" #~ msgid "String length is zero" #~ msgstr "String length is zero" #~ msgid "Strings are equal" #~ msgstr "Strings are equal" #~ msgid "Strings are not equal" #~ msgstr "Strings are not equal" #~ msgid "Integers are equal" #~ msgstr "Integers are equal" #~ msgid "Left integer larger than or equal to right integer" #~ msgstr "Left integer larger than or equal to right integer" #~ msgid "Left integer larger than right integer" #~ msgstr "Left integer larger than right integer" #~ msgid "Left integer less than or equal to right integer" #~ msgstr "Left integer less than or equal to right integer" #~ msgid "Left integer less than right integer" #~ msgstr "Left integer less than right integer" #~ msgid "Left integer not equal to right integer" #~ msgstr "Left integer not equal to right integer" #~ msgid "Left file equal to right file" #~ msgstr "Left file equal to right file" #~ msgid "Left file newer than right file" #~ msgstr "Left file newer than right file" #~ msgid "Left file older than right file" #~ msgstr "Left file older than right file" #~ msgid "File is block device" #~ msgstr "File is block device" #~ msgid "File is character device" #~ msgstr "File is character device" #~ msgid "File is directory" #~ msgstr "File is directory" #~ msgid "File exists" #~ msgstr "File exists" #~ msgid "File is regular" #~ msgstr "File is regular" #~ msgid "File is set-group-ID" #~ msgstr "File is set-group-ID" #~ msgid "File is symlink" #~ msgstr "File is symlink" #~ msgid "File owned by effective group ID" #~ msgstr "File owned by effective group ID" #~ msgid "File has sticky bit set" #~ msgstr "File has sticky bit set" #~ msgid "File owned by effective user ID" #~ msgstr "File owned by effective user ID" #~ msgid "File is named pipe" #~ msgstr "File is named pipe" #~ msgid "File is readable" #~ msgstr "File is readable" #~ msgid "File size is non-zero" #~ msgstr "File size is non-zero" #~ msgid "File is socket" #~ msgstr "File is socket" #~ msgid "FD is terminal" #~ msgstr "FD is terminal" #~ msgid "File set-user-ID bit is set" #~ msgstr "File set-user-ID bit is set" #~ msgid "File is writable" #~ msgstr "File is writable" #~ msgid "Command" #~ msgstr "Command" #~ msgid "Specify output format" #~ msgstr "Specify output format" #~ msgid "Use the portable output format" #~ msgstr "Use the portable output format" #~ msgid "Do not send the results to stderr, but overwrite the specified file" #~ msgstr "Do not send the results to stderr, but overwrite the specified file" #~ msgid "(Used together with -o) Do not overwrite but append" #~ msgstr "(Used together with -o) Do not overwrite but append" #~ msgid "Toggle command line/program name" #~ msgstr "Toggle command line/program name" #~ msgid "Update interval" #~ msgstr "Update interval" #~ msgid "Toggle idle processes" #~ msgstr "Toggle idle processes" #~ msgid "Maximium iterations" #~ msgstr "Maximium iterations" #~ msgid "Monitor effective UID" #~ msgstr "Monitor effective UID" #~ msgid "Monitor user" #~ msgstr "Monitor user" #~ msgid "Monitor PID" #~ msgstr "Monitor PID" #~ msgid "Secure mode" #~ msgstr "Secure mode" #~ msgid "Cumulative mode" #~ msgstr "Cumulative mode" #~ msgid "Change access time" #~ msgstr "Change access time" #~ msgid "Do not create file" #~ msgstr "Do not create file" #~ msgid "Change modification time" #~ msgstr "Change modification time" #~ msgid "Use this files times" #~ msgstr "Use this files times" #~ msgid "Display names of all signals" #~ msgstr "Display names of all signals" #~ msgid "Display all currently defined trap handlers" #~ msgstr "Display all currently defined trap handlers" #~ msgid "Print all possible definitions of the specified name" #~ msgstr "Print all possible definitions of the specified name" #~ msgid "Supress function and builtin lookup" #~ msgstr "Supress function and builtin lookup" #~ msgid "Print command type" #~ msgstr "Print command type" #~ msgid "Print path to command, or nothing if name is not a command" #~ msgstr "Print path to command, or nothing if name is not a command" #~ msgid "Print path to command" #~ msgstr "Print path to command" #~ msgid "Set or get all current limits" #~ msgstr "Set or get all current limits" #~ msgid "Maximum size of core files created" #~ msgstr "Maximum size of core files created" #~ msgid "Maximum size of a process's data segment" #~ msgstr "Maximum size of a process's data segment" #~ msgid "Maximum size of files created by the shell" #~ msgstr "Maximum size of files created by the shell" #~ msgid "Maximum size that may be locked into memory" #~ msgstr "Maximum size that may be locked into memory" #~ msgid "Maximum resident set size" #~ msgstr "Maximum resident set size" #~ msgid "Maximum number of open file descriptors" #~ msgstr "Maximum number of open file descriptors" #~ msgid "Maximum stack size" #~ msgstr "Maximum stack size" #~ msgid "Maximum amount of cpu time in seconds" #~ msgstr "Maximum amount of cpu time in seconds" #~ msgid "Maximum number of processes available to a single user" #~ msgstr "Maximum number of processes available to a single user" #~ msgid "Maximum amount of virtual memory available to the shell" #~ msgstr "Maximum amount of virtual memory available to the shell" #~ msgid "Unmount without writing in /etc/mtab" #~ msgstr "Unmount without writing in /etc/mtab" #~ msgid "In case unmounting fails, try to remount read-only" #~ msgstr "In case unmounting fails, try to remount read-only" #~ msgid "" #~ "In case the unmounted device was a loop device, also free this loop device" #~ msgstr "" #~ "In case the unmounted device was a loop device, also free this loop device" #~ msgid "Don't call the /sbin/umount. helper even if it exists" #~ msgstr "Don't call the /sbin/umount. helper even if it exists" #~ msgid "Unmount all of the file systems described in /etc/mtab" #~ msgstr "Unmount all of the file systems described in /etc/mtab" #~ msgid "Actions should only be taken on file systems of the specified type" #~ msgstr "Actions should only be taken on file systems of the specified type" #~ msgid "" #~ "Actions should only be taken on file systems with the specified options " #~ "in /etc/fstab" #~ msgstr "" #~ "Actions should only be taken on file systems with the specified options " #~ "in /etc/fstab" #~ msgid "Force unmount (in case of an unreachable NFS system)" #~ msgstr "Force unmount (in case of an unreachable NFS system)" #~ msgid "" #~ "Detach the filesystem from the filesystem hierarchy now, and cleanup all " #~ "references to the filesystem as soon as it is not busy" #~ msgstr "" #~ "Detach the filesystem from the filesystem hierarchy now, and cleanup all " #~ "references to the filesystem as soon as it is not busy" #~ msgid "Print kernel name" #~ msgstr "Print kernel name" #~ msgid "Print network node hostname" #~ msgstr "Print network node hostname" #~ msgid "Print kernel release" #~ msgstr "Print kernel release" #~ msgid "Print machine name" #~ msgstr "Print machine name" #~ msgid "Print processor" #~ msgstr "Print processor" #~ msgid "Print hardware platform" #~ msgstr "Print hardware platform" #~ msgid "Print operating system" #~ msgstr "Print operating system" #~ msgid "Print number of occurences" #~ msgstr "Print number of occurences" #~ msgid "Only print duplicates" #~ msgstr "Only print duplicates" #~ msgid "Remove non-duplicate lines" #~ msgstr "Remove non-duplicate lines" #~ msgid "Avoid comparing first N fields" #~ msgstr "Avoid comparing first N fields" #~ msgid "Case insensitive" #~ msgstr "Case insensitive" #~ msgid "Avoid comparing first N characters" #~ msgstr "Avoid comparing first N characters" #~ msgid "Only print unique lines" #~ msgstr "Only print unique lines" #~ msgid "Compare only specified number of characters" #~ msgstr "Compare only specified number of characters" #~ msgid "Valgrind-ise children" #~ msgstr "Valgrind-ise children" #~ msgid "Log to file descriptor" #~ msgstr "Log to file descriptor" #~ msgid "Log to socket" #~ msgstr "Log to socket" #~ msgid "Callers in stack trace" #~ msgstr "Callers in stack trace" #~ msgid "Stop showing errors if too many" #~ msgstr "Stop showing errors if too many" #~ msgid "Continue trace below main()" #~ msgstr "Continue trace below main()" #~ msgid "Supress errors from file" #~ msgstr "Supress errors from file" #~ msgid "Print suppressions for detected errors" #~ msgstr "Print suppressions for detected errors" #~ msgid "Start debugger on error" #~ msgstr "Start debugger on error" #~ msgid "Debugger command" #~ msgstr "Debugger command" #~ msgid "File descriptor for input" #~ msgstr "File descriptor for input" #~ msgid "Check for memory leaks" #~ msgstr "Check for memory leaks" #~ msgid "Show reachable leaked memory" #~ msgstr "Show reachable leaked memory" #~ msgid "" #~ "Determines how willing Memcheck is to consider different backtraces to be " #~ "the same" #~ msgstr "" #~ "Determines how willing Memcheck is to consider different backtraces to be " #~ "the same" #~ msgid "Set size of freed memory pool" #~ msgstr "Set size of freed memory pool" #~ msgid "" #~ "Determines how willing Addrcheck is to consider different backtraces to " #~ "be the same" #~ msgstr "" #~ "Determines how willing Addrcheck is to consider different backtraces to " #~ "be the same" #~ msgid "Type of L1 instruction cache" #~ msgstr "Type of L1 instruction cache" #~ msgid "Type of L1 data cache" #~ msgstr "Type of L1 data cache" #~ msgid "Type of L2 cache" #~ msgstr "Type of L2 cache" #~ msgid "Specify a function that allocates memory" #~ msgstr "Specify a function that allocates memory" #~ msgid "Print byte counts" #~ msgstr "Print byte counts" #~ msgid "Print character counts" #~ msgstr "Print character counts" #~ msgid "Print newline counts" #~ msgstr "Print newline counts" #~ msgid "Print length of longest line" #~ msgstr "Print length of longest line" #~ msgid "Print word counts" #~ msgstr "Print word counts" #~ msgid "Dont print header" #~ msgstr "Dont print header" #~ msgid "Ignore username for time calculations" #~ msgstr "Ignore username for time calculations" #~ msgid "Short format" #~ msgstr "Short format" #~ msgid "Toggle printing of remote hostname" #~ msgstr "Toggle printing of remote hostname" #~ msgid "Go to background immediately after startup" #~ msgstr "Go to background immediately after startup" #~ msgid "Execute command as if part of .wgetrc" #~ msgstr "Execute command as if part of .wgetrc" #~ msgid "Log all messages to logfile" #~ msgstr "Log all messages to logfile" #~ msgid "Append all messages to logfile" #~ msgstr "Append all messages to logfile" #~ msgid "Turn on debug output" #~ msgstr "Turn on debug output" #~ msgid "Turn off verbose without being completely quiet" #~ msgstr "Turn off verbose without being completely quiet" #~ msgid "Read URLs from file" #~ msgstr "Read URLs from file" #~ msgid "Force input to be treated as HTML" #~ msgstr "Force input to be treated as HTML" #~ msgid "Prepend string to relative links" #~ msgstr "Prepend string to relative links" #~ msgid "Bind address on local machine" #~ msgstr "Bind address on local machine" #~ msgid "Set number of retries to number" #~ msgstr "Set number of retries to number" #~ msgid "Concatenate output to file" #~ msgstr "Concatenate output to file" #~ msgid "Never overwrite files with same name" #~ msgstr "Never overwrite files with same name" #~ msgid "Continue getting a partially-downloaded file" #~ msgstr "Continue getting a partially-downloaded file" #~ msgid "Select progress meter type" #~ msgstr "Select progress meter type" #~ msgid "Turn on time-stamping" #~ msgstr "Turn on time-stamping" #~ msgid "Print the headers/responses sent by servers" #~ msgstr "Print the headers/responses sent by servers" #~ msgid "Do not download the pages, just check that they are there" #~ msgstr "Do not download the pages, just check that they are there" #~ msgid "Set the network timeout" #~ msgstr "Set the network timeout" #~ msgid "Set the DNS lookup timeout" #~ msgstr "Set the DNS lookup timeout" #~ msgid "Set the connect timeout" #~ msgstr "Set the connect timeout" #~ msgid "Set the read (and write) timeout" #~ msgstr "Set the read (and write) timeout" #~ msgid "Limit the download speed" #~ msgstr "Limit the download speed" #~ msgid "Wait the specified number of seconds between the retrievals" #~ msgstr "Wait the specified number of seconds between the retrievals" #~ msgid "Wait time between retries" #~ msgstr "Wait time between retries" #~ msgid "Wait random amount of time between retrievals" #~ msgstr "Wait random amount of time between retrievals" #~ msgid "Toggle proxy support" #~ msgstr "Toggle proxy support" #~ msgid "Specify download quota for automatic retrievals" #~ msgstr "Specify download quota for automatic retrievals" #~ msgid "Turn off caching of DNS lookups" #~ msgstr "Turn off caching of DNS lookups" #~ msgid "" #~ "Change which characters found in remote URLs may show up in local file " #~ "names" #~ msgstr "" #~ "Change which characters found in remote URLs may show up in local file " #~ "names" #~ msgid "Do not create a hierarchy of directories" #~ msgstr "Do not create a hierarchy of directories" #~ msgid "Force creation of a hierarchy of directories" #~ msgstr "Force creation of a hierarchy of directories" #~ msgid "Disable generation of host-prefixed directories" #~ msgstr "Disable generation of host-prefixed directories" #~ msgid "Use the protocol name as a directory component" #~ msgstr "Use the protocol name as a directory component" #~ msgid "Ignore specified number of directory components" #~ msgstr "Ignore specified number of directory components" #~ msgid "Set directory prefix" #~ msgstr "Set directory prefix" #~ msgid "Force html files to have html extension" #~ msgstr "Force html files to have html extension" #~ msgid "Specify the http username" #~ msgstr "Specify the http username" #~ msgid "Specify the http password" #~ msgstr "Specify the http password" #~ msgid "Disable server-side cache" #~ msgstr "Disable server-side cache" #~ msgid "Disable the use of cookies" #~ msgstr "Disable the use of cookies" #~ msgid "Load cookies from file" #~ msgstr "Load cookies from file" #~ msgid "Save cookies to file" #~ msgstr "Save cookies to file" #~ msgid "Save session cookies" #~ msgstr "Save session cookies" #~ msgid "Ignore 'Content-Length' header" #~ msgstr "Ignore “Content-Length†header" #~ msgid "Define an additional-header to be passed to the HTTP servers" #~ msgstr "Define an additional-header to be passed to the HTTP servers" #~ msgid "Specify the proxy username" #~ msgstr "Specify the proxy username" #~ msgid "Specify the proxy password" #~ msgstr "Specify the proxy password" #~ msgid "Set referer URL" #~ msgstr "Set referer URL" #~ msgid "Save the headers sent by the HTTP server" #~ msgstr "Save the headers sent by the HTTP server" #~ msgid "Identify as agent-string" #~ msgstr "Identify as agent-string" #~ msgid "" #~ "Use POST as the method for all HTTP requests and send the specified data " #~ "in the request body" #~ msgstr "" #~ "Use POST as the method for all HTTP requests and send the specified data " #~ "in the request body" #~ msgid "Turn off keep-alive for http downloads" #~ msgstr "Turn off keep-alive for http downloads" #~ msgid "Don't remove the temporary .listing files generated" #~ msgstr "Don't remove the temporary .listing files generated" #~ msgid "Turn off FTP globbing" #~ msgstr "Turn off FTP globbing" #~ msgid "Use the passive FTP retrieval scheme" #~ msgstr "Use the passive FTP retrieval scheme" #~ msgid "Traverse symlinks and retrieve pointed-to files" #~ msgstr "Traverse symlinks and retrieve pointed-to files" #~ msgid "Turn on recursive retrieving" #~ msgstr "Turn on recursive retrieving" #~ msgid "Specify recursion maximum depth" #~ msgstr "Specify recursion maximum depth" #~ msgid "Delete every single file downloaded" #~ msgstr "Delete every single file downloaded" #~ msgid "" #~ "Convert the links in the document to make them suitable for local viewing" #~ msgstr "" #~ "Convert the links in the document to make them suitable for local viewing" #~ msgid "Back up the original version" #~ msgstr "Back up the original version" #~ msgid "Turn on options suitable for mirroring" #~ msgstr "Turn on options suitable for mirroring" #~ msgid "" #~ "Download all the files that are necessary to properly display a given " #~ "HTML page" #~ msgstr "" #~ "Download all the files that are necessary to properly display a given " #~ "HTML page" #~ msgid "Turn on strict parsing of HTML comments" #~ msgstr "Turn on strict parsing of HTML comments" #~ msgid "Comma-separated lists of file name suffixes or patterns to accept" #~ msgstr "Comma-separated lists of file name suffixes or patterns to accept" #~ msgid "Comma-separated lists of file name suffixes or patterns to reject" #~ msgstr "Comma-separated lists of file name suffixes or patterns to reject" #~ msgid "Set domains to be followed" #~ msgstr "Set domains to be followed" #~ msgid "Specify the domains that are not to be followed" #~ msgstr "Specify the domains that are not to be followed" #~ msgid "Follow FTP links from HTML documents" #~ msgstr "Follow FTP links from HTML documents" #~ msgid "HTML tags to follow" #~ msgstr "HTML tags to follow" #~ msgid "HTML tags to ignore" #~ msgstr "HTML tags to ignore" #~ msgid "Enable spanning across hosts" #~ msgstr "Enable spanning across hosts" #~ msgid "Follow relative links only" #~ msgstr "Follow relative links only" #~ msgid "Specify a comma-separated list of directories you wish to follow" #~ msgstr "Specify a comma-separated list of directories you wish to follow" #~ msgid "Specify a comma-separated list of directories you wish to exclude" #~ msgstr "Specify a comma-separated list of directories you wish to exclude" #~ msgid "Ignore option '--read-functions'" #~ msgstr "Ignore option “--read-functionsâ€" #~ msgid "Same as -b -d --login -p -r -t -T -u" #~ msgstr "Same as -b -d --login -p -r -t -T -u" #~ msgid "Print time of last boot" #~ msgstr "Print time of last boot" #~ msgid "Print dead processes" #~ msgstr "Print dead processes" #~ msgid "Print line of headings" #~ msgstr "Print line of headings" #~ msgid "Print idle time" #~ msgstr "Print idle time" #~ msgid "Print login process" #~ msgstr "Print login process" #~ msgid "Canonicalize hostnames via DNS" #~ msgstr "Canonicalize hostnames via DNS" #~ msgid "Print hostname and user for stdin" #~ msgstr "Print hostname and user for stdin" #~ msgid "Print active processes spawned by init" #~ msgstr "Print active processes spawned by init" #~ msgid "Print all login names and number of users logged on" #~ msgstr "Print all login names and number of users logged on" #~ msgid "Print current runlevel" #~ msgstr "Print current runlevel" #~ msgid "Print name, line, and time" #~ msgstr "Print name, line, and time" #~ msgid "Print last system clock change" #~ msgstr "Print last system clock change" #~ msgid "Print users message status as +, - or ?" #~ msgstr "Print users message status as +, - or ?" #~ msgid "List users logged in" #~ msgstr "List users logged in" #~ msgid "" #~ "Input filenames are terminated by a null character instead of by " #~ "whitespace, and the quotes and backslash are not special" #~ msgstr "" #~ "Input filenames are terminated by a null character instead of by " #~ "whitespace, and the quotes and backslash are not special" #~ msgid "Set the end of file string to eof-str" #~ msgstr "Set the end of file string to eof-str" #~ msgid "" #~ "Replace replace-str in the initial arguments with names from standard " #~ "input" #~ msgstr "" #~ "Replace replace-str in the initial arguments with names from standard " #~ "input" #~ msgid "Use at most max-lines nonblank input lines per command line" #~ msgstr "Use at most max-lines nonblank input lines per command line" #~ msgid "Use at most max-args arguments per command line" #~ msgstr "Use at most max-args arguments per command line" #~ msgid "" #~ "Prompt the user about whether to run each command line and read a line " #~ "from the terminal" #~ msgstr "" #~ "Prompt the user about whether to run each command line and read a line " #~ "from the terminal" #~ msgid "" #~ "If the standard input does not contain any nonblanks, do not run the " #~ "command" #~ msgstr "" #~ "If the standard input does not contain any nonblanks, do not run the " #~ "command" #~ msgid "Use at most max-chars characters per command line" #~ msgstr "Use at most max-chars characters per command line" #~ msgid "" #~ "Print the command line on the standard error output before executing it" #~ msgstr "" #~ "Print the command line on the standard error output before executing it" #~ msgid "Exit if the size is exceeded" #~ msgstr "Exit if the size is exceeded" #~ msgid "Run up to max-procs processes at a time" #~ msgstr "Run up to max-procs processes at a time" #~ msgid "Display grammar and exit" #~ msgstr "Display grammar and exit" #~ msgid "Select window by name" #~ msgstr "Select window by name" #~ msgid "Select root window" #~ msgstr "Select root window" #~ msgid "Specify X server" #~ msgstr "Specify X server" #~ msgid "Do not show property type" #~ msgstr "Do not show property type" #~ msgid "Select a window by clicking on its frame" #~ msgstr "Select a window by clicking on its frame" #~ msgid "Remove property" #~ msgstr "Remove property" #~ msgid "Set property" #~ msgstr "Set property" #~ msgid "Examine property updates forever" #~ msgstr "Examine property updates forever" #~ msgid "Set format" #~ msgstr "Set format" #~ msgid "Append input to selection" #~ msgstr "Append input to selection" #~ msgid "Append to selection as input grows" #~ msgstr "Append to selection as input grows" #~ msgid "Read into selection" #~ msgstr "Read into selection" #~ msgid "Write selection" #~ msgstr "Write selection" #~ msgid "Clear selection" #~ msgstr "Clear selection" #~ msgid "Delete selection" #~ msgstr "Delete selection" #~ msgid "Use primary selection" #~ msgstr "Use primary selection" #~ msgid "Use secondary selection" #~ msgstr "Use secondary selection" #~ msgid "Use clipboard selection" #~ msgstr "Use clipboard selection" #~ msgid "Make current selections persistent after program exit" #~ msgstr "Make current selections persistent after program exit" #~ msgid "Exchange primary and secondary selections" #~ msgstr "Exchange primary and secondary selections" #~ msgid "Timeout for retrieving selection" #~ msgstr "Timeout for retrieving selection" #~ msgid "Do not detach from the controlling terminal" #~ msgstr "Do not detach from the controlling terminal" #~ msgid "Print informative messages" #~ msgstr "Print informative messages" #~ msgid "Set error level" #~ msgstr "Set error level" #~ msgid "Be tolerant of errors in commandline" #~ msgstr "Be tolerant of errors in commandline" #~ msgid "Set maximum delay between commands" #~ msgstr "Set maximum delay between commands" #~ msgid "Run commands from cache" #~ msgstr "Run commands from cache" #~ msgid "Specify installroot" #~ msgstr "Specify installroot" #~ msgid "Enables obsolets processing logic" #~ msgstr "Enables obsolets processing logic" #~ msgid "Output rss-data to file" #~ msgstr "Output rss-data to file" #~ msgid "Exclude specified package from updates" #~ msgstr "Exclude specified package from updates" #~ msgid "Freshen: only changed files" #~ msgstr "Freshen: only changed files" #~ msgid "Delete entries in zipfile" #~ msgstr "Delete entries in zipfile" #~ msgid "Update: only changed or newer files" #~ msgstr "Update: only changed or newer files" #~ msgid "Move into zipfile (delete files)" #~ msgstr "Move into zipfile (delete files)" #~ msgid "Do not store directory names" #~ msgstr "Do not store directory names" #~ msgid "Do not compress at all" #~ msgstr "Do not compress at all" #~ msgid "Convert LF to CR LF" #~ msgstr "Convert LF to CR LF" #~ msgid "Convert CR LF to LF" #~ msgstr "Convert CR LF to LF" #~ msgid "Compress faster" #~ msgstr "Compress faster" #~ msgid "Compress better" #~ msgstr "Compress better" #~ msgid "Add one-line comments" #~ msgstr "Add one-line comments" #~ msgid "Add zipfile comments" #~ msgstr "Add zipfile comments" #~ msgid "Read names from stdin" #~ msgstr "Read names from stdin" #~ msgid "Make zipfile as old as the latest entry" #~ msgstr "Make zipfile as old as the latest entry" #~ msgid "Fix zipfile" #~ msgstr "Fix zipfile" #~ msgid "Fix zipfile (try harder)" #~ msgstr "Fix zipfile (try harder)" #~ msgid "Adjust offsets to suit self-extracting exe" #~ msgstr "Adjust offsets to suit self-extracting exe" #~ msgid "Strip prepended data" #~ msgstr "Strip prepended data" #~ msgid "Test zipfile integrity" #~ msgstr "Test zipfile integrity" #~ msgid "Exclude extra file attributes" #~ msgstr "Exclude extra file attributes" #~ msgid "Store symbolic links as links" #~ msgstr "Store symbolic links as links" #~ msgid "PKZIP recursion" #~ msgstr "PKZIP recursion" #~ msgid "Encrypt" #~ msgstr "Encrypt" #~ msgid "Test if a key is contained in a set of values" #~ msgstr "Test if a key is contained in a set of values" #~ msgid "-d" #~ msgstr "-d" #~ msgid "Maximum uploads at once" #~ msgstr "Maximum uploads at once" #~ msgid "Number of seconds between keepalives" #~ msgstr "Number of seconds between keepalives" #~ msgid "Bytes per request" #~ msgstr "Bytes per request" #~ msgid "Requests per pipe" #~ msgstr "Requests per pipe" #~ msgid "Maximum length prefix encoding" #~ msgstr "Maximum length prefix encoding" #~ msgid "File for server response" #~ msgstr "File for server response" #~ msgid "URL to get file from" #~ msgstr "URL to get file from" #~ msgid "Local file target" #~ msgstr "Local file target" #~ msgid "Time to close inactive socket" #~ msgstr "Time to close inactive socket" #~ msgid "Time between checking timeouts" #~ msgstr "Time between checking timeouts" #~ msgid "Maximum outgoing slice length" #~ msgstr "Maximum outgoing slice length" #~ msgid "Maximum time to guess rate" #~ msgstr "Maximum time to guess rate" #~ msgid "IP to bind to locally" #~ msgstr "IP to bind to locally" #~ msgid "Time between screen updates" #~ msgstr "Time between screen updates" #~ msgid "Time to wait between requesting more peers" #~ msgstr "Time to wait between requesting more peers" #~ msgid "Minimum number of peers to not do requesting" #~ msgstr "Minimum number of peers to not do requesting" #~ msgid "Number of seconds before assuming http timeout" #~ msgstr "Number of seconds before assuming http timeout" #~ msgid "Number of peers at which to stop initiating new connections" #~ msgstr "Number of peers at which to stop initiating new connections" #~ msgid "Maximum number of connections to allow" #~ msgstr "Maximum number of connections to allow" #~ msgid "Whether to check hashes on disk" #~ msgstr "Whether to check hashes on disk" #~ msgid "Maximum kB/s to upload at" #~ msgstr "Maximum kB/s to upload at" #~ msgid "Seconds to wait for data to come in before assuming choking" #~ msgstr "Seconds to wait for data to come in before assuming choking" #~ msgid "Whether to display diagnostic info" #~ msgstr "Whether to display diagnostic info" #~ msgid "Number of downloads at which to switch from random to rarest first" #~ msgstr "Number of downloads at which to switch from random to rarest first" #~ msgid "Number of uploads to fill out to with optimistic unchokes" #~ msgstr "Number of uploads to fill out to with optimistic unchokes" #~ msgid "Whether to inform the user that hash failures occur" #~ msgstr "Whether to inform the user that hash failures occur" #~ msgid "Set block size" #~ msgstr "Set block size" #~ msgid "List format" #~ msgstr "List format" #~ msgid "Select quoting style" #~ msgstr "Select quoting style" #~ msgid "Sort criteria" #~ msgstr "Sort criteria" #~ msgid "Show time type" #~ msgstr "Show time type" #~ msgid "Select time style" #~ msgstr "Select time style" #~ msgid "Assume tab stops at each COLS" #~ msgstr "Assume tab stops at each COLS" #~ msgid "Assume screen width" #~ msgstr "Assume screen width" #~ msgid "%s: Unknown argument '%s'\\n" #~ msgstr "%s: Unknown argument “%sâ€\\n" #~ msgid "Invalid input" #~ msgstr "Invalid input" #~ msgid "%ls: Argument must be a number: %ls\n" #~ msgstr "%ls: Argument must be a number: %ls\n" #~ msgid "Pipe or short circuit command requires additional command" #~ msgstr "Pipe or short circuit command requires additional command" #~ msgid "Same" #~ msgstr "Same" fish/po/fr.po000066400000000000000000010245461214535744100134160ustar00rootroot00000000000000# translation of fr.po to Français # FRENCH TRANSLATION FOR FISH # Copyright (C) 2006 Xavier Douville # This file is distributed under the GNU General Public License, version 2 or later. # Xavier Douville , 2006. # msgid "" msgstr "" "Project-Id-Version: 1.2.8" "POT-Creation-Date: 2006-07-10 13:44-0400\n" "PO-Revision-Date: 2006-07-25 20:16-0400\n" "Last-Translator: Xavier Douville \n" "Language-Team: Français \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.10.2\n" "X-Poedit-Language: French\n" #: builtin.c:84 #, c-format msgid "Send job %d, '%ls' to foreground\n" msgstr "Mettre la tâche %d, '%ls' en premier plan\n" #: builtin.c:414 #, c-format msgid "%ls: Can not specify scope when removing block\n" msgstr "%ls: Ne peut pas indiquer la portée en enlevant le bloc\n" #: builtin.c:420 #, c-format msgid "%ls: No blocks defined\n" msgstr "%ls: Aucun bloc défini\n" #: builtin.c:821 #: builtin.h:28 #, c-format msgid "%ls: Invalid combination of options\n" msgstr "%ls: Combinaison d'options invalide\n" #: builtin.c:844 #, c-format msgid "%ls: Expected exactly one function name\n" msgstr "%ls: Exactement un nom de fonction est attendu\n" #: builtin.c:854 #, c-format msgid "%ls: Function '%ls' does not exist\n" msgstr "%ls: La fonction '%ls' n'existe pas\n" #: builtin.c:910 msgid "" "Current function definitions are:\n" "\n" msgstr "" "Définitions de fonctions courantes:\n" "\n" #: builtin.c:1057 #, c-format msgid "%ls: Unknown signal '%ls'\n" msgstr "%ls: Signal inconnu '%ls'\n" #: builtin.c:1081 #, c-format msgid "%ls: Invalid variable name '%ls'\n" msgstr "%ls: Nom de variable invalide '%ls'\n" #: builtin.c:1134 #, c-format msgid "%ls: Cannot find calling job for event handler\n" msgstr "%ls: Impossible de trouver la tâche parente pour le gestionnaire d'événements\n" #: builtin.c:1152 #, c-format msgid "%ls: Invalid process id %ls\n" msgstr "%ls: id de processus invalide %ls\n" #: builtin.c:1193 #, c-format msgid "%ls: Expected one argument, got %d\n" msgstr "%ls: Un argument attendu, %d obtenu(s)\n" #: builtin.c:1201 #, c-format msgid "%ls: Illegal function name '%ls'\n" msgstr "%ls: Nom de fonction illégal '%ls'\n" #: builtin.c:1211 #, c-format msgid "" "%ls: The name '%ls' is reserved,\n" "and can not be used as a function name\n" msgstr "" "%ls: Le nom '%ls' est réservé,\n" "et ne peut pas être utilisé comme nom de fonction\n" #: builtin.c:1226 msgid "Current functions are: " msgstr "Les fonctions courantes sont: " #: builtin.c:1359 #, c-format msgid "%ls: Seed value '%ls' is not a valid number\n" msgstr "%ls: La valeur germe '%ls' n'est pas un nombre valide\n" #: builtin.c:1373 #, c-format msgid "%ls: Expected zero or one argument, got %d\n" msgstr "%ls: Zéro ou un argument attendu, %d obtenu(s)\n" #: builtin.c:1807 #: main.c:336 #: parser.c:1255 msgid "Standard input" msgstr "Entrée standard" #: builtin.c:1850 msgid "This is a login shell\n" msgstr "Ceci est un shell de connexion\n" #: builtin.c:1852 msgid "This is not a login shell\n" msgstr "Ceci n'est pas un shell de connexion\n" #: builtin.c:1854 #, c-format msgid "Job control: %ls\n" msgstr "Contrôle des tâches: %ls\n" #: builtin.c:1855 msgid "Only on interactive jobs" msgstr "Seulement sur les tâches interactives" #: builtin.c:1856 msgid "Never" msgstr "Jamais" #: builtin.c:1856 msgid "Always" msgstr "Toujours" #: builtin.c:1911 #: builtin.c:2634 #, c-format msgid "%ls: Argument '%ls' must be an integer\n" msgstr "%ls: L'argument '%ls' doit être un entier\n" #: builtin.c:1967 #, c-format msgid "%ls: Could not find home directory\n" msgstr "%ls: Répertoire personnel introuvable\n" #: builtin.c:1979 #, c-format msgid "%ls: '%ls' is not a directory or you do not have permission to enter it\n" msgstr "%ls: '%ls' n'est pas un répertoire ou vous n'avez pas l'autorisation d'y entrer\n" #: builtin.c:1993 #, c-format msgid "%ls: '%ls' is not a directory\n" msgstr "%ls: '%ls' n'est pas un répertoire\n" #: builtin.c:2009 #, c-format msgid "%ls: Could not set PWD variable\n" msgstr "%ls: Définition de la variable PWD impossible\n" #: builtin.c:2033 #, c-format msgid "%ls: Expected at least one argument, got %d\n" msgstr "%ls: Au moins un argument attendu, %d obtenu\n" #: builtin.c:2046 #, c-format msgid "%ls: '%ls' is not a file\n" msgstr "%ls: '%ls' n'est pas un fichier\n" #: builtin.c:2084 #, c-format msgid "%ls: Error while reading file '%ls'\n" msgstr "%ls: Erreur de lecture sur le fichier '%ls'\n" #: builtin.c:2147 #: builtin.c:2311 #, c-format msgid "%ls: There are no suitable jobs\n" msgstr "%ls: Aucune tâche appropriée\n" #: builtin.c:2165 #, c-format msgid "%ls: Ambiguous job\n" msgstr "%ls: Tâche ambiguë\n" #: builtin.c:2171 #: builtin_jobs.c:302 #, c-format msgid "%ls: '%ls' is not a job\n" msgstr "%ls: '%ls' n'est pas une tâche\n" #: builtin.c:2188 #, c-format msgid "%ls: Argument must be a number: %ls\n" msgstr "%ls: L'argument doit être un nombre: %ls\n" #: builtin.c:2199 #: builtin_jobs.c:317 #, c-format msgid "%ls: No suitable job: %d\n" msgstr "%ls: Aucune tâche appropriée: %d\n" #: builtin.c:2208 #, c-format msgid "%ls: Can't put job %d, '%ls' to foreground because it is not under job control\n" msgstr "%ls: Ne peut mettre la tâche %d, '%ls' en premier plan parce qu'elle n'est pas gérée par le contrôleur de tâches\n" #: builtin.c:2262 #, c-format msgid "%ls: Unknown job '%ls'\n" msgstr "%ls: Tâche inconnue: '%ls'\n" #: builtin.c:2271 #, c-format msgid "%ls: Can't put job %d, '%ls' to background because it is not under job control\n" msgstr "%ls: Ne peut mettre la tâche %d, '%ls' en arrière-plan parce qu'elle n'est pas gérée par le contrôleur de tâches\n" #: builtin.c:2281 #, c-format msgid "Send job %d '%ls' to background\n" msgstr "Envoyer la tâche %d '%ls' en arrière-plan\n" #: builtin.c:2317 msgid "(default)" msgstr "(défaut)" #: builtin.c:2344 #, c-format msgid "%ls: Expected at least two arguments, got %d\n" msgstr "%ls: Au moins deux arguments attendus, %d obtenu\n" #: builtin.c:2352 #, c-format msgid "%ls: '%ls' is not a valid variable name\n" msgstr "%ls: '%ls' est un nom de variable invalide\n" #: builtin.c:2422 #, c-format msgid "%ls: Not inside of block\n" msgstr "%ls: À l'extérieur du bloc\n" #: builtin.c:2542 #, c-format msgid "%ls: Not inside of 'if' block\n" msgstr "%ls: À l'extérieur du bloc 'if'\n" #: builtin.c:2594 #, c-format msgid "%ls: Not inside of loop\n" msgstr "%ls: À l'extérieur de la boucle\n" #: builtin.c:2645 #: builtin_complete.c:528 #: builtin.h:65 #, c-format msgid "%ls: Too many arguments\n" msgstr "%ls: Trop d'arguments\n" #: builtin.c:2661 #, c-format msgid "%ls: Not inside of function\n" msgstr "%ls: À l'extérieur de la fonction\n" #: builtin.c:2690 #, c-format msgid "%ls: Expected exactly one argument, got %d\n" msgstr "%ls: Exactement un argument attendu, %d obtenu(s)\n" #: builtin.c:2721 #, c-format msgid "%ls: 'case' command while not in switch block\n" msgstr "%ls: commande 'case' sans bloc 'switch'\n" #: builtin.c:2762 msgid "Exit the shell" msgstr "Quitter le shell" #: builtin.c:2766 msgid "Temporarily block delivery of events" msgstr "Bloquer temporairement la distribution des événements" #: builtin.c:2770 msgid "Run a builtin command instead of a function" msgstr "Exécuter une commande interne au lieu d'une fonction" #: builtin.c:2774 msgid "Change working directory" msgstr "Changer le répertoire de travail" #: builtin.c:2778 msgid "Define a new function" msgstr "Définir une nouvelle fonction" #: builtin.c:2782 msgid "List or remove functions" msgstr "Lister ou enlever des fonctions" #: builtin.c:2786 msgid "Edit command specific completions" msgstr "Éditer les complétions spécifiques aux commandes" #: builtin.c:2790 msgid "End a block of commands" msgstr "Termine un bloc de commandes" #: builtin.c:2794 msgid "Evaluate block if condition is false" msgstr "Évalue le bloc si la condition est fausse" #: builtin.c:2798 msgid "Evaluate parameters as a command" msgstr "Évaluer le paramètre comme une commande" #: builtin.c:2802 msgid "Perform a set of commands multiple times" msgstr "Exécuter un ensemble de commandes plusieurs fois" #: builtin.c:2806 msgid "Evaluate contents of file" msgstr "Évaluer le contenu d'un fichier" #: builtin.c:2810 msgid "Handle environment variables" msgstr "Gérer les variables d'environnement" #: builtin.c:2814 msgid "Send job to foreground" msgstr "Mettre la tâche en premier plan" #: builtin.c:2818 msgid "Send job to background" msgstr "Mettre la tâche en arrière-plan" #: builtin.c:2822 msgid "Print currently running jobs" msgstr "Afficher les tâches en cours d'exécution" #: builtin.c:2826 msgid "Read a line of input into variables" msgstr "Lire une ligne d'entrée dans des variables" #: builtin.c:2830 msgid "Stop the innermost loop" msgstr "Arrêter la boucle interne" #: builtin.c:2834 msgid "Skip the rest of the current lap of the innermost loop" msgstr "Sauter le reste de la boucle interne" #: builtin.c:2838 msgid "Stop the currently evaluated function" msgstr "Arrêter la fonction en évaluation" #: builtin.c:2842 msgid "Set or get the commandline" msgstr "Définir ou obtenir la ligne de commande" #: builtin.c:2846 #: builtin.c:2850 msgid "Conditionally execute a block of commands" msgstr "Exécuter conditionnellement un bloc de commandes" #: builtin.c:2854 msgid "Handle fish key bindings" msgstr "Gérer les raccourcis clavier de fish" #: builtin.c:2858 msgid "Generate random number" msgstr "Génère un nombre aléatoire" #: builtin.c:2862 msgid "Return status information about fish" msgstr "Retourner l'information sur l'état de fish" #: builtin.c:2866 msgid "Set or get the shells resource usage limits" msgstr "Définir ou obtenir les limites d'utilisation des ressources du shell" #: builtin.c:2876 msgid "Run a program instead of a function or builtin" msgstr "Exécuter un programme au lieu d'une fonction ou d'une commande interne" #: builtin.c:2880 msgid "Evaluate block if condition is true" msgstr "Évaluer le bloc si la condition est vraie" #: builtin.c:2884 msgid "Perform a command multiple times" msgstr "Exécuter une commande plusieurs fois" #: builtin.c:2888 msgid "Negate exit status of job" msgstr "Inverser l'état de sortie de la tâche" #: builtin.c:2892 msgid "Execute command if previous command suceeded" msgstr "Exécuter la commande si la précédente a réussi" #: builtin.c:2896 msgid "Execute command if previous command failed" msgstr "Exécuter la commande si la précédente a échoué" #: builtin.c:2900 msgid "Run command in current process" msgstr "Exécuter la commande dans le processus courant" #: builtin.c:2904 msgid "Create a block of code" msgstr "Créer un bloc de code" #: builtin.c:3010 #, c-format msgid "Unknown builtin '%ls'" msgstr "Commande interne inconnue '%ls'" #: builtin_complete.c:270 #, c-format msgid "%ls: Command only available in interactive sessions" msgstr "%ls: Commande disponible seulement dans les sessions interactives" #: builtin_jobs.c:88 msgid "Job\tGroup\t" msgstr "Tâche\tGroupe\t" #: builtin_jobs.c:90 msgid "CPU\t" msgstr "CPU\t" #: builtin_jobs.c:92 msgid "State\tCommand\n" msgstr "État\tCommande\n" #: builtin_jobs.c:101 #: proc.c:596 msgid "stopped" msgstr "arrêtée" #: builtin_jobs.c:101 msgid "running" msgstr "en cours d'exécution" #: builtin_jobs.c:116 msgid "Group\n" msgstr "Groupe\n" #: builtin_jobs.c:129 msgid "Procces\n" msgstr "Processus\n" #: builtin_jobs.c:146 msgid "Command\n" msgstr "Commande\n" #: builtin_jobs.c:343 #, c-format msgid "%ls: There are no jobs\n" msgstr "%ls: Il n'y a aucune tâche\n" #: builtin_set.c:158 #, c-format msgid "%ls: Tried to change the read-only variable '%ls'\n" msgstr "%ls: Impossible de changer la valeur de la variable en lecture seule '%ls'\n" #: builtin_set.c:208 #, c-format msgid "%ls: Multiple variable names specified in single call (%ls and %.*ls)\n" msgstr "%ls: Plusieurs noms de variable spécifiés dans un seul appel (%ls and %.*ls)\n" #: builtin_set.c:229 #, c-format msgid "%ls: Invalid index starting at '%ls'\n" msgstr "%ls: Index invalide commençant à '%ls'\n" #: builtin_set.c:590 #, c-format msgid "" "%ls: Erase needs a variable name\n" "%ls\n" msgstr "" "%ls: 'Erase' requiert un nom de variable\n" "%ls\n" #: builtin_set.c:733 #, c-format msgid "" "%ls: Values cannot be specfied with erase\n" "%ls\n" msgstr "" "%ls: 'erase' ne peut pas spécifier des valeurs\n" "%ls\n" #: complete.c:59 msgid "User home" msgstr "Répertoire personnel" #: complete.c:64 msgid "Variable: " msgstr "Variable: " #: complete.c:69 msgid "Executable" msgstr "Exécutable" #: complete.c:73 msgid "Executable link" msgstr "Lien exécutable" #: complete.c:78 msgid "File" msgstr "Fichier" #: complete.c:82 msgid "Character device" msgstr "Périphérique de caractères" #: complete.c:86 msgid "Block device" msgstr "Périphérique de blocs" #: complete.c:90 msgid "Fifo" msgstr "Fifo" #: complete.c:94 msgid "Symbolic link" msgstr "Lien symbolique" #: complete.c:98 msgid "Rotten symbolic link" msgstr "Lien symbolique brisé" #: complete.c:102 msgid "Symbolic link loop" msgstr "Boucle de liens symboliques" #: complete.c:106 msgid "Socket" msgstr "Socket" #: complete.c:110 msgid "Directory" msgstr "Répertoire" #: complete.c:115 msgid "Function" msgstr "Fonction" #: complete.c:119 msgid "Builtin" msgstr "Commande interne" #: complete.c:776 #: complete.c:794 msgid "Unknown option: " msgstr "Option inconnue: " #: complete.c:799 msgid "Multiple matches for option: " msgstr "Plusieurs correspondances pour l'option: " #: env.c:220 msgid "Could not get user information" msgstr "Obtention des informations utilisateur impossible." #: env.c:311 #: env.c:319 msgid "Changing language to English" msgstr "Changement de langue à français" #: env.c:1097 msgid "Tried to pop empty environment stack." msgstr "Impossible de dépiler une pile d'environnement vide" #: event.c:212 #, c-format msgid "signal handler for %ls (%ls)" msgstr "gestionnaire de signaux pour %ls (%ls)" #: event.c:216 #, c-format msgid "handler for variable '%ls'" msgstr "gestionnaire pour la variable '%ls'" #: event.c:222 #, c-format msgid "exit handler for process %d" msgstr "gestionnaire de sortie pour le processus %d" #: event.c:228 #: event.c:239 #, c-format msgid "exit handler for job %d, '%ls'" msgstr "gestionnaire de sortie pour la tâche %d, '%ls'" #: event.c:230 #, c-format msgid "exit handler for job with process group %d" msgstr "gestionnaire de sortie pour la tâche avec le groupe de processus %d" #: event.c:241 #, c-format msgid "exit handler for job with job id %d" msgstr "gestionnaire de sortie pour la tâche %d" #: event.c:551 msgid "Signal list overflow. Signals have been ignored." msgstr "Débordement de la liste des signaux. Des signaux ont été ignorés." #: exec.c:58 #, c-format msgid "An error occurred while redirecting file descriptor %d" msgstr "Une erreur s'est produite pendant la redirection du descripteur de fichier %d" #: exec.c:62 #, c-format msgid "An error occurred while redirecting file '%ls'" msgstr "Une erreur est survenue pendant la redirection du fichier '%ls'" #: exec.c:66 msgid "Could not create child process - exiting" msgstr "Impossible de créer le processus fils - fermeture" #: exec.c:427 #, c-format msgid "Failed to execute process '%ls'" msgstr "L'exécution du processus '%ls' a échoué" #: exec.c:606 #, c-format msgid "Could not send process %d from group %d to group %d" msgstr "Déplacement du processus %d du groupe %d au groupe %d impossible" #: exec.c:624 #: proc.c:844 #: proc.c:856 #, c-format msgid "Could not send job %d ('%ls') to foreground" msgstr "Mise en premier plan de la tâche %d ('%ls') impossible" #: exec.c:791 #, c-format msgid "Unknown function '%ls'" msgstr "Fonction inconnue '%ls'" #: exec.c:892 #, c-format msgid "Unknown input redirection type %d" msgstr "Type de redirection d'entrée inconnu: %d" #: exec.c:1220 #, c-format msgid "Sent null command to subshell. This is a fish bug. If it can be reproduced, please send a bug report to %s." msgstr "Commande nulle envoyé au sous-shell. Ceci est un bogue de fish. S'il peut être reproduit, envoyez un rapport de bogue à %s." #: expand.c:52 msgid "Child process" msgstr "Processus fils" #: expand.c:57 msgid "Process" msgstr "Processus" #: expand.c:62 msgid "Job" msgstr "Tâche" #: expand.c:67 msgid "Job: " msgstr "Tâche: " #: expand.c:72 msgid "Shell process" msgstr "Processus shell" #: expand.c:77 msgid "Last background job" msgstr "Dernière tâche mise en arrière-plan" #: expand.c:1051 msgid "Mismatched brackets" msgstr "Les crochets ne concordent pas" #: input.c:435 msgid "Invalid Control sequence" msgstr "Séquence de contrôle invalide" #: input.c:547 #, c-format msgid "Could not parse sequence '%ls'" msgstr "Analyse de la séquence '%ls' impossible" #: input.c:713 msgid "Invalid sequence - no dash after control\n" msgstr "Séquence invalide - pas de tiret après CTRL\n" #: input.c:743 msgid "Invalid sequence - Control-nothing?\n" msgstr "Séquence invalide - CTRL-rien?\n" #: input.c:758 msgid "Invalid sequence - no dash after meta\n" msgstr "Séquence invalide - pas de tiret après méta\n" #: input.c:763 msgid "Invalid sequence - Meta-nothing?" msgstr "Séquence invalide - Méta-rien?" #: input.c:808 #, c-format msgid "Invalid sequence - '%ls' expanded to zero characters" msgstr "Séquence invalide - '%ls' ne contient aucun caractère" #: input.c:872 msgid "Mismatched $endif in inputrc file" msgstr "Les $endif ne concordent pas dans le fichier inputrc" #: input.c:924 msgid "Mismatched quote" msgstr "Apostrophe non-concordante" #: input.c:938 msgid "Expected a ':'" msgstr "Attendu ':'" #: input.c:983 #, c-format msgid "I don't know what '%ls' means" msgstr "Je ne sais pas ce que '%ls' veut dire" #: input.c:987 #, c-format msgid "Expected end of line, got '%ls'" msgstr "Fin de ligne attendu, '%ls' obtenu" #: input.c:992 msgid "Syntax: set KEY VALUE" msgstr "Syntaxe: set CLÉ VALEUR" #: input.c:1058 msgid "Unable to parse key binding" msgstr "Incapable d'analyser le raccourci clavier" #: input.c:1084 #, c-format msgid "I don't know what %ls means" msgstr "Je ne sais pas ce que %ls veut dire" #: input.c:1110 #, c-format msgid "Error while reading input information from file '%ls'" msgstr "Erreur lors de la lecture d'information d'entrée du fichier '%ls'" #: input.c:1363 msgid "Could not set up terminal" msgstr "Paramétrage du terminal impossible" #: io.c:80 #, c-format msgid "An error occured while reading output from code block on file descriptor %d" msgstr "Une erreur est survenue lors de la lecture de la sortie du bloc de code sur le descripteur de fichier %d" #: main.c:204 #, c-format msgid "Invalid value '%s' for debug level switch" msgstr "Valeur '%s' invalide comme interrupteur au niveau de débogage" #: main.c:232 #: mimedb.c:1274 #: set_color.c:223 #, c-format msgid "%s, version %s\n" msgstr "%s, version %s\n" #: main.c:257 msgid "Can not use the no-execute mode when running an interactive session" msgstr "Le mode no-execute ne peut pas être utilisé dans une session interactive" #: main.c:335 #, c-format msgid "Error while reading file %ls\n" msgstr "Erreur lors de la lecture du fichier %ls\n" #: mimedb.c:161 #: mimedb.c:175 #: mimedb.c:1094 #, c-format msgid "%s: Out of memory\n" msgstr "%s: Mémoire pleine\n" #: mimedb.c:410 #, c-format msgid "%s: Unknown error in munge()\n" msgstr "%s: Erreur inconnue dans munge()\n" #: mimedb.c:428 #, c-format msgid "%s: Locale string too long\n" msgstr "%s: Chaîne de caractères de locale trop longue\n" #: mimedb.c:490 #, c-format msgid "%s: Could not compile regular expressions\n" msgstr "%s: Compilation impossible de l'expression régulière\n" #: mimedb.c:596 #, c-format msgid "%s: No description for type %s\n" msgstr "%s: Aucune description pour le type %s\n" #: mimedb.c:660 #, c-format msgid "%s: Could not parse launcher string '%s'\n" msgstr "%s: Analyse impossible de la chaîne de lancement '%s'\n" #: mimedb.c:693 #, c-format msgid "%s: Default launcher '%s' does not specify how to start\n" msgstr "%s: Le lanceur par défaut '%s' ne spécifie pas comment démarrer\n" #: mimedb.c:1073 #, c-format msgid "%s: Unsupported switch '%c' in launch string '%s'\n" msgstr "%s: Commutateur '%c' non supporté dans la chaîne de démarrage '%s'\n" #: mimedb.c:1285 #, c-format msgid "%s: Can not launch a mimetype\n" msgstr "%s: Impossible de lancer un type Mime\n" #: mimedb.c:1317 #, c-format msgid "%s: Could not parse mimetype from argument '%s'\n" msgstr "%s: Analyse impossible du type Mime à partir de l'argument '%s'\n" #: mimedb.c:1395 #, c-format msgid "%s: Unknown error\n" msgstr "%s: Erreur inconnue\n" #: parser.c:63 #, c-format msgid "If this error can be reproduced, please send a bug report to %s." msgstr "Si cette erreur peut être reproduite, envoyez un rapport de bogue à %s." #: parser.c:68 msgid "This command can not be used in a pipeline" msgstr "Cette commande ne peut pas être utilisée dans un pipeline" #: parser.c:74 #, c-format msgid "Tokenizer error: '%ls'" msgstr "Erreur d'analyseur lexical: '%ls'" #: parser.c:79 msgid "Pipe or short circuit command requires additional command" msgstr "Le tube ou la commande court-circuit exige une commande additionnelle" #: parser.c:84 msgid "Maximum recursion depth reached. Accidental infinite loop?" msgstr "Profondeur maximale de récursion atteinte. Boucle infinie accidentelle?" #: parser.c:89 msgid "Could not locate end of block. The 'end' command is missing, misspelled or a ';' is missing." msgstr "Fin de bloc introuvable. La commande 'end' est manquante, mal écrite ou un ';' est manquant." #: parser.c:94 msgid "Maximum number of nested blocks reached." msgstr "Nombre maximum de blocs imbriqués atteint." #: parser.c:99 #, c-format msgid "Expected a command name, got token of type '%ls'" msgstr "Un nom de commande était attendu, un jeton de type '%ls' a été obtenu" #: parser.c:104 #, c-format msgid "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; or COMMAND'? See the help section for the 'or' builtin command by typing 'help or'." msgstr "Un nom de commande était attendu, un jeton de type '%ls' a été obtenu. Vouliez-vous dire 'COMMANDE; or COMMANDE'? Lisez l'aide pour la commande interne 'or' en tapant 'help or'." #: parser.c:109 #, c-format msgid "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; and COMMAND'? See the help section for the 'and' builtin command by typing 'help and'." msgstr "Un nom de commande était attendu, un jeton de type '%ls' a été obtenu. Vouliez-vous dire 'COMMANDE; and COMMANDE'? Lisez l'aide pour la commande interne 'and' en tapant 'help and'." #: parser.c:114 #, c-format msgid "Illegal command name '%ls'" msgstr "Nom de commande illégal '%ls'" #: parser.c:119 #, c-format msgid "Warning: No match for wildcard '%ls'. The command will not be executed." msgstr "Avertissement: Aucune correspondance pour l'expression générique '%ls'. La commande ne sera pas exécutée." #: parser.c:124 msgid "'case' builtin not inside of switch block" msgstr "Commande interne 'case' à l'extérieur d'un bloc 'switch'" #: parser.c:129 msgid "Loop control command while not inside of loop" msgstr "Commande de contrôle de boucle à l'extérieur d'une boucle" #: parser.c:134 msgid "'else' builtin not inside of if block" msgstr "Commande interne 'else' à l'extérieur d'un bloc 'if'" #: parser.c:139 msgid "'end' command outside of block" msgstr "Commande interne 'end' à l'extérieur d'un bloc" #: parser.c:144 #, c-format msgid "Unknown command '%ls'. Did you mean 'set VARIABLE VALUE'? For information on setting variable values, see the help section on the set command by typing 'help set'." msgstr "Commande '%ls' inconnue. Vouliez-vous dire 'set VARIABLE VALEUR'? Pour de l'information sur l'attribution de valeurs à des variables, lisez l'aide sur la commande 'set' en tapant 'help set'." #: parser.c:149 #, c-format msgid "Expected redirection specification, got token of type '%ls'" msgstr "Spécification de redirection attendue, jeton de type '%ls' obtenu" #: parser.c:154 msgid "Encountered redirection when expecting a command name. Fish does not allow a redirection operation before a command." msgstr "Redirection obtenue alors qu'un nom de commande était attendu. Fish ne permet pas une opération de redirection avant une commande." #: parser.c:159 msgid "Tried to evaluate null pointer." msgstr "Évaluation de pointeur nul." #: parser.c:164 #, c-format msgid "Tried to evaluate commands using invalid block type '%ls'" msgstr "Évaluation de commandes en utilisant un type de bloc invalide '%ls'" #: parser.c:170 #, c-format msgid "Unexpected token of type '%ls'" msgstr "Jeton de type '%ls' inattendu" #: parser.c:175 #, c-format msgid "Error while searching for command '%ls'" msgstr "Erreur lors de la recherche de la commande '%ls'" #: parser.c:181 msgid "'while' block" msgstr "bloc 'while'" #: parser.c:187 msgid "'for' block" msgstr "bloc 'for'" #: parser.c:193 msgid "'if' conditional block" msgstr "bloc conditionnel 'if'" #: parser.c:199 msgid "function definition block" msgstr "bloc de définition de fonction" #: parser.c:205 msgid "function invocation block" msgstr "bloc d'invocation de fonction" #: parser.c:211 msgid "'switch' block" msgstr "bloc 'switch'" #: parser.c:217 msgid "unexecutable block" msgstr "bloc inexécutable" #: parser.c:223 msgid "global root block" msgstr "bloc racine global" #: parser.c:229 msgid "command substitution block" msgstr "bloc de substitution de commande" #: parser.c:235 msgid "'begin' unconditional block" msgstr "bloc inconditionnel 'begin'" #: parser.c:241 msgid "Block created by the . builtin" msgstr "bloc créé par la commande interne '.'" #: parser.c:246 msgid "event handler block" msgstr "bloc de gestion d'événement" #: parser.c:252 msgid "unknown/invalid block" msgstr "bloc inconnu/invalide" #: parser.c:893 #, c-format msgid "Could not write profiling information to file '%s'" msgstr "Écriture des informations de profilage dans le fichier '%s' impossible" #: parser.c:899 msgid "Time\tSum\tCommand\n" msgstr "Temps\tSomme\tCommande\n" #: parser.c:1025 #, c-format msgid "in event handler: %ls\n" msgstr "dans le gestionnaire d'événement: %ls\n" #: parser.c:1039 #, c-format msgid "in . (source) call of file '%ls',\n" msgstr "dans . (source) appel du fichier '%ls',\n" #: parser.c:1044 #, c-format msgid "in function '%ls',\n" msgstr "dans la fonction '%ls',\n" #: parser.c:1049 msgid "in command substitution\n" msgstr "dans la substitution de commande\n" #: parser.c:1059 #, c-format msgid "\tcalled on line %d of file '%ls',\n" msgstr "\tappelé à la ligne %d du fichier '%ls',\n" #: parser.c:1066 msgid "\tcalled on standard input,\n" msgstr "\tappelé sur l'entrée standard,\n" #: parser.c:1080 #, c-format msgid "\twith parameter list '%ls'\n" msgstr "\tavec la liste de paramètres '%ls'\n" #: parser.c:1249 #, c-format msgid "%ls (line %d): " msgstr "%ls (ligne %d): " #: parser.c:1457 #, c-format msgid "Could not expand string '%ls'" msgstr "Développement de la chaîne '%ls' impossible" #: parser.c:1560 msgid "Invalid IO redirection" msgstr "Redirection E/S invalide" #: parser.c:1603 #, c-format msgid "Requested redirection to something that is not a file descriptor %ls" msgstr "Redirection demandée à quelque chose qui n'est pas un descripteur de fichier %ls" #: parser.c:2025 #, c-format msgid "Variables may not be used as commands. Instead, define a function like 'function %ls; %ls $argv; end'. See the help section for the function command by typing 'help function'." msgstr "Les variables ne peuvent pas être utilisées comme des commandes. À la place, définissez une fonction 'function %ls; %ls $argv; end'. Lisez l'aide pour la commande 'function' en tapant 'help function'." #: parser.c:2033 msgid "Variables may not be used as commands. Instead, define a function. See the help section for the function command by typing 'help function'." msgstr "Les variables ne peuvent pas être utilisées comme des commandes. À la place, définissez une fonction. Lisez l'aide pour la commande 'function' en tapant 'help function'." #: parser.c:2040 #, c-format msgid "Commands may not contain variables. Use the eval builtin instead, like 'eval %ls'. See the help section for the eval command by typing 'help eval'." msgstr "Les commandes ne peuvent pas contenir des variables. Utilisez la commande interne 'eval', comme 'eval %ls'. Lisez l'aide sur la commande 'eval' en tapant 'help eval'." #: parser.c:2047 #, c-format msgid "Unknown command '%ls'" msgstr "Commande inconnue '%ls'" #: parser.c:2489 msgid "End of block mismatch. Program terminating." msgstr "Fin du bloc incohérente. Fin du programme." #: proc.c:137 msgid "Job inconsistency" msgstr "Inconsistance de tâche" #: proc.c:455 #, c-format msgid "Job %d, '%ls' has %ls" msgstr "La tâche %d, '%ls' a %ls" #: proc.c:541 #, c-format msgid "%ls: Job %d, '%ls' terminated by signal %ls (%ls)" msgstr "%ls: Tâche %d, '%ls' terminée par le signal %ls (%ls)" #: proc.c:549 #, c-format msgid "%ls: Process %d, '%ls' from job %d, '%ls' terminated by signal %ls (%ls)" msgstr "%ls: Processus %d, '%ls' de la tâche %d, '%ls' terminé par le signal %ls (%ls)" #: proc.c:580 msgid "ended" msgstr "terminé" #: proc.c:804 msgid "An error occured while reading output from code block" msgstr "Une erreur est survenue lors de la lecture de la sortie du bloc de code" #: proc.c:981 #: proc.c:991 #: proc.c:1001 msgid "Could not return shell to foreground" msgstr "Impossible de remettre le shell en premier plan" #: proc.c:1024 msgid "Job command" msgstr "Commande de tâche" #: proc.c:1027 #: proc.c:1054 msgid "Process list pointer" msgstr "Pointeur de la liste des processus" #: proc.c:1030 msgid "Job list pointer" msgstr "Pointeur de la liste des tâches" #: proc.c:1041 #, c-format msgid "More than one job in foreground: job 1: '%ls' job 2: '%ls'" msgstr "Plus d'une tâche en premier plan: tâche 1: '%ls' tâche 2: '%ls'" #: proc.c:1052 msgid "Process argument list" msgstr "Liste des arguments du processus" #: proc.c:1053 msgid "Process name" msgstr "Nom du processus" #: proc.c:1055 msgid "Process command" msgstr "Commande du processus" #: proc.c:1060 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'stopped'=%d" msgstr "Tâche '%ls', le processus '%ls' a un état inconsistant 'arrêté'=%d" #: proc.c:1070 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'completed'=%d" msgstr "Tâche '%ls', le processus '%ls' a un état inconsistant 'complété'=%d" #: reader.c:328 msgid "Could not set terminal mode for new job" msgstr "Impossible de définir le mode du terminal pour la nouvelle tâche" #: reader.c:352 msgid "Could not set terminal mode for shell" msgstr "Impossible de définir le mode du terminal pour le shell" #: reader.c:1636 msgid "Couldn't put the shell in its own process group" msgstr "Mise impossible du shell dans son propre groupe de processus" #: reader.c:1646 msgid "Couldn't grab control of terminal" msgstr "Ne peut pas saisir le contrôle du terminal" #: reader.c:2151 msgid "Pop null reader block" msgstr "Pop null reader block" #: reader.c:2300 msgid "There are stopped jobs\n" msgstr "Il y a des tâches arrêtées\n" #: reader.c:2846 #, c-format msgid "Unknown keybinding %d" msgstr "Raccourci clavier inconnu %d" #: reader.c:2921 msgid "Error while reading commands" msgstr "Erreur lors de la lecture des commandes" #: reader.c:2940 msgid "Error while closing input stream" msgstr "Erreur lors de la fermeture du flux d'entrée" #: reader.c:2965 #, c-format msgid "Could not convert input. Read %d bytes." msgstr "Impossible de convertir l'entrée. %d octets lus." #: reader.c:2971 msgid "Could not read input stream" msgstr "Impossible de lire le flux d'entrée" #: reader.c:2980 msgid "Error while opening input stream" msgstr "Erreur d'ouverture du flux d'entrée" #: sanity.c:37 msgid "Errors detected, shutting down" msgstr "Erreurs détectées, fermeture" #: sanity.c:65 #, c-format msgid "The pointer '%ls' is invalid" msgstr "Le pointeur '%ls' est invalide" #: sanity.c:71 #, c-format msgid "The pointer '%ls' is null" msgstr "Le pointeur '%ls' est nul" #: set_color.c:250 #, c-format msgid "%s: Too many arguments\n" msgstr "%s: Trop d'arguments\n" #: set_color.c:257 #, c-format msgid "%s: Expected an argument\n" msgstr "%s: Un argument attendu\n" #: set_color.c:266 #: set_color.c:274 #, c-format msgid "%s: Unknown color '%s'\n" msgstr "%s: Couleur inconnue '%s'\n" #: signal.c:62 msgid "Terminal hung up" msgstr "Le terminal a raccroché" #: signal.c:70 msgid "Quit request from job control (^C)" msgstr "Requête de sortie du contrôle des tâches (^C)" #: signal.c:78 msgid "Quit request from job control with core dump (^\\)" msgstr "Requête de sortie du contrôle des tâches avec core dump (^\\)" #: signal.c:86 msgid "Illegal instruction" msgstr "Instruction illégale" #: signal.c:94 msgid "Trace or breakpoint trap" msgstr "Déroutement de suivi/point d'arrêt" #: signal.c:102 msgid "Abort" msgstr "Abandon" #: signal.c:110 msgid "Misaligned address error" msgstr "Erreur de mauvaise adresse" #: signal.c:118 msgid "Floating point exception" msgstr "Exception de virgule flottante" #: signal.c:126 msgid "Forced quit" msgstr "Forcé à quitter" #: signal.c:134 msgid "User defined signal 1" msgstr "Signal défini par l'utilisateur 1" #: signal.c:141 msgid "User defined signal 2" msgstr "Signal défini par l'utilisateur 2" #: signal.c:149 msgid "Address boundary error" msgstr "Erreur de frontière d'adresse" #: signal.c:157 msgid "Broken pipe" msgstr "tube interrompu" #: signal.c:165 msgid "Timer expired" msgstr "Expiration de l'horloge" #: signal.c:173 msgid "Polite quit request" msgstr "Demande polie de quitter" #: signal.c:181 msgid "Child process status changed" msgstr "L'état du processus fils a changé" #: signal.c:189 msgid "Continue previously stopped process" msgstr "Continuer le processus précédemment arrêté" #: signal.c:197 msgid "Forced stop" msgstr "Arrêt forcé" #: signal.c:205 msgid "Stop request from job control (^Z)" msgstr "Demande d'arrêt du contrôle des tâches (^Z)" #: signal.c:213 msgid "Stop from terminal input" msgstr "Arrêt de l'entrée du terminal" #: signal.c:221 msgid "Stop from terminal output" msgstr "Arrêt de la sortie du terminal" #: signal.c:229 msgid "Urgent socket condition" msgstr "Condition urgente de socket" #: signal.c:237 msgid "CPU time limit exceeded" msgstr "Limite de temps CPU dépassée" #: signal.c:245 msgid "File size limit exceeded" msgstr "Limite de taille de fichier dépassée" #: signal.c:253 msgid "Virtual timer expired" msgstr "Horloge virtuelle expirée" #: signal.c:261 msgid "Profiling timer expired" msgstr "Horloge de profilage expirée" #: signal.c:269 #: signal.c:277 msgid "Window size change" msgstr "Changement de dimension de fenêtre" #: signal.c:285 msgid "I/O on asynchronous file descriptor is possible" msgstr "E/S sur un descripteur de fichier asynchrone possible" #: signal.c:293 msgid "Power failure" msgstr "Panne de courant" #: signal.c:301 msgid "Bad system call" msgstr "Mauvais appel système" #: signal.c:309 msgid "Information request" msgstr "Demande d'information" #: signal.c:317 msgid "Stack fault" msgstr "Faute de pile" #: signal.c:325 msgid "Emulator trap" msgstr "Déroutement d'émulation" #: signal.c:333 msgid "Abort (Alias for SIGABRT)" msgstr "Abandon (Alias pour SIGABRT)" #: signal.c:341 msgid "Unused signal" msgstr "Signal inutilisé" #: signal.c:400 #: signal.c:415 msgid "Unknown" msgstr "Inconnu" #: tokenizer.c:31 msgid "Unexpected end of token" msgstr "Fin de jeton inattendue" #: tokenizer.c:35 msgid "Parenthesis mismatch" msgstr "Incohérence de parenthèses" #: tokenizer.c:39 msgid "Invalid redirection" msgstr "Redirection invalide" #: tokenizer.c:43 msgid "Invalid input" msgstr "Entrée invalide" #: tokenizer.c:48 msgid "Can not use fd 0 as pipe output" msgstr "Impossible d'utiliser fd 0 comme sortie de tube" #: tokenizer.c:65 msgid "Tokenizer not yet initialized" msgstr "Analyseur lexical pas encore initialisé" #: tokenizer.c:66 msgid "Tokenizer error" msgstr "Erreur d'analyseur lexical" #: tokenizer.c:67 msgid "Invalid token" msgstr "Jeton invalide" #: tokenizer.c:68 msgid "String" msgstr "Chaîne" #: tokenizer.c:69 msgid "Pipe" msgstr "Tube" #: tokenizer.c:70 msgid "End of command" msgstr "Fin de commande" #: tokenizer.c:71 msgid "Redirect output to file" msgstr "Redirige la sortie vers un fichier" #: tokenizer.c:72 msgid "Append output to file" msgstr "Concatène la sortie à un fichier" #: tokenizer.c:73 msgid "Redirect input to file" msgstr "Redirige l'entrée depuis un fichier" #: tokenizer.c:74 msgid "Redirect to file descriptor" msgstr "Redirige vers un descripteur de fichier" #: tokenizer.c:75 msgid "Run job in background" msgstr "Exécuter la tâche en arrière-plan" #: tokenizer.c:76 msgid "Comment" msgstr "Commentaire" #: wgetopt.c:539 #, c-format msgid "%ls: Option '%ls' is ambiguous\n" msgstr "%ls: Option '%ls' ambiguë\n" #: wgetopt.c:563 #, c-format msgid "%ls: Option '--%ls' doesn't allow an argument\n" msgstr "%ls: L'option '--%ls' ne permet pas d'argument\n" #: wgetopt.c:568 #, c-format msgid "%ls: Option '%lc%ls' doesn't allow an argument\n" msgstr "%ls: L'option '%lc%ls' ne permet pas d'argument\n" #: wgetopt.c:582 #, c-format msgid "%ls: Option '%ls' requires an argument\n" msgstr "%ls: L'option '%ls' exige un argument\n" #: wgetopt.c:610 #, c-format msgid "%ls: Unrecognized option '--%ls'\n" msgstr "%ls: Option '--%ls' non reconnue\n" #: wgetopt.c:614 #, c-format msgid "%ls: Unrecognized option '%lc%ls'\n" msgstr "%ls: Option '%lc%ls' non reconnue\n" #: wgetopt.c:639 #, c-format msgid "%ls: Illegal option -- %lc\n" msgstr "%ls: Option illégale -- %lc\n" #: wgetopt.c:641 #, c-format msgid "%ls: Invalid option -- %lc\n" msgstr "%ls: Option invalide -- %lc\n" #: wgetopt.c:675 #, c-format msgid "%ls: Option requires an argument -- %lc\n" msgstr "%ls: L'option exige un argument -- %lc\n" #: wildcard.c:350 msgid "empty" msgstr "vide" #: builtin.h:23 #, c-format msgid "%ls: Expected argument\n" msgstr "%ls: Argument attendu\n" #: builtin.h:33 #, c-format msgid "" "%ls: Invalid combination of options,\n" "%ls\n" msgstr "" "%ls: Combinaison d'options invalide,\n" "%ls\n" #: builtin.h:38 #, c-format msgid "" "%ls: Variable scope can only be one of universal, global and local\n" "%ls\n" msgstr "" "%ls: La portée des variables peut seulement être universelle, globale ou locale\n" "%ls\n" #: builtin.h:43 #, c-format msgid "" "%ls: Variable can't be both exported and unexported\n" "%ls\n" msgstr "" "%ls: La variable ne peut pas être et exportée et non exportée\n" "%ls\n" #: builtin.h:48 #, c-format msgid "%ls: Unknown option '%ls'\n" msgstr "%ls: Option '%ls' inconnue\n" #: builtin.h:53 #, c-format msgid "%ls: Invalid character '%lc' in variable name. Only alphanumerical characters and underscores are valid in a variable name.\n" msgstr "%ls: caractère '%lc' invalide dans le nom de variable. Seuls les caractères alphanumériques et '_' sont valides dans un nom de variable.\n" #: builtin.h:58 #, c-format msgid "%ls: Variable name can not be the empty string\n" msgstr "%ls: Le nom de variable ne peut pas être une chaîne vide\n" #: builtin.h:63 #, c-format msgid "%ls: Second argument must be 'in'\n" msgstr "%ls: Le second argument doit être 'in'\n" #: exec.h:19 msgid "An error occurred while setting up pipe" msgstr "Une erreur est survenue lors du paramétrage du tube" #: expand.h:118 #, c-format msgid "The '$' character begins a variable name. The character '%lc', which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'." msgstr "Le caractère '$' commence un nom de variable. Le caractère '%lc', qui suivait un '$', n'est pas permis dans le nom de variable, et les noms de variables ne peuvent pas avoir une taille de 0. Pour en apprendre plus sur le développement de variables dans fish, tapez 'help expand-variable'." #: expand.h:123 msgid "The '$' begins a variable name. It was given at the end of an argument. Variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'." msgstr "Le caractère '$' commence un nom de variable. Il était donné à la fin d'un argument. Les noms de variables ne peuvent pas avoir une taille de 0. Pour en apprendre plus sur le développement de variables dans fish, tapez 'help expand-variable'." #: expand.h:128 msgid "Did you mean {$VARIABLE}? The '$' character begins a variable name. A bracket, which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'." msgstr "Vouliez-vous dire {$VARIABLE}? Le caractère '$' commence un nom de variable. Un crochet, qui suivait un '$', n'est pas permis dans le nom de variable, et les noms de variables ne peuvent pas avoir une taille de 0. Pour en apprendre plus sur le développement de variables dans fish, tapez 'help expand-variable'." #: expand.h:133 msgid "Did you mean (COMMAND)? In fish, the '$' character is only used for accessing variables. To learn more about command substitution in fish, type 'help expand-command-substitution'." msgstr "Vouliez-vous dire (COMMANDE)? Dans fish, le caractère '$' est seulement utilisé pour accéder à des variables. Pour en apprendre plus sur la substitution de commande dans fish, tapez 'help expand-command-substitution'." #: etc/fish_interactive.fish.in:14 msgid "Welcome to fish, the friendly interactive shell\\n" msgstr "Bienvenue dans fish, le shell amical et interactif\\n" #: etc/fish_interactive.fish.in:15 msgid "Type %shelp%s for instructions on how to use fish\\n" msgstr "Tappez %shelp%s pour des instructions sur l'utilisation de fish\\n" #: etc/fish_interactive.fish.in:21 msgid "Commands to execute when fish exits" msgstr "Commandes à exécuter à la fermeture de fish" #: etc/fish_interactive.fish.in:22 msgid "Good bye\\n" msgstr "Au revoir\\n" #: share/fish:22 msgid "%s: Warning: The directory %s has been removed from your PATH, because it does not exist\\n" msgstr "%s: Attention: Le répertoire %s a été enlevé de votre variable PATH, parce qu'il n'existe pas\\n" #: share/fish:108 msgid "Start service" msgstr "Démarrer le service" #: share/fish:109 msgid "Stop service" msgstr "Arrêter le service" #: share/fish:110 msgid "Print service status" msgstr "Afficher l'état du service" #: share/fish:111 msgid "Stop and then start service" msgstr "Redémarrer le service" #: share/fish:112 msgid "Reload service configuration" msgstr "Recharger la configuration du service" #: share/completions/apm.fish:2 #: share/completions/apropos.fish:20 #: share/completions/apt-build.fish:29 #: share/completions/apt-cache.fish:28 #: share/completions/apt-cdrom.fish:11 #: share/completions/apt-config.fish:5 #: share/completions/apt-file.fish:12 #: share/completions/apt-ftparchive.fish:15 #: share/completions/apt-get.fish:61 #: share/completions/apt-proxy-import.fish:3 #: share/completions/apt-rdepends.fish:12 #: share/completions/apt-show-source.fish:8 #: share/completions/apt-sortpkgs.fish:4 #: share/completions/apt-zip-inst.fish:3 #: share/completions/apt-zip-list.fish:3 #: share/completions/at.fish:2 #: share/completions/atq.fish:2 #: share/completions/atrm.fish:2 #: share/completions/bc.fish:8 #: share/completions/bunzip2.fish:15 #: share/completions/bzip2.fish:17 #: share/completions/cat.fish:11 #: share/completions/cdrecord.fish:5 #: share/completions/chgrp.fish:11 #: share/completions/chown.fish:10 #: share/completions/configure.fish:2 #: share/completions/cut.fish:9 #: share/completions/cvs.fish:51 #: share/completions/cvs.fish:73 #: share/completions/date.fish:10 #: share/completions/df.fish:29 #: share/completions/diff.fish:25 #: share/completions/du.fish:19 #: share/completions/echo.fish:5 #: share/completions/fish.fish:3 #: share/completions/fusermount.fish:14 #: share/completions/gprof.fish:32 #: share/completions/grep.fish:43 #: share/completions/gunzip.fish:18 #: share/completions/gzip.fish:20 #: share/completions/id.fish:7 #: share/completions/less.fish:41 #: share/completions/make.fish:26 #: share/completions/mimedb.fish:9 #: share/completions/modprobe.fish:14 #: share/completions/mount.fish:8 #: share/completions/mplayer.fish:83 #: share/completions/mv.fish:11 #: share/completions/nice.fish:4 #: share/completions/patch.fish:34 #: share/completions/perl.fish:18 #: share/completions/ping.fish:27 #: share/completions/ps.fish:34 #: share/completions/python.fish:12 #: share/completions/rm.fish:9 #: share/completions/rmdir.fish:7 #: share/completions/rpm.fish:5 #: share/completions/ruby.fish:21 #: share/completions/sed.fish:28 #: share/completions/sort.fish:20 #: share/completions/sshfs.fish:24 #: share/completions/su.fish:11 #: share/completions/tar.fish:51 #: share/completions/test.fish:3 #: share/completions/time.fish:10 #: share/completions/top.fish:13 #: share/completions/touch.fish:11 #: share/completions/umount.fish:10 #: share/completions/uname.fish:11 #: share/completions/uniq.fish:14 #: share/completions/valgrind.fish:26 #: share/completions/w.fish:5 #: share/completions/wc.fish:7 #: share/completions/wget.fish:5 #: share/completions/who.fish:19 #: share/completions/xargs.fish:18 #: share/completions/xsel.fish:18 #: share/completions/yum.fish:54 #: share/completions/zcat.fish:9 #: share/functions/__fish_complete_ls.fish:91 #: share/functions/__fish_complete_tex.fish:5 msgid "Display version and exit" msgstr "Afficher la version et quitter" #: share/completions/apm.fish:3 msgid "Print APM info" msgstr "Afficher les informations APM" #: share/completions/apm.fish:4 msgid "Print time remaining" msgstr "Afficher le temps restant" #: share/completions/apm.fish:5 msgid "Monitor status info" msgstr "Surveiller l'info sur l'état" #: share/completions/apm.fish:6 msgid "Request APM standby mode" msgstr "Demande de mise en veille APM" #: share/completions/apm.fish:7 msgid "Request APM suspend mode" msgstr "Demande de suspension APM" #: share/completions/apm.fish:8 msgid "APM status debugging info" msgstr "Information de débogage de l'état APM" #: share/completions/apropos.fish:9 msgid "whatis entry" msgstr "whatis entry" #: share/completions/apropos.fish:11 #: share/completions/apt-build.fish:3 #: share/completions/apt-cache.fish:2 #: share/completions/apt-cdrom.fish:2 #: share/completions/apt-config.fish:2 #: share/completions/apt-extracttemplates.fish:3 #: share/completions/apt-file.fish:2 #: share/completions/apt-ftparchive.fish:2 #: share/completions/apt-get.fish:23 #: share/completions/apt-listbugs.fish:2 #: share/completions/apt-listchanges.fish:2 #: share/completions/apt-proxy-import.fish:2 #: share/completions/apt-rdepends.fish:2 #: share/completions/apt-show-source.fish:2 #: share/completions/apt-show-versions.fish:2 #: share/completions/apt-sortpkgs.fish:2 #: share/completions/apt-spy.fish:2 #: share/completions/apt-src.fish:2 #: share/completions/apt-zip-inst.fish:2 #: share/completions/apt-zip-list.fish:2 #: share/completions/bc.fish:9 #: share/completions/cat.fish:10 #: share/completions/chgrp.fish:10 #: share/completions/chown.fish:9 #: share/completions/complete.fish:13 #: share/completions/configure.fish:1 #: share/completions/cut.fish:8 #: share/completions/date.fish:9 #: share/completions/df.fish:28 #: share/completions/diff.fish:26 #: share/completions/du.fish:18 #: share/completions/echo.fish:4 #: share/completions/emerge.fish:30 #: share/completions/fish.fish:2 #: share/completions/functions.fish:4 #: share/completions/fusermount.fish:13 #: share/completions/gpg.fish:108 #: share/completions/gprof.fish:31 #: share/completions/grep.fish:23 #: share/completions/gunzip.fish:8 #: share/completions/gzip.fish:10 #: share/completions/id.fish:6 #: share/completions/less.fish:1 #: share/completions/man.fish:28 #: share/completions/mimedb.fish:8 #: share/completions/mount.fish:9 #: share/completions/mplayer.fish:30 #: share/completions/mplayer.fish:35 #: share/completions/mplayer.fish:82 #: share/completions/mv.fish:10 #: share/completions/nice.fish:3 #: share/completions/patch.fish:19 #: share/completions/pine.fish:3 #: share/completions/ps.fish:35 #: share/completions/python.fish:4 #: share/completions/read.fish:1 #: share/completions/rm.fish:8 #: share/completions/rmdir.fish:6 #: share/completions/rpm.fish:4 #: share/completions/ruby.fish:8 #: share/completions/sed.fish:27 #: share/completions/set.fish:65 #: share/completions/sort.fish:19 #: share/completions/sshfs.fish:32 #: share/completions/su.fish:10 #: share/completions/sudo.fish:7 #: share/completions/test.fish:2 #: share/completions/time.fish:9 #: share/completions/top.fish:5 #: share/completions/touch.fish:10 #: share/completions/trap.fish:4 #: share/completions/type.fish:2 #: share/completions/ulimit.fish:13 #: share/completions/umount.fish:11 #: share/completions/uname.fish:10 #: share/completions/uniq.fish:13 #: share/completions/valgrind.fish:24 #: share/completions/vared.fish:2 #: share/completions/wc.fish:6 #: share/completions/wget.fish:6 #: share/completions/who.fish:18 #: share/completions/xargs.fish:8 #: share/completions/xprop.fish:2 #: share/completions/xsel.fish:16 #: share/completions/yum.fish:46 #: share/completions/zcat.fish:7 #: share/completions/zip.fish:31 #: share/functions/__fish_complete_ls.fish:90 #: share/functions/__fish_complete_tex.fish:4 msgid "Display help and exit" msgstr "Afficher l'aide et quitter" #: share/completions/apropos.fish:12 msgid "Print debugging info" msgstr "Afficher les infos de débogage" #: share/completions/apropos.fish:13 #: share/completions/apt-file.fish:8 #: share/completions/apt-listchanges.fish:4 #: share/completions/apt-proxy-import.fish:4 #: share/completions/apt-show-source.fish:10 #: share/completions/arp.fish:2 #: share/completions/darcs.fish:64 #: share/completions/darcs.fish:144 #: share/completions/darcs.fish:155 #: share/completions/darcs.fish:160 #: share/completions/makedepend.fish:11 #: share/completions/mount.fish:10 #: share/completions/mv.fish:9 #: share/completions/ping.fish:26 #: share/completions/python.fish:11 #: share/completions/rmdir.fish:5 #: share/completions/rpm.fish:7 #: share/completions/ruby.fish:19 #: share/completions/tar.fish:49 #: share/completions/time.fish:8 #: share/completions/umount.fish:12 #: share/completions/valgrind.fish:28 #: share/completions/wget.fish:13 #: share/completions/zip.fish:14 #: share/functions/__fish_complete_ssh.fish:59 msgid "Verbose mode" msgstr "Mode détaillé" #: share/completions/apropos.fish:14 msgid "Keyword as regex" msgstr "Mot clé comme regex" #: share/completions/apropos.fish:15 msgid "Keyword as wildcards" msgstr "Mot clé comme expression générique" #: share/completions/apropos.fish:16 msgid "Keyword as exactly match" msgstr "Mot clé comme correspondance exacte" #: share/completions/apropos.fish:17 msgid "Search for other system" msgstr "Rechercher un autre système" #: share/completions/apropos.fish:18 msgid "Specify man path" msgstr "Spécifier la variable MANPATH" #: share/completions/apropos.fish:19 msgid "Specify a configuration file" msgstr "Spécifier un fichier de configuration" #: share/completions/apt-build.fish:4 msgid "Update list of packages" msgstr "Actualiser la liste des paquets" #: share/completions/apt-build.fish:5 msgid "Upgrade packages" msgstr "Mettre à niveau les paquets" #: share/completions/apt-build.fish:6 msgid "Rebuild your system" msgstr "Reconstruire votre système" #: share/completions/apt-build.fish:7 msgid "Build and install a new package" msgstr "Construire et installer un nouveau paquet" #: share/completions/apt-build.fish:8 msgid "Download and extract a source" msgstr "Télécharger et extraire une source" #: share/completions/apt-build.fish:9 msgid "Info on a package" msgstr "Info sur un paquet" #: share/completions/apt-build.fish:10 msgid "Remove packages" msgstr "Supprime les paquet" #: share/completions/apt-build.fish:11 msgid "Erase built packages" msgstr "Efface les paquets construits" #: share/completions/apt-build.fish:12 msgid "Build source without install" msgstr "Construire sans installer" #: share/completions/apt-build.fish:13 msgid "Clean source directories" msgstr "Nettoyer les répertoires source" #: share/completions/apt-build.fish:14 msgid "Update source and rebuild" msgstr "Mettre à jour la source et reconstruire" #: share/completions/apt-build.fish:15 msgid "Update the repository" msgstr "Mettre à jour le référentiel" #: share/completions/apt-build.fish:16 msgid "Do not use gcc wrapper" msgstr "Ne pas utiliser le l'enveloppe gcc" #: share/completions/apt-build.fish:17 msgid "Remove build-dep" msgstr "Supprimer les dépendance de construction" #: share/completions/apt-build.fish:18 msgid "Do not download source" msgstr "Ne pas télécharger la source" #: share/completions/apt-build.fish:19 msgid "Specify build-dir" msgstr "Spécifier le répertoire de construction" #: share/completions/apt-build.fish:20 msgid "Rebuild a package" msgstr "Reconstruire un paquet" #: share/completions/apt-build.fish:21 msgid "Rebuild and install an installed package" msgstr "Reconstruire et installer un paquet installé" #: share/completions/apt-build.fish:22 msgid "Use to build" msgstr "Utiliser pour construire" #: share/completions/apt-build.fish:23 msgid "Apply patch" msgstr "Appliquer la patch " #: share/completions/apt-build.fish:24 msgid "Prefix to strip on patch" msgstr "Préfixe à sauter dans la patch" #: share/completions/apt-build.fish:25 #: share/completions/apt-listbugs.fish:21 #: share/completions/yum.fish:47 msgid "Assume yes to all questions" msgstr "Assumer oui à toutes les questions" #: share/completions/apt-build.fish:26 #: share/completions/apt-get.fish:50 msgid "Use purge instead of remove" msgstr "Purger au lieu de supprimer" #: share/completions/apt-build.fish:27 msgid "Do not run update" msgstr "Ne pas lancer de mise à jour" #: share/completions/apt-build.fish:28 msgid "Specify sources.list file" msgstr "Spécifier un fichier sources.list" #: share/completions/apt-cache.fish:3 msgid "Build apt cache" msgstr "Construire la cache apt" #: share/completions/apt-cache.fish:4 msgid "Show package info" msgstr "Afficher les infos du paquet" #: share/completions/apt-cache.fish:5 msgid "Show cache statistics" msgstr "Afficher les statistiques de la cache" #: share/completions/apt-cache.fish:6 msgid "Show source package" msgstr "Afficher le paquet source" #: share/completions/apt-cache.fish:7 msgid "Show packages in cache" msgstr "Afficher les paquets dans la cache" #: share/completions/apt-cache.fish:8 msgid "Print available list" msgstr "Afficher la liste disponible" #: share/completions/apt-cache.fish:9 msgid "List unmet dependencies in cache" msgstr "Lister les dépendances non satisfaites de la cache" #: share/completions/apt-cache.fish:10 msgid "Display package record" msgstr "Afficher la fiche du paquet" #: share/completions/apt-cache.fish:11 msgid "Search packagename by REGEX" msgstr "Chercher un nom de paquet par REGEX" #: share/completions/apt-cache.fish:12 msgid "Search full package name" msgstr "Chercher le nom complet de paquet" #: share/completions/apt-cache.fish:13 msgid "Search packagename only" msgstr "Chercher le nom du paquet seulement" #: share/completions/apt-cache.fish:14 msgid "List dependencies for the package" msgstr "Lister les dépendances du paquet" #: share/completions/apt-cache.fish:15 msgid "List reverse dependencies for the package" msgstr "Lister les dépendances inverses du paquet" #: share/completions/apt-cache.fish:16 msgid "Print package name by prefix" msgstr "Afficher le nom du paquet par préfixe" #: share/completions/apt-cache.fish:17 msgid "Generate dotty output for packages" msgstr "Générer la sortie dotty pour les paquets" #: share/completions/apt-cache.fish:18 msgid "Debug preferences file" msgstr "Déboguer le fichier de préférences" #: share/completions/apt-cache.fish:19 msgid "Select file to store package cache" msgstr "Choisir le fichier de cache des paquets" #: share/completions/apt-cache.fish:20 msgid "Select file to store source cache" msgstr "Choisir le fichier de cache des sources" #: share/completions/apt-cache.fish:21 #: share/completions/apt-ftparchive.fish:10 #: share/completions/apt-get.fish:39 #: share/completions/configure.fish:3 #: share/completions/gpg.fish:130 #: share/completions/make.fish:23 #: share/completions/ping.fish:17 #: share/completions/rpm.fish:6 #: share/completions/ssh.fish:37 #: share/completions/valgrind.fish:27 #: share/completions/wget.fish:12 #: share/completions/zip.fish:13 msgid "Quiet mode" msgstr "Mode silencieux" #: share/completions/apt-cache.fish:22 msgid "Print important dependencies" msgstr "Afficher les dépendances importantes" #: share/completions/apt-cache.fish:23 msgid "Print full records" msgstr "Afficher les fiches complètes" #: share/completions/apt-cache.fish:24 msgid "Auto-gen package cache" msgstr "Générer automatiquement la cache des paquets" #: share/completions/apt-cache.fish:25 msgid "Print all names" msgstr "Afficher tous les noms" #: share/completions/apt-cache.fish:26 msgid "Dep and rdep recursive" msgstr "Dépendances récursives" #: share/completions/apt-cache.fish:27 msgid "Limit to installed" msgstr "Limiter aux installés" #: share/completions/apt-cache.fish:29 #: share/completions/apt-cdrom.fish:12 #: share/completions/apt-config.fish:6 msgid "Specify config file" msgstr "Spécifier le fichier de config" #: share/completions/apt-cache.fish:30 #: share/completions/apt-cdrom.fish:13 #: share/completions/apt-config.fish:7 #: share/completions/apt-extracttemplates.fish:6 #: share/completions/apt-zip-list.fish:10 msgid "Specify options" msgstr "Spécifier les options" #: share/completions/apt-cdrom.fish:3 msgid "Add new disc to source list" msgstr "Ajouter un nouveau disque à la liste des sources" #: share/completions/apt-cdrom.fish:4 msgid "Report identity of disc" msgstr "Rapporter l'identité du disque" #: share/completions/apt-cdrom.fish:5 #: share/completions/fusermount.fish:6 #: share/completions/mount.fish:7 #: share/completions/sshfs.fish:20 #: share/completions/umount.fish:8 msgid "Mount point" msgstr "Point de montage" #: share/completions/apt-cdrom.fish:6 msgid "Rename a disc" msgstr "Renommer un disque" #: share/completions/apt-cdrom.fish:7 msgid "No mounting" msgstr "Pas de montage" #: share/completions/apt-cdrom.fish:8 msgid "Fast copy" msgstr "Copie rapide" #: share/completions/apt-cdrom.fish:9 msgid "Thorough package scan" msgstr "Examination profonde des paquets" #: share/completions/apt-cdrom.fish:10 msgid "No changes" msgstr "Pas de changements" #: share/completions/apt-config.fish:3 msgid "Access config file from shell" msgstr "Accéder au fichier de config à partir du shell" #: share/completions/apt-config.fish:4 msgid "Dump contents of config file" msgstr "Afficher le contenu du fichier de config" #: share/completions/apt-extracttemplates.fish:4 msgid "Set temp dir" msgstr "Définir le répertoire temporaire" #: share/completions/apt-extracttemplates.fish:5 msgid "Specifiy config file" msgstr "Spécifier le fichier de configuration" #: share/completions/apt-file.fish:3 msgid "Resync package contents from source" msgstr "Resynchroniser le contenu du paquet depuis la source" #: share/completions/apt-file.fish:4 msgid "Search package containing pattern" msgstr "Cherche les paquet contenant le motif" #: share/completions/apt-file.fish:5 msgid "List contents of a package matching pattern" msgstr "Lister le contenu d'un paquet correspondant au motif" #: share/completions/apt-file.fish:6 msgid "Remove all gz files from cache" msgstr "Supprimer tous les fichiers gz de la cache" #: share/completions/apt-file.fish:7 msgid "Set cache dir" msgstr "Définir le répertoire cache" #: share/completions/apt-file.fish:9 msgid "Use cdrom-mount-point" msgstr "Utiliser le point de montage du cdrom" #: share/completions/apt-file.fish:10 #: share/completions/apt-file.fish:16 msgid "Do not expand pattern" msgstr "Ne pas développer le motif" #: share/completions/apt-file.fish:11 msgid "Pattern is regexp" msgstr "Le motif est une regexp" #: share/completions/apt-file.fish:13 msgid "Set arch" msgstr "Définir l'architecture" #: share/completions/apt-file.fish:14 msgid "Set sources.list file" msgstr "Définir le fichier sources.list" #: share/completions/apt-file.fish:15 msgid "Only display package name" msgstr "Afficher seulement le nom du paquet" #: share/completions/apt-file.fish:17 msgid "Run in dummy mode" msgstr "Exécuter en mode fictif" #: share/completions/apt-ftparchive.fish:3 msgid "Generate package from source" msgstr "Générer le paquet depuis la source" #: share/completions/apt-ftparchive.fish:4 msgid "Generate source index file" msgstr "Générer le fichier d'index source" #: share/completions/apt-ftparchive.fish:5 msgid "Generate contents file" msgstr "Générer le fichier de contenu" #: share/completions/apt-ftparchive.fish:6 msgid "Generate release file" msgstr "Générer le fichier de version" #: share/completions/apt-ftparchive.fish:7 msgid "Remove records" msgstr "Nettoyer les fiches" #: share/completions/apt-ftparchive.fish:8 msgid "Generate MD5 sums" msgstr "Générer la somme MD5" #: share/completions/apt-ftparchive.fish:9 msgid "Use a binary db" msgstr "Utiliser une base de données binaire" #: share/completions/apt-ftparchive.fish:11 msgid "Perform delinking" msgstr "Défaire les liens" #: share/completions/apt-ftparchive.fish:12 msgid "Perform contents generation" msgstr "Générer le contenu" #: share/completions/apt-ftparchive.fish:13 msgid "Use source override" msgstr "" #: share/completions/apt-ftparchive.fish:14 msgid "Make caching db readonly" msgstr "Mettre la BD en lecture seule" #: share/completions/apt-ftparchive.fish:16 msgid "Use config file" msgstr "Utiliser le fichier de config" #: share/completions/apt-ftparchive.fish:17 #: share/completions/apt-sortpkgs.fish:6 msgid "Set config options" msgstr "Définir les options de config" #: share/completions/apt-get.fish:3 msgid "Test if apt has yet to be given the subcommand" msgstr "Tester si apt doit se faire donner la sous-commande" #: share/completions/apt-get.fish:12 msgid "Test if apt command should have packages as potential completion" msgstr "Tester si la commande apt devrait avoir les paquets comme complétion potentielle" #: share/completions/apt-get.fish:21 #: share/completions/emerge.fish:28 #: share/completions/emerge.fish:29 #: share/functions/__fish_print_packages.fish:13 msgid "Package" msgstr "Paquet" #: share/completions/apt-get.fish:24 msgid "Update sources" msgstr "Actualiser les sources" #: share/completions/apt-get.fish:25 msgid "Upgrade or install newest packages" msgstr "Mettre à niveau ou installer les plus nouveaux paquets" #: share/completions/apt-get.fish:26 msgid "Use with dselect front-end" msgstr "Utiliser dselect" #: share/completions/apt-get.fish:27 msgid "Distro upgrade" msgstr "Mise à niveau de la distro" #: share/completions/apt-get.fish:28 msgid "Install one or more packages" msgstr "Installer un ou des paquets" #: share/completions/apt-get.fish:29 msgid "Remove one or more packages" msgstr "Supprimer un ou des paquets" #: share/completions/apt-get.fish:30 msgid "Fetch source packages" msgstr "Récupérer les paquets sources" #: share/completions/apt-get.fish:31 msgid "Install/remove packages for dependencies" msgstr "Installer/supprimer les dépendances de construction" #: share/completions/apt-get.fish:32 msgid "Update cache and check dependencies" msgstr "Mettre à jour la cache et vérifier les dépendances" #: share/completions/apt-get.fish:33 msgid "Clean local caches and packages" msgstr "Nettoyer les paquets locaux" #: share/completions/apt-get.fish:34 msgid "Clean packages no longer be downloaded" msgstr "Nettoyer les paquets ne pouvant plus être téléchargés" #: share/completions/apt-get.fish:35 msgid "Download Only" msgstr "Télécharger seulement" #: share/completions/apt-get.fish:36 msgid "Correct broken dependencies" msgstr "Corriger les dépendances brisées" #: share/completions/apt-get.fish:37 msgid "Ignore missing packages" msgstr "Ignorer les paquets manquants" #: share/completions/apt-get.fish:38 msgid "Disable downloading packages" msgstr "Désactiver le téléchargement de paquets" #: share/completions/apt-get.fish:40 msgid "Perform a simulation" msgstr "Simuler" #: share/completions/apt-get.fish:41 msgid "Automatic yes to prompts" msgstr "Assumer Oui aux questions" #: share/completions/apt-get.fish:42 msgid "Show upgraded packages" msgstr "Afficher les paquets mis à niveau" #: share/completions/apt-get.fish:43 msgid "Show full versions for packages" msgstr "Afficher les versions complètes pour les paquets" #: share/completions/apt-get.fish:44 #: share/completions/apt-get.fish:45 msgid "Compile source packages" msgstr "Compiler les paquets source" #: share/completions/apt-get.fish:46 msgid "Ignore package Holds" msgstr "" #: share/completions/apt-get.fish:47 msgid "Do not upgrade packages" msgstr "Aucune mise à niveau" #: share/completions/apt-get.fish:48 msgid "Force yes" msgstr "Forcer oui" #: share/completions/apt-get.fish:49 msgid "Print the URIs" msgstr "Afficher les URIs" #: share/completions/apt-get.fish:51 msgid "Reinstall packages" msgstr "Réinstaller les paquets" #: share/completions/apt-get.fish:52 msgid "Erase obsolete files" msgstr "Effacer les fichiers obsolètes" #: share/completions/apt-get.fish:53 msgid "Control default input to the policy engine" msgstr "Choisir la version" #: share/completions/apt-get.fish:54 msgid "Only perform operations that are trivial" msgstr "Effectuer seulement les opérations triviales" #: share/completions/apt-get.fish:55 msgid "Abort if any packages are to be removed" msgstr "Abandonner si un paquet doit être enlevé" #: share/completions/apt-get.fish:56 msgid "Only accept source packages" msgstr "Seulement accepter les paquets source" #: share/completions/apt-get.fish:57 msgid "Download only diff file" msgstr "Télécharger seulement le fichier diff" #: share/completions/apt-get.fish:58 msgid "Download only tar file" msgstr "Télécharger seulement le fichier tar" #: share/completions/apt-get.fish:59 msgid "Only process arch-dependant build-dependencies" msgstr "Traiter seulement les dépendances de construction dépendantes de l'architecture" #: share/completions/apt-get.fish:60 msgid "Ignore non-authenticated packages" msgstr "Ignorer les paquets non-authentifiés" #: share/completions/apt-get.fish:62 msgid "Specify a config file" msgstr "Spécifier un fichier de config" #: share/completions/apt-get.fish:63 msgid "Set a config option" msgstr "Définir une option de config" #: share/completions/apt-key.fish:2 msgid "Add a new key" msgstr "Ajouter une nouvelle clé" #: share/completions/apt-key.fish:3 msgid "Remove a key" msgstr "Supprimer une clé" #: share/completions/apt-key.fish:4 msgid "List trusted keys" msgstr "Lister les clés de confiance" #: share/completions/apt-listbugs.fish:3 msgid "Set severity" msgstr "Définir la sévérité" #: share/completions/apt-listbugs.fish:4 msgid "Tags you want to see" msgstr "Balises à afficher" #: share/completions/apt-listbugs.fish:5 msgid "Bug-status you want to see" msgstr "État de bogue à afficher" #: share/completions/apt-listbugs.fish:6 msgid "Ignore bugs in your system" msgstr "Ignorer les bogues dans votre système" #: share/completions/apt-listbugs.fish:7 msgid "Ignore newer bugs than upgrade packages" msgstr "" #: share/completions/apt-listbugs.fish:8 msgid "Bugs for downgrade packages" msgstr "" #: share/completions/apt-listbugs.fish:9 msgid "Bug Tracking system" msgstr "Système de suivi des bogues" #: share/completions/apt-listbugs.fish:10 msgid "Specify port for web interface" msgstr "Spécifier le port pour l'interface web" #: share/completions/apt-listbugs.fish:11 msgid "Use daily bug report" msgstr "Utiliser le rapport de bogue quotidien" #: share/completions/apt-listbugs.fish:12 msgid "Use the raw index.db" msgstr "Utiliser le fichier index.db" #: share/completions/apt-listbugs.fish:13 msgid "Specify index dir" msgstr "Spécifier le rep. d'index" #: share/completions/apt-listbugs.fish:14 msgid "Specify Pin-Priority value" msgstr "" #: share/completions/apt-listbugs.fish:15 msgid "Specify the title of rss" msgstr "Spécifier le titre du rss" #: share/completions/apt-listbugs.fish:16 msgid "Retrieve fresh bugs" msgstr "Récupérer les nouveaux bogues" #: share/completions/apt-listbugs.fish:17 #: share/completions/scp.fish:32 msgid "Do not display progress bar" msgstr "Ne pas afficher la barre de progression" #: share/completions/apt-listbugs.fish:18 msgid "Specify local cache dir" msgstr "Spécifier un rep. de cache local" #: share/completions/apt-listbugs.fish:19 msgid "Specify the expire cache timer" msgstr "Spécifier l'expiration de la cache" #: share/completions/apt-listbugs.fish:20 msgid "Specify apt config file" msgstr "Spécifier le fichier de config d'APT" #: share/completions/apt-listbugs.fish:22 msgid "Assume no to all questions" msgstr "Assumer non comme réponse" #: share/completions/apt-listbugs.fish:23 msgid "List bugs from packages" msgstr "Lister les bogues des paquets" #: share/completions/apt-listbugs.fish:24 msgid "List bugs in rss format" msgstr "Lister les bogues au format rss" #: share/completions/apt-listchanges.fish:3 msgid "Read filenames from pipe" msgstr "Lire les noms de fichier depuis un tube" #: share/completions/apt-listchanges.fish:5 msgid "Select frontend interface" msgstr "Choisir l'interface de façade" #: share/completions/apt-listchanges.fish:6 #: share/completions/darcs.fish:171 msgid "Specify email address" msgstr "Spécifier l'adresse de courriel" #: share/completions/apt-listchanges.fish:7 msgid "Ask confirmation" msgstr "Demander une confirmation" #: share/completions/apt-listchanges.fish:8 msgid "Display all changelogs" msgstr "Afficher tous les journaux des modifications" #: share/completions/apt-listchanges.fish:9 msgid "Avoid changelogs from db in named file" msgstr "" #: share/completions/apt-listchanges.fish:10 msgid "Select display" msgstr "Choisir l'affichage" #: share/completions/apt-listchanges.fish:11 msgid "Insert header" msgstr "Insérer l'en-tête" #: share/completions/apt-listchanges.fish:12 #: share/completions/ps.fish:36 msgid "Display debug info" msgstr "Afficher les infos de débogage" #: share/completions/apt-listchanges.fish:13 msgid "Select an option profile" msgstr "Choisir un profile d'option" #: share/completions/apt-move.fish:2 msgid "Generate master file" msgstr "Générer un fichier maître" #: share/completions/apt-move.fish:3 msgid "Alias for 'get'" msgstr "Alias pour 'get'" #: share/completions/apt-move.fish:4 msgid "Move packages to local tree" msgstr "Déplacer les paquets dans l'arbre local" #: share/completions/apt-move.fish:5 msgid "Delete obsolete package files" msgstr "Supprimer les fichiers obsolètes" #: share/completions/apt-move.fish:6 msgid "Build new local files" msgstr "Construire des nouveaux fichiers locaux" #: share/completions/apt-move.fish:7 msgid "Rebuild index files" msgstr "Reconstruire l'index des fichiers" #: share/completions/apt-move.fish:8 msgid "Move packages from cache to local mirror" msgstr "Déplacer les paquets de la cache au miroir local" #: share/completions/apt-move.fish:9 msgid "Alias for 'move delete packages'" msgstr "Alias pour 'move delete packages'" #: share/completions/apt-move.fish:10 msgid "Alias for 'update'" msgstr "Alias pour 'update'" #: share/completions/apt-move.fish:11 msgid "Download package missing from mirror" msgstr "Télécharger les paquets manquant au miroir" #: share/completions/apt-move.fish:12 msgid "Sync packages installed" msgstr "Synchroniser les paquets installés" #: share/completions/apt-move.fish:14 msgid "Move file specified on commandline" msgstr "Déplacer le fichier spécifier dans la ligne de commande" #: share/completions/apt-move.fish:15 msgid "List packages that may serve as input to mirrorbin or mirrorsource" msgstr "" #: share/completions/apt-move.fish:16 msgid "Fetch package from STDIN" msgstr "Récupérer le paquet de STDIN" #: share/completions/apt-move.fish:17 msgid "Fetch source package from STDIN" msgstr "Récupérer le paquet source de STDIN" #: share/completions/apt-move.fish:18 msgid "Process all packages" msgstr "Traiter tous les paquets" #: share/completions/apt-move.fish:19 msgid "Use specific conffile" msgstr "Utiliser un fichier de config spécifique" #: share/completions/apt-move.fish:20 msgid "Force deletion" msgstr "Forcer la suppression" #: share/completions/apt-move.fish:21 msgid "Suppresses normal output" msgstr "Effacer la sortie normale" #: share/completions/apt-move.fish:22 msgid "Test run" msgstr "Essai" #: share/completions/apt-proxy-import.fish:5 msgid "No message to STDOUT" msgstr "Aucun message à STDOUT" #: share/completions/apt-proxy-import.fish:6 msgid "Recurse into subdir" msgstr "Récursif" #: share/completions/apt-proxy-import.fish:7 msgid "Dir to import" msgstr "Rep. à importer" #: share/completions/apt-proxy-import.fish:8 msgid "Change to user" msgstr "Changer d'utilisateur" #: share/completions/apt-proxy-import.fish:9 msgid "Debug level[default 0]" msgstr "Niveau de débogage[défaut 0]" #: share/completions/apt-rdepends.fish:3 msgid "Show build dependencies" msgstr "Afficher les dépendances de construction" #: share/completions/apt-rdepends.fish:4 msgid "Generate a dotty graph" msgstr "Générer un graphique dotty" #: share/completions/apt-rdepends.fish:5 msgid "Show state of dependencies" msgstr "Afficher l'état des dépendances" #: share/completions/apt-rdepends.fish:6 msgid "List packages depending on" msgstr "Lister les dépendances inverses" #: share/completions/apt-rdepends.fish:7 msgid "Comma-separated list of dependancy types to follow recursively" msgstr "Liste séparée par des virgules de types de dépendances à suivre récursivement" #: share/completions/apt-rdepends.fish:8 msgid "Comma-separated list of dependancy types to show" msgstr "Liste séparée par des virgules de types de dépendances à afficher" #: share/completions/apt-rdepends.fish:9 msgid "Comma-separated list of package installation states to follow recursively" msgstr "Liste séparée par des virgules d'états d'installation de paquet à suivre récursivement" #: share/completions/apt-rdepends.fish:10 msgid "Comma-separated list of package installation states to show" msgstr "Liste séparée par des virgules d'états d'installation de paquet à afficher" #: share/completions/apt-rdepends.fish:11 msgid "Display man page" msgstr "Afficher la page de manuel" #: share/completions/apt-setup.fish:2 msgid "Probe a CD" msgstr "Analyser un CD" #: share/completions/apt-setup.fish:3 msgid "Run in noninteractive mode" msgstr "Exécuter en mode noninteractif" #: share/completions/apt-show-source.fish:3 #: share/completions/apt-show-source.fish:4 #: share/completions/apt-show-versions.fish:10 #: share/completions/apt-show-versions.fish:11 msgid "Read package from file" msgstr "Lire le paquet depuis un fichier" #: share/completions/apt-show-source.fish:5 #: share/completions/apt-show-source.fish:6 #: share/completions/apt-show-versions.fish:12 #: share/completions/apt-show-versions.fish:13 msgid "Specify APT list dir" msgstr "Spécifier le rep. de liste APT" #: share/completions/apt-show-source.fish:7 msgid "List PKG info" msgstr "Lister les infos du paquet" #: share/completions/apt-show-source.fish:9 msgid "Print all source packages with version" msgstr "Afficher tous les paquets source avec version" #: share/completions/apt-show-versions.fish:3 msgid "Print PKG versions" msgstr "Afficher la version des paquets" #: share/completions/apt-show-versions.fish:4 msgid "Using regex" msgstr "Utiliser les regex" #: share/completions/apt-show-versions.fish:5 msgid "Print only upgradeable packages" msgstr "Afficher seulement les paquets pouvant être mis à niveau" #: share/completions/apt-show-versions.fish:6 msgid "Print all versions" msgstr "Afficher toutes les versions" #: share/completions/apt-show-versions.fish:7 msgid "Print package name/distro" msgstr "Afficher le nom du paquet/distro" #: share/completions/apt-show-versions.fish:8 msgid "Print verbose info" msgstr "Afficher les infos détaillées" #: share/completions/apt-show-versions.fish:9 msgid "Init or update cache only" msgstr "Initialiser ou actualiser la cache seulement" #: share/completions/apt-sortpkgs.fish:3 msgid "Use source index field" msgstr "" #: share/completions/apt-sortpkgs.fish:5 msgid "Specify conffile" msgstr "Spécifier le fichier de config" #: share/completions/apt-spy.fish:3 msgid "Debian distribution" msgstr "Version de Debian" #: share/completions/apt-spy.fish:4 msgid "Servers in the areas" msgstr "Serveurs sur le continent" #: share/completions/apt-spy.fish:5 msgid "Conf file" msgstr "Fichier de config" #: share/completions/apt-spy.fish:6 msgid "Finish after number of servers" msgstr "Finir après un nombre de serveurs" #: share/completions/apt-spy.fish:7 msgid "File to grab servers" msgstr "" #: share/completions/apt-spy.fish:8 msgid "File as input" msgstr "Fichier d'entrée" #: share/completions/apt-spy.fish:9 msgid "Mirror-list file" msgstr "Liste de miroirs" #: share/completions/apt-spy.fish:10 msgid "Output sources.list file" msgstr "Fichier sources.list de sortie" #: share/completions/apt-spy.fish:11 msgid "Use proxy server" msgstr "Utiliser un proxy" #: share/completions/apt-spy.fish:12 msgid "Comma separated country list" msgstr "Liste de pays séparés par des virgules" #: share/completions/apt-spy.fish:13 msgid "How long in sec to download" msgstr "Durée du téléchargement (sec)" #: share/completions/apt-spy.fish:14 msgid "Custom URL to get mirror list" msgstr "URL pour obtenir la liste des miroirs" #: share/completions/apt-spy.fish:15 msgid "Write top servers to file" msgstr "Écrire les meilleurs serveurs dans un fichier" #: share/completions/apt-spy.fish:16 msgid "Number of top servers" msgstr "Nombre de meilleurs serveurs" #: share/completions/apt-spy.fish:17 msgid "Update mirror list" msgstr "Actualiser la liste des miroirs" #: share/completions/apt-spy.fish:18 msgid "Version number" msgstr "Numéro de version" #: share/completions/apt-src.fish:3 msgid "Update list of source packages" msgstr "Actualiser la liste des paquets source" #: share/completions/apt-src.fish:4 msgid "Install source packages" msgstr "Installer des paquets source" #: share/completions/apt-src.fish:5 msgid "Upgrade source packages" msgstr "Mettre à niveau des paquets source" #: share/completions/apt-src.fish:6 msgid "Remove source packages" msgstr "Supprimer des paquets source" #: share/completions/apt-src.fish:7 #: share/completions/apt-src.fish:14 msgid "Build source packages" msgstr "Construire des paquets source" #: share/completions/apt-src.fish:8 msgid "Clean source packages" msgstr "Nettoyer des paquets source" #: share/completions/apt-src.fish:9 msgid "Detect known source tree" msgstr "Détecter l'arbre source connu" #: share/completions/apt-src.fish:10 msgid "List installed source package\\(s\\)" msgstr "Lister les paquets source installés" #: share/completions/apt-src.fish:11 msgid "Root source tree" msgstr "L'arbre source racine" #: share/completions/apt-src.fish:12 msgid "Version of source package" msgstr "Version du paquet source" #: share/completions/apt-src.fish:13 msgid "Name of the source package" msgstr "Nom du paquet source" #: share/completions/apt-src.fish:15 msgid "Install after build" msgstr "Installer après la construction" #: share/completions/apt-src.fish:16 msgid "Patch local changes" msgstr "Patcher les changements locaux" #: share/completions/apt-src.fish:17 msgid "Specify a dir" msgstr "Spécifier un répertoire" #: share/completions/apt-src.fish:18 msgid "Run on current dir" msgstr "Exécuter dans le répertoire courant" #: share/completions/apt-src.fish:19 msgid "Omit debian version" msgstr "Omettre la version Debian" #: share/completions/apt-src.fish:20 msgid "Do not del built files" msgstr "Ne pas suppr. les fichiers construits" #: share/completions/apt-src.fish:21 msgid "Do not del source files" msgstr "Ne pas suppr. les fichiers source" #: share/completions/apt-src.fish:22 msgid "Source tree version" msgstr "Version de l'arbre source" #: share/completions/apt-src.fish:23 msgid "Output to /dev/null" msgstr "Sortie vers /dev/null" #: share/completions/apt-src.fish:24 msgid "Output trace" msgstr "Suivi de la sortie" #: share/completions/apt-zip-inst.fish:4 #: share/completions/apt-zip-list.fish:4 msgid "Removable medium" msgstr "Média amovible" #: share/completions/apt-zip-inst.fish:5 #: share/completions/apt-zip-list.fish:5 msgid "Select an action" msgstr "Choisir une action" #: share/completions/apt-zip-inst.fish:6 #: share/completions/apt-zip-list.fish:6 msgid "List of packages to install" msgstr "Liste des paquets à installer" #: share/completions/apt-zip-inst.fish:7 #: share/completions/apt-zip-list.fish:7 msgid "Fix broken option" msgstr "Fixer les options brisées" #: share/completions/apt-zip-inst.fish:8 #: share/completions/apt-zip-list.fish:8 msgid "Specify a non-mountpoint dir" msgstr "Spécifier un rep. qui n'est pas un point de montage" #: share/completions/apt-zip-list.fish:9 msgid "Select a method" msgstr "Choisir une méthode" #: share/completions/apt-zip-list.fish:11 msgid "Accept protocols" msgstr "Accepter les protocoles" #: share/completions/apt-zip-list.fish:12 msgid "Reject protocols" msgstr "Rejeter les protocoles" #: share/completions/arp.fish:3 msgid "Numerical address" msgstr "Adresse numérique" #: share/completions/arp.fish:4 msgid "Class of hw type" msgstr "Classe de matériel" #: share/completions/arp.fish:5 msgid "Show arp entries" msgstr "Afficher les entrées ARP" #: share/completions/arp.fish:6 msgid "Remove an entry for hostname" msgstr "Enlever une entrée pour le nom de machine" #: share/completions/arp.fish:7 msgid "Use hardware address" msgstr "Utiliser l'adresse matérielle" #: share/completions/arp.fish:8 msgid "Select interface" msgstr "Sélectionner l'interface" #: share/completions/arp.fish:9 msgid "Manually create ARP address" msgstr "Créer l'adresse ARP manuellement" #: share/completions/arp.fish:10 msgid "Take addr from filename, default /etc/ethers" msgstr "Prendre l'adr. du nom de fichier, /etc/ethers par défaut" #: share/completions/at.fish:3 #: share/completions/atq.fish:3 msgid "Use specified queue" msgstr "Utiliser la file spécifiée" #: share/completions/at.fish:4 msgid "Send mail to user" msgstr "Envoyer un couriel à l'utilisateur" #: share/completions/at.fish:5 msgid "Read job from file" msgstr "Lire la tâche depuis le fichier" #: share/completions/at.fish:6 msgid "Alias for atq" msgstr "Alias pour atq" #: share/completions/at.fish:7 msgid "Alias for atrm" msgstr "Alias pour atrm" #: share/completions/at.fish:8 msgid "Show the time" msgstr "Afficher le temps" #: share/completions/at.fish:9 msgid "Print the jobs listed" msgstr "Afficher les tâches listées" #: share/completions/atd.fish:2 msgid "Limiting load factor" msgstr "" #: share/completions/atd.fish:3 msgid "Minimum interval in seconds" msgstr "Interval minimum en sec." #: share/completions/atd.fish:4 #: share/completions/make.fish:11 msgid "Debug mode" msgstr "Mode débogage" #: share/completions/atd.fish:5 msgid "Process at queue only once" msgstr "" #: share/completions/bc.fish:3 msgid "Force interactive mode" msgstr "Forcer le mode interactif" #: share/completions/bc.fish:4 msgid "Define math library" msgstr "Définir la bibliothèque mathématique" #: share/completions/bc.fish:5 msgid "Give warnings for extensions to POSIX bc" msgstr "Avertir lors d'utilisations d'extensions de bc POSIX" #: share/completions/bc.fish:6 msgid "Process exactly POSIX bc" msgstr "Traiter exactement comme bc POSIX" #: share/completions/bc.fish:7 msgid "Do not print the GNU welcome" msgstr "Ne pas afficher le message de bienvenue GNU" #: share/completions/bunzip2.fish:9 msgid "Decompress to stdout" msgstr "Décompresser vers stdout" #: share/completions/bunzip2.fish:10 #: share/completions/bzip2.fish:11 #: share/completions/gunzip.fish:7 #: share/completions/gzip.fish:9 #: share/completions/zcat.fish:6 msgid "Overwrite" msgstr "Écraser" #: share/completions/bunzip2.fish:11 #: share/completions/bzip2.fish:12 msgid "Do not overwrite" msgstr "Ne pas écraser" #: share/completions/bunzip2.fish:12 #: share/completions/bzcat.fish:8 #: share/completions/bzip2.fish:13 msgid "Reduce memory usage" msgstr "Réduire l'utilisation de la mémoire" #: share/completions/bunzip2.fish:13 #: share/completions/bzip2.fish:15 msgid "Print compression ratios" msgstr "Afficher les ratios de compression" #: share/completions/bunzip2.fish:14 #: share/completions/bzip2.fish:16 #: share/completions/gunzip.fish:10 #: share/completions/gzip.fish:12 #: share/completions/zcat.fish:8 msgid "Print license" msgstr "Afficher la licence" #: share/completions/bzip2.fish:1 #: share/completions/gunzip.fish:1 #: share/completions/gzip.fish:1 msgid "Compress to stdout" msgstr "Compresser vers stdout" #: share/completions/bzip2.fish:9 msgid "Compress file" msgstr "Compresser le fichier" #: share/completions/bzip2.fish:10 #: share/completions/gunzip.fish:16 #: share/completions/gzip.fish:18 msgid "Check integrity" msgstr "Vérifier l'intégrité" #: share/completions/bzip2.fish:14 #: share/completions/chgrp.fish:6 #: share/completions/chown.fish:5 msgid "Supress errors" msgstr "Supprimer les erreurs" #: share/completions/bzip2.fish:18 msgid "Small block size" msgstr "Petite taille de blocs" #: share/completions/bzip2.fish:19 msgid "Large block size" msgstr "Grande taille de blocs" #: share/completions/cat.fish:1 msgid "Escape all non-printing characters" msgstr "Échapper tous les caractères non-imprimables" #: share/completions/cat.fish:2 msgid "Number nonblank lines" msgstr "Numéroter les lignes non blanches" #: share/completions/cat.fish:3 msgid "Escape non-printing characters except tab" msgstr "Échapper les caractères non-imprimables sauf tab" #: share/completions/cat.fish:4 msgid "Display $ at end of line" msgstr "Afficher $ à la fin du fichier" #: share/completions/cat.fish:5 msgid "Number all lines" msgstr "Numéroter toutes les lignes" #: share/completions/cat.fish:6 msgid "Never more than single blank line" msgstr "Jamais plus d'une seule ligne blanche" #: share/completions/cat.fish:7 msgid "Escape non-printing characters except newline" msgstr "Échapper tous les caractères non-imprimables sauf nouvelle ligne" #: share/completions/cat.fish:8 msgid "Escape tab" msgstr "Échapper tab" #: share/completions/cat.fish:9 msgid "Escape non-printing except newline and tab" msgstr "Échapper les caractères non-imprimables sauf tab et nouvelle ligne" #: share/completions/cdrecord.fish:6 msgid "Increment the level of general verbosity by one" msgstr "Incrémenter de un le niveau général de verbosité" #: share/completions/cdrecord.fish:7 msgid "Increment the verbose level in respect of SCSI command transport by one" msgstr "Incrémenter de un le niveau de verbosité en respect des commandes de transport SCSI" #: share/completions/cdrecord.fish:8 msgid "Set the misc debug value to #" msgstr "Définir le niveau de débogage misc" #: share/completions/cdrecord.fish:9 msgid "Increment the misc debug level by one" msgstr "Incrémenter de un le niveau de débogage misc" #: share/completions/cdrecord.fish:10 msgid "Do not print out a status report for failed SCSI commands" msgstr "Ne pas afficher un rapport pour les commandes SCSI qui ont échoué" #: share/completions/cdrecord.fish:11 msgid "Force to continue on some errors" msgstr "Forcer à continuer lors de certaines erreurs" #: share/completions/cdrecord.fish:12 msgid "Tell cdrecord to set the SCSI IMMED flag in certain commands" msgstr "Dire à cdrecord de définir le drapeau SCSI IMMED pour certaines commandes" #: share/completions/cdrecord.fish:13 msgid "Defines the minimum drive buffer fill ratio for the experimental ATAPI wait mode intended to free the IDE bus to allow hard disk and CD/DVD writer on the same IDE cable" msgstr "Définir le tampon de ratio de remplissage maximal pour le mode ATAPI expérimental d'attente dont l'objectif est de libérer le bus IDE pour permettre d'autres périphériques sur le même câble IDE" #: share/completions/cdrecord.fish:14 msgid "Complete CD/DVD-Recorder recording process with the laser turned off" msgstr "Compléter l'enregistrement du CD/DVD avec le laser éteint" #: share/completions/cdrecord.fish:15 msgid "Tells cdrecord to handle images created by readcd -clone" msgstr "Dire à cdrecord de gérer les images créées par readcd -clone" #: share/completions/cdrecord.fish:17 msgid "Set SAO (Session At Once) mode, usually called Disk At Once mode" msgstr "Utiliser le mode SAO (Session At One), habituellement appelé mode DAO" #: share/completions/cdrecord.fish:18 msgid "Set TAO (Track At Once) writing mode" msgstr "Utiliser le mode d'écriture TAO (Track At Once)" #: share/completions/cdrecord.fish:19 msgid "Set RAW writing mode" msgstr "Utiliser le mode d'écriture brut" #: share/completions/cdrecord.fish:20 msgid "Select Set RAW writing, the preferred raw writing mode" msgstr "Utiliser l'écriture brute, le mode d'écriture brute préféré" #: share/completions/cdrecord.fish:21 msgid "Select Set RAW writing, the less preferred raw writing mode" msgstr "" #: share/completions/cdrecord.fish:22 msgid "Select Set RAW writing, the preferred raw writing mode if raw96r is not supported" msgstr "" #: share/completions/cdrecord.fish:23 msgid "Allow multi session CDs to be made" msgstr "Permettre la création de CDs multi sessions" #: share/completions/cdrecord.fish:24 msgid "Retrieve multi session info in a form suitable for mkisofs-1.10 or later" msgstr "" #: share/completions/cdrecord.fish:25 msgid "Retrieve and print out the table of content or PMA of a CD" msgstr "" #: share/completions/cdrecord.fish:26 msgid "Retrieve and print out the ATIP (absolute Time in Pre-groove) info" msgstr "" #: share/completions/cdrecord.fish:27 msgid "The disk will only be fixated" msgstr "" #: share/completions/cdrecord.fish:28 msgid "Do not fixate the disk after writing the tracks" msgstr "" #: share/completions/cdrecord.fish:29 msgid "Wait for input to become available on standard input before trying to open the SCSI driver" msgstr "" #: share/completions/cdrecord.fish:30 msgid "Load the media and exit" msgstr "Charger le média et quitter" #: share/completions/cdrecord.fish:31 msgid "Load the media, lock the door and exit" msgstr "" #: share/completions/cdrecord.fish:32 msgid "Eject disk after doing the work" msgstr "Éjecter le disque après le travail" #: share/completions/cdrecord.fish:33 msgid "Set the speed factor of the writing process to #" msgstr "Définir la vitesse d'écriture" #: share/completions/cdrecord.fish:34 msgid "Blank a CD-RW and exit or blank a CD-RW before writing" msgstr "Effacer un CD-RW" #: share/completions/cdrecord.fish:35 msgid "Format a CD-RW/DVD-RW/DVD+RW disc" msgstr "Formatter un CD-RW" #: share/completions/cdrecord.fish:36 msgid "Set the FIFO (ring buffer) size to #" msgstr "" #: share/completions/cdrecord.fish:37 msgid "Set the maximum transfer size for a single SCSI command to #" msgstr "" #: share/completions/cdrecord.fish:38 msgid "Sets the SCSI target for the CD/DVD-Recorder" msgstr "" #: share/completions/cdrecord.fish:39 msgid "Set the grace time before starting to write to ># seconds" msgstr "" #: share/completions/cdrecord.fish:40 msgid "Set the default SCSI command timeout value to # seconds" msgstr "" #: share/completions/cdrecord.fish:41 msgid "Allows the user to manually select a driver for the device" msgstr "Permettre à l'utilisateur de choisir un pilote manuellement pour le périphérique" #: share/completions/cdrecord.fish:45 msgid "Set driver specific options" msgstr "Définir les options spécifiques au pilote" #: share/completions/cdrecord.fish:46 msgid "Set the driveropts specified by driveropts=option list, the speed of the drive and the dummy flag and exit" msgstr "" #: share/completions/cdrecord.fish:47 msgid "Checks if a driver for the current drive is present and exit" msgstr "Vérifier si le pilote pour le lecteur est présent" #: share/completions/cdrecord.fish:48 msgid "Print the drive capabilities for SCSI-3/mmc compliant drives as obtained from mode page 0x2A" msgstr "" #: share/completions/cdrecord.fish:49 msgid "Do an inquiry for the drive, print the inquiry info and exit" msgstr "" #: share/completions/cdrecord.fish:50 msgid "Scan all SCSI devices on all SCSI busses and print the inquiry strings" msgstr "" #: share/completions/cdrecord.fish:51 msgid "Try to reset the SCSI bus where the CD recorder is located" msgstr "" #: share/completions/cdrecord.fish:52 msgid "Try to send an abort sequence to the drive" msgstr "" #: share/completions/cdrecord.fish:53 msgid "Allow cdrecord to write more than the official size of a medium" msgstr "" #: share/completions/cdrecord.fish:54 msgid "Ignore the known size of the medium, use for debugging only" msgstr "" #: share/completions/cdrecord.fish:55 msgid "Use *.inf files to overwrite audio options" msgstr "" #: share/completions/cdrecord.fish:56 msgid "Set the default pre-gap size for all tracks except track nr 1" msgstr "" #: share/completions/cdrecord.fish:57 msgid "Set Packet writing mode (experimental interface)" msgstr "" #: share/completions/cdrecord.fish:58 msgid "Set the packet size to #, forces fixed packet mode (experimental)" msgstr "" #: share/completions/cdrecord.fish:59 msgid "Do not close the current track, only when in packet writing mode (experimental)" msgstr "" #: share/completions/cdrecord.fish:60 msgid "Set the Media Catalog Number of the CD" msgstr "" #: share/completions/cdrecord.fish:61 msgid "Write CD-Text info based on info taken from a file that contains ascii info for the text strings" msgstr "" #: share/completions/cdrecord.fish:62 msgid "Write CD-Text based on info found in the binary file filename" msgstr "" #: share/completions/cdrecord.fish:63 msgid "Take all recording related info from a CDRWIN compliant CUE sheet file" msgstr "" #: share/completions/cdrecord.fish:67 msgid "Set the International Standard Recording Number for the next track" msgstr "" #: share/completions/cdrecord.fish:68 msgid "Sets an index list for the next track" msgstr "" #: share/completions/cdrecord.fish:69 msgid "All subsequent tracks are written in CD-DA audio format" msgstr "" #: share/completions/cdrecord.fish:70 msgid "Audio data is assumed to be in byte-swapped (little-endian) order" msgstr "" #: share/completions/cdrecord.fish:71 msgid "All subsequent tracks are written in CD-ROM mode 1 (Yellow Book) format" msgstr "" #: share/completions/cdrecord.fish:72 msgid "All subsequent tracks are written in CD-ROM mode 2 format" msgstr "" #: share/completions/cdrecord.fish:73 #: share/completions/cdrecord.fish:74 msgid "All subsequent tracks are written in CD-ROM XA mode 2 form 1 format" msgstr "" #: share/completions/cdrecord.fish:75 msgid "All subsequent tracks are written in CD-ROM XA mode 2 form 2 format" msgstr "" #: share/completions/cdrecord.fish:76 msgid "All subsequent tracks are written in a way that allows a mix of CD-ROM XA mode 2 form 1/2 format" msgstr "" #: share/completions/cdrecord.fish:77 msgid "The TOC type for the disk is set to CDI, with XA only" msgstr "" #: share/completions/cdrecord.fish:78 msgid "Use the ISO-9660 file system size as the size of the next track" msgstr "" #: share/completions/cdrecord.fish:79 msgid "15 sectors of zeroed data will be added to the end of this and each subsequent data track" msgstr "" #: share/completions/cdrecord.fish:80 msgid "Set the amount of data to be appended as padding to the next track" msgstr "" #: share/completions/cdrecord.fish:81 msgid "Do not pad the following tracks - the default" msgstr "" #: share/completions/cdrecord.fish:82 msgid "Allow all subsequent tracks to violate the Red Book track length standard (min 4 s)" msgstr "" #: share/completions/cdrecord.fish:83 msgid "Re-enforce the Red Book track length standard (min 4 s)" msgstr "" #: share/completions/cdrecord.fish:84 msgid "Set the pre-gap size for the next track" msgstr "" #: share/completions/cdrecord.fish:85 msgid "All TOC entries for subsequent audio tracks will indicate that the audio data has been sampled with 50/15 microsec pre-emphasis" msgstr "" #: share/completions/cdrecord.fish:86 msgid "All TOC entries for subsequent audio tracks will indicate that the audio data has been mastered with linear data" msgstr "" #: share/completions/cdrecord.fish:87 msgid "All TOC entries for subsequent audio tracks of the resulting CD will indicate that the audio data has permission to be copied without limit" msgstr "" #: share/completions/cdrecord.fish:88 msgid "All TOC entries for subsequent audio tracks of the resulting CD will indicate that the audio data has permission to be copied only once for personal use" msgstr "" #: share/completions/cdrecord.fish:89 msgid "All TOC entries for subsequent audio tracks of the resulting CD will indicate that the audio data has no permission to be copied" msgstr "" #: share/completions/cdrecord.fish:90 msgid "If the master image for the next track has been stored on a raw disk, use this option to specify the valid amount of data on this disk" msgstr "" #: share/completions/chgrp.fish:2 #: share/completions/chown.fish:1 msgid "Output diagnostic for changed files" msgstr "Rapporter les changements effectués" #: share/completions/chgrp.fish:3 #: share/completions/chown.fish:2 msgid "Dereferense symbolic links" msgstr "Déréférencer les liens symboliques" #: share/completions/chgrp.fish:4 #: share/completions/chown.fish:3 msgid "Do not dereference symbolic links" msgstr "Ne pas déréférencer les liens symboliques" #: share/completions/chgrp.fish:5 #: share/completions/chown.fish:4 msgid "Change from owner/group" msgstr "" #: share/completions/chgrp.fish:7 #: share/completions/chown.fish:6 msgid "Use same owner/group as file" msgstr "Utiliser le même propriétaire/groupe que celui du fichier" #: share/completions/chgrp.fish:8 #: share/completions/chown.fish:7 #: share/completions/zip.fish:6 msgid "Operate recursively" msgstr "Opérer récursivement" #: share/completions/chgrp.fish:9 #: share/completions/chown.fish:8 msgid "Output diagnostic for every file" msgstr "Afficher les détails pour chaque fichier" #: share/completions/chown.fish:11 #: share/completions/chown.fish:12 #: share/completions/w.fish:6 msgid "Username" msgstr "Nom d'utilisateur" #: share/completions/commandline.fish:1 msgid "Add text to the end of the selected area" msgstr "Ajouter du texte à la fin de la sélection" #: share/completions/commandline.fish:2 msgid "Add text at cursor" msgstr "Ajouter du texte au curseur" #: share/completions/commandline.fish:3 msgid "Replace selected part" msgstr "Remplacer la partie sélectionnée" #: share/completions/commandline.fish:5 msgid "Select job under cursor" msgstr "Sélectionner la tâche sous le curseur" #: share/completions/commandline.fish:6 msgid "Select process under cursor" msgstr "Sélectionner le processus sous le curseur" #: share/completions/commandline.fish:7 msgid "Select token under cursor" msgstr "Sélectionner le jeton sous le curseur" #: share/completions/commandline.fish:8 msgid "Select entire command line (default)" msgstr "Sélectionner la ligne de commande entière (défaut)" #: share/completions/commandline.fish:10 msgid "Only return that part of the command line before the cursor" msgstr "Retourner seulement la partie de la ligne de commande avant le curseur" #: share/completions/commandline.fish:11 msgid "Inject readline functions to reader" msgstr "" #: share/completions/complete.fish:1 msgid "Command to add completion to" msgstr "Commande à ajouter une complétion" #: share/completions/complete.fish:2 msgid "Path to add completion to" msgstr "Chemin à ajouter une complétion" #: share/completions/complete.fish:3 msgid "Posix-style option to complete" msgstr "Option de style Posix à compléter" #: share/completions/complete.fish:4 msgid "GNU-style option to complete" msgstr "Option de style GNU à compléter" #: share/completions/complete.fish:5 msgid "Old style long option to complete" msgstr "Vieux type d'option longue à compléter" #: share/completions/complete.fish:6 msgid "Do not use file completion" msgstr "Ne pas utiliser la complétion de fichier" #: share/completions/complete.fish:7 msgid "Require parameter" msgstr "Requiert un paramètre" #: share/completions/complete.fish:8 msgid "Require parameter and do not use file completion" msgstr "Requiert un paramètre et ne pas utiliser la complétion de fichier" #: share/completions/complete.fish:9 msgid "A list of possible arguments" msgstr "Une liste d'arguments possibles" #: share/completions/complete.fish:10 msgid "Description of this completions" msgstr "Description de cette complétion" #: share/completions/complete.fish:11 msgid "Option list is not complete" msgstr "Liste d'options incomplète" #: share/completions/complete.fish:12 msgid "Remove completion" msgstr "Enlever la complétion" #: share/completions/complete.fish:14 msgid "Print all completions for the specified commandline" msgstr "Afficher toutes les complétions pour la commande spécifiée" #: share/completions/complete.fish:15 msgid "The completion should only be used if the specified command has a zero exit status" msgstr "La complétion devrait seulement être utilisée si la commande spécifiée a un état de sortie de zéro" #: share/completions/configure.fish:4 msgid "Cache test results in specified file" msgstr "" #: share/completions/configure.fish:5 msgid "Cache test results in file config.cache" msgstr "" #: share/completions/configure.fish:6 msgid "Do not create output files" msgstr "Ne pas créer de fichiers de sortie" #: share/completions/configure.fish:7 msgid "Set source directory" msgstr "Définir le répertoire source" #: share/completions/configure.fish:8 msgid "Architecture-independent install directory" msgstr "Répertoire d'installation des fichiers indépendants de l'architecture" #: share/completions/configure.fish:9 msgid "Architecture-dependent install directory" msgstr "Répertoire d'installation des fichiers dépendants de l'architectures" #: share/completions/configure.fish:10 msgid "Configure for building on BUILD" msgstr "" #: share/completions/configure.fish:11 msgid "Cross-compile to build programs to run on HOST" msgstr "" #: share/completions/configure.fish:12 msgid "Configure for building compilers for TARGET" msgstr "" #: share/completions/cut.fish:1 msgid "Output byte range" msgstr "Plage d'octets de sortie" #: share/completions/cut.fish:2 msgid "Output character range" msgstr "Plage de caractères de sortie" #: share/completions/cut.fish:3 msgid "Select field delimiter" msgstr "Délimiteur de champs" #: share/completions/cut.fish:4 msgid "Select fields" msgstr "Sélectionner le champ" #: share/completions/cut.fish:5 msgid "Dont split mutibyte characters" msgstr "Ne pas séparer les caractères multioctets" #: share/completions/cut.fish:6 msgid "Do not print lines without delimiter" msgstr "Ne pas afficher les lignes sans délimiteur" #: share/completions/cut.fish:7 msgid "Select output delimiter" msgstr "Choisir le délimiteur de sortie" #: share/completions/cvs.fish:23 msgid "Add a new file/directory to the repository" msgstr "Ajouter un fichier/répertoire au référentiel" #: share/completions/cvs.fish:24 msgid "Administration front end for rcs" msgstr "Façade d'administration pour rcs" #: share/completions/cvs.fish:25 msgid "Show last revision where each line was modified" msgstr "Afficher la dernière révision où chaque ligne a été modifiée" #: share/completions/cvs.fish:26 msgid "Checkout sources for editing" msgstr "Extraire les sources pour édition" #: share/completions/cvs.fish:27 msgid "Check files into the repository" msgstr "Appliquer les modifications au référentiel" #: share/completions/cvs.fish:28 msgid "Show differences between revisions" msgstr "Afficher les différences entre les révisions" #: share/completions/cvs.fish:29 msgid "Get ready to edit a watched file" msgstr "Préparation à l'édition d'un fichier surveillé" #: share/completions/cvs.fish:30 msgid "See who is editing a watched file" msgstr "Voir qui édite un fichier surveillé" #: share/completions/cvs.fish:31 msgid "Export sources from CVS, similar to checkout" msgstr "Exporter les sources depuis le référentiel, similaire à \"checkout\"" #: share/completions/cvs.fish:32 msgid "Show repository access history" msgstr "Afficher l'historique d'accès au référentiel" #: share/completions/cvs.fish:33 msgid "Import sources into CVS, using vendor branches" msgstr "Importer les sources dans le CVS, en utilisant les branches du vendeur" #: share/completions/cvs.fish:34 msgid "Create a CVS repository if it doesnt exist" msgstr "Créer un référentiel CVS s'il n'existe pas" #: share/completions/cvs.fish:35 msgid "Kerberos server mode" msgstr "Mode serveur Kerberos" #: share/completions/cvs.fish:36 msgid "Print out history information for files" msgstr "Afficher l'historique pour les fichiers" #: share/completions/cvs.fish:37 msgid "Prompt for password for authenticating server" msgstr "Demander le mot de passe pour l'authentification" #: share/completions/cvs.fish:38 msgid "Removes entry in .cvspass for remote repository" msgstr "" #: share/completions/cvs.fish:39 msgid "Password server mode" msgstr "" #: share/completions/cvs.fish:40 msgid "Show last revision where each line of module was modified" msgstr "Afficher la dernière révision où chaque ligne de module a été modifiée" #: share/completions/cvs.fish:41 msgid "Create patch format diffs between releases" msgstr "Créer une différence de format patch entre les versions" #: share/completions/cvs.fish:42 msgid "Indicate that a Module is no longer in use" msgstr "Indiquer qu'un module n'est plus utilisé" #: share/completions/cvs.fish:43 msgid "Remove an entry from the repository" msgstr "Enlever un fichier du référentiel" #: share/completions/cvs.fish:44 msgid "Print out history information for a module" msgstr "Afficher l'historique d'un module" #: share/completions/cvs.fish:45 msgid "Add a symbolic tag to a module" msgstr "Ajouter une étiquette symbolique à un module" #: share/completions/cvs.fish:46 msgid "Server mode" msgstr "Mode serveur" #: share/completions/cvs.fish:47 msgid "Display status information on checked out files" msgstr "Afficher l'état des fichiers extraits" #: share/completions/cvs.fish:48 msgid "Add a symbolic tag to checked out version of files" msgstr "Ajouter une étiquette symbolique aux fichiers extraits" #: share/completions/cvs.fish:49 msgid "Undo an edit command" msgstr "Annuler une commande d'édition" #: share/completions/cvs.fish:50 msgid "Bring work tree in sync with repository" msgstr "Synchroniser le répertoire de travail avec le référentiel" #: share/completions/cvs.fish:52 msgid "Set watches" msgstr "Surveiller des fichiers" #: share/completions/cvs.fish:53 msgid "See who is watching a file" msgstr "Voir qui surveille un fichier" #: share/completions/cvs.fish:59 msgid "Specify legal cvsroot directory." msgstr "" #: share/completions/cvs.fish:60 msgid "Authenticate all net traffic" msgstr "Authentifier tout le trafic réseau" #: share/completions/cvs.fish:61 msgid "Use tmpdir for temporary files" msgstr "Spécifier le répertoire temporaire" #: share/completions/cvs.fish:63 msgid "Use editor for editing log information" msgstr "Spécifier l'éditeur texte" #: share/completions/cvs.fish:64 msgid "Do not use the ~/.cvsrc file" msgstr "ne pas utiliser ~/.cvsrc" #: share/completions/cvs.fish:65 msgid "Displays usage information for command" msgstr "Afficher l'aide pour la commande" #: share/completions/cvs.fish:66 msgid "Do not change any files" msgstr "Ne pas modifier aucun fichier" #: share/completions/cvs.fish:67 msgid "Cause CVS to be really quiet" msgstr "Forcer le plus grand silence" #: share/completions/cvs.fish:68 msgid "Read-only repository mode" msgstr "Référentiel en lecture seule" #: share/completions/cvs.fish:69 msgid "Cause CVS to be somewhat quiet" msgstr "Forcer un certain silence" #: share/completions/cvs.fish:70 msgid "Make checked-out files read-only" msgstr "Mettre les fichiers extraits en lecture seule" #: share/completions/cvs.fish:71 msgid "Set CVS user variable" msgstr "" #: share/completions/cvs.fish:72 msgid "Show trace of program execution -- try with -n" msgstr "" #: share/completions/cvs.fish:74 msgid "Make checked-out files read-write (default)" msgstr "Mettre en lecture-écriture les fichiers extraits (défaut)" #: share/completions/cvs.fish:75 msgid "Encrypt all net traffic" msgstr "Encrypter tout le trafic réseau" #: share/completions/cvs.fish:76 msgid "Compression level for net traffic" msgstr "Niveau de compression pour le trafic réseau" #: share/completions/cvs.fish:82 msgid "Use the most recent revision no later than date" msgstr "Utiliser la plus récente version en date spécifiée" #: share/completions/cvs.fish:83 msgid "Retrieve files even when no match for tag/date" msgstr "Extraire les fichiers même si la date/étiquette ne concorde pas" #: share/completions/cvs.fish:84 msgid "Alter default keyword processing" msgstr "Altérer le traitement des mots-clés par défaut" #: share/completions/cvs.fish:85 #: share/completions/svn.fish:52 msgid "Don't recurse" msgstr "Pas de récursion" #: share/completions/cvs.fish:86 msgid "Specify log message instead of invoking editor" msgstr "Spécifier le message de journal au lieu d'invoquer l'éditeur" #: share/completions/cvs.fish:87 msgid "Don't run any tag programs" msgstr "" #: share/completions/cvs.fish:88 msgid "Prune empty directories" msgstr "Effacer les répertoires vides" #: share/completions/cvs.fish:89 msgid "Pipe files to stdout" msgstr "Envoyer les fichiers vers le tube stdout" #: share/completions/cvs.fish:90 msgid "Process directories recursively" msgstr "Traiter les répertoires récursivement" #: share/completions/cvs.fish:91 msgid "Use a specified tag" msgstr "Utiliser une étiquette spécifiée" #: share/completions/cvs.fish:92 msgid "Specify filenames to be filtered" msgstr "Spécifier les noms de fichier à filtrer" #: share/completions/cvs.fish:100 msgid "Set the default keyword substitution" msgstr "Définir la substitution de mots-clés par défaut" #: share/completions/cvs.fish:101 msgid "Lock a revision" msgstr "Verrouiller une révision" #: share/completions/cvs.fish:102 msgid "Replace a log message" msgstr "Remplacer un message du journal" #: share/completions/cvs.fish:103 msgid "Force name/rev association" msgstr "Forcer une association nom/rev" #: share/completions/cvs.fish:104 msgid "Make a name/rev association" msgstr "Faire une association nom/rev" #: share/completions/cvs.fish:105 msgid "Run quietly" msgstr "Exécution en silence" #: share/completions/cvs.fish:106 msgid "Set a state attribute for a revision" msgstr "Définir un attribut d'état pour une révision" #: share/completions/cvs.fish:107 msgid "Write descriptive text from a file into RCS" msgstr "" #: share/completions/cvs.fish:108 msgid "Write descriptive text into RCS" msgstr "" #: share/completions/cvs.fish:109 msgid "Unlock a revision" msgstr "Déverrouiller une révision" #: share/completions/cvs.fish:116 msgid "Annotate binary files" msgstr "Annoter un fichier binaire" #: share/completions/cvs.fish:123 msgid "Reset sticky tags/dates/k-opts" msgstr "" #: share/completions/cvs.fish:124 msgid "Copy module file to stdout" msgstr "Copier le fichier module vers stdout" #: share/completions/cvs.fish:125 #: share/completions/cvs.fish:182 msgid "Name directory for working files" msgstr "Nommer le répertoire pour les fichiers de travail" #: share/completions/cvs.fish:126 #: share/completions/cvs.fish:250 msgid "Merge revisions" msgstr "Fusionner les révisions" #: share/completions/cvs.fish:127 #: share/completions/cvs.fish:183 msgid "For -d. Don't shorten paths" msgstr "Pour -d. Ne pas réduire les chemins" #: share/completions/cvs.fish:134 msgid "Read log message from file" msgstr "Lire le journal depuis le fichier" #: share/completions/cvs.fish:135 msgid "Force new revision" msgstr "Forcer une nouvelle révision" #: share/completions/cvs.fish:142 #: share/completions/diff.fish:10 msgid "Treat all files as text" msgstr "Traiter tous les fichiers comme du texte" #: share/completions/cvs.fish:143 msgid "Treat all whitespace as one space" msgstr "Traiter tous les blancs comme un seul espace" #: share/completions/cvs.fish:144 msgid "Ignore blank line only changes" msgstr "Ignorer les changements de lignes blanches" #: share/completions/cvs.fish:145 msgid "Binary mode" msgstr "Mode binaire" #: share/completions/cvs.fish:146 msgid "Report only whether files differ" msgstr "Rapporter seulement si les fichiers diffèrent" #: share/completions/cvs.fish:147 msgid "Use context format" msgstr "Utiliser le format du contexte" #: share/completions/cvs.fish:148 msgid "Set context size" msgstr "Définir la taille du contexte" #: share/completions/cvs.fish:149 msgid "Set context format and, optionally, size" msgstr "" #: share/completions/cvs.fish:150 msgid "Set line group format" msgstr "" #: share/completions/cvs.fish:151 #: share/completions/diff.fish:21 msgid "Try to find a smaller set of changes" msgstr "" #: share/completions/cvs.fish:152 msgid "Make output a valid ed script" msgstr "Faire de la sortie un script ed valide" #: share/completions/cvs.fish:153 msgid "Expand tabs to spaces" msgstr "Remplacer les tabs par des espaces" #: share/completions/cvs.fish:154 msgid "Output that looks like an ed script" msgstr "Sortie qui ressemble à un script ed" #: share/completions/cvs.fish:155 msgid "Set regexp for context, unified formats" msgstr "" #: share/completions/cvs.fish:156 msgid "Speed handling of large files with small changes" msgstr "Traitement rapide des gros fichiers avec de petits changements" #: share/completions/cvs.fish:157 msgid "Set horizon lines" msgstr "" #: share/completions/cvs.fish:158 msgid "Ignore changes in case" msgstr "Ignorer les changements de casse" #: share/completions/cvs.fish:159 msgid "Ignore changes matching regexp" msgstr "Ignorer les changements correspondants à la regexp" #: share/completions/cvs.fish:160 msgid "Make ifdef from diff" msgstr "" #: share/completions/cvs.fish:161 msgid "Ignore whitespace" msgstr "Ignorer les blancs" #: share/completions/cvs.fish:162 msgid "Start lines with a tab" msgstr "Commencer les lignes avec une tabulation" #: share/completions/cvs.fish:163 msgid "Use label instead of filename in output" msgstr "Utiliser l'étiquette au lieu du nom de fichier pour la sortie" #: share/completions/cvs.fish:164 msgid "Print only left column" msgstr "Afficher seulement la colonne de gauche" #: share/completions/cvs.fish:165 msgid "Use format to produce if-then-else output" msgstr "" #: share/completions/cvs.fish:166 msgid "Produce RCS-style diffs" msgstr "" #: share/completions/cvs.fish:167 msgid "Treat files absent from one dir as empty" msgstr "Traiter les fichiers absents d'un rép. comme vides" #: share/completions/cvs.fish:168 msgid "Specifies line formatting" msgstr "Spécifier le format de ligne" #: share/completions/cvs.fish:169 msgid "Identify the C function each change is in" msgstr "Identifier la fonction C contenant chaque changement" #: share/completions/cvs.fish:170 msgid "Report identical files" msgstr "Rapporter les fichiers identiques" #: share/completions/cvs.fish:171 msgid "Use side-by-side format" msgstr "Utiliser le format côte-à-côte" #: share/completions/cvs.fish:172 msgid "Suppress common lines in side-by-side" msgstr "Supprimer les lignes communes dans le côte-à-côte" #: share/completions/cvs.fish:173 msgid "Use unified format" msgstr "Utiliser le format unifié" #: share/completions/cvs.fish:174 msgid "Set context size in unified" msgstr "Définir la taille du contexte du format unifié" #: share/completions/cvs.fish:175 msgid "Set column width for side-by-side format" msgstr "Définir la largeur des colonnes pour le côte-à-côte" #: share/completions/cvs.fish:191 msgid "Report on each commit" msgstr "" #: share/completions/cvs.fish:192 msgid "Report on everything" msgstr "Tout rapporter" #: share/completions/cvs.fish:193 msgid "Report on a module" msgstr "Rapporter un module" #: share/completions/cvs.fish:194 msgid "Report on checked-out modules" msgstr "Rapporter les modules extraits" #: share/completions/cvs.fish:195 msgid "Report on all tags" msgstr "Rapporter les étiquettes" #: share/completions/cvs.fish:196 msgid "Specify record type" msgstr "Spécifier le type d'enregistrement" #: share/completions/cvs.fish:197 msgid "Show history for all users" msgstr "Afficher l'historique de tous les utilisateurs" #: share/completions/cvs.fish:198 msgid "Show last modification only" msgstr "Afficher les dernières modifications seulement" #: share/completions/cvs.fish:199 msgid "Show only records for this directory" msgstr "Afficher seulement les enregistrements pour ce répertoire" #: share/completions/cvs.fish:206 msgid "Multiple vendor branch" msgstr "Branche à vendeur multiple" #: share/completions/cvs.fish:207 msgid "Files to ignore during import" msgstr "Fichier à ignorer durant l'import" #: share/completions/cvs.fish:214 msgid "Print info about revision on default branch" msgstr "" #: share/completions/cvs.fish:215 msgid "Specify date range for query" msgstr "" #: share/completions/cvs.fish:216 msgid "Print only file info" msgstr "" #: share/completions/cvs.fish:217 msgid "Do not print tags" msgstr "" #: share/completions/cvs.fish:218 msgid "Print only rcs filename" msgstr "" #: share/completions/cvs.fish:219 msgid "Print only given revisions" msgstr "" #: share/completions/cvs.fish:220 msgid "Suppress header if no revisions found" msgstr "" #: share/completions/cvs.fish:221 msgid "Specify revision states" msgstr "" #: share/completions/cvs.fish:222 msgid "Same as -h, plus descriptive text" msgstr "" #: share/completions/cvs.fish:223 msgid "Specify users for query" msgstr "" #: share/completions/cvs.fish:230 msgid "Use context diff format" msgstr "" #: share/completions/cvs.fish:231 msgid "Create summary change report" msgstr "" #: share/completions/cvs.fish:232 msgid "diff top two revisions" msgstr "" #: share/completions/cvs.fish:233 msgid "Use unidiff format" msgstr "" #: share/completions/cvs.fish:239 msgid "Delete working copy if release succeeds" msgstr "" #: share/completions/cvs.fish:246 msgid "Reset sticky tags, dates, and k-opts" msgstr "" #: share/completions/cvs.fish:247 msgid "Overwrite modified files with clean copies" msgstr "" #: share/completions/cvs.fish:248 msgid "Create any missing directories" msgstr "" #: share/completions/cvs.fish:249 msgid "Specify files to ignore" msgstr "" #: share/completions/darcs.fish:28 msgid "Create new project" msgstr "" #: share/completions/darcs.fish:29 msgid "Create a local copy of another repository" msgstr "" #: share/completions/darcs.fish:30 msgid "Add one or more new files or directories" msgstr "" #: share/completions/darcs.fish:31 msgid "Remove one or more files or directories from the repository" msgstr "" #: share/completions/darcs.fish:32 msgid "Move/rename one or more files or directories" msgstr "" #: share/completions/darcs.fish:33 msgid "Replace a token with a new value for that token" msgstr "" #: share/completions/darcs.fish:34 msgid "Save changes in the working copy to the repository as a patch" msgstr "" #: share/completions/darcs.fish:35 msgid "Copy and apply patches from another repository to this one" msgstr "" #: share/completions/darcs.fish:36 msgid "Send by email a bundle of one or more patches" msgstr "" #: share/completions/darcs.fish:37 msgid "Apply patches (from an email bundle) to the repository" msgstr "" #: share/completions/darcs.fish:38 msgid "Copy and apply patches from this repository to another one" msgstr "" #: share/completions/darcs.fish:39 msgid "Display unrecorded changes in the working copy" msgstr "" #: share/completions/darcs.fish:40 msgid "Gives a changelog style summary of the repo history" msgstr "" #: share/completions/darcs.fish:41 msgid "Remove recorded patches without changing the working copy" msgstr "" #: share/completions/darcs.fish:42 msgid "Replace a recorded patch with a better version" msgstr "" #: share/completions/darcs.fish:43 msgid "Revert to the recorded version (safe the first time only)" msgstr "" #: share/completions/darcs.fish:44 msgid "Undo the last revert (may fail if changes after the revert)" msgstr "" #: share/completions/darcs.fish:45 msgid "Opposite of pull; unsafe if the patch is not in remote repo" msgstr "" #: share/completions/darcs.fish:46 msgid "Record an inverse patch without changing the working copy" msgstr "" #: share/completions/darcs.fish:47 msgid "Tag the contents of the repository with a version name" msgstr "" #: share/completions/darcs.fish:48 msgid "Set a value for a preference (test, predist, ...)" msgstr "" #: share/completions/darcs.fish:49 msgid "Create a diff between two versions of the repository" msgstr "" #: share/completions/darcs.fish:50 msgid "Display which patch last modified something" msgstr "" #: share/completions/darcs.fish:51 msgid "Optimize the repository" msgstr "" #: share/completions/darcs.fish:52 msgid "Check the repository for consistency" msgstr "" #: share/completions/darcs.fish:53 msgid "Mark any conflicts to the working copy for manual resolution" msgstr "" #: share/completions/darcs.fish:54 msgid "Create a distribution tarball" msgstr "" #: share/completions/darcs.fish:55 msgid "Locate the most recent version lacking an error" msgstr "" #: share/completions/darcs.fish:56 msgid "Repair the corrupted repository" msgstr "" #: share/completions/darcs.fish:61 msgid "Shows brief description of command and its arguments" msgstr "" #: share/completions/darcs.fish:62 msgid "Disable this command" msgstr "" #: share/completions/darcs.fish:63 msgid "Specify the repository directory in which to run" msgstr "" #: share/completions/darcs.fish:65 msgid "Neither verbose nor quiet output" msgstr "" #: share/completions/darcs.fish:72 msgid "Name of patch" msgstr "" #: share/completions/darcs.fish:73 #: share/completions/darcs.fish:165 msgid "Specify author id" msgstr "" #: share/completions/darcs.fish:74 msgid "Give patch name and comment in file" msgstr "" #: share/completions/darcs.fish:75 #: share/completions/darcs.fish:98 #: share/completions/darcs.fish:119 #: share/completions/darcs.fish:164 msgid "Answer yes to all patches" msgstr "" #: share/completions/darcs.fish:76 msgid "In addition to modifications, look for files that are not boring, and thus are potentially pending addition" msgstr "" #: share/completions/darcs.fish:77 msgid "Delete the logfile when done" msgstr "" #: share/completions/darcs.fish:78 #: share/completions/darcs.fish:107 #: share/completions/darcs.fish:134 #: share/completions/darcs.fish:148 msgid "Don't run the test script" msgstr "" #: share/completions/darcs.fish:79 #: share/completions/darcs.fish:106 #: share/completions/darcs.fish:135 #: share/completions/darcs.fish:149 msgid "Run the test script" msgstr "" #: share/completions/darcs.fish:80 #: share/completions/darcs.fish:137 #: share/completions/darcs.fish:150 msgid "Don't remove the test directory" msgstr "" #: share/completions/darcs.fish:81 #: share/completions/darcs.fish:138 #: share/completions/darcs.fish:151 msgid "Remove the test directory" msgstr "" #: share/completions/darcs.fish:82 #: share/completions/darcs.fish:104 #: share/completions/darcs.fish:128 msgid "Create compressed patches" msgstr "" #: share/completions/darcs.fish:83 #: share/completions/darcs.fish:105 #: share/completions/darcs.fish:129 msgid "Don't create compressed patches" msgstr "" #: share/completions/darcs.fish:84 msgid "Expect to receive input from a pipe" msgstr "" #: share/completions/darcs.fish:85 #: share/completions/darcs.fish:103 #: share/completions/darcs.fish:130 #: share/completions/darcs.fish:170 msgid "Prompt user interactively" msgstr "" #: share/completions/darcs.fish:86 msgid "Ask for extra dependencies" msgstr "" #: share/completions/darcs.fish:87 msgid "Don't ask for extra dependencies" msgstr "" #: share/completions/darcs.fish:88 msgid "Edit the long comment by default" msgstr "" #: share/completions/darcs.fish:89 msgid "Don't give a long comment" msgstr "" #: share/completions/darcs.fish:90 msgid "Prompt for whether to edit the long comment" msgstr "" #: share/completions/darcs.fish:91 #: share/completions/darcs.fish:110 #: share/completions/darcs.fish:127 msgid "Don't trust the file modification times" msgstr "" #: share/completions/darcs.fish:92 msgid "Don't look for any files or directories that could be added, and don't add them automatically" msgstr "" #: share/completions/darcs.fish:96 #: share/completions/darcs.fish:162 #: share/completions/darcs.fish:213 msgid "Select patches matching REGEXP" msgstr "" #: share/completions/darcs.fish:97 #: share/completions/darcs.fish:163 #: share/completions/darcs.fish:214 msgid "Select tags matching REGEXP" msgstr "" #: share/completions/darcs.fish:99 #: share/completions/darcs.fish:168 #: share/completions/darcs.fish:193 #: share/completions/darcs.fish:218 msgid "Summarize changes" msgstr "" #: share/completions/darcs.fish:100 #: share/completions/darcs.fish:145 #: share/completions/darcs.fish:161 #: share/completions/darcs.fish:220 #: share/completions/darcs.fish:232 #: share/completions/darcs.fish:234 msgid "Suppress informational output" msgstr "" #: share/completions/darcs.fish:101 #: share/completions/darcs.fish:169 #: share/completions/darcs.fish:212 msgid "Select patches matching PATTERN" msgstr "" #: share/completions/darcs.fish:102 #: share/completions/darcs.fish:125 msgid "Use external tool to merge conflicts" msgstr "" #: share/completions/darcs.fish:108 #: share/completions/darcs.fish:178 #: share/completions/darcs.fish:233 msgid "Don't actually take the action" msgstr "" #: share/completions/darcs.fish:109 #: share/completions/darcs.fish:179 #: share/completions/darcs.fish:194 #: share/completions/darcs.fish:219 msgid "Don't summarize changes" msgstr "" #: share/completions/darcs.fish:111 msgid "Don't automatically fulfill dependencies" msgstr "" #: share/completions/darcs.fish:112 #: share/completions/darcs.fish:182 msgid "Set default repository [DEFAULT]" msgstr "" #: share/completions/darcs.fish:113 #: share/completions/darcs.fish:183 msgid "Don't set default repository" msgstr "" #: share/completions/darcs.fish:114 #: share/completions/darcs.fish:139 msgid "Make scripts executable" msgstr "" #: share/completions/darcs.fish:115 #: share/completions/darcs.fish:140 msgid "Don't make scripts executable" msgstr "" #: share/completions/darcs.fish:120 msgid "Verify that the patch was signed by a key in PUBRING" msgstr "" #: share/completions/darcs.fish:121 msgid "Verify using openSSL with authorized keys from specified file" msgstr "" #: share/completions/darcs.fish:122 #: share/completions/darcs.fish:184 msgid "Specify sendmail command" msgstr "" #: share/completions/darcs.fish:123 msgid "Reply to email-based patch using FROM address" msgstr "" #: share/completions/darcs.fish:124 #: share/completions/darcs.fish:173 msgid "Mail results to additional EMAIL(s). Requires --reply" msgstr "" #: share/completions/darcs.fish:126 msgid "Don't verify patch signature" msgstr "" #: share/completions/darcs.fish:131 msgid "Mark conflicts" msgstr "" #: share/completions/darcs.fish:132 msgid "Allow conflicts, but don't mark them" msgstr "" #: share/completions/darcs.fish:133 msgid "Fail on patches that create conflicts [DEFAULT]" msgstr "" #: share/completions/darcs.fish:136 msgid "Forward unsigned messages without extra header" msgstr "" #: share/completions/darcs.fish:146 msgid "Check the entire repository" msgstr "" #: share/completions/darcs.fish:147 msgid "Check patches since latest checkpoint" msgstr "" #: share/completions/darcs.fish:156 #: share/completions/darcs.fish:227 msgid "Don't refuse to add files differing only in case" msgstr "" #: share/completions/darcs.fish:166 msgid "Specify output filename" msgstr "" #: share/completions/darcs.fish:167 #: share/completions/darcs.fish:195 msgid "Output patch in a darcs-specific format similar to diff -u" msgstr "" #: share/completions/darcs.fish:172 msgid "Specify destination email" msgstr "" #: share/completions/darcs.fish:174 msgid "Sign the patch with your gpg key" msgstr "" #: share/completions/darcs.fish:175 msgid "Sign the patch with a given keyid" msgstr "" #: share/completions/darcs.fish:176 msgid "Sign the patch using openssl with a given private key" msgstr "" #: share/completions/darcs.fish:177 msgid "Do not sign the patch" msgstr "" #: share/completions/darcs.fish:180 msgid "Send to context stored in FILENAME" msgstr "" #: share/completions/darcs.fish:181 msgid "Edit the patch bundle description" msgstr "" #: share/completions/darcs.fish:188 msgid "Use a plain pristine tree [DEFAULT]" msgstr "" #: share/completions/darcs.fish:189 msgid "Use no pristine tree" msgstr "" #: share/completions/darcs.fish:196 msgid "Give human readable output" msgstr "" #: share/completions/darcs.fish:197 #: share/completions/darcs.fish:216 msgid "Generate XML formatted output" msgstr "" #: share/completions/darcs.fish:198 msgid "Select patch matching PATTERN" msgstr "" #: share/completions/darcs.fish:199 msgid "Select patch matching REGEXP" msgstr "" #: share/completions/darcs.fish:200 msgid "Select tag matching REGEXP" msgstr "" #: share/completions/darcs.fish:201 msgid "Specify hash of creator patch (see docs)" msgstr "" #: share/completions/darcs.fish:205 msgid "Select changes up to a patch matching PATTERN" msgstr "" #: share/completions/darcs.fish:206 msgid "Select changes up to a patch matching REGEXP" msgstr "" #: share/completions/darcs.fish:207 msgid "Select changes up to a tag matching REGEXP" msgstr "" #: share/completions/darcs.fish:208 msgid "Select changes starting with a patch matching PATTERN" msgstr "" #: share/completions/darcs.fish:209 msgid "Select changes starting with a patch matching REGEXP" msgstr "" #: share/completions/darcs.fish:210 msgid "Select changes starting with a tag matching REGEXP" msgstr "" #: share/completions/darcs.fish:211 msgid "Select the last NUMBER patches" msgstr "" #: share/completions/darcs.fish:215 msgid "Give output suitable for get --context" msgstr "" #: share/completions/darcs.fish:217 msgid "Give human-readable output" msgstr "" #: share/completions/darcs.fish:221 msgid "Show changes in reverse order" msgstr "" #: share/completions/darcs.fish:222 msgid "Specify the repository URL" msgstr "" #: share/completions/darcs.fish:226 msgid "Don't skip boring files" msgstr "" #: share/completions/darcs.fish:228 msgid "Add contents of subdirectories" msgstr "" #: share/completions/darcs.fish:229 msgid "Don't add contents of subdirectories" msgstr "" #: share/completions/darcs.fish:230 msgid "Add files with date appended to avoid conflict. [EXPERIMENTAL]" msgstr "" #: share/completions/darcs.fish:231 msgid "Don't use experimental date appending trick. [DEFAULT]" msgstr "" #: share/completions/date.fish:1 msgid "Display date described by string" msgstr "" #: share/completions/date.fish:2 msgid "Display date for each line in file" msgstr "" #: share/completions/date.fish:3 msgid "Output in ISO 8601 format" msgstr "" #: share/completions/date.fish:4 #: share/completions/touch.fish:9 msgid "Set time" msgstr "" #: share/completions/date.fish:5 msgid "Output RFC-2822 compliant date string" msgstr "" #: share/completions/date.fish:6 msgid "Display the last modification time of file" msgstr "" #: share/completions/date.fish:7 #: share/completions/date.fish:8 msgid "Print or set Coordinated Universal Time" msgstr "" #: share/completions/df.fish:12 #: share/completions/du.fish:7 #: share/functions/__fish_complete_ls.fish:24 msgid "Human readable sizes" msgstr "" #: share/completions/df.fish:13 msgid "List inode information" msgstr "" #: share/completions/df.fish:14 #: share/completions/du.fish:9 msgid "Use 1kB block size" msgstr "" #: share/completions/df.fish:15 msgid "List only local filesystems" msgstr "" #: share/completions/df.fish:16 msgid "Use Posix format" msgstr "" #: share/completions/df.fish:17 msgid "Show filesystems of specified type" msgstr "" #: share/completions/df.fish:21 msgid "Include empty filesystems" msgstr "" #: share/completions/df.fish:22 #: share/completions/du.fish:3 #: share/completions/tar.fish:13 msgid "Block size" msgstr "" #: share/completions/df.fish:23 #: share/completions/du.fish:8 #: share/functions/__fish_complete_ls.fish:57 msgid "Human readable sizes, powers of 1000" msgstr "" #: share/completions/df.fish:24 msgid "Do not sync before getting usage info" msgstr "" #: share/completions/df.fish:25 msgid "Sync before getting usage info" msgstr "" #: share/completions/df.fish:26 msgid "Print filesystem type" msgstr "" #: share/completions/df.fish:27 msgid "Excluded filesystem type" msgstr "" #: share/completions/df.fish:33 msgid "Show all filesystems" msgstr "" #: share/completions/df.fish:34 msgid "Show sizes in gigabytes" msgstr "" #: share/completions/df.fish:35 msgid "Show sizes in megabytes" msgstr "" #: share/completions/df.fish:36 msgid "Print out the previously obtained statistics from the file systems" msgstr "" #: share/completions/diff.fish:2 msgid "Ignore case differences" msgstr "" #: share/completions/diff.fish:3 msgid "Ignore case when comparing file names" msgstr "" #: share/completions/diff.fish:4 msgid "Consider case when comparing file names" msgstr "" #: share/completions/diff.fish:5 msgid "Ignore changes due to tab expansion" msgstr "" #: share/completions/diff.fish:6 msgid "Ignore changes in the amount of white space" msgstr "" #: share/completions/diff.fish:7 msgid "Ignore all white space" msgstr "" #: share/completions/diff.fish:8 msgid "Ignore changes whose lines are all blank" msgstr "" #: share/completions/diff.fish:9 msgid "Ignore changes whose lines match the REGEX" msgstr "" #: share/completions/diff.fish:11 msgid "Recursively compare subdirectories" msgstr "" #: share/completions/diff.fish:12 msgid "Treat absent files as empty" msgstr "" #: share/completions/diff.fish:13 msgid "Output NUM lines of copied context" msgstr "" #: share/completions/diff.fish:14 msgid "Output 3 lines of copied context" msgstr "" #: share/completions/diff.fish:15 msgid "Output NUM lines of unified context" msgstr "" #: share/completions/diff.fish:16 msgid "Output 3 lines of unified context" msgstr "" #: share/completions/diff.fish:17 msgid "Output only whether the files differ" msgstr "" #: share/completions/diff.fish:18 msgid "Output a normal diff" msgstr "" #: share/completions/diff.fish:19 msgid "Output in two columns" msgstr "" #: share/completions/diff.fish:20 msgid "Output at most NUM print columns" msgstr "" #: share/completions/diff.fish:22 msgid "Compare FILE1 to all operands" msgstr "" #: share/completions/diff.fish:23 msgid "Compare FILE2 to all operands" msgstr "" #: share/completions/diff.fish:24 msgid "Pass the output through 'pr'" msgstr "" #: share/completions/du.fish:1 msgid "Write size for all files" msgstr "" #: share/completions/du.fish:2 msgid "Print file size, not disk usage" msgstr "" #: share/completions/du.fish:4 msgid "Use 1B block size" msgstr "" #: share/completions/du.fish:5 msgid "Produce grand total" msgstr "" #: share/completions/du.fish:6 msgid "Dereference file symlinks" msgstr "" #: share/completions/du.fish:10 msgid "Count hard links multiple times" msgstr "" #: share/completions/du.fish:11 msgid "Dereference all symlinks" msgstr "" #: share/completions/du.fish:12 msgid "Do not include subdirectory size" msgstr "" #: share/completions/du.fish:13 msgid "Display only a total for each argument" msgstr "" #: share/completions/du.fish:14 msgid "Skip other filesystems" msgstr "" #: share/completions/du.fish:15 msgid "Exclude files thet match pattern in file" msgstr "" #: share/completions/du.fish:16 msgid "Exclude files that match pattern" msgstr "" #: share/completions/du.fish:17 msgid "Recursion limit" msgstr "" #: share/completions/echo.fish:1 msgid "No newline" msgstr "" #: share/completions/echo.fish:2 msgid "Use backslash escaped characters" msgstr "" #: share/completions/echo.fish:3 msgid "Do not use backslash escaped characters" msgstr "" #: share/completions/emacs.fish:4 msgid "Do not load init files" msgstr "" #: share/completions/emacs.fish:5 msgid "Load users init file" msgstr "" #: share/completions/emacs.fish:6 msgid "Use file as terminal" msgstr "" #: share/completions/emacs.fish:7 msgid "Execute Lisp function" msgstr "" #: share/completions/emacs.fish:8 msgid "Load Lisp code from file" msgstr "" #: share/completions/emacs.fish:9 msgid "Do not use X interface" msgstr "" #: share/completions/emacs.fish:10 msgid "Create window on the specified display" msgstr "" #: share/completions/emerge.fish:3 msgid "Test if emerge command should have packages as potential completion" msgstr "" #: share/completions/emerge.fish:12 msgid "Tests if emerge command should have package as potential completion for removal" msgstr "" #: share/completions/emerge.fish:21 msgid "Prints completions for installed packages on the system from /var/db/pkg" msgstr "" #: share/completions/emerge.fish:31 msgid "Cleans the system by removing outdated packages" msgstr "" #: share/completions/emerge.fish:32 msgid "Cleans the system by removing packages that are not associated with explicitly merged packages" msgstr "" #: share/completions/emerge.fish:33 msgid "Displays important portage variables that will be exported to ebuild.sh when performing merges" msgstr "" #: share/completions/emerge.fish:34 msgid "Causes portage to process all the metacache files as is normally done on the tail end of an rsync update using emerge --sync" msgstr "" #: share/completions/emerge.fish:35 msgid "Removes all but the most recently installed version of a package from your system" msgstr "" #: share/completions/emerge.fish:36 msgid "Causes portage to check and update the dependency cache of all ebuilds in the portage tree" msgstr "" #: share/completions/emerge.fish:37 msgid "Searches for matches of the supplied string in the current local portage tree" msgstr "" #: share/completions/emerge.fish:38 msgid "Removes all matching packages completely from your system" msgstr "" #: share/completions/emerge.fish:39 msgid "Before performing the merge, display what ebuilds and tbz2s will be installed, in the same format as when using --pretend" msgstr "" #: share/completions/emerge.fish:40 msgid "Tell emerge to build binary packages for all ebuilds processed in addition to actually merging the packages" msgstr "" #: share/completions/emerge.fish:41 msgid "Creates a binary package, but does not merge it to the system" msgstr "" #: share/completions/emerge.fish:42 msgid "When pretending, also display the ChangeLog entries for packages that will be upgraded" msgstr "" #: share/completions/emerge.fish:43 msgid "Display the pretend output in a tabular form" msgstr "" #: share/completions/emerge.fish:44 msgid "Tell emerge to run the ebuild command in --debug mode" msgstr "" #: share/completions/emerge.fish:45 msgid "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" msgstr "" #: share/completions/emerge.fish:46 msgid "Virtually tweaks the tree of installed packages to contain nothing" msgstr "" #: share/completions/emerge.fish:47 msgid "Instead of doing any package building, just perform fetches for all packages (main package as well as all dependencies)" msgstr "" #: share/completions/emerge.fish:48 msgid "Same as --fetchonly except that all package files, including those not required to build the package, will be processed" msgstr "" #: share/completions/emerge.fish:49 msgid "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" msgstr "" #: share/completions/emerge.fish:50 msgid "This option is identical to -g, except it will not use ANY information from the local machine" msgstr "" #: share/completions/emerge.fish:51 msgid "Tells emerge to include installed packages where USE flags have changed since installation" msgstr "" #: share/completions/emerge.fish:52 msgid "Merge files in CONFIG_PROTECT to the live fs instead of silently dropping them" msgstr "" #: share/completions/emerge.fish:53 msgid "Merge specified packages, but don't merge any dependencies" msgstr "" #: share/completions/emerge.fish:54 msgid "Skip the packages specified on the command-line that have already been installed" msgstr "" #: share/completions/emerge.fish:55 msgid "Disables the spinner regardless of terminal type" msgstr "" #: share/completions/emerge.fish:56 msgid "Emerge as normal, but don't add packages to the world profile" msgstr "" #: share/completions/emerge.fish:57 msgid "Only merge (or pretend to merge) the dependencies of the specified packages, not the packages themselves" msgstr "" #: share/completions/emerge.fish:58 msgid "Do not merge, display what ebuilds and tbz2s would have been installed" msgstr "" #: share/completions/emerge.fish:59 msgid "Reduced output from portage's displays" msgstr "" #: share/completions/emerge.fish:60 msgid "Resumes the last merge operation" msgstr "" #: share/completions/emerge.fish:61 msgid "Matches the search string against the description field as well the package's name" msgstr "" #: share/completions/emerge.fish:62 msgid "Remove the first package in the resume list so that a merge may continue in the presence of an uncorrectable or inconsequential error" msgstr "" #: share/completions/emerge.fish:63 msgid "Shows the dependency tree using indentation for dependencies" msgstr "" #: share/completions/emerge.fish:64 msgid "Updates packages to the best version available" msgstr "" #: share/completions/emerge.fish:66 msgid "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" msgstr "" #: share/completions/emerge.fish:67 msgid "Increased or expanded display of content in portage's displays" msgstr "" #: share/completions/emerge.fish:68 msgid "Displays the currently installed version of portage along with other information useful for quick reference on a system" msgstr "" #: share/completions/fish.fish:1 msgid "Run fish with this command" msgstr "" #: share/completions/fish.fish:4 msgid "Only parse input, do not execute" msgstr "" #: share/completions/fish.fish:5 msgid "Run in interactive mode" msgstr "" #: share/completions/fish.fish:6 msgid "Run in login mode" msgstr "" #: share/completions/fish.fish:7 msgid "Output profiling information to specified file" msgstr "" #: share/completions/function.fish:1 #: share/completions/functions.fish:5 msgid "Set function description" msgstr "" #: share/completions/function.fish:4 msgid "Make the function a job exit event handler" msgstr "" #: share/completions/function.fish:5 msgid "Make the function a process exit event handler" msgstr "" #: share/completions/function.fish:6 msgid "Make the function a signal event handler" msgstr "" #: share/completions/function.fish:7 msgid "Make the function a variable update event handler" msgstr "" #: share/completions/function.fish:8 msgid "Allow dash (-) in function name" msgstr "" #: share/completions/functions.fish:1 msgid "Erase function" msgstr "" #: share/completions/functions.fish:3 msgid "Show hidden functions" msgstr "" #: share/completions/fusermount.fish:15 #: share/completions/sshfs.fish:27 #: share/completions/sshfs.fish:31 msgid "Mount options" msgstr "" #: share/completions/fusermount.fish:16 msgid "Unmount" msgstr "" #: share/completions/fusermount.fish:17 msgid "Quiet" msgstr "" #: share/completions/fusermount.fish:18 msgid "Lazy unmount" msgstr "" #: share/completions/gcc.fish:5 msgid "Language" msgstr "" #: share/completions/gcc.fish:23 msgid "Pass program exit codes" msgstr "" #: share/completions/gcc.fish:24 msgid "Stop after assembler" msgstr "" #: share/completions/gcc.fish:25 msgid "Stop after compile" msgstr "" #: share/completions/gcc.fish:26 msgid "Stop after preprocessor" msgstr "" #: share/completions/gcc.fish:27 msgid "Output file" msgstr "" #: share/completions/gcc.fish:28 msgid "Print commands to stderr" msgstr "" #: share/completions/gcc.fish:29 msgid "Print quoted commands to stderr, do not run" msgstr "" #: share/completions/gcc.fish:30 msgid "Use pipes" msgstr "" #: share/completions/gcc.fish:31 msgid "Use ansi mode" msgstr "" #: share/completions/gcc.fish:32 msgid "Standard mode" msgstr "" #: share/completions/gcc.fish:46 msgid "Write prototypes to file" msgstr "" #: share/completions/gcc.fish:47 msgid "Do not recognize asm, inline or typeof keywords" msgstr "" #: share/completions/gcc.fish:48 msgid "Do not use builtin functions" msgstr "" #: share/completions/gcc.fish:49 msgid "Assert hosted environment" msgstr "" #: share/completions/gcc.fish:50 msgid "Assert freestanding environment" msgstr "" #: share/completions/gcc.fish:51 msgid "Use Microsoft extensions" msgstr "" #: share/completions/gcc.fish:52 msgid "Use ANSI trigraphs" msgstr "" #: share/completions/gcc.fish:53 msgid "Do not use integrated preprocessor" msgstr "" #: share/completions/gcc.fish:54 msgid "char is unsigned" msgstr "" #: share/completions/gcc.fish:55 msgid "char is signed" msgstr "" #: share/completions/gcc.fish:56 msgid "bitfield is unsigned" msgstr "" #: share/completions/gcc.fish:57 msgid "bitfield is signed" msgstr "" #: share/completions/gcc.fish:58 msgid "All bitfields are signed" msgstr "" #: share/completions/gcc.fish:59 msgid "All bitfields are unsigned" msgstr "" #: share/completions/gcc.fish:60 #: share/completions/gcc.fish:65 msgid "String constants are not const" msgstr "" #: share/completions/gcc.fish:61 msgid "C++ ABI version" msgstr "" #: share/completions/gcc.fish:62 msgid "Turn off access checking" msgstr "" #: share/completions/gcc.fish:63 msgid "Check pointer returned by new" msgstr "" #: share/completions/gcc.fish:64 msgid "Put globals in the common segment" msgstr "" #: share/completions/gcc.fish:66 msgid "Accept $ in identifiers" msgstr "" #: share/completions/gcc.fish:67 msgid "Reject $ in identifiers" msgstr "" #: share/completions/gcc.fish:68 msgid "Do not omit unneeded temporarys" msgstr "" #: share/completions/gcc.fish:69 msgid "Allow exception violations" msgstr "" #: share/completions/gcc.fish:70 msgid "Do not extend for-loop scope" msgstr "" #: share/completions/gcc.fish:71 msgid "Extend for-loop scope" msgstr "" #: share/completions/gcc.fish:72 msgid "Do not recognize typeof as keyword" msgstr "" #: share/completions/gcc.fish:73 msgid "Do not emit code for implicit templates" msgstr "" #: share/completions/gcc.fish:74 msgid "Do not emit code for implicit inline templates" msgstr "" #: share/completions/gcc.fish:75 msgid "Do not emit out-of-line code for inline functions" msgstr "" #: share/completions/gcc.fish:76 msgid "Disable warnings about MFC" msgstr "" #: share/completions/gcc.fish:77 msgid "Disable some built-in functions" msgstr "" #: share/completions/gcc.fish:78 msgid "Disable operator keywords" msgstr "" #: share/completions/gcc.fish:79 msgid "Disable optional diagnostics" msgstr "" #: share/completions/gcc.fish:80 msgid "Downgrade some errors to warnings" msgstr "" #: share/completions/gcc.fish:81 msgid "Enable automatic template instantiation at link time" msgstr "" #: share/completions/gcc.fish:82 msgid "Disable generation of C++ runtime type information" msgstr "" #: share/completions/gcc.fish:86 msgid "Set maximum template depth" msgstr "" #: share/completions/gcc.fish:89 msgid "Do not emit code for thread-safe initialization of local statics" msgstr "" #: share/completions/gcc.fish:90 msgid "Use __cxa_atexit for destructors" msgstr "" #: share/completions/gcc.fish:91 msgid "Hides inline methods from export table" msgstr "" #: share/completions/gcc.fish:92 msgid "Do not use weak symbol support" msgstr "" #: share/completions/gpg.fish:48 msgid "Make a signature" msgstr "" #: share/completions/gpg.fish:49 msgid "Make a clear text signature" msgstr "" #: share/completions/gpg.fish:50 msgid "Make a detached signature" msgstr "" #: share/completions/gpg.fish:51 msgid "Encrypt data" msgstr "" #: share/completions/gpg.fish:52 msgid "Encrypt with a symmetric cipher using a passphrase" msgstr "" #: share/completions/gpg.fish:53 msgid "Store only (make a simple RFC1991 packet)" msgstr "" #: share/completions/gpg.fish:54 msgid "Decrypt specified file or stdin" msgstr "" #: share/completions/gpg.fish:55 msgid "Assume specified file or stdin is sigfile and verify it" msgstr "" #: share/completions/gpg.fish:56 msgid "Modify certain other commands to accept multiple files for processing" msgstr "" #: share/completions/gpg.fish:57 msgid "Identical to '--multifile --verify'" msgstr "" #: share/completions/gpg.fish:58 msgid "Identical to '--multifile --encrypt'" msgstr "" #: share/completions/gpg.fish:59 msgid "Identical to --multifile --decrypt" msgstr "" #: share/completions/gpg.fish:61 #: share/completions/gpg.fish:62 msgid "List all keys from the public keyrings, or just the ones given on the command line" msgstr "" #: share/completions/gpg.fish:63 msgid "List all keys from the secret keyrings, or just the ones given on the command line" msgstr "" #: share/completions/gpg.fish:64 msgid "Same as --list-keys, but the signatures are listed too" msgstr "" #: share/completions/gpg.fish:66 msgid "Same as --list-keys, but the signatures are listed and verified" msgstr "" #: share/completions/gpg.fish:67 msgid "List all keys with their fingerprints" msgstr "" #: share/completions/gpg.fish:68 msgid "Generate a new key pair" msgstr "" #: share/completions/gpg.fish:70 msgid "Present a menu which enables you to do all key related tasks" msgstr "" #: share/completions/gpg.fish:72 msgid "Sign a public key with your secret key" msgstr "" #: share/completions/gpg.fish:73 msgid "Sign a public key with your secret key but mark it as non exportable" msgstr "" #: share/completions/gpg.fish:75 msgid "Remove key from the public keyring" msgstr "" #: share/completions/gpg.fish:76 msgid "Remove key from the secret and public keyring" msgstr "" #: share/completions/gpg.fish:77 msgid "Same as --delete-key, but if a secret key exists, it will be removed first" msgstr "" #: share/completions/gpg.fish:79 msgid "Generate a revocation certificate for the complete key" msgstr "" #: share/completions/gpg.fish:80 msgid "Generate a designated revocation certificate for a key" msgstr "" #: share/completions/gpg.fish:82 msgid "Export all or the given keys from all keyrings" msgstr "" #: share/completions/gpg.fish:83 msgid "Same as --export but sends the keys to a keyserver" msgstr "" #: share/completions/gpg.fish:84 #: share/completions/gpg.fish:85 msgid "Same as --export, but exports the secret keys instead" msgstr "" #: share/completions/gpg.fish:87 #: share/completions/gpg.fish:88 msgid "Import/merge keys" msgstr "" #: share/completions/gpg.fish:90 msgid "Import the keys with the given key IDs from a keyserver" msgstr "" #: share/completions/gpg.fish:91 msgid "Request updates from a keyserver for keys that already exist on the local keyring" msgstr "" #: share/completions/gpg.fish:92 msgid "Search the keyserver for the given names" msgstr "" #: share/completions/gpg.fish:93 msgid "Do trust database maintenance" msgstr "" #: share/completions/gpg.fish:94 msgid "Do trust database maintenance without user interaction" msgstr "" #: share/completions/gpg.fish:96 msgid "Send the ownertrust values to stdout" msgstr "" #: share/completions/gpg.fish:97 msgid "Update the trustdb with the ownertrust values stored in specified files or stdin" msgstr "" #: share/completions/gpg.fish:99 msgid "Create signature caches in the keyring" msgstr "" #: share/completions/gpg.fish:101 msgid "Print message digest of specified algorithm for all given files or stdin" msgstr "" #: share/completions/gpg.fish:102 msgid "Print message digest of all algorithms for all given files or stdin" msgstr "" #: share/completions/gpg.fish:104 msgid "Emit specified number of random bytes of the given quality level" msgstr "" #: share/completions/gpg.fish:106 msgid "Display version and supported algorithms, and exit" msgstr "" #: share/completions/gpg.fish:107 msgid "Display warranty and exit" msgstr "" #: share/completions/gpg.fish:115 msgid "Create ASCII armored output" msgstr "" #: share/completions/gpg.fish:116 msgid "Write output to specified file" msgstr "" #: share/completions/gpg.fish:118 msgid "Sets a limit on the number of bytes that will be generated when processing a file" msgstr "" #: share/completions/gpg.fish:120 msgid "Use specified key as the key to sign with" msgstr "" #: share/completions/gpg.fish:121 msgid "Use specified key as the default key to sign with" msgstr "" #: share/completions/gpg.fish:123 msgid "Encrypt for specified user id" msgstr "" #: share/completions/gpg.fish:124 msgid "Encrypt for specified user id, but hide the keyid of the key" msgstr "" #: share/completions/gpg.fish:125 msgid "Use specified user id as default recipient" msgstr "" #: share/completions/gpg.fish:126 msgid "Use the default key as default recipient" msgstr "" #: share/completions/gpg.fish:127 msgid "Reset --default-recipient and --default-recipient-self" msgstr "" #: share/completions/gpg.fish:129 msgid "Give more information during processing" msgstr "" #: share/completions/gpg.fish:132 #: share/completions/gpg.fish:133 #: share/completions/gpg.fish:134 msgid "Compression level" msgstr "" #: share/completions/gpg.fish:135 msgid "Use a different decompression method for BZIP2 compressed files" msgstr "" #: share/completions/gpg.fish:137 msgid "Treat input files as text and store them in the OpenPGP canonical text form with standard 'CRLF' line endings" msgstr "" #: share/completions/gpg.fish:138 msgid "Don't treat input files as text and store them in the OpenPGP canonical text form with standard 'CRLF' line endings" msgstr "" #: share/completions/gpg.fish:140 msgid "Don't make any changes (this is not completely implemented)" msgstr "" #: share/completions/gpg.fish:142 #: share/completions/mv.fish:3 msgid "Prompt before overwrite" msgstr "" #: share/completions/gpg.fish:144 #: share/completions/scp.fish:28 #: share/completions/top.fish:2 msgid "Batch mode" msgstr "" #: share/completions/gpg.fish:145 msgid "Don't use batch mode" msgstr "" #: share/completions/gpg.fish:146 msgid "Never write output to terminal" msgstr "" #: share/completions/gpg.fish:148 msgid "Assume yes on most questions" msgstr "" #: share/completions/gpg.fish:149 msgid "Assume no on most questions" msgstr "" #: share/completions/gpg.fish:151 msgid "Prompt for a certification level when making a key signature" msgstr "" #: share/completions/gpg.fish:152 msgid "Don't prompt for a certification level when making a key signature" msgstr "" #: share/completions/gpg.fish:153 msgid "The default certification level to use for the level check when signing a key" msgstr "" #: share/completions/gpg.fish:154 msgid "Disregard any signatures with a certification level below specified level when building the trust database" msgstr "" #: share/completions/gpg.fish:156 msgid "Assume that the specified key is as trustworthy as one of your own secret keys" msgstr "" #: share/completions/gpg.fish:157 msgid "Specify trust model" msgstr "" #: share/completions/gpg.fish:159 msgid "Select how to display key IDs" msgstr "" #: share/completions/gpg.fish:161 msgid "Use specified keyserver" msgstr "" #: share/completions/gpg.fish:162 msgid "Options for the keyserver" msgstr "" #: share/completions/gpg.fish:164 msgid "Options for importing keys" msgstr "" #: share/completions/gpg.fish:165 msgid "Options for exporting keys" msgstr "" #: share/completions/gpg.fish:166 msgid "Options for listing keys and signatures" msgstr "" #: share/completions/gpg.fish:167 msgid "Options for verifying signatures" msgstr "" #: share/completions/gpg.fish:169 msgid "The command line that should be run to view a photo ID" msgstr "" #: share/completions/gpg.fish:170 msgid "Sets a list of directories to search for photo viewers and keyserver helpers" msgstr "" #: share/completions/gpg.fish:172 msgid "Display the keyring name at the head of key listings to show which keyring a given key resides on" msgstr "" #: share/completions/gpg.fish:173 msgid "Add specified file to the current list of keyrings" msgstr "" #: share/completions/gpg.fish:175 msgid "Add specified file to the current list of secret keyrings" msgstr "" #: share/completions/gpg.fish:176 msgid "Designate specified file as the primary public keyring" msgstr "" #: share/completions/gpg.fish:178 msgid "Use specified file instead of the default trustdb" msgstr "" #: share/completions/gpg.fish:179 msgid "Set the home directory" msgstr "" #: share/completions/gpg.fish:180 msgid "Set the native character set" msgstr "" #: share/completions/gpg.fish:182 msgid "Assume that following command line arguments are given in UTF8" msgstr "" #: share/completions/gpg.fish:183 msgid "Assume that following arguments are encoded in the character set specified by --display-charset" msgstr "" #: share/completions/gpg.fish:184 msgid "Read options from specified file, do not read the default options file" msgstr "" #: share/completions/gpg.fish:185 msgid "Shortcut for '--options /dev/null'" msgstr "" #: share/completions/gpg.fish:186 msgid "Load an extension module" msgstr "" #: share/completions/gpg.fish:188 msgid "Write special status strings to the specified file descriptor" msgstr "" #: share/completions/gpg.fish:189 msgid "Write log output to the specified file descriptor" msgstr "" #: share/completions/gpg.fish:190 msgid "Write attribute subpackets to the specified file descriptor" msgstr "" #: share/completions/gpg.fish:192 msgid "Include secret key comment packets when exporting secret keys" msgstr "" #: share/completions/gpg.fish:193 msgid "Don't include secret key comment packets when exporting secret keys" msgstr "" #: share/completions/gpg.fish:195 msgid "Use specified string as comment string" msgstr "" #: share/completions/gpg.fish:196 msgid "Don't use a comment string" msgstr "" #: share/completions/gpg.fish:198 msgid "Include the version string in ASCII armored output" msgstr "" #: share/completions/gpg.fish:199 msgid "Don't include the version string in ASCII armored output" msgstr "" #: share/completions/gpg.fish:204 msgid "Put the specified name value pair into the signature as notation data" msgstr "" #: share/completions/gpg.fish:205 msgid "Set signature policy" msgstr "" #: share/completions/gpg.fish:206 msgid "Set certificate policy" msgstr "" #: share/completions/gpg.fish:207 msgid "Set signature and certificate policy" msgstr "" #: share/completions/gpg.fish:208 msgid "Use specified URL as a preferred keyserver for data signatures" msgstr "" #: share/completions/gpg.fish:210 msgid "Use specified string as the filename which is stored inside messages" msgstr "" #: share/completions/gpg.fish:212 msgid "Set the 'for your eyes only' flag in the message" msgstr "" #: share/completions/gpg.fish:213 msgid "Clear the 'for your eyes only' flag in the message" msgstr "" #: share/completions/gpg.fish:215 msgid "Create file with name as given in data" msgstr "" #: share/completions/gpg.fish:216 msgid "Don't create file with name as given in data" msgstr "" #: share/completions/gpg.fish:218 msgid "Number of completely trusted users to introduce a new key signer (defaults to 1)" msgstr "" #: share/completions/gpg.fish:219 msgid "Number of marginally trusted users to introduce a new key signer (defaults to 3)" msgstr "" #: share/completions/gpg.fish:221 msgid "Maximum depth of a certification chain (default is 5)" msgstr "" #: share/completions/gpg.fish:223 msgid "Use specified cipher algorithm" msgstr "" #: share/completions/gpg.fish:224 msgid "Use specified message digest algorithm" msgstr "" #: share/completions/gpg.fish:225 msgid "Use specified compression algorithm" msgstr "" #: share/completions/gpg.fish:226 msgid "Use specified message digest algorithm when signing a key" msgstr "" #: share/completions/gpg.fish:227 msgid "Use specified cipher algorithm to protect secret keys" msgstr "" #: share/completions/gpg.fish:228 msgid "Use specified digest algorithm to mangle the passphrases" msgstr "" #: share/completions/gpg.fish:229 msgid "Selects how passphrases are mangled" msgstr "" #: share/completions/gpg.fish:231 msgid "Integrity protect secret keys by using a SHA-1 checksum" msgstr "" #: share/completions/gpg.fish:233 msgid "Never allow the use of specified cipher algorithm" msgstr "" #: share/completions/gpg.fish:234 msgid "Never allow the use of specified public key algorithm" msgstr "" #: share/completions/gpg.fish:236 msgid "Do not cache the verification status of key signatures" msgstr "" #: share/completions/gpg.fish:237 msgid "Do not verify each signature right after creation" msgstr "" #: share/completions/gpg.fish:239 msgid "Automatically run the --check-trustdb command internally when needed" msgstr "" #: share/completions/gpg.fish:240 msgid "Never automatically run the --check-trustdb" msgstr "" #: share/completions/gpg.fish:242 msgid "Do not put the recipient keyid into encrypted packets" msgstr "" #: share/completions/gpg.fish:243 msgid "Put the recipient keyid into encrypted packets" msgstr "" #: share/completions/gpg.fish:244 msgid "Change the behavior of cleartext signatures so that they can be used for patch files" msgstr "" #: share/completions/gpg.fish:246 msgid "Mangle From-field of email headers (default)" msgstr "" #: share/completions/gpg.fish:247 msgid "Do not mangle From-field of email headers" msgstr "" #: share/completions/gpg.fish:249 msgid "Read passphrase from specified file descriptor" msgstr "" #: share/completions/gpg.fish:250 msgid "Read user input from specified file descriptor" msgstr "" #: share/completions/gpg.fish:252 msgid "Try to use the GnuPG-Agent" msgstr "" #: share/completions/gpg.fish:253 msgid "Do not try to use the GnuPG-Agent" msgstr "" #: share/completions/gpg.fish:254 msgid "Override value of GPG_AGENT_INFO environment variable" msgstr "" #: share/completions/gpg.fish:256 msgid "Force v3 signatures for signatures on data" msgstr "" #: share/completions/gpg.fish:257 msgid "Do not force v3 signatures for signatures on data" msgstr "" #: share/completions/gpg.fish:259 msgid "Always use v4 key signatures even on v3 keys" msgstr "" #: share/completions/gpg.fish:260 msgid "Don't use v4 key signatures on v3 keys" msgstr "" #: share/completions/gpg.fish:262 msgid "Force the use of encryption with a modification detection code" msgstr "" #: share/completions/gpg.fish:263 msgid "Disable the use of the modification detection code" msgstr "" #: share/completions/gpg.fish:265 msgid "Allow the import and use of keys with user IDs which are not self-signed" msgstr "" #: share/completions/gpg.fish:266 msgid "Do not allow the import and use of keys with user IDs which are not self-signed" msgstr "" #: share/completions/gpg.fish:268 msgid "Disable all checks on the form of the user ID while generating a new one" msgstr "" #: share/completions/gpg.fish:270 msgid "Do not fail if signature is older than key" msgstr "" #: share/completions/gpg.fish:271 msgid "Allow subkeys that have a timestamp from the future" msgstr "" #: share/completions/gpg.fish:272 msgid "Ignore CRC errors" msgstr "" #: share/completions/gpg.fish:273 msgid "Do not fail on MDC integrity protection failure" msgstr "" #: share/completions/gpg.fish:275 msgid "Lock the databases the first time a lock is requested and do not release the lock until the process terminates" msgstr "" #: share/completions/gpg.fish:276 msgid "Release the locks every time a lock is no longer needed" msgstr "" #: share/completions/gpg.fish:278 msgid "Do not create an internal pool file for quicker generation of random numbers" msgstr "" #: share/completions/gpg.fish:279 msgid "Reset verbose level to 0" msgstr "" #: share/completions/gpg.fish:280 msgid "Suppress the initial copyright message" msgstr "" #: share/completions/gpg.fish:281 msgid "Suppress the warning about 'using insecure memory'" msgstr "" #: share/completions/gpg.fish:282 msgid "Suppress the warning about unsafe file and home directory (--homedir) permissions" msgstr "" #: share/completions/gpg.fish:283 msgid "Suppress the warning about missing MDC integrity protection" msgstr "" #: share/completions/gpg.fish:285 msgid "Refuse to run if GnuPG cannot get secure memory" msgstr "" #: share/completions/gpg.fish:287 msgid "Do not refuse to run if GnuPG cannot get secure memory (default)" msgstr "" #: share/completions/gpg.fish:288 msgid "Assume the input data is not in ASCII armored format" msgstr "" #: share/completions/gpg.fish:290 msgid "Do not add the default keyrings to the list of keyrings" msgstr "" #: share/completions/gpg.fish:292 msgid "Skip the signature verification step" msgstr "" #: share/completions/gpg.fish:294 msgid "Print key listings delimited by colons" msgstr "" #: share/completions/gpg.fish:295 msgid "Print key listings delimited by colons (like --with-colons) and print the public key data" msgstr "" #: share/completions/gpg.fish:296 msgid "Same as the command --fingerprint but changes only the format of the output and may be used together with another command" msgstr "" #: share/completions/gpg.fish:298 msgid "Changes the output of the list commands to work faster" msgstr "" #: share/completions/gpg.fish:299 msgid "Do not merge primary user ID and primary key in --with-colon listing mode and print all timestamps as UNIX timestamps" msgstr "" #: share/completions/gpg.fish:301 msgid "Changes the behaviour of some commands. This is like --dry-run but different" msgstr "" #: share/completions/gpg.fish:303 msgid "Display the session key used for one message" msgstr "" #: share/completions/gpg.fish:304 msgid "Don't use the public key but the specified session key" msgstr "" #: share/completions/gpg.fish:306 #: share/completions/gpg.fish:309 msgid "Prompt for an expiration time" msgstr "" #: share/completions/gpg.fish:307 #: share/completions/gpg.fish:310 msgid "Do not prompt for an expiration time" msgstr "" #: share/completions/gpg.fish:312 msgid "Don't look at the key ID as stored in the message but try all secret keys in turn to find the right decryption key" msgstr "" #: share/completions/gpg.fish:313 msgid "Enable a mode in which filenames of the form -&n, where n is a non-negative decimal number, refer to the file descriptor n and not to a file with that name" msgstr "" #: share/completions/gpg.fish:315 msgid "Sets up a named group, which is similar to aliases in email programs" msgstr "" #: share/completions/gpg.fish:316 msgid "Remove a given entry from the --group list" msgstr "" #: share/completions/gpg.fish:317 msgid "Remove all entries from the --group list" msgstr "" #: share/completions/gpg.fish:319 msgid "Don't change the permissions of a secret keyring back to user read/write only" msgstr "" #: share/completions/gpg.fish:321 msgid "Set the list of personal cipher preferences to the specified string" msgstr "" #: share/completions/gpg.fish:322 msgid "Set the list of personal digest preferences to the specified string" msgstr "" #: share/completions/gpg.fish:323 msgid "Set the list of personal compression preferences to the specified string" msgstr "" #: share/completions/gpg.fish:324 msgid "Set the list of default preferences to the specified string" msgstr "" #: share/completions/gprof.fish:1 msgid "Print annotated source" msgstr "" #: share/completions/gprof.fish:2 msgid "Do not print explanations" msgstr "" #: share/completions/gprof.fish:3 msgid "Print tally" msgstr "" #: share/completions/gprof.fish:4 msgid "Display summary" msgstr "" #: share/completions/gprof.fish:5 msgid "Search directories for source" msgstr "" #: share/completions/gprof.fish:6 msgid "No annotated source" msgstr "" #: share/completions/gprof.fish:7 msgid "Print full path of source" msgstr "" #: share/completions/gprof.fish:8 msgid "Print flat profile" msgstr "" #: share/completions/gprof.fish:9 msgid "No flat profile" msgstr "" #: share/completions/gprof.fish:10 msgid "Print call graph" msgstr "" #: share/completions/gprof.fish:11 msgid "No call graph" msgstr "" #: share/completions/gprof.fish:12 msgid "Annotate to file" msgstr "" #: share/completions/gprof.fish:13 msgid "No tally" msgstr "" #: share/completions/gprof.fish:14 msgid "Suggest function ordering" msgstr "" #: share/completions/gprof.fish:15 msgid "Suggest file ordering" msgstr "" #: share/completions/gprof.fish:16 msgid "Traditional mode" msgstr "" #: share/completions/gprof.fish:17 msgid "Set width of output" msgstr "" #: share/completions/gprof.fish:18 msgid "Annotate every line" msgstr "" #: share/completions/gprof.fish:19 msgid "Set demangling style" msgstr "" #: share/completions/gprof.fish:20 msgid "Turn of demangling" msgstr "" #: share/completions/gprof.fish:21 msgid "Supress static functions" msgstr "" #: share/completions/gprof.fish:23 msgid "Ignore symbols not known to be functions" msgstr "" #: share/completions/gprof.fish:24 msgid "Delete arcs from callgraph" msgstr "" #: share/completions/gprof.fish:25 msgid "Line by line profiling" msgstr "" #: share/completions/gprof.fish:26 msgid "Supress output when executed less than specified times" msgstr "" #: share/completions/gprof.fish:27 msgid "Only propagate times for matching symbols" msgstr "" #: share/completions/gprof.fish:28 msgid "Do not propagate times for matching symbols" msgstr "" #: share/completions/gprof.fish:29 msgid "Mention unused functions in flat profile" msgstr "" #: share/completions/gprof.fish:30 msgid "Specify debugging options" msgstr "" #: share/completions/gprof.fish:33 msgid "Profile data format" msgstr "" #: share/completions/gprof.fish:34 msgid "Print summary" msgstr "" #: share/completions/grep.fish:5 msgid "Print NUM lines of trailing context" msgstr "" #: share/completions/grep.fish:6 msgid "Process binary file as text" msgstr "" #: share/completions/grep.fish:7 msgid "Print NUM lines of leading context" msgstr "" #: share/completions/grep.fish:8 msgid "Print NUM lines of context" msgstr "" #: share/completions/grep.fish:9 msgid "Print byte offset of matches" msgstr "" #: share/completions/grep.fish:10 msgid "Assume data type for binary files" msgstr "" #: share/completions/grep.fish:13 msgid "Only print number of matches" msgstr "" #: share/completions/grep.fish:14 msgid "Action for devices" msgstr "" #: share/completions/grep.fish:15 msgid "Action for directories" msgstr "" #: share/completions/grep.fish:16 msgid "Pattern is extended regexp" msgstr "" #: share/completions/grep.fish:17 msgid "Pattern is a regexp" msgstr "" #: share/completions/grep.fish:18 msgid "Pattern is a fixed string" msgstr "" #: share/completions/grep.fish:19 msgid "Use pattern from file" msgstr "" #: share/completions/grep.fish:20 msgid "Pattern is basic regex" msgstr "" #: share/completions/grep.fish:21 msgid "Print filename" msgstr "" #: share/completions/grep.fish:22 msgid "Supress printing filename" msgstr "" #: share/completions/grep.fish:24 msgid "Skip binary files" msgstr "" #: share/completions/grep.fish:25 #: share/completions/sort.fish:3 msgid "Ignore case" msgstr "" #: share/completions/grep.fish:26 msgid "Print first non-matching file" msgstr "" #: share/completions/grep.fish:27 msgid "Print first matching file" msgstr "" #: share/completions/grep.fish:28 msgid "Stop reading after NUM matches" msgstr "" #: share/completions/grep.fish:29 msgid "Use the mmap system call to read input" msgstr "" #: share/completions/grep.fish:30 msgid "Print linenumber" msgstr "" #: share/completions/grep.fish:31 msgid "Show only matching part" msgstr "" #: share/completions/grep.fish:32 msgid "Rename stdin" msgstr "" #: share/completions/grep.fish:33 #: share/completions/sed.fish:36 msgid "Use line buffering" msgstr "" #: share/completions/grep.fish:34 #: share/completions/grep.fish:35 msgid "Do not write anything" msgstr "" #: share/completions/grep.fish:36 #: share/completions/grep.fish:37 msgid "Read files under each directory" msgstr "" #: share/completions/grep.fish:38 msgid "Recurse, search file matching PATTERN" msgstr "" #: share/completions/grep.fish:39 msgid "Recurse, skip file matching PATTERN" msgstr "" #: share/completions/grep.fish:40 msgid "Suppress error messages" msgstr "" #: share/completions/grep.fish:41 msgid "Treat files as binary" msgstr "" #: share/completions/grep.fish:42 msgid "Report Unix-style byte offsets" msgstr "" #: share/completions/grep.fish:44 msgid "Invert the sense of matching" msgstr "" #: share/completions/grep.fish:45 msgid "Only whole matching words" msgstr "" #: share/completions/grep.fish:46 msgid "Only whole matching lines" msgstr "" #: share/completions/grep.fish:47 msgid "Synonym for -i" msgstr "" #: share/completions/grep.fish:48 msgid "Output a zero byte after filename" msgstr "" #: share/completions/gunzip.fish:9 #: share/completions/gzip.fish:11 msgid "List compression information" msgstr "" #: share/completions/gunzip.fish:11 #: share/completions/gzip.fish:13 msgid "Do not save/restore filename" msgstr "" #: share/completions/gunzip.fish:12 #: share/completions/gzip.fish:14 msgid "Save/restore filename" msgstr "" #: share/completions/gunzip.fish:13 #: share/completions/gzip.fish:15 msgid "Supress warnings" msgstr "" #: share/completions/gunzip.fish:14 #: share/completions/gzip.fish:16 msgid "Recurse directories" msgstr "" #: share/completions/gunzip.fish:15 #: share/completions/gzip.fish:17 msgid "Suffix" msgstr "" #: share/completions/gunzip.fish:17 #: share/completions/gzip.fish:19 msgid "Display compression ratios" msgstr "" #: share/completions/gzip.fish:21 msgid "Use fast setting" msgstr "" #: share/completions/gzip.fish:22 msgid "Use high compression setting" msgstr "" #: share/completions/help.fish:6 msgid "Help for the specified builtin" msgstr "" #: share/completions/help.fish:10 msgid "Help for the specified command" msgstr "" #: share/completions/help.fish:14 msgid "Help section" msgstr "" #: share/completions/help.fish:17 msgid "Help on how tab-completion works" msgstr "" #: share/completions/help.fish:18 msgid "Help on how job control works" msgstr "" #: share/completions/help.fish:19 msgid "Summary on how fish differs from other shells" msgstr "" #: share/completions/help.fish:21 msgid "Help on how to set the prompt" msgstr "" #: share/completions/help.fish:22 msgid "Help on how to set the titlebar message" msgstr "" #: share/completions/help.fish:23 msgid "Help on how to copy and paste" msgstr "" #: share/completions/help.fish:24 msgid "Help on editor shortcuts" msgstr "" #: share/completions/help.fish:25 msgid "Help on environment variables" msgstr "" #: share/completions/help.fish:26 msgid "Help on setting syntax highlighting colors" msgstr "" #: share/completions/help.fish:27 msgid "A short summary of all builtin commands" msgstr "" #: share/completions/help.fish:29 #: share/completions/help.fish:30 msgid "Help on parameter expansion (Globbing)" msgstr "" #: share/completions/help.fish:31 #, sh-format msgid "Help on variable expansion $VARNAME" msgstr "" #: share/completions/help.fish:32 msgid "Help on home directory expansion ~USER" msgstr "" #: share/completions/help.fish:33 msgid "Help on brace expansion {a,b,c}" msgstr "" #: share/completions/help.fish:34 msgid "Help on wildcard expansion *.*" msgstr "" #: share/completions/help.fish:35 msgid "Help on command substitution (SUBCOMMAND)" msgstr "" #: share/completions/help.fish:36 msgid "Help on process expansion %JOB" msgstr "" #: share/completions/id.fish:1 msgid "Print effective group id" msgstr "" #: share/completions/id.fish:2 msgid "Print all group ids" msgstr "" #: share/completions/id.fish:3 msgid "Print name, not number" msgstr "" #: share/completions/id.fish:4 msgid "Print real ID, not effective" msgstr "" #: share/completions/id.fish:5 msgid "Print effective user ID" msgstr "" #: share/completions/ifconfig.fish:1 msgid "Stop interface" msgstr "" #: share/completions/ifconfig.fish:2 msgid "Start interface" msgstr "" #: share/completions/ifconfig.fish:25 msgid "Network interface" msgstr "" #: share/completions/jobs.fish:3 msgid "Show the process id of each process in the job" msgstr "" #: share/completions/jobs.fish:4 msgid "Show group id of job" msgstr "" #: share/completions/jobs.fish:5 msgid "Show commandname of each job" msgstr "" #: share/completions/jobs.fish:6 msgid "Only show status for last job to be started" msgstr "" #: share/completions/kill.fish:34 msgid "List names of available signals" msgstr "" #: share/completions/less.fish:2 msgid "Search after end of screen" msgstr "" #: share/completions/less.fish:3 msgid "Buffer space" msgstr "" #: share/completions/less.fish:4 msgid "Disable automtic buffer allocation" msgstr "" #: share/completions/less.fish:5 msgid "Repaint from top" msgstr "" #: share/completions/less.fish:6 msgid "Clear and repaint from top" msgstr "" #: share/completions/less.fish:7 msgid "Supress error for lacking terminal capability" msgstr "" #: share/completions/less.fish:8 msgid "Exit on second EOF" msgstr "" #: share/completions/less.fish:9 msgid "Exit on EOF" msgstr "" #: share/completions/less.fish:10 msgid "Open non-regular files" msgstr "" #: share/completions/less.fish:11 msgid "Quit if file shorter than one screen" msgstr "" #: share/completions/less.fish:12 msgid "Hilight one search target" msgstr "" #: share/completions/less.fish:13 msgid "No search highlighting" msgstr "" #: share/completions/less.fish:14 msgid "Maximum backward scroll" msgstr "" #: share/completions/less.fish:15 msgid "Search ignores lowercase case" msgstr "" #: share/completions/less.fish:16 msgid "Search ignores all case" msgstr "" #: share/completions/less.fish:17 msgid "Target line" msgstr "" #: share/completions/less.fish:18 msgid "Display status column" msgstr "" #: share/completions/less.fish:19 msgid "Specify key bindings file" msgstr "" #: share/completions/less.fish:21 msgid "Prompt with percentage" msgstr "" #: share/completions/less.fish:22 msgid "Verbose prompt" msgstr "" #: share/completions/less.fish:23 msgid "Display line number" msgstr "" #: share/completions/less.fish:24 msgid "Display line number for each line" msgstr "" #: share/completions/less.fish:25 msgid "Log input to file" msgstr "" #: share/completions/less.fish:26 msgid "Log to file, overwrite" msgstr "" #: share/completions/less.fish:27 msgid "Start at first occurrence of pattern" msgstr "" #: share/completions/less.fish:28 msgid "Prompt string" msgstr "" #: share/completions/less.fish:29 #: share/completions/less.fish:30 #: share/completions/sed.fish:12 #: share/completions/sed.fish:21 msgid "Silent mode" msgstr "" #: share/completions/less.fish:31 #: share/completions/less.fish:32 msgid "Completly silent mode" msgstr "" #: share/completions/less.fish:33 msgid "Display control chars" msgstr "" #: share/completions/less.fish:34 msgid "Display control chars, guess screen appearance" msgstr "" #: share/completions/less.fish:35 msgid "Multiple blank lines sqeezed" msgstr "" #: share/completions/less.fish:36 msgid "Do not fold long lines" msgstr "" #: share/completions/less.fish:37 msgid "Edit tag" msgstr "" #: share/completions/less.fish:38 msgid "Set tag file" msgstr "" #: share/completions/less.fish:39 msgid "Allow backspace and carriage return" msgstr "" #: share/completions/less.fish:40 msgid "Allow backspace, tab and carriage return" msgstr "" #: share/completions/less.fish:42 msgid "Highlight first unread line on new page" msgstr "" #: share/completions/less.fish:43 msgid "Highlight first unread line on any movement" msgstr "" #: share/completions/less.fish:44 msgid "Set tab stops" msgstr "" #: share/completions/less.fish:45 msgid "No termcap init" msgstr "" #: share/completions/less.fish:46 msgid "No keypad init" msgstr "" #: share/completions/less.fish:47 msgid "Maximum forward scroll" msgstr "" #: share/completions/less.fish:48 msgid "Max scroll window" msgstr "" #: share/completions/less.fish:49 msgid "Set quote char" msgstr "" #: share/completions/less.fish:50 msgid "Lines after EOF are blank" msgstr "" #: share/completions/less.fish:51 msgid "Characters to scroll on left/right arrows" msgstr "" #: share/completions/make.fish:8 msgid "Target" msgstr "" #: share/completions/make.fish:9 msgid "Use file as makefile" msgstr "" #: share/completions/make.fish:10 #: share/completions/tar.fish:15 #: share/functions/cd.fish:5 msgid "Change directory" msgstr "" #: share/completions/make.fish:12 msgid "Environment before makefile" msgstr "" #: share/completions/make.fish:13 msgid "Ignore errors" msgstr "" #: share/completions/make.fish:14 msgid "Search directory for makefile" msgstr "" #: share/completions/make.fish:15 msgid "Number of concurrent jobs" msgstr "" #: share/completions/make.fish:16 msgid "Continue after an error" msgstr "" #: share/completions/make.fish:17 msgid "Start when load drops" msgstr "" #: share/completions/make.fish:18 msgid "Do not execute commands" msgstr "" #: share/completions/make.fish:19 msgid "Ignore specified file" msgstr "" #: share/completions/make.fish:20 msgid "Print database" msgstr "" #: share/completions/make.fish:21 msgid "Question mode" msgstr "" #: share/completions/make.fish:22 msgid "Eliminate implicit rules" msgstr "" #: share/completions/make.fish:24 msgid "Don't continue after an error" msgstr "" #: share/completions/make.fish:25 msgid "Touch files, don't run commands" msgstr "" #: share/completions/make.fish:27 #: share/functions/pwd.fish:5 msgid "Print working directory" msgstr "" #: share/completions/make.fish:28 msgid "Pretend file is modified" msgstr "" #: share/completions/makedepend.fish:1 msgid "Define" msgstr "" #: share/completions/makedepend.fish:2 msgid "Include directory" msgstr "" #: share/completions/makedepend.fish:3 msgid "Replace include directories" msgstr "" #: share/completions/makedepend.fish:4 msgid "Append dependencies to makefile" msgstr "" #: share/completions/makedepend.fish:5 msgid "Specify makefile" msgstr "" #: share/completions/makedepend.fish:6 msgid "Prepend file to input" msgstr "" #: share/completions/makedepend.fish:7 msgid "Object file suffix" msgstr "" #: share/completions/makedepend.fish:8 msgid "Object file prefix" msgstr "" #: share/completions/makedepend.fish:9 msgid "Starting string delimiter" msgstr "" #: share/completions/makedepend.fish:10 msgid "Line width" msgstr "" #: share/completions/makedepend.fish:12 msgid "Warn about multiple inclusion" msgstr "" #: share/completions/man.fish:4 msgid "Program section" msgstr "" #: share/completions/man.fish:5 msgid "Syscall section" msgstr "" #: share/completions/man.fish:6 msgid "Library section" msgstr "" #: share/completions/man.fish:7 msgid "Device section" msgstr "" #: share/completions/man.fish:8 msgid "File format section" msgstr "" #: share/completions/man.fish:9 msgid "Games section" msgstr "" #: share/completions/man.fish:10 msgid "Misc section" msgstr "" #: share/completions/man.fish:11 msgid "Admin section" msgstr "" #: share/completions/man.fish:12 msgid "Kernel section" msgstr "" #: share/completions/man.fish:13 msgid "Tcl section" msgstr "" #: share/completions/man.fish:14 msgid "New section" msgstr "" #: share/completions/man.fish:15 msgid "Local section" msgstr "" #: share/completions/man.fish:17 msgid "Old section" msgstr "" #: share/completions/man.fish:18 #: share/completions/modprobe.fish:7 #: share/completions/yum.fish:48 #: share/functions/__fish_complete_ssh.fish:10 msgid "Configuration file" msgstr "" #: share/completions/man.fish:19 msgid "Manpath" msgstr "" #: share/completions/man.fish:20 msgid "Pager" msgstr "" #: share/completions/man.fish:21 msgid "Manual sections" msgstr "" #: share/completions/man.fish:22 msgid "Display all matches" msgstr "" #: share/completions/man.fish:23 msgid "Always reformat" msgstr "" #: share/completions/man.fish:24 msgid "Debug" msgstr "" #: share/completions/man.fish:25 msgid "Debug and run" msgstr "" #: share/completions/man.fish:26 msgid "Show whatis information" msgstr "" #: share/completions/man.fish:27 msgid "Format only" msgstr "" #: share/completions/man.fish:29 msgid "Show apropos information" msgstr "" #: share/completions/man.fish:30 msgid "Search in all man pages" msgstr "" #: share/completions/man.fish:31 msgid "Set system" msgstr "" #: share/completions/man.fish:32 msgid "Preprocessors" msgstr "" #: share/completions/man.fish:33 msgid "Format for printing" msgstr "" #: share/completions/man.fish:34 #: share/completions/man.fish:35 msgid "Only print locations" msgstr "" #: share/completions/mimedb.fish:1 msgid "Input is a file, use name and contents to determine mimetype" msgstr "" #: share/completions/mimedb.fish:2 msgid "Input is a file, use name to determine mimetype" msgstr "" #: share/completions/mimedb.fish:3 msgid "Input is a mimetype" msgstr "" #: share/completions/mimedb.fish:4 msgid "Output mimetype" msgstr "" #: share/completions/mimedb.fish:5 msgid "Output description of mimetype" msgstr "" #: share/completions/mimedb.fish:6 msgid "Output default action for mimetype" msgstr "" #: share/completions/mimedb.fish:7 msgid "Launch default action for each file" msgstr "" #: share/completions/modprobe.fish:6 msgid "Print messages about what the program is doing" msgstr "" #: share/completions/modprobe.fish:8 msgid "Dump configuration file" msgstr "" #: share/completions/modprobe.fish:9 msgid "Do not actually insert/remove module" msgstr "" #: share/completions/modprobe.fish:10 #: share/completions/modprobe.fish:11 msgid "Ignore install and remove commands in configuration file" msgstr "" #: share/completions/modprobe.fish:12 msgid "Ignore bogus module names" msgstr "" #: share/completions/modprobe.fish:13 msgid "Remove modules" msgstr "" #: share/completions/modprobe.fish:15 msgid "Ignore all version information" msgstr "" #: share/completions/modprobe.fish:16 msgid "Ignore version magic information" msgstr "" #: share/completions/modprobe.fish:17 msgid "Ignore module interface version" msgstr "" #: share/completions/modprobe.fish:18 msgid "List all modules matching the given wildcard" msgstr "" #: share/completions/modprobe.fish:19 msgid "Insert modules matching the given wildcard" msgstr "" #: share/completions/modprobe.fish:20 msgid "Restrict wildcards to specified directory" msgstr "" #: share/completions/modprobe.fish:21 msgid "Send error messages through syslog" msgstr "" #: share/completions/modprobe.fish:22 msgid "Specify kernel version" msgstr "" #: share/completions/modprobe.fish:23 msgid "List dependencies of module" msgstr "" #: share/completions/modprobe.fish:24 msgid "Rename module" msgstr "" #: share/completions/modprobe.fish:25 msgid "Fail if inserting already loaded module" msgstr "" #: share/completions/mount.fish:11 msgid "Mount filesystems in fstab" msgstr "" #: share/completions/mount.fish:12 msgid "Fork process for each mount" msgstr "" #: share/completions/mount.fish:13 msgid "Fake mounting" msgstr "" #: share/completions/mount.fish:14 msgid "Add label to output" msgstr "" #: share/completions/mount.fish:15 msgid "Do not write mtab" msgstr "" #: share/completions/mount.fish:16 msgid "Tolerate sloppy mount options" msgstr "" #: share/completions/mount.fish:17 msgid "Read only" msgstr "" #: share/completions/mount.fish:18 msgid "Read/Write mode" msgstr "" #: share/completions/mount.fish:19 msgid "Mount partition with specified label" msgstr "" #: share/completions/mount.fish:20 msgid "Mount partition with specified UID" msgstr "" #: share/completions/mount.fish:21 msgid "Exclude filesystems" msgstr "" #: share/completions/mount.fish:22 msgid "Remount a subtree to a second position" msgstr "" #: share/completions/mount.fish:23 msgid "Move a subtree to a new position" msgstr "" #: share/completions/mount.fish:24 msgid "Filesystem" msgstr "" #: share/completions/mount.fish:26 msgid "Mount option" msgstr "" #: share/completions/mplayer.fish:27 msgid "Dynamically change postprocessing" msgstr "" #: share/completions/mplayer.fish:28 msgid "A/V sync speed" msgstr "" #: share/completions/mplayer.fish:29 #: share/completions/mplayer.fish:31 msgid "Skip frames to maintain A/V sync" msgstr "" #: share/completions/mplayer.fish:32 msgid "Loop playback" msgstr "" #: share/completions/mplayer.fish:33 msgid "Play in random order" msgstr "" #: share/completions/mplayer.fish:36 msgid "Full screen" msgstr "" #: share/completions/mplayer.fish:37 msgid "Set playlist" msgstr "" #: share/completions/mplayer.fish:38 msgid "Audio language" msgstr "" #: share/completions/mplayer.fish:39 msgid "Play audio from file" msgstr "" #: share/completions/mplayer.fish:40 msgid "Set default CD-ROM drive" msgstr "" #: share/completions/mplayer.fish:41 msgid "Set number of audio channels" msgstr "" #: share/completions/mplayer.fish:42 msgid "Set start chapter" msgstr "" #: share/completions/mplayer.fish:43 msgid "Set default DVD-ROM drive" msgstr "" #: share/completions/mplayer.fish:44 msgid "Set dvd viewing angle" msgstr "" #: share/completions/mplayer.fish:45 msgid "Force rebuilding index" msgstr "" #: share/completions/mplayer.fish:46 msgid "Override framerate" msgstr "" #: share/completions/mplayer.fish:47 msgid "Build index if unavailable" msgstr "" #: share/completions/mplayer.fish:48 msgid "Load index from file" msgstr "" #: share/completions/mplayer.fish:49 msgid "Force non-interleaved AVI parser" msgstr "" #: share/completions/mplayer.fish:50 msgid "Rebuild index and save to file" msgstr "" #: share/completions/mplayer.fish:51 msgid "Seek to given time position" msgstr "" #: share/completions/mplayer.fish:52 msgid "TV capture mode" msgstr "" #: share/completions/mplayer.fish:53 msgid "Subtitle language" msgstr "" #: share/completions/mplayer.fish:54 msgid "Subtitle file" msgstr "" #: share/completions/mplayer.fish:55 msgid "Handle subtitlefile as unicode" msgstr "" #: share/completions/mplayer.fish:56 msgid "Handle subtitlefile as utf8" msgstr "" #: share/completions/mplayer.fish:58 #: share/completions/mplayer.fish:76 msgid "Video output" msgstr "" #: share/completions/mplayer.fish:64 #: share/completions/mplayer.fish:70 msgid "Audio output" msgstr "" #: share/completions/mv.fish:1 msgid "Make backup of each existing destination file" msgstr "" #: share/completions/mv.fish:2 msgid "Do not prompt before overwriting" msgstr "" #: share/completions/mv.fish:4 msgid "Answer for overwrite questions" msgstr "" #: share/completions/mv.fish:5 msgid "Remove trailing slashes from source" msgstr "" #: share/completions/mv.fish:6 msgid "Backup suffix" msgstr "" #: share/completions/mv.fish:7 msgid "Target directory" msgstr "" #: share/completions/mv.fish:8 msgid "Do not overwrite newer files" msgstr "" #: share/completions/nextd.fish:1 #: share/completions/prevd.fish:1 msgid "Also print directory history" msgstr "" #: share/completions/nice.fish:2 msgid "Increment priority by specified number first" msgstr "" #: share/completions/patch.fish:5 msgid "Make backup files, when patching a file, rename or copy the original instead of removing it" msgstr "" #: share/completions/patch.fish:6 msgid "Back up a file if the patch does not match the file exactly" msgstr "" #: share/completions/patch.fish:7 msgid "Do not back up a file if the patch does not match the file exactly" msgstr "" #: share/completions/patch.fish:8 msgid "Prefix pref to a file name when generating its simple backup file name" msgstr "" #: share/completions/patch.fish:9 msgid "Read and write all files in binary mode" msgstr "" #: share/completions/patch.fish:10 msgid "Interpret the patch file as a ordinary context diff" msgstr "" #: share/completions/patch.fish:11 msgid "Change to the directory dir immediately" msgstr "" #: share/completions/patch.fish:12 msgid "Use the #ifdef ... #endif construct to mark changes" msgstr "" #: share/completions/patch.fish:13 msgid "Print the results of applying the patches without actually changing any files" msgstr "" #: share/completions/patch.fish:14 msgid "Interpret the patch file as an ed script" msgstr "" #: share/completions/patch.fish:15 msgid "Remove output files that are empty after the patches have been applied" msgstr "" #: share/completions/patch.fish:16 msgid "Assume that the user knows exactly what he/she is doing, and do not ask questions" msgstr "" #: share/completions/patch.fish:17 msgid "Set the maximum fuzz factor" msgstr "" #: share/completions/patch.fish:18 msgid "This option controls patch's actions when a file is under RCS or SCCS control, and does not exist or is read-only and matches the default version, or when a file is under ClearCase control and does not exist" msgstr "" #: share/completions/patch.fish:20 msgid "Read the patch from patchfile" msgstr "" #: share/completions/patch.fish:21 msgid "Match patterns loosely, in case tabs or spaces have been munged in your files" msgstr "" #: share/completions/patch.fish:22 msgid "Interpret the patch file as a normal diff" msgstr "" #: share/completions/patch.fish:23 msgid "Ignore patches that seem to be reversed or already applied" msgstr "" #: share/completions/patch.fish:24 msgid "Send output to outfile instead of patching files in place" msgstr "" #: share/completions/patch.fish:25 msgid "Strip the smallest prefix containing num leading slashes from each file name found in the patch file" msgstr "" #: share/completions/patch.fish:26 msgid "Conform more strictly to the POSIX standard" msgstr "" #: share/completions/patch.fish:27 msgid "Use style word to quote output names" msgstr "" #: share/completions/patch.fish:28 msgid "Put rejects into rejectfile instead of the default .rej file" msgstr "" #: share/completions/patch.fish:29 msgid "Assume that this patch was created with the old and new files swapped" msgstr "" #: share/completions/patch.fish:30 msgid "Work silently, unless an error occurs" msgstr "" #: share/completions/patch.fish:31 msgid "Suppress questions like -f, but make some different assumptions" msgstr "" #: share/completions/patch.fish:32 msgid "Set the modification and access times of patched files from time stamps given in context diff headers, local time" msgstr "" #: share/completions/patch.fish:33 msgid "Interpret the patch file as a unified context diff" msgstr "" #: share/completions/patch.fish:35 msgid "Use method to determine backup file names" msgstr "" #: share/completions/patch.fish:36 msgid "Output extra information about the work being done" msgstr "" #: share/completions/patch.fish:37 msgid "Set internal debugging flags of interest only to patch patchers" msgstr "" #: share/completions/patch.fish:38 msgid "Prefix pref to the basename of a file name when generating its simple backup file name" msgstr "" #: share/completions/patch.fish:39 msgid "Use suffix as the simple backup suffix" msgstr "" #: share/completions/patch.fish:40 msgid "Set the modification and access times of patched files from time stamps given in context diff headers, UTC, GMT" msgstr "" #: share/completions/perl.fish:1 #: share/completions/ruby.fish:2 msgid "Specify record separator" msgstr "" #: share/completions/perl.fish:2 #: share/completions/ruby.fish:3 msgid "Turn on autosplit mode" msgstr "" #: share/completions/perl.fish:3 #: share/completions/ruby.fish:4 msgid "Check syntax" msgstr "" #: share/completions/perl.fish:4 #: share/completions/ruby.fish:6 msgid "Debugger" msgstr "" #: share/completions/perl.fish:5 msgid "Debug option" msgstr "" #: share/completions/perl.fish:6 #: share/completions/ruby.fish:7 msgid "Execute command" msgstr "" #: share/completions/perl.fish:7 #: share/completions/ruby.fish:9 msgid "Set regexp used to split input" msgstr "" #: share/completions/perl.fish:8 #: share/completions/ruby.fish:10 msgid "Edit files in-place" msgstr "" #: share/completions/perl.fish:9 #: share/completions/ruby.fish:11 msgid "Include path" msgstr "" #: share/completions/perl.fish:10 #: share/completions/ruby.fish:12 msgid "Automatic line ending processing" msgstr "" #: share/completions/perl.fish:11 #: share/completions/ruby.fish:13 msgid "Loop script" msgstr "" #: share/completions/perl.fish:12 #: share/completions/ruby.fish:14 #, sh-format msgid "Loop script, print $_" msgstr "" #: share/completions/perl.fish:13 msgid "Invoke CPP" msgstr "" #: share/completions/perl.fish:14 #: share/completions/ruby.fish:16 msgid "Define custom switches" msgstr "" #: share/completions/perl.fish:15 #: share/completions/ruby.fish:17 #, sh-format msgid "Search $PATH for script" msgstr "" #: share/completions/perl.fish:16 #: share/completions/ruby.fish:18 msgid "Taint checking" msgstr "" #: share/completions/perl.fish:17 msgid "Unsafe mode" msgstr "" #: share/completions/perl.fish:19 #: share/completions/ruby.fish:22 msgid "Extract script" msgstr "" #: share/completions/pine.fish:1 msgid "Open folder" msgstr "" #: share/completions/pine.fish:2 msgid "Open file" msgstr "" #: share/completions/pine.fish:4 msgid "Start in folder index" msgstr "" #: share/completions/pine.fish:5 msgid "Initial set of keystrokes" msgstr "" #: share/completions/pine.fish:6 msgid "Use function keys for commands" msgstr "" #: share/completions/pine.fish:7 msgid "Expand collections in FOLDER LIST display" msgstr "" #: share/completions/pine.fish:8 msgid "Start with specified current message number" msgstr "" #: share/completions/pine.fish:9 msgid "Open folder read-only" msgstr "" #: share/completions/pine.fish:10 msgid "Set configuration file" msgstr "" #: share/completions/pine.fish:11 msgid "Set global configuration file" msgstr "" #: share/completions/pine.fish:12 msgid "Restricted mode" msgstr "" #: share/completions/pine.fish:13 msgid "Enable suspension support" msgstr "" #: share/completions/pine.fish:14 msgid "Produce a sample global configuration file" msgstr "" #: share/completions/pine.fish:15 msgid "Produce sample configuration file" msgstr "" #: share/completions/pine.fish:16 msgid "Set mail sort order" msgstr "" #: share/completions/pine.fish:26 msgid "Config option" msgstr "" #: share/completions/ping.fish:2 msgid "Audible ping" msgstr "" #: share/completions/ping.fish:3 msgid "Adaptive ping" msgstr "" #: share/completions/ping.fish:4 msgid "Allow pinging a broadcast address" msgstr "" #: share/completions/ping.fish:5 msgid "Do not allow ping to change source address of probes" msgstr "" #: share/completions/ping.fish:6 msgid "Stop after specified number of ECHO_REQUEST packets" msgstr "" #: share/completions/ping.fish:7 msgid "Set the SO_DEBUG option on the socket being used" msgstr "" #: share/completions/ping.fish:8 msgid "Allocate and set 20 bit flow label on ECHO_REQUEST packets" msgstr "" #: share/completions/ping.fish:9 msgid "Flood ping" msgstr "" #: share/completions/ping.fish:10 msgid "Wait specified interval of seconds between sending each packet" msgstr "" #: share/completions/ping.fish:11 msgid "Set source address to specified interface address" msgstr "" #: share/completions/ping.fish:12 msgid "Send the specified number of packets without waiting for reply" msgstr "" #: share/completions/ping.fish:13 msgid "Suppress loopback of multicast packets" msgstr "" #: share/completions/ping.fish:14 msgid "Numeric output only" msgstr "" #: share/completions/ping.fish:15 msgid "Pad packet with empty bytes" msgstr "" #: share/completions/ping.fish:16 msgid "Set Quality of Service -related bits in ICMP datagrams" msgstr "" #: share/completions/ping.fish:18 msgid "Record route" msgstr "" #: share/completions/ping.fish:19 msgid "Bypass the normal routing tables and send directly to a host on an attached interface" msgstr "" #: share/completions/ping.fish:20 msgid "Specifies the number of data bytes to be sent" msgstr "" #: share/completions/ping.fish:21 msgid "Set socket buffer size" msgstr "" #: share/completions/ping.fish:22 msgid "Set the IP Time to Live" msgstr "" #: share/completions/ping.fish:23 msgid "Set special IP timestamp options" msgstr "" #: share/completions/ping.fish:24 msgid "Select Path MTU Discovery strategy" msgstr "" #: share/completions/ping.fish:25 msgid "Print full user-to-user latency" msgstr "" #: share/completions/ping.fish:28 msgid "Specify a timeout, in seconds, before ping exits regardless of how many packets have been sent or received" msgstr "" #: share/completions/ping.fish:29 msgid "Time to wait for a response, in seconds" msgstr "" #: share/completions/ps.fish:3 #: share/completions/ps.fish:7 msgid "Select all" msgstr "" #: share/completions/ps.fish:4 msgid "Invert selection" msgstr "" #: share/completions/ps.fish:5 msgid "Select all processes except session leaders and terminal-less" msgstr "" #: share/completions/ps.fish:6 msgid "Select all processes except session leaders" msgstr "" #: share/completions/ps.fish:8 msgid "Deselect all processes that do not fulfill conditions" msgstr "" #: share/completions/ps.fish:10 msgid "Select by command" msgstr "" #: share/completions/ps.fish:11 msgid "Select by group" msgstr "" #: share/completions/ps.fish:13 #: share/completions/ps.fish:14 msgid "Select by user" msgstr "" #: share/completions/ps.fish:15 msgid "Select by group/session" msgstr "" #: share/completions/ps.fish:16 msgid "Select by PID" msgstr "" #: share/completions/ps.fish:17 msgid "Select by parent PID" msgstr "" #: share/completions/ps.fish:18 msgid "Select by session ID" msgstr "" #: share/completions/ps.fish:19 msgid "Select by tty" msgstr "" #: share/completions/ps.fish:20 msgid "Extra full format" msgstr "" #: share/completions/ps.fish:21 #: share/completions/ps.fish:26 msgid "User defined format" msgstr "" #: share/completions/ps.fish:22 #: share/completions/ps.fish:28 msgid "Add column for security data" msgstr "" #: share/completions/ps.fish:23 msgid "Full format" msgstr "" #: share/completions/ps.fish:24 msgid "Jobs format" msgstr "" #: share/completions/ps.fish:25 #: share/functions/__fish_complete_ls.fish:38 msgid "Long format" msgstr "" #: share/completions/ps.fish:27 msgid "Do not show flags" msgstr "" #: share/completions/ps.fish:29 msgid "Show hierarchy" msgstr "" #: share/completions/ps.fish:30 msgid "Set namelist file" msgstr "" #: share/completions/ps.fish:31 msgid "Wide output" msgstr "" #: share/completions/ps.fish:32 #: share/completions/ps.fish:33 msgid "Show threads" msgstr "" #: share/completions/python.fish:1 msgid "Execute argument as command" msgstr "" #: share/completions/python.fish:2 msgid "Debug on" msgstr "" #: share/completions/python.fish:3 msgid "Ignore environment variables" msgstr "" #: share/completions/python.fish:5 msgid "Interactive mode after executing commands" msgstr "" #: share/completions/python.fish:6 msgid "Enable optimizations" msgstr "" #: share/completions/python.fish:7 msgid "Division control" msgstr "" #: share/completions/python.fish:8 msgid "Disable import of site module" msgstr "" #: share/completions/python.fish:9 msgid "Warn on mixed tabs and spaces" msgstr "" #: share/completions/python.fish:10 msgid "Unbuffered input and output" msgstr "" #: share/completions/python.fish:13 msgid "Warning control" msgstr "" #: share/completions/python.fish:14 msgid "Ignore first line of input" msgstr "" #: share/completions/read.fish:2 msgid "Set prompt command" msgstr "" #: share/completions/read.fish:3 #: share/completions/set.fish:59 msgid "Export variable to subprocess" msgstr "" #: share/completions/read.fish:4 #: share/completions/set.fish:61 msgid "Make variable scope global" msgstr "" #: share/completions/read.fish:5 #: share/completions/set.fish:62 msgid "Make variable scope local" msgstr "" #: share/completions/read.fish:6 #: share/completions/set.fish:63 msgid "Make variable scope universal, i.e. share variable with all the users fish processes on this computer" msgstr "" #: share/completions/read.fish:7 #: share/completions/set.fish:60 msgid "Do not export variable to subprocess" msgstr "" #: share/completions/renice.fish:2 msgid "Force following parameters to be process ID's (The default)" msgstr "" #: share/completions/renice.fish:3 msgid "Force following parameters to be interpreted as process group ID's" msgstr "" #: share/completions/renice.fish:4 msgid "Force following parameters to be interpreted as user names" msgstr "" #: share/completions/rm.fish:2 msgid "Unlink directory (Only by superuser)" msgstr "" #: share/completions/rm.fish:3 msgid "Never prompt before removal" msgstr "" #: share/completions/rm.fish:4 msgid "Prompt before removal" msgstr "" #: share/completions/rm.fish:5 #: share/completions/rm.fish:6 msgid "Recursively remove subdirectories" msgstr "" #: share/completions/rm.fish:7 msgid "Explain what is done" msgstr "" #: share/completions/rmdir.fish:3 msgid "Ignore errors from non-empty directories" msgstr "" #: share/completions/rmdir.fish:4 msgid "Remove each component of path" msgstr "" #: share/completions/rpm.fish:8 msgid "List of rpm configuration files" msgstr "" #: share/completions/rpm.fish:9 msgid "Pipe output through specified command" msgstr "" #: share/completions/rpm.fish:10 msgid "Specify directory for rpm database" msgstr "" #: share/completions/rpm.fish:15 msgid "Specify root directory for rpm operations" msgstr "" #: share/completions/rpm.fish:22 msgid "Add suggested packages to the transaction set when needed" msgstr "" #: share/completions/rpm.fish:23 msgid "Installs or upgrades all the files in the package, even if they aren't needed (missingok) and don't exist" msgstr "" #: share/completions/rpm.fish:24 msgid "Used with --relocate, permit relocations on all file paths, not just those OLD-PATH's included in the binary package relocation hint(s)" msgstr "" #: share/completions/rpm.fish:25 msgid "Don't install files whose name begins with specified path" msgstr "" #: share/completions/rpm.fish:26 msgid "Don't install any files which are marked as documentation" msgstr "" #: share/completions/rpm.fish:27 msgid "Same as using --replacepkgs, --replacefiles, and --oldpackage" msgstr "" #: share/completions/rpm.fish:28 msgid "Print 50 hash marks as the package archive is unpacked" msgstr "" #: share/completions/rpm.fish:29 msgid "Don't check for sufficient disk space before installation" msgstr "" #: share/completions/rpm.fish:30 msgid "Allow installation or upgrading even if the architectures of the binary package and host don't match" msgstr "" #: share/completions/rpm.fish:31 msgid "Allow installation or upgrading even if the operating systems of the binary package and host don't match" msgstr "" #: share/completions/rpm.fish:32 msgid "Install documentation files (default)" msgstr "" #: share/completions/rpm.fish:33 msgid "Update only the database, not the filesystem" msgstr "" #: share/completions/rpm.fish:34 #: share/completions/rpm.fish:94 msgid "Don't verify package or header digests when reading" msgstr "" #: share/completions/rpm.fish:35 #: share/completions/rpm.fish:97 msgid "Don't verify package or header signatures when reading" msgstr "" #: share/completions/rpm.fish:36 msgid "Don't do a dependency check" msgstr "" #: share/completions/rpm.fish:37 msgid "Don't suggest package(s) that provide a missing dependency" msgstr "" #: share/completions/rpm.fish:38 msgid "Don't change the package installation order" msgstr "" #: share/completions/rpm.fish:39 msgid "Don't execute scripts" msgstr "" #: share/completions/rpm.fish:40 msgid "Don't execute pre scripts" msgstr "" #: share/completions/rpm.fish:41 msgid "Don't execute post scripts" msgstr "" #: share/completions/rpm.fish:42 msgid "Don't execute preun scripts" msgstr "" #: share/completions/rpm.fish:43 msgid "Don't execute postun scripts" msgstr "" #: share/completions/rpm.fish:44 #: share/completions/rpm.fish:115 msgid "Don't execute trigger scriptlets" msgstr "" #: share/completions/rpm.fish:45 msgid "Don't execute triggerin scriptlets" msgstr "" #: share/completions/rpm.fish:46 #: share/completions/rpm.fish:116 msgid "Don't execute triggerun scriptlets" msgstr "" #: share/completions/rpm.fish:47 #: share/completions/rpm.fish:117 msgid "Don't execute triggerpostun scriptlets" msgstr "" #: share/completions/rpm.fish:48 msgid "Allow an upgrade to replace a newer package with an older one" msgstr "" #: share/completions/rpm.fish:49 msgid "Print percentages as files are unpacked from the package archive. This is intended to make rpm easy to run from other tools" msgstr "" #: share/completions/rpm.fish:50 msgid "For relocatable binary packages, translate all file paths that start with the installation prefix in the package relocation hint(s) to NEWPATH" msgstr "" #: share/completions/rpm.fish:51 msgid "Translate all paths that start with first half of following parameter to second half of following parameter" msgstr "" #: share/completions/rpm.fish:52 #: share/completions/rpm.fish:118 msgid "Re-package the files before erasing" msgstr "" #: share/completions/rpm.fish:53 msgid "Install the packages even if they replace files from other, already installed, packages" msgstr "" #: share/completions/rpm.fish:54 msgid "Install the packages even if some of them are already installed on this system" msgstr "" #: share/completions/rpm.fish:55 msgid "Don't install the package, simply check for and report potential conflicts" msgstr "" #: share/completions/rpm.fish:59 msgid "Display change information for the package" msgstr "" #: share/completions/rpm.fish:60 msgid "List only configuration files (implies -l)" msgstr "" #: share/completions/rpm.fish:61 msgid "List only documentation files (implies -l)" msgstr "" #: share/completions/rpm.fish:62 msgid "Dump file information. Must be used with at least one of -l, -c, -d" msgstr "" #: share/completions/rpm.fish:63 msgid "List all the files in each selected package" msgstr "" #: share/completions/rpm.fish:64 msgid "Display package information, including name, version, and description. Uses --queryformat if specified" msgstr "" #: share/completions/rpm.fish:65 msgid "Orders the package listing by install time" msgstr "" #: share/completions/rpm.fish:66 msgid "List files in package" msgstr "" #: share/completions/rpm.fish:67 msgid "List capabilities this package provides" msgstr "" #: share/completions/rpm.fish:68 msgid "List packages on which this package depends" msgstr "" #: share/completions/rpm.fish:69 msgid "List the package specific scriptlets" msgstr "" #: share/completions/rpm.fish:70 msgid "Display the states of files in the package. The state of each file is one of normal, not installed, or replaced" msgstr "" #: share/completions/rpm.fish:71 #: share/completions/rpm.fish:72 msgid "Display the trigger scripts contained in the package" msgstr "" #: share/completions/rpm.fish:78 msgid "Query all installed packages" msgstr "" #: share/completions/rpm.fish:79 msgid "Query package owning specified file" msgstr "" #: share/completions/rpm.fish:80 msgid "Query package that contains a given file identifier, i.e. the MD5 digest of the file contents" msgstr "" #: share/completions/rpm.fish:81 msgid "Query packages with the specified group" msgstr "" #: share/completions/rpm.fish:82 msgid "Query package that contains a given header identifier, i.e. the SHA1 digest of the immutable header region" msgstr "" #: share/completions/rpm.fish:83 msgid "Query an (uninstalled) package in specified file" msgstr "" #: share/completions/rpm.fish:84 msgid "Query package that contains a given package identifier, i.e. the MD5 digest of the combined header and payload contents" msgstr "" #: share/completions/rpm.fish:85 msgid "Parse and query specified spec-file as if it were a package" msgstr "" #: share/completions/rpm.fish:86 msgid "Query package(s) that have the specified TID (transaction identifier)" msgstr "" #: share/completions/rpm.fish:87 msgid "Query packages that are triggered by the specified packages" msgstr "" #: share/completions/rpm.fish:88 msgid "Query all packages that provide the specified capability" msgstr "" #: share/completions/rpm.fish:89 msgid "Query all packages that requires the specified capability for functioning" msgstr "" #: share/completions/rpm.fish:93 msgid "Don't verify dependencies of packages" msgstr "" #: share/completions/rpm.fish:95 msgid "Don't verify any attributes of package files" msgstr "" #: share/completions/rpm.fish:96 msgid "Don't execute the %verifyscript scriptlet" msgstr "" #: share/completions/rpm.fish:98 msgid "Don't verify linkto attribute" msgstr "" #: share/completions/rpm.fish:99 msgid "Don't verify md5 attribute" msgstr "" #: share/completions/rpm.fish:100 msgid "Don't verify size attribute" msgstr "" #: share/completions/rpm.fish:101 msgid "Don't verify user attribute" msgstr "" #: share/completions/rpm.fish:102 msgid "Don't verify group attribute" msgstr "" #: share/completions/rpm.fish:103 msgid "Don't verify time attribute" msgstr "" #: share/completions/rpm.fish:104 msgid "Don't verify mode attribute" msgstr "" #: share/completions/rpm.fish:105 msgid "Don't verify dev attribute" msgstr "" #: share/completions/rpm.fish:110 msgid "Remove all versions of the package which match specified string" msgstr "" #: share/completions/rpm.fish:111 msgid "Don't check dependencies before uninstalling the packages" msgstr "" #: share/completions/rpm.fish:112 msgid "Don't execute scriplets" msgstr "" #: share/completions/rpm.fish:113 msgid "Don't execute preun scriptlet" msgstr "" #: share/completions/rpm.fish:114 msgid "Don't execute postun scriptlet" msgstr "" #: share/completions/rpm.fish:119 msgid "Don't really uninstall anything" msgstr "" #: share/completions/rpm.fish:123 msgid "Install new package" msgstr "" #: share/completions/rpm.fish:124 msgid "Upgrade existing package" msgstr "" #: share/completions/rpm.fish:125 msgid "Upgrade package if already installed" msgstr "" #: share/completions/rpm.fish:126 msgid "Query installed packages" msgstr "" #: share/completions/rpm.fish:127 msgid "Verify package integrity" msgstr "" #: share/completions/rpm.fish:128 msgid "Erase package" msgstr "" #: share/completions/ruby.fish:5 msgid "Kanji code-set" msgstr "" #: share/completions/ruby.fish:15 msgid "Require file" msgstr "" #: share/completions/ruby.fish:20 msgid "Verbose mode without message" msgstr "" #: share/completions/ruby.fish:24 msgid "Compiler debug mode" msgstr "" #: share/completions/scp.fish:29 msgid "Bandwidth limit" msgstr "" #: share/completions/scp.fish:30 #: share/completions/ssh.fish:36 #: share/completions/sshfs.fish:25 msgid "Port" msgstr "" #: share/completions/scp.fish:31 msgid "Preserves modification times, access times, and modes from the original file" msgstr "" #: share/completions/scp.fish:33 msgid "Recursively copy" msgstr "" #: share/completions/scp.fish:34 msgid "Encyption program" msgstr "" #: share/completions/screen.fish:1 msgid "Print a list of running screen sessions" msgstr "" #: share/completions/sed.fish:13 msgid "Evaluate expression" msgstr "" #: share/completions/sed.fish:14 msgid "Evalute file" msgstr "" #: share/completions/sed.fish:15 msgid "Edit files in place" msgstr "" #: share/completions/sed.fish:22 msgid "Specify line-length" msgstr "" #: share/completions/sed.fish:23 msgid "Disable all GNU extensions" msgstr "" #: share/completions/sed.fish:24 #: share/completions/sed.fish:34 msgid "Use extended regexp" msgstr "" #: share/completions/sed.fish:25 msgid "Consider files as separate" msgstr "" #: share/completions/sed.fish:26 msgid "Use minimal IO buffers" msgstr "" #: share/completions/sed.fish:35 msgid "Delay opening files until a command containing the related 'w' function is applied" msgstr "" #: share/completions/service.fish:3 msgid "Service name" msgstr "" #: share/completions/set.fish:58 msgid "Erase variable" msgstr "" #: share/completions/set.fish:64 msgid "Test if variable is defined" msgstr "" #: share/completions/set.fish:71 #: share/completions/set_color.fish:1 msgid "Color" msgstr "" #: share/completions/set.fish:72 #: share/completions/set_color.fish:2 msgid "Change background color" msgstr "" #: share/completions/set.fish:73 #: share/completions/set_color.fish:3 msgid "Make font bold" msgstr "" #: share/completions/set.fish:77 msgid "Locale" msgstr "" #: share/completions/sort.fish:1 msgid "Ignore leading blanks" msgstr "" #: share/completions/sort.fish:2 msgid "Consider only blanks and alphanumerics" msgstr "" #: share/completions/sort.fish:4 msgid "Compare general numeric value" msgstr "" #: share/completions/sort.fish:5 msgid "Consider only printable" msgstr "" #: share/completions/sort.fish:6 msgid "Compare month names" msgstr "" #: share/completions/sort.fish:7 msgid "Compare string numerical value" msgstr "" #: share/completions/sort.fish:8 msgid "Reverse results" msgstr "" #: share/completions/sort.fish:9 msgid "Only check if sorted" msgstr "" #: share/completions/sort.fish:10 msgid "Define key" msgstr "" #: share/completions/sort.fish:11 msgid "Merge sorted files" msgstr "" #: share/completions/sort.fish:12 msgid "Write to file" msgstr "" #: share/completions/sort.fish:13 msgid "Stabilize sort" msgstr "" #: share/completions/sort.fish:14 msgid "Set memory buffer size" msgstr "" #: share/completions/sort.fish:15 msgid "Field separator" msgstr "" #: share/completions/sort.fish:16 msgid "Set temporary directory" msgstr "" #: share/completions/sort.fish:17 msgid "Output only first of equal lines" msgstr "" #: share/completions/sort.fish:18 msgid "Lines end with 0 byte" msgstr "" #: share/completions/ssh.fish:19 msgid "Disables forwarding of the authentication agent" msgstr "" #: share/completions/ssh.fish:20 msgid "Enables forwarding of the authentication agent" msgstr "" #: share/completions/ssh.fish:21 msgid "Interface to transmit from" msgstr "" #: share/completions/ssh.fish:27 msgid "Escape character" msgstr "" #: share/completions/ssh.fish:28 msgid "Go to background" msgstr "" #: share/completions/ssh.fish:29 msgid "Allow remote host to connect to local forwarded ports" msgstr "" #: share/completions/ssh.fish:30 msgid "Smartcard device" msgstr "" #: share/completions/ssh.fish:31 msgid "Disable forwarding of Kerberos tickets" msgstr "" #: share/completions/ssh.fish:32 msgid "User" msgstr "" #: share/completions/ssh.fish:33 msgid "MAC algorithm" msgstr "" #: share/completions/ssh.fish:34 msgid "Prevent reading from stdin" msgstr "" #: share/completions/ssh.fish:35 msgid "Do not execute remote command" msgstr "" #: share/completions/ssh.fish:38 msgid "Subsystem" msgstr "" #: share/completions/ssh.fish:39 msgid "Force pseudo-tty allocation" msgstr "" #: share/completions/ssh.fish:40 msgid "Disable pseudo-tty allocation" msgstr "" #: share/completions/ssh.fish:41 msgid "Disable X11 forwarding" msgstr "" #: share/completions/ssh.fish:42 msgid "Enable X11 forwarding" msgstr "" #: share/completions/ssh.fish:43 msgid "Locally forwarded ports" msgstr "" #: share/completions/ssh.fish:44 msgid "Remotely forwarded ports" msgstr "" #: share/completions/ssh.fish:45 msgid "Dynamic port forwarding" msgstr "" #: share/completions/sshfs.fish:26 msgid "Compression" msgstr "" #: share/completions/sshfs.fish:28 msgid "Enable debug" msgstr "" #: share/completions/sshfs.fish:29 msgid "Foreground operation" msgstr "" #: share/completions/sshfs.fish:30 msgid "Disable multi-threaded operation" msgstr "" #: share/completions/status.fish:2 msgid "Test if a command substitution is currently evaluated" msgstr "" #: share/completions/status.fish:3 msgid "Test if a code block is currently evaluated" msgstr "" #: share/completions/status.fish:4 msgid "Test if this is an interactive shell" msgstr "" #: share/completions/status.fish:5 msgid "Test if this is a login shell" msgstr "" #: share/completions/status.fish:6 msgid "Test if all new jobs are put under job control" msgstr "" #: share/completions/status.fish:7 msgid "Test if only interactive new jobs are put under job control" msgstr "" #: share/completions/status.fish:8 msgid "Test if new jobs are never put under job control" msgstr "" #: share/completions/status.fish:9 msgid "Set which jobs are out under job control" msgstr "" #: share/completions/status.fish:10 msgid "Print a list of all function calls leading up to running the current command" msgstr "" #: share/completions/su.fish:4 msgid "Make login shell" msgstr "" #: share/completions/su.fish:5 msgid "Pass command to shell" msgstr "" #: share/completions/su.fish:6 msgid "Pass -f to the shell" msgstr "" #: share/completions/su.fish:7 #: share/completions/su.fish:8 msgid "Preserve environment" msgstr "" #: share/completions/sudo.fish:5 msgid "Command to run" msgstr "" #: share/completions/sudo.fish:8 msgid "Validate" msgstr "" #: share/completions/svn.fish:21 msgid "Place files or directories under version control" msgstr "" #: share/completions/svn.fish:22 msgid "Output files/URLs with revision and author information inline" msgstr "" #: share/completions/svn.fish:23 msgid "Output content of files/URLs" msgstr "" #: share/completions/svn.fish:24 msgid "Check out a working copy from the repository" msgstr "" #: share/completions/svn.fish:25 msgid "Recursively clean up the working copy" msgstr "" #: share/completions/svn.fish:26 msgid "Send changes from your working copy to the repository" msgstr "" #: share/completions/svn.fish:27 msgid "Commit an unversioned file or tree into the repository" msgstr "" #: share/completions/svn.fish:28 msgid "Display information about a local or remote item" msgstr "" #: share/completions/svn.fish:29 msgid "List directory entries in the repository" msgstr "" #: share/completions/svn.fish:30 msgid "Lock working copy paths or URLs in the repository" msgstr "" #: share/completions/svn.fish:31 msgid "Show the log messages for a set of revision(s) and/or file(s)" msgstr "" #: share/completions/svn.fish:32 msgid "Apply the differences between two sources to a working copy path" msgstr "" #: share/completions/svn.fish:33 msgid "Create a new directory under version control" msgstr "" #: share/completions/svn.fish:34 msgid "Move and/or rename something in working copy or repository" msgstr "" #: share/completions/svn.fish:35 msgid "Remove a property from files, dirs, or revisions" msgstr "" #: share/completions/svn.fish:36 msgid "Edit a property with an external editor on targets" msgstr "" #: share/completions/svn.fish:37 msgid "Print value of a property on files, dirs, or revisions" msgstr "" #: share/completions/svn.fish:38 msgid "List all properties on files, dirs, or revisions" msgstr "" #: share/completions/svn.fish:39 msgid "Remove conflicted state on working copy files or directories" msgstr "" #: share/completions/svn.fish:40 msgid "Restore pristine working copy file" msgstr "" #: share/completions/svn.fish:41 msgid "Print the status of working copy files and directories" msgstr "" #: share/completions/svn.fish:42 msgid "Update the working copy to a different URL" msgstr "" #: share/completions/svn.fish:43 msgid "Unlock working copy paths or URLs" msgstr "" #: share/completions/svn.fish:44 msgid "Bring changes from the repository into the working copy" msgstr "" #: share/completions/svn.fish:45 msgid "Describe the usage of this program or its subcommands" msgstr "" #: share/completions/svn.fish:48 msgid "Specify revision" msgstr "" #: share/completions/svn.fish:50 msgid "Pass contents of file as additional args" msgstr "" #: share/completions/svn.fish:54 msgid "Print as little as possible" msgstr "" #: share/completions/svn.fish:56 msgid "Force operation to run" msgstr "" #: share/completions/svn.fish:58 msgid "Enable automatic properties" msgstr "" #: share/completions/svn.fish:60 msgid "Disable automatic properties" msgstr "" #: share/completions/svn.fish:62 msgid "Print extra info" msgstr "" #: share/completions/svn.fish:64 msgid "Specify a username" msgstr "" #: share/completions/svn.fish:66 msgid "Specify a password" msgstr "" #: share/completions/svn.fish:68 msgid "Don't cache auth tokens" msgstr "" #: share/completions/svn.fish:70 msgid "Do no interactive prompting" msgstr "" #: share/completions/svn.fish:72 msgid "Read user config files from named directory" msgstr "" #: share/completions/svn.fish:74 msgid "Don't unlock targets" msgstr "" #: share/completions/svn.fish:76 msgid "Specify commit message" msgstr "" #: share/completions/svn.fish:78 msgid "Read commit message from file" msgstr "" #: share/completions/svn.fish:80 msgid "Force log message source validity" msgstr "" #: share/completions/svn.fish:82 msgid "Specify external editor" msgstr "" #: share/completions/svn.fish:84 msgid "Descend recursively" msgstr "" #: share/completions/svn.fish:86 msgid "Give output suitable for concatenation" msgstr "" #: share/completions/svn.fish:88 msgid "Output in XML" msgstr "" #: share/completions/svn.fish:90 msgid "Specify merge command" msgstr "" #: share/completions/svn.fish:92 msgid "Force encoding" msgstr "" #: share/completions/svn.fish:94 msgid "Operate on revision property" msgstr "" #: share/completions/svn.fish:96 msgid "Use strict semantics" msgstr "" #: share/completions/svn.fish:98 msgid "Ignore externals definitions" msgstr "" #: share/completions/svn.fish:104 msgid "Do not cross copies" msgstr "" #: share/completions/svn.fish:105 msgid "Maximum number of log entries" msgstr "" #: share/completions/svn.fish:111 msgid "Make no changes" msgstr "" #: share/completions/svn.fish:112 msgid "Ignore ancestry when calculating merge" msgstr "" #: share/completions/svn.fish:118 msgid "Display update information" msgstr "" #: share/completions/svn.fish:119 msgid "Disregard ignores" msgstr "" #: share/completions/svn.fish:125 msgid "Relocate VIA URL-rewriting" msgstr "" #: share/completions/svn.fish:131 msgid "Print client version info" msgstr "" #: share/completions/tar.fish:1 #: share/completions/tar.fish:2 msgid "Append archive to archive" msgstr "" #: share/completions/tar.fish:3 msgid "Create archive" msgstr "" #: share/completions/tar.fish:4 #: share/completions/tar.fish:5 msgid "Compare archive and filesystem" msgstr "" #: share/completions/tar.fish:6 msgid "Delete from archive" msgstr "" #: share/completions/tar.fish:7 msgid "Append files to archive" msgstr "" #: share/completions/tar.fish:8 msgid "List archive" msgstr "" #: share/completions/tar.fish:9 msgid "Append new files" msgstr "" #: share/completions/tar.fish:10 #: share/completions/tar.fish:11 msgid "Extract from archive" msgstr "" #: share/completions/tar.fish:12 msgid "Keep access time" msgstr "" #: share/completions/tar.fish:14 msgid "Reblock while reading" msgstr "" #: share/completions/tar.fish:16 msgid "Print directory names" msgstr "" #: share/completions/tar.fish:17 msgid "Archive file" msgstr "" #: share/completions/tar.fish:18 msgid "Archive is local" msgstr "" #: share/completions/tar.fish:19 msgid "Run script at end of tape" msgstr "" #: share/completions/tar.fish:20 msgid "Use old incremental GNU format" msgstr "" #: share/completions/tar.fish:21 msgid "Use new incremental GNU format" msgstr "" #: share/completions/tar.fish:22 msgid "Dereference symlinks" msgstr "" #: share/completions/tar.fish:23 msgid "Ignore zero block in archive" msgstr "" #: share/completions/tar.fish:24 msgid "Filter through bzip2" msgstr "" #: share/completions/tar.fish:25 msgid "Don't exit on unreadable files" msgstr "" #: share/completions/tar.fish:26 msgid "Don't overwrite" msgstr "" #: share/completions/tar.fish:27 msgid "Starting file in archive" msgstr "" #: share/completions/tar.fish:28 msgid "Stay in local filesystem" msgstr "" #: share/completions/tar.fish:29 msgid "Tape length" msgstr "" #: share/completions/tar.fish:30 msgid "Don't extract modification time" msgstr "" #: share/completions/tar.fish:31 msgid "Multi volume archive" msgstr "" #: share/completions/tar.fish:32 msgid "Only store newer files" msgstr "" #: share/completions/tar.fish:33 #: share/completions/tar.fish:34 msgid "Use V7 format" msgstr "" #: share/completions/tar.fish:35 msgid "Extract to stdout" msgstr "" #: share/completions/tar.fish:36 #: share/completions/tar.fish:37 msgid "Extract all permissions" msgstr "" #: share/completions/tar.fish:38 msgid "Don't strip leading /" msgstr "" #: share/completions/tar.fish:39 msgid "Preserve all permissions and do not sort file arguments" msgstr "" #: share/completions/tar.fish:40 msgid "Show record number" msgstr "" #: share/completions/tar.fish:41 msgid "Remove files after adding to archive" msgstr "" #: share/completions/tar.fish:42 #: share/completions/tar.fish:43 msgid "Do not sort file arguments" msgstr "" #: share/completions/tar.fish:44 msgid "Preserve file ownership" msgstr "" #: share/completions/tar.fish:45 msgid "Handle sparse files" msgstr "" #: share/completions/tar.fish:46 msgid "Extract file from file" msgstr "" #: share/completions/tar.fish:47 msgid "-T has null-terminated names" msgstr "" #: share/completions/tar.fish:48 msgid "Print total bytes written" msgstr "" #: share/completions/tar.fish:50 msgid "Set volume name" msgstr "" #: share/completions/tar.fish:52 #: share/completions/tar.fish:53 msgid "Ask for confirmation" msgstr "" #: share/completions/tar.fish:54 msgid "Verify archive" msgstr "" #: share/completions/tar.fish:55 msgid "Exclude file" msgstr "" #: share/completions/tar.fish:56 msgid "Exclude files listed in specified file" msgstr "" #: share/completions/tar.fish:57 #: share/completions/tar.fish:58 msgid "Filter through compress" msgstr "" #: share/completions/tar.fish:59 #: share/completions/tar.fish:60 msgid "Filter through gzip" msgstr "" #: share/completions/tar.fish:61 msgid "Filter through specified program" msgstr "" #: share/completions/telnet.fish:9 #: share/completions/telnet.fish:14 msgid "Specifies an 8-bit data path." msgstr "" #: share/completions/telnet.fish:10 msgid "Do not try to negotiate TELNET BINARY option." msgstr "" #: share/completions/telnet.fish:11 msgid "Stops any character from being recognized as an escape character." msgstr "" #: share/completions/telnet.fish:12 msgid "Use local Kerberos authentication, if possible." msgstr "" #: share/completions/telnet.fish:13 msgid "Specifies no automatic login to remote system." msgstr "" #: share/completions/telnet.fish:15 msgid "Attempt automatic login." msgstr "" #: share/completions/telnet.fish:16 msgid "Disables reading user's .telnetrc" msgstr "" #: share/completions/telnet.fish:17 msgid "Sets debug mode." msgstr "" #: share/completions/telnet.fish:18 msgid "Sets IP TOS." msgstr "" #: share/completions/telnet.fish:19 msgid "Disables atype type of authentication." msgstr "" #: share/completions/telnet.fish:20 msgid "User login." msgstr "" #: share/completions/telnet.fish:21 msgid "Log to tracefile." msgstr "" #: share/completions/telnet.fish:22 msgid "Turn on encryption." msgstr "" #: share/completions/telnet.fish:23 msgid "User interface similar to rlogin." msgstr "" #: share/completions/telnet.fish:24 msgid "Use Kerberos realm for authentication." msgstr "" #: share/completions/test.fish:4 msgid "Negate expression" msgstr "" #: share/completions/test.fish:5 msgid "Logical and" msgstr "" #: share/completions/test.fish:6 msgid "Logical or" msgstr "" #: share/completions/test.fish:7 msgid "String length is non-zero" msgstr "" #: share/completions/test.fish:8 msgid "String length is zero" msgstr "" #: share/completions/test.fish:9 msgid "Strings are equal" msgstr "" #: share/completions/test.fish:10 msgid "Strings are not equal" msgstr "" #: share/completions/test.fish:11 msgid "Integers are equal" msgstr "" #: share/completions/test.fish:12 msgid "Left integer larger than or equal to right integer" msgstr "" #: share/completions/test.fish:13 msgid "Left integer larger than right integer" msgstr "" #: share/completions/test.fish:14 msgid "Left integer less than or equal to right integer" msgstr "" #: share/completions/test.fish:15 msgid "Left integer less than right integer" msgstr "" #: share/completions/test.fish:16 msgid "Left integer not equal to right integer" msgstr "" #: share/completions/test.fish:17 msgid "Left file equal to right file" msgstr "" #: share/completions/test.fish:18 msgid "Left file newer than right file" msgstr "" #: share/completions/test.fish:19 msgid "Left file older than right file" msgstr "" #: share/completions/test.fish:20 msgid "File is block device" msgstr "" #: share/completions/test.fish:21 msgid "File is character device" msgstr "" #: share/completions/test.fish:22 msgid "File is directory" msgstr "" #: share/completions/test.fish:23 msgid "File exists" msgstr "" #: share/completions/test.fish:24 msgid "File is regular" msgstr "" #: share/completions/test.fish:25 msgid "File is set-group-ID" msgstr "" #: share/completions/test.fish:26 #: share/completions/test.fish:29 msgid "File is symlink" msgstr "" #: share/completions/test.fish:27 msgid "File owned by effective group ID" msgstr "" #: share/completions/test.fish:28 msgid "File has sticky bit set" msgstr "" #: share/completions/test.fish:30 msgid "File owned by effective user ID" msgstr "" #: share/completions/test.fish:31 msgid "File is named pipe" msgstr "" #: share/completions/test.fish:32 msgid "File is readable" msgstr "" #: share/completions/test.fish:33 msgid "File size is non-zero" msgstr "" #: share/completions/test.fish:34 msgid "File is socket" msgstr "" #: share/completions/test.fish:35 msgid "FD is terminal" msgstr "" #: share/completions/test.fish:36 msgid "File set-user-ID bit is set" msgstr "" #: share/completions/test.fish:37 msgid "File is writable" msgstr "" #: share/completions/test.fish:38 msgid "File is executable" msgstr "" #: share/completions/time.fish:2 #: share/completions/type.fish:11 msgid "Command" msgstr "" #: share/completions/time.fish:4 msgid "Specify output format" msgstr "" #: share/completions/time.fish:5 msgid "Use the portable output format" msgstr "" #: share/completions/time.fish:6 msgid "Do not send the results to stderr, but overwrite the specified file" msgstr "" #: share/completions/time.fish:7 msgid "(Used together with -o) Do not overwrite but append" msgstr "" #: share/completions/top.fish:3 msgid "Toggle command line/program name" msgstr "" #: share/completions/top.fish:4 msgid "Update interval" msgstr "" #: share/completions/top.fish:6 msgid "Toggle idle processes" msgstr "" #: share/completions/top.fish:7 msgid "Maximium iterations" msgstr "" #: share/completions/top.fish:8 msgid "Monitor effective UID" msgstr "" #: share/completions/top.fish:9 msgid "Monitor user" msgstr "" #: share/completions/top.fish:10 msgid "Monitor PID" msgstr "" #: share/completions/top.fish:11 msgid "Secure mode" msgstr "" #: share/completions/top.fish:12 msgid "Cumulative mode" msgstr "" #: share/completions/touch.fish:1 msgid "Change access time" msgstr "" #: share/completions/touch.fish:2 msgid "Set date back" msgstr "" #: share/completions/touch.fish:3 msgid "Do not create file" msgstr "" #: share/completions/touch.fish:4 #: share/completions/touch.fish:8 msgid "Set date" msgstr "" #: share/completions/touch.fish:5 msgid "Set date forward" msgstr "" #: share/completions/touch.fish:6 msgid "Change modification time" msgstr "" #: share/completions/touch.fish:7 msgid "Use this files times" msgstr "" #: share/completions/trap.fish:2 msgid "Display names of all signals" msgstr "" #: share/completions/trap.fish:3 msgid "Display all currently defined trap handlers" msgstr "" #: share/completions/type.fish:3 msgid "Print all possible definitions of the specified name" msgstr "" #: share/completions/type.fish:4 msgid "Supress function and builtin lookup" msgstr "" #: share/completions/type.fish:5 msgid "Print command type" msgstr "" #: share/completions/type.fish:6 msgid "Print path to command, or nothing if name is not a command" msgstr "" #: share/completions/type.fish:7 msgid "Print path to command" msgstr "" #: share/completions/ulimit.fish:2 msgid "Set or get all current limits" msgstr "" #: share/completions/ulimit.fish:3 msgid "Maximum size of core files created" msgstr "" #: share/completions/ulimit.fish:4 msgid "Maximum size of a process's data segment" msgstr "" #: share/completions/ulimit.fish:5 msgid "Maximum size of files created by the shell" msgstr "" #: share/completions/ulimit.fish:6 msgid "Maximum size that may be locked into memory" msgstr "" #: share/completions/ulimit.fish:7 msgid "Maximum resident set size" msgstr "" #: share/completions/ulimit.fish:8 msgid "Maximum number of open file descriptors" msgstr "" #: share/completions/ulimit.fish:9 msgid "Maximum stack size" msgstr "" #: share/completions/ulimit.fish:10 msgid "Maximum amount of cpu time in seconds" msgstr "" #: share/completions/ulimit.fish:11 msgid "Maximum number of processes available to a single user" msgstr "" #: share/completions/ulimit.fish:12 msgid "Maximum amount of virtual memory available to the shell" msgstr "" #: share/completions/umount.fish:13 msgid "Unmount without writing in /etc/mtab" msgstr "" #: share/completions/umount.fish:14 msgid "In case unmounting fails, try to remount read-only" msgstr "" #: share/completions/umount.fish:15 msgid "In case the unmounted device was a loop device, also free this loop device" msgstr "" #: share/completions/umount.fish:16 msgid "Don't call the /sbin/umount. helper even if it exists" msgstr "" #: share/completions/umount.fish:17 msgid "Unmount all of the file systems described in /etc/mtab" msgstr "" #: share/completions/umount.fish:18 msgid "Actions should only be taken on file systems of the specified type" msgstr "" #: share/completions/umount.fish:19 msgid "Actions should only be taken on file systems with the specified options in /etc/fstab" msgstr "" #: share/completions/umount.fish:20 msgid "Force unmount (in case of an unreachable NFS system)" msgstr "" #: share/completions/umount.fish:21 msgid "Detach the filesystem from the filesystem hierarchy now, and cleanup all references to the filesystem as soon as it is not busy" msgstr "" #: share/completions/uname.fish:1 msgid "Print all information" msgstr "" #: share/completions/uname.fish:2 msgid "Print kernel name" msgstr "" #: share/completions/uname.fish:3 msgid "Print network node hostname" msgstr "" #: share/completions/uname.fish:4 msgid "Print kernel release" msgstr "" #: share/completions/uname.fish:5 msgid "Print kernel version" msgstr "" #: share/completions/uname.fish:6 msgid "Print machine name" msgstr "" #: share/completions/uname.fish:7 msgid "Print processor" msgstr "" #: share/completions/uname.fish:8 msgid "Print hardware platform" msgstr "" #: share/completions/uname.fish:9 msgid "Print operating system" msgstr "" #: share/completions/uniq.fish:1 msgid "Print number of occurences" msgstr "" #: share/completions/uniq.fish:2 msgid "Only print duplicates" msgstr "" #: share/completions/uniq.fish:3 msgid "Remove non-duplicate lines" msgstr "" #: share/completions/uniq.fish:8 msgid "Avoid comparing first N fields" msgstr "" #: share/completions/uniq.fish:9 msgid "Case insensitive" msgstr "" #: share/completions/uniq.fish:10 msgid "Avoid comparing first N characters" msgstr "" #: share/completions/uniq.fish:11 msgid "Only print unique lines" msgstr "" #: share/completions/uniq.fish:12 msgid "Compare only specified number of characters" msgstr "" #: share/completions/valgrind.fish:12 msgid "Skin" msgstr "" #: share/completions/valgrind.fish:25 msgid "Display help and debug options" msgstr "" #: share/completions/valgrind.fish:29 msgid "Valgrind-ise children" msgstr "" #: share/completions/valgrind.fish:30 msgid "Track file descriptors" msgstr "" #: share/completions/valgrind.fish:31 msgid "Log to file descriptor" msgstr "" #: share/completions/valgrind.fish:32 msgid "Log to file" msgstr "" #: share/completions/valgrind.fish:33 msgid "Log to socket" msgstr "" #: share/completions/valgrind.fish:35 msgid "Callers in stack trace" msgstr "" #: share/completions/valgrind.fish:36 msgid "Stop showing errors if too many" msgstr "" #: share/completions/valgrind.fish:37 msgid "Continue trace below main()" msgstr "" #: share/completions/valgrind.fish:38 msgid "Supress errors from file" msgstr "" #: share/completions/valgrind.fish:39 msgid "Print suppressions for detected errors" msgstr "" #: share/completions/valgrind.fish:40 msgid "Start debugger on error" msgstr "" #: share/completions/valgrind.fish:41 msgid "Debugger command" msgstr "" #: share/completions/valgrind.fish:42 msgid "File descriptor for input" msgstr "" #: share/completions/valgrind.fish:46 #: share/completions/valgrind.fish:55 msgid "Check for memory leaks" msgstr "" #: share/completions/valgrind.fish:47 #: share/completions/valgrind.fish:56 msgid "Show reachable leaked memory" msgstr "" #: share/completions/valgrind.fish:48 msgid "Determines how willing Memcheck is to consider different backtraces to be the same" msgstr "" #: share/completions/valgrind.fish:49 #: share/completions/valgrind.fish:58 msgid "Set size of freed memory pool" msgstr "" #: share/completions/valgrind.fish:57 msgid "Determines how willing Addrcheck is to consider different backtraces to be the same" msgstr "" #: share/completions/valgrind.fish:63 msgid "Type of L1 instruction cache" msgstr "" #: share/completions/valgrind.fish:64 msgid "Type of L1 data cache" msgstr "" #: share/completions/valgrind.fish:65 msgid "Type of L2 cache" msgstr "" #: share/completions/valgrind.fish:69 msgid "Specify a function that allocates memory" msgstr "" #: share/completions/valgrind.fish:71 msgid "The number of bytes of heap overhead per allocation" msgstr "" #: share/completions/valgrind.fish:72 msgid "Profile stack usage" msgstr "" #: share/completions/valgrind.fish:73 msgid "Depth of call chain" msgstr "" #: share/completions/valgrind.fish:74 msgid "Profiling output format" msgstr "" #: share/completions/w.fish:1 msgid "Dont print header" msgstr "" #: share/completions/w.fish:2 msgid "Ignore username for time calculations" msgstr "" #: share/completions/w.fish:3 msgid "Short format" msgstr "" #: share/completions/w.fish:4 msgid "Toggle printing of remote hostname" msgstr "" #: share/completions/wc.fish:1 msgid "Print byte counts" msgstr "" #: share/completions/wc.fish:2 msgid "Print character counts" msgstr "" #: share/completions/wc.fish:3 msgid "Print newline counts" msgstr "" #: share/completions/wc.fish:4 msgid "Print length of longest line" msgstr "" #: share/completions/wc.fish:5 msgid "Print word counts" msgstr "" #: share/completions/wget.fish:7 msgid "Go to background immediately after startup" msgstr "" #: share/completions/wget.fish:8 msgid "Execute command as if part of .wgetrc" msgstr "" #: share/completions/wget.fish:9 msgid "Log all messages to logfile" msgstr "" #: share/completions/wget.fish:10 msgid "Append all messages to logfile" msgstr "" #: share/completions/wget.fish:11 msgid "Turn on debug output" msgstr "" #: share/completions/wget.fish:14 #: share/completions/wget.fish:15 msgid "Turn off verbose without being completely quiet" msgstr "" #: share/completions/wget.fish:16 msgid "Read URLs from file" msgstr "" #: share/completions/wget.fish:17 msgid "Force input to be treated as HTML" msgstr "" #: share/completions/wget.fish:18 msgid "Prepend string to relative links" msgstr "" #: share/completions/wget.fish:19 msgid "Bind address on local machine" msgstr "" #: share/completions/wget.fish:20 msgid "Set number of retries to number" msgstr "" #: share/completions/wget.fish:21 msgid "Concatenate output to file" msgstr "" #: share/completions/wget.fish:22 #: share/completions/wget.fish:23 msgid "Never overwrite files with same name" msgstr "" #: share/completions/wget.fish:24 msgid "Continue getting a partially-downloaded file" msgstr "" #: share/completions/wget.fish:25 msgid "Select progress meter type" msgstr "" #: share/completions/wget.fish:32 msgid "Turn on time-stamping" msgstr "" #: share/completions/wget.fish:33 msgid "Print the headers/responses sent by servers" msgstr "" #: share/completions/wget.fish:34 msgid "Do not download the pages, just check that they are there" msgstr "" #: share/completions/wget.fish:35 msgid "Set the network timeout" msgstr "" #: share/completions/wget.fish:36 msgid "Set the DNS lookup timeout" msgstr "" #: share/completions/wget.fish:37 msgid "Set the connect timeout" msgstr "" #: share/completions/wget.fish:38 msgid "Set the read (and write) timeout" msgstr "" #: share/completions/wget.fish:39 msgid "Limit the download speed" msgstr "" #: share/completions/wget.fish:40 msgid "Wait the specified number of seconds between the retrievals" msgstr "" #: share/completions/wget.fish:41 msgid "Wait time between retries" msgstr "" #: share/completions/wget.fish:42 msgid "Wait random amount of time between retrievals" msgstr "" #: share/completions/wget.fish:43 msgid "Toggle proxy support" msgstr "" #: share/completions/wget.fish:44 msgid "Specify download quota for automatic retrievals" msgstr "" #: share/completions/wget.fish:45 msgid "Turn off caching of DNS lookups" msgstr "" #: share/completions/wget.fish:46 msgid "Change which characters found in remote URLs may show up in local file names" msgstr "" #: share/completions/wget.fish:53 #: share/completions/wget.fish:54 msgid "Do not create a hierarchy of directories" msgstr "" #: share/completions/wget.fish:55 msgid "Force creation of a hierarchy of directories" msgstr "" #: share/completions/wget.fish:56 #: share/completions/wget.fish:57 msgid "Disable generation of host-prefixed directories" msgstr "" #: share/completions/wget.fish:58 msgid "Use the protocol name as a directory component" msgstr "" #: share/completions/wget.fish:59 msgid "Ignore specified number of directory components" msgstr "" #: share/completions/wget.fish:60 msgid "Set directory prefix" msgstr "" #: share/completions/wget.fish:61 msgid "Force html files to have html extension" msgstr "" #: share/completions/wget.fish:62 msgid "Specify the http username" msgstr "" #: share/completions/wget.fish:63 msgid "Specify the http password" msgstr "" #: share/completions/wget.fish:64 msgid "Disable server-side cache" msgstr "" #: share/completions/wget.fish:65 msgid "Disable the use of cookies" msgstr "" #: share/completions/wget.fish:66 msgid "Load cookies from file" msgstr "" #: share/completions/wget.fish:67 msgid "Save cookies to file" msgstr "" #: share/completions/wget.fish:68 msgid "Save session cookies" msgstr "" #: share/completions/wget.fish:69 msgid "Ignore 'Content-Length' header" msgstr "" #: share/completions/wget.fish:70 msgid "Define an additional-header to be passed to the HTTP servers" msgstr "" #: share/completions/wget.fish:71 msgid "Specify the proxy username" msgstr "" #: share/completions/wget.fish:72 msgid "Specify the proxy password" msgstr "" #: share/completions/wget.fish:73 msgid "Set referer URL" msgstr "" #: share/completions/wget.fish:74 msgid "Save the headers sent by the HTTP server" msgstr "" #: share/completions/wget.fish:75 msgid "Identify as agent-string" msgstr "" #: share/completions/wget.fish:76 #: share/completions/wget.fish:77 msgid "Use POST as the method for all HTTP requests and send the specified data in the request body" msgstr "" #: share/completions/wget.fish:78 msgid "Turn off keep-alive for http downloads" msgstr "" #: share/completions/wget.fish:82 msgid "Don't remove the temporary .listing files generated" msgstr "" #: share/completions/wget.fish:83 msgid "Turn off FTP globbing" msgstr "" #: share/completions/wget.fish:84 msgid "Use the passive FTP retrieval scheme" msgstr "" #: share/completions/wget.fish:85 msgid "Traverse symlinks and retrieve pointed-to files" msgstr "" #: share/completions/wget.fish:89 msgid "Turn on recursive retrieving" msgstr "" #: share/completions/wget.fish:90 msgid "Specify recursion maximum depth" msgstr "" #: share/completions/wget.fish:91 msgid "Delete every single file downloaded" msgstr "" #: share/completions/wget.fish:92 msgid "Convert the links in the document to make them suitable for local viewing" msgstr "" #: share/completions/wget.fish:93 msgid "Back up the original version" msgstr "" #: share/completions/wget.fish:94 msgid "Turn on options suitable for mirroring" msgstr "" #: share/completions/wget.fish:95 msgid "Download all the files that are necessary to properly display a given HTML page" msgstr "" #: share/completions/wget.fish:96 msgid "Turn on strict parsing of HTML comments" msgstr "" #: share/completions/wget.fish:100 msgid "Comma-separated lists of file name suffixes or patterns to accept" msgstr "" #: share/completions/wget.fish:101 msgid "Comma-separated lists of file name suffixes or patterns to reject" msgstr "" #: share/completions/wget.fish:102 msgid "Set domains to be followed" msgstr "" #: share/completions/wget.fish:103 msgid "Specify the domains that are not to be followed" msgstr "" #: share/completions/wget.fish:104 msgid "Follow FTP links from HTML documents" msgstr "" #: share/completions/wget.fish:105 msgid "HTML tags to follow" msgstr "" #: share/completions/wget.fish:106 msgid "HTML tags to ignore" msgstr "" #: share/completions/wget.fish:107 msgid "Enable spanning across hosts" msgstr "" #: share/completions/wget.fish:108 msgid "Follow relative links only" msgstr "" #: share/completions/wget.fish:109 msgid "Specify a comma-separated list of directories you wish to follow" msgstr "" #: share/completions/wget.fish:110 msgid "Specify a comma-separated list of directories you wish to exclude" msgstr "" #: share/completions/wget.fish:111 #: share/completions/wget.fish:112 msgid "Do not ever ascend to the parent directory" msgstr "" #: share/completions/who.fish:1 msgid "Same as -b -d --login -p -r -t -T -u" msgstr "" #: share/completions/who.fish:2 msgid "Print time of last boot" msgstr "" #: share/completions/who.fish:3 msgid "Print dead processes" msgstr "" #: share/completions/who.fish:4 msgid "Print line of headings" msgstr "" #: share/completions/who.fish:5 msgid "Print idle time" msgstr "" #: share/completions/who.fish:6 msgid "Print login process" msgstr "" #: share/completions/who.fish:7 msgid "Canonicalize hostnames via DNS" msgstr "" #: share/completions/who.fish:8 msgid "Print hostname and user for stdin" msgstr "" #: share/completions/who.fish:9 msgid "Print active processes spawned by init" msgstr "" #: share/completions/who.fish:10 msgid "Print all login names and number of users logged on" msgstr "" #: share/completions/who.fish:11 msgid "Print current runlevel" msgstr "" #: share/completions/who.fish:12 msgid "Print name, line, and time" msgstr "" #: share/completions/who.fish:13 msgid "Print last system clock change" msgstr "" #: share/completions/who.fish:14 #: share/completions/who.fish:15 #: share/completions/who.fish:16 msgid "Print users message status as +, - or ?" msgstr "" #: share/completions/who.fish:17 msgid "List users logged in" msgstr "" #: share/completions/xargs.fish:5 msgid "Input filenames are terminated by a null character instead of by whitespace, and the quotes and backslash are not special" msgstr "" #: share/completions/xargs.fish:6 #: share/completions/xargs.fish:7 msgid "Set the end of file string to eof-str" msgstr "" #: share/completions/xargs.fish:9 #: share/completions/xargs.fish:10 msgid "Replace replace-str in the initial arguments with names from standard input" msgstr "" #: share/completions/xargs.fish:11 #: share/completions/xargs.fish:12 msgid "Use at most max-lines nonblank input lines per command line" msgstr "" #: share/completions/xargs.fish:13 msgid "Use at most max-args arguments per command line" msgstr "" #: share/completions/xargs.fish:14 msgid "Prompt the user about whether to run each command line and read a line from the terminal" msgstr "" #: share/completions/xargs.fish:15 msgid "If the standard input does not contain any nonblanks, do not run the command" msgstr "" #: share/completions/xargs.fish:16 msgid "Use at most max-chars characters per command line" msgstr "" #: share/completions/xargs.fish:17 msgid "Print the command line on the standard error output before executing it" msgstr "" #: share/completions/xargs.fish:19 msgid "Exit if the size is exceeded" msgstr "" #: share/completions/xargs.fish:20 msgid "Run up to max-procs processes at a time" msgstr "" #: share/completions/xprop.fish:3 msgid "Display grammar and exit" msgstr "" #: share/completions/xprop.fish:4 msgid "Select window by id" msgstr "" #: share/completions/xprop.fish:5 msgid "Select window by name" msgstr "" #: share/completions/xprop.fish:6 msgid "Display font properties" msgstr "" #: share/completions/xprop.fish:7 msgid "Select root window" msgstr "" #: share/completions/xprop.fish:8 msgid "Specify X server" msgstr "" #: share/completions/xprop.fish:9 msgid "Maximum display length" msgstr "" #: share/completions/xprop.fish:10 msgid "Do not show property type" msgstr "" #: share/completions/xprop.fish:11 msgid "Set format file" msgstr "" #: share/completions/xprop.fish:12 msgid "Select a window by clicking on its frame" msgstr "" #: share/completions/xprop.fish:13 msgid "Remove property" msgstr "" #: share/completions/xprop.fish:19 msgid "Set property" msgstr "" #: share/completions/xprop.fish:25 msgid "Examine property updates forever" msgstr "" #: share/completions/xprop.fish:26 msgid "Set format" msgstr "" #: share/completions/xsel.fish:1 msgid "Append input to selection" msgstr "" #: share/completions/xsel.fish:2 msgid "Append to selection as input grows" msgstr "" #: share/completions/xsel.fish:3 msgid "Read into selection" msgstr "" #: share/completions/xsel.fish:4 msgid "Write selection" msgstr "" #: share/completions/xsel.fish:5 msgid "Clear selection" msgstr "" #: share/completions/xsel.fish:6 msgid "Delete selection" msgstr "" #: share/completions/xsel.fish:7 msgid "Use primary selection" msgstr "" #: share/completions/xsel.fish:8 msgid "Use secondary selection" msgstr "" #: share/completions/xsel.fish:9 msgid "Use clipboard selection" msgstr "" #: share/completions/xsel.fish:10 msgid "Make current selections persistent after program exit" msgstr "" #: share/completions/xsel.fish:11 msgid "Exchange primary and secondary selections" msgstr "" #: share/completions/xsel.fish:12 msgid "X server display" msgstr "" #: share/completions/xsel.fish:13 msgid "Timeout for retrieving selection" msgstr "" #: share/completions/xsel.fish:14 msgid "Error log" msgstr "" #: share/completions/xsel.fish:15 msgid "Do not detach from the controlling terminal" msgstr "" #: share/completions/xsel.fish:17 msgid "Print informative messages" msgstr "" #: share/completions/yum.fish:49 msgid "Set debug level" msgstr "" #: share/completions/yum.fish:50 msgid "Set error level" msgstr "" #: share/completions/yum.fish:51 msgid "Be tolerant of errors in commandline" msgstr "" #: share/completions/yum.fish:52 msgid "Set maximum delay between commands" msgstr "" #: share/completions/yum.fish:53 msgid "Run commands from cache" msgstr "" #: share/completions/yum.fish:55 msgid "Specify installroot" msgstr "" #: share/completions/yum.fish:56 msgid "Enable repository" msgstr "" #: share/completions/yum.fish:57 msgid "Disable repository" msgstr "" #: share/completions/yum.fish:58 msgid "Enables obsolets processing logic" msgstr "" #: share/completions/yum.fish:59 msgid "Output rss-data to file" msgstr "" #: share/completions/yum.fish:60 msgid "Exclude specified package from updates" msgstr "" #: share/completions/zip.fish:2 msgid "Freshen: only changed files" msgstr "" #: share/completions/zip.fish:3 msgid "Delete entries in zipfile" msgstr "" #: share/completions/zip.fish:4 msgid "Update: only changed or newer files" msgstr "" #: share/completions/zip.fish:5 msgid "Move into zipfile (delete files)" msgstr "" #: share/completions/zip.fish:7 msgid "Do not store directory names" msgstr "" #: share/completions/zip.fish:8 msgid "Do not compress at all" msgstr "" #: share/completions/zip.fish:9 msgid "Convert LF to CR LF" msgstr "" #: share/completions/zip.fish:10 msgid "Convert CR LF to LF" msgstr "" #: share/completions/zip.fish:11 msgid "Compress faster" msgstr "" #: share/completions/zip.fish:12 msgid "Compress better" msgstr "" #: share/completions/zip.fish:15 msgid "Add one-line comments" msgstr "" #: share/completions/zip.fish:16 msgid "Add zipfile comments" msgstr "" #: share/completions/zip.fish:17 msgid "Read names from stdin" msgstr "" #: share/completions/zip.fish:18 msgid "Make zipfile as old as the latest entry" msgstr "" #: share/completions/zip.fish:19 msgid "Exclude the following names" msgstr "" #: share/completions/zip.fish:20 msgid "Include only the following names" msgstr "" #: share/completions/zip.fish:21 msgid "Fix zipfile" msgstr "" #: share/completions/zip.fish:22 msgid "Fix zipfile (try harder)" msgstr "" #: share/completions/zip.fish:23 msgid "Adjust offsets to suit self-extracting exe" msgstr "" #: share/completions/zip.fish:24 msgid "Strip prepended data" msgstr "" #: share/completions/zip.fish:25 msgid "Test zipfile integrity" msgstr "" #: share/completions/zip.fish:26 msgid "Exclude extra file attributes" msgstr "" #: share/completions/zip.fish:27 msgid "Store symbolic links as links" msgstr "" #: share/completions/zip.fish:28 msgid "PKZIP recursion" msgstr "" #: share/completions/zip.fish:29 msgid "Encrypt" msgstr "" #: share/completions/zip.fish:30 msgid "Don't compress files with these suffixes" msgstr "" #: share/functions/N_.fish:3 #: share/functions/_.fish:8 #: share/functions/_.fish:12 #: seq:11 #: seq:16 msgid "-d" msgstr "" #: share/functions/_.fish:9 #: seq:17 msgid "fish" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:4 msgid "Maximum uploads at once" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:5 msgid "Number of seconds between keepalives" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:6 msgid "Bytes per request" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:7 msgid "Requests per pipe" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:8 msgid "Maximum length prefix encoding" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:9 msgid "IP to report to the tracker" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:10 msgid "Minimum port to listen to" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:11 msgid "Maximum port to listen to" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:12 msgid "File for server response" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:13 msgid "URL to get file from" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:14 msgid "Local file target" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:15 msgid "Time to close inactive socket" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:16 msgid "Time between checking timeouts" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:17 msgid "Maximum outgoing slice length" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:18 msgid "Maximum time to guess rate" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:19 msgid "IP to bind to locally" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:20 msgid "Time between screen updates" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:21 msgid "Time to wait between requesting more peers" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:22 msgid "Minimum number of peers to not do requesting" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:23 msgid "Number of seconds before assuming http timeout" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:24 msgid "Number of peers at which to stop initiating new connections" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:25 msgid "Maximum number of connections to allow" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:26 msgid "Whether to check hashes on disk" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:27 msgid "Maximum kB/s to upload at" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:28 msgid "Seconds to wait for data to come in before assuming choking" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:29 msgid "Whether to display diagnostic info" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:30 msgid "Number of downloads at which to switch from random to rarest first" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:31 msgid "Number of uploads to fill out to with optimistic unchokes" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:32 msgid "Whether to inform the user that hash failures occur" msgstr "" #: share/functions/__fish_complete_ls.fish:16 msgid "Show hidden" msgstr "" #: share/functions/__fish_complete_ls.fish:17 msgid "Show hidden except . and .." msgstr "" #: share/functions/__fish_complete_ls.fish:18 #: share/functions/__fish_complete_ls.fish:27 #: share/functions/__fish_complete_ls.fish:59 msgid "Append filetype indicator" msgstr "" #: share/functions/__fish_complete_ls.fish:19 #: share/functions/__fish_complete_ls.fish:20 msgid "Follow symlinks" msgstr "" #: share/functions/__fish_complete_ls.fish:21 msgid "List subdirectory recursively" msgstr "" #: share/functions/__fish_complete_ls.fish:22 #: share/functions/__fish_complete_ls.fish:97 msgid "Octal escapes for non graphic characters" msgstr "" #: share/functions/__fish_complete_ls.fish:23 msgid "List directories, not their content" msgstr "" #: share/functions/__fish_complete_ls.fish:25 msgid "Print inode number of files" msgstr "" #: share/functions/__fish_complete_ls.fish:26 msgid "Long format, numeric IDs" msgstr "" #: share/functions/__fish_complete_ls.fish:28 msgid "Replace non-graphic characters with '?'" msgstr "" #: share/functions/__fish_complete_ls.fish:29 msgid "Reverse sort order" msgstr "" #: share/functions/__fish_complete_ls.fish:30 msgid "Print size of files" msgstr "" #: share/functions/__fish_complete_ls.fish:32 msgid "List by columns" msgstr "" #: share/functions/__fish_complete_ls.fish:33 msgid "Sort by size" msgstr "" #: share/functions/__fish_complete_ls.fish:34 msgid "Show and sort by ctime" msgstr "" #: share/functions/__fish_complete_ls.fish:35 msgid "Don't sort" msgstr "" #: share/functions/__fish_complete_ls.fish:36 msgid "Long format without owner" msgstr "" #: share/functions/__fish_complete_ls.fish:37 msgid "Set blocksize to 1kB" msgstr "" #: share/functions/__fish_complete_ls.fish:39 msgid "Comma separated format" msgstr "" #: share/functions/__fish_complete_ls.fish:40 msgid "Sort by modification time" msgstr "" #: share/functions/__fish_complete_ls.fish:41 msgid "Show access time" msgstr "" #: share/functions/__fish_complete_ls.fish:42 msgid "List entries by lines" msgstr "" #: share/functions/__fish_complete_ls.fish:43 msgid "List one file per line" msgstr "" #: share/functions/__fish_complete_ls.fish:49 msgid "Print author" msgstr "" #: share/functions/__fish_complete_ls.fish:50 msgid "Set block size" msgstr "" #: share/functions/__fish_complete_ls.fish:51 msgid "Ignore files ending with ~" msgstr "" #: share/functions/__fish_complete_ls.fish:52 #: share/functions/__fish_complete_ls.fish:98 msgid "Use colors" msgstr "" #: share/functions/__fish_complete_ls.fish:53 msgid "Generate dired output" msgstr "" #: share/functions/__fish_complete_ls.fish:54 msgid "List format" msgstr "" #: share/functions/__fish_complete_ls.fish:55 msgid "Long format, full-iso time" msgstr "" #: share/functions/__fish_complete_ls.fish:56 msgid "Don't print group information" msgstr "" #: share/functions/__fish_complete_ls.fish:60 msgid "Skip entries matching pattern" msgstr "" #: share/functions/__fish_complete_ls.fish:61 #: share/functions/__fish_complete_ls.fish:105 msgid "Print raw entry names" msgstr "" #: share/functions/__fish_complete_ls.fish:62 msgid "Long format without groups" msgstr "" #: share/functions/__fish_complete_ls.fish:63 msgid "Non graphic as-is" msgstr "" #: share/functions/__fish_complete_ls.fish:64 msgid "Enclose entry in quotes" msgstr "" #: share/functions/__fish_complete_ls.fish:65 msgid "Select quoting style" msgstr "" #: share/functions/__fish_complete_ls.fish:66 msgid "Sort criteria" msgstr "" #: share/functions/__fish_complete_ls.fish:77 msgid "Show time type" msgstr "" #: share/functions/__fish_complete_ls.fish:84 msgid "Select time style" msgstr "" #: share/functions/__fish_complete_ls.fish:85 msgid "Assume tab stops at each COLS" msgstr "" #: share/functions/__fish_complete_ls.fish:86 msgid "Do not sort" msgstr "" #: share/functions/__fish_complete_ls.fish:87 msgid "Sort by version" msgstr "" #: share/functions/__fish_complete_ls.fish:88 msgid "Assume screen width" msgstr "" #: share/functions/__fish_complete_ls.fish:89 msgid "Sort by extension" msgstr "" #: share/functions/__fish_complete_ls.fish:99 msgid "Prevent -A from being automatically set for root" msgstr "" #: share/functions/__fish_complete_ls.fish:100 msgid "Don't follow symlinks" msgstr "" #: share/functions/__fish_complete_ls.fish:101 msgid "Show modification time" msgstr "" #: share/functions/__fish_complete_ls.fish:102 msgid "Show whiteouts when scanning directories" msgstr "" #: share/functions/__fish_complete_ls.fish:103 msgid "Display each file's MAC label" msgstr "" #: share/functions/__fish_complete_ls.fish:104 msgid "Include the file flags in a long (-l) output" msgstr "" #: share/functions/__fish_complete_ssh.fish:4 msgid "Protocoll version 1 only" msgstr "" #: share/functions/__fish_complete_ssh.fish:5 msgid "Protocoll version 2 only" msgstr "" #: share/functions/__fish_complete_ssh.fish:6 msgid "IPv4 addresses only" msgstr "" #: share/functions/__fish_complete_ssh.fish:7 msgid "IPv6 addresses only" msgstr "" #: share/functions/__fish_complete_ssh.fish:8 msgid "Compress all data" msgstr "" #: share/functions/__fish_complete_ssh.fish:9 msgid "Encryption algorithm" msgstr "" #: share/functions/__fish_complete_ssh.fish:11 msgid "Identity file" msgstr "" #: share/functions/__fish_complete_ssh.fish:12 msgid "Options" msgstr "" #: share/functions/__fish_move_last.fish:9 msgid "Hit end of history...\\n" msgstr "" #: share/functions/contains.fish:2 msgid "Test if a key is contained in a set of values" msgstr "" #: share/functions/contains.fish:15 msgid "%s: Unknown option '%s'\\n" msgstr "" #: share/functions/contains.fish:28 msgid "%s: Key not specified\\n" msgstr "" #: share/functions/dirh.fish:2 msgid "Print the current directory history (the back- and fwd- lists)" msgstr "" #: share/functions/dirs.fish:1 msgid "Print directory stack" msgstr "" #: share/functions/fish_prompt.fish:6 msgid "Event handler, repaints the prompt when fish_color_cwd changes" msgstr "" #: share/functions/fish_prompt.fish:10 msgid "Write out the prompt" msgstr "" #: share/functions/help.fish:10 msgid "Show help for the fish shell" msgstr "" #: share/functions/help.fish:59 msgid "%s: Could not find a web browser.\\n" msgstr "" #: share/functions/help.fish:60 #, sh-format msgid "" "Please set the variable $BROWSER to a suitable browser and try again\\n" "\\n" msgstr "" #: share/functions/la.fish:4 msgid "List contents of directory, including hidden files in directory using long format" msgstr "" #: share/functions/ll.fish:4 msgid "List contents of directory using long format" msgstr "" #: share/functions/ls.fish:7 #: share/functions/ls.fish:54 msgid "List contents of directory" msgstr "" #: share/functions/nextd.fish:2 msgid "Move forward in the directory history" msgstr "" #: share/functions/nextd.fish:12 #: share/functions/prevd.fish:12 #: share/functions/vared.fish:15 msgid "%s: Unknown option %s\\n" msgstr "" #: share/functions/nextd.fish:18 msgid "%s: The number of positions to skip must be a non-negative integer\\n" msgstr "" #: share/functions/open.fish:8 msgid "Open file in default application" msgstr "" #: share/functions/popd.fish:2 msgid "Pop dir from stack" msgstr "" #: share/functions/popd.fish:6 msgid "%s: Directory stack is empty..." msgstr "" #: share/functions/prevd.fish:2 msgid "Move back in the directory history" msgstr "" #: share/functions/prevd.fish:18 msgid "The number of positions to skip must be a non-negative integer\\n" msgstr "" #: share/functions/prompt_pwd.fish:3 #: share/functions/prompt_pwd.fish:12 msgid "Print the current working directory, shortend to fit the prompt" msgstr "" #: share/functions/psub.fish:3 msgid "Read from stdin into a file and output the filename. Remove the file when the command that called psub exits." msgstr "" #: share/functions/psub.fish:16 msgid "%s: Unknown argument '%s'\\n" msgstr "" #: share/functions/pushd.fish:3 msgid "Push directory to stack" msgstr "" #: share/functions/type.fish:2 msgid "Print the type of a command" msgstr "" #: share/functions/type.fish:73 msgid "%s is a function with definition\\n" msgstr "" #: share/functions/type.fish:77 msgid "function\\n" msgstr "" #: share/functions/type.fish:94 msgid "%s is a builtin\\n" msgstr "" #: share/functions/type.fish:97 msgid "builtin\\n" msgstr "" #: share/functions/type.fish:115 msgid "%s is %s\\n" msgstr "" #: share/functions/type.fish:118 msgid "file\\n" msgstr "" #: share/functions/type.fish:129 msgid "%s: Could not find '%s'\\n" msgstr "" #: share/functions/umask.fish:10 #: share/functions/umask.fish:67 #: share/functions/umask.fish:74 msgid "%s: Invalid mask '%s'\\n" msgstr "" #: share/functions/umask.fish:135 msgid "Set default file permission mask" msgstr "" #: share/functions/umask.fish:202 msgid "%s: Too many arguments\\n" msgstr "" #: share/functions/vared.fish:7 msgid "Edit variable value" msgstr "" #: share/functions/vared.fish:40 msgid "%s: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of %s\\n" msgstr "" #: share/functions/vared.fish:44 msgid "" "%s: Expected exactly one argument, got %s.\\n" "\\n" "Synopsis:\\n" "\\t%svared%s VARIABLE\\n" msgstr "" #: seq:15 msgid "^/dev/null" msgstr "" #: seq:36 msgid "%s: Expected 1, 2 or 3 arguments, got %d\\n" msgstr "" #: seq:43 msgid "%s: '%s' is not a number\\n" msgstr "" fish/po/sv.po000066400000000000000000012762211214535744100134360ustar00rootroot00000000000000# fish - the friendly interactive shell # Copyright © 2006 # This file is distributed under the same license as the fish package. # Axel Liljencrantz , 2006 # msgid "" msgstr "" "Project-Id-Version: fish 1.22.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-10-27 11:34+0200\n" "PO-Revision-Date: 2006-03-13 18:06+0100\n" "Last-Translator: Axel Liljencrantz \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: builtin.c:83 #, c-format msgid "Send job %d, '%ls' to foreground\n" msgstr "Skicka job %d, â€%ls†till förgrunden\n" #: builtin.c:352 #, c-format msgid "%ls: Type 'help %ls' for related documentation\n" "\n" msgstr "%ls: Skriv 'help %ls' för relaterad dokumnetation\n" "\n" #: builtin.c:498 #, c-format msgid "%ls: No key with name '%ls' found\n" msgstr "%ls: Ingen tangent med namn â€%ls†kunde hittas\n" #: builtin.c:504 #, c-format msgid "%ls: Key with name '%ls' does not have any mapping\n" msgstr "%ls: Tangent mad namn “%ls“ har ingen mappning\n" #: builtin.c:510 #, c-format msgid "%ls: Unknown error trying to bind to key named '%ls'\n" msgstr "%ls: Okänt fel inträffade vid försök att binda till tangen med namn â€%lsâ€\n" #: builtin.c:701 #, c-format msgid "%ls: Expected zero or two parameters, got %d" msgstr "%ls: Förväntade noll eller tvÃ¥ argument, fick %d" #: builtin.c:725 #, c-format msgid "%ls: Invalid state\n" msgstr "%ls: Ogiltigt tillstÃ¥nd\n" #: builtin.c:830 #, c-format msgid "%ls: Can not specify scope when removing block\n" msgstr "%ls: Kan inte ange definitionsomrÃ¥de vid blockradering\n" #: builtin.c:836 #, c-format msgid "%ls: No blocks defined\n" msgstr "%ls: Inga block definerade\n" #: builtin.c:1328 builtin.h:29 #, c-format msgid "%ls: Invalid combination of options\n" msgstr "%ls: Ogiltig kombination av flaggor\n" #: builtin.c:1350 #, c-format msgid "%ls: Expected exactly one function name\n" msgstr "%ls: Förväntade exakt ett funktionsnamn\n" #: builtin.c:1360 #, c-format msgid "%ls: Function '%ls' does not exist\n" msgstr "%ls: Funktionen â€%ls†existerar inte\n" #: builtin.c:1534 #, c-format msgid "%ls: Unknown signal '%ls'\n" msgstr "%ls: Okänd signal â€%lsâ€\n" #: builtin.c:1558 builtin.c:1728 #, c-format msgid "%ls: Invalid variable name '%ls'\n" msgstr "%ls: Ogiltigt variabelnamn â€%lsâ€\n" #: builtin.c:1624 #, c-format msgid "%ls: Cannot find calling job for event handler\n" msgstr "%ls: Kan inte hitta anropande job för händelsehanterare\n" #: builtin.c:1642 #, c-format msgid "%ls: Invalid process id %ls\n" msgstr "%ls: Ogiltigt processid %ls\n" #: builtin.c:1693 #, c-format msgid "%ls: Expected function name\n" msgstr "%ls: Förväntade ett funktionsnamn\n" #: builtin.c:1700 #, c-format msgid "%ls: Illegal function name '%ls'\n" msgstr "%ls: Ogiltigt funktionsnamn â€%lsâ€\n" #: builtin.c:1710 #, c-format msgid "" "%ls: The name '%ls' is reserved,\n" "and can not be used as a function name\n" msgstr "" "%ls: Namnet â€%ls†är reserverat,\n" " och kan inte användas som funktionsnamn\n" #: builtin.c:1741 #, c-format msgid "%ls: Expected one argument, got %d\n" msgstr "%ls: Förväntade ett argument, fick %d\n" #: builtin.c:1757 msgid "Current functions are: " msgstr "Nuvarande funktioner är: " #: builtin.c:1901 #, c-format msgid "%ls: Seed value '%ls' is not a valid number\n" msgstr "%ls: Slumpfrö â€%ls†är inte ett giltigt nummer\n" #: builtin.c:1915 #, c-format msgid "%ls: Expected zero or one argument, got %d\n" msgstr "%ls: Förväntade noll eller ett argument, fick %d\n" #: builtin.c:2421 main.c:389 parser.c:1208 msgid "Standard input" msgstr "Standard in" #: builtin.c:2464 msgid "This is a login shell\n" msgstr "Detta är ett login-skal\n" #: builtin.c:2466 msgid "This is not a login shell\n" msgstr "Detta är inte ett login-skal\n" #: builtin.c:2468 #, c-format msgid "Job control: %ls\n" msgstr "Jobkontroll: %ls\n" #: builtin.c:2469 msgid "Only on interactive jobs" msgstr "Bara för interaktiva jobb" #: builtin.c:2470 msgid "Never" msgstr "Aldrig" #: builtin.c:2470 msgid "Always" msgstr "Alltid" #: builtin.c:2506 builtin.c:3443 #, c-format msgid "%ls: Argument '%ls' must be an integer\n" msgstr "%ls: Argumentet â€%ls†mÃ¥ste vara ett heltal\n" #: builtin.c:2566 #, c-format msgid "%ls: Could not find home directory\n" msgstr "%ls: Kunde inte hitta hemkatalogen\n" #: builtin.c:2580 builtin.c:2636 #, c-format msgid "%ls: '%ls' is not a directory\n" msgstr "%ls: â€%ls†är inte en katalog\n" #: builtin.c:2587 #, c-format msgid "%ls: The directory '%ls' does not exist\n" msgstr "%ls: Katalogen â€%ls†existerar inte\n" #: builtin.c:2594 #, c-format msgid "%ls: '%ls' is a rotten symlink\n" msgstr "%ls: â€%ls†är en rutten symbolisk länk\n" #: builtin.c:2602 #, c-format msgid "%ls: Unknown error trying to locate directory '%ls'\n" msgstr "%ls: Okänd fel inträffade under lokalisering av katalogen â€%lsâ€\n" #: builtin.c:2627 #, c-format msgid "%ls: Permission denied: '%ls'\n" msgstr "%ls: Ã…tkomst nekad till katalogen â€%lsâ€\n" #: builtin.c:2653 #, c-format msgid "%ls: Could not set PWD variable\n" msgstr "%ls: Kunde inte sätta variableln PWD\n" #: builtin.c:2739 #, c-format msgid "%ls: Key not specified\n" msgstr "%ls: Ingen nyckel angiven\n" #: builtin.c:2784 builtin.c:2798 #, c-format msgid "%ls: Error encountered while sourcing file '%ls':\n" msgstr "%ls: Ett fel uppstod medan filen â€%ls†lästes\n" #: builtin.c:2792 #, c-format msgid "%ls: '%ls' is not a file\n" msgstr "%ls: â€%ls†är inte en fil\n" #: builtin.c:2831 #, c-format msgid "%ls: Error while reading file '%ls'\n" msgstr "%ls: Ett fel uppstod medan filen â€%ls†lästes\n" #: builtin.c:2903 builtin.c:3083 #, c-format msgid "%ls: There are no suitable jobs\n" msgstr "%ls: Det finns inga lämpliga jobb\n" #: builtin.c:2932 #, c-format msgid "%ls: Ambiguous job\n" msgstr "%ls: Mer än ett jobb matchar\n" #: builtin.c:2938 builtin.c:3106 builtin_jobs.c:301 #, c-format msgid "%ls: '%ls' is not a job\n" msgstr "%ls: â€%ls†är inte ett jobb\n" #: builtin.c:2969 builtin_jobs.c:316 #, c-format msgid "%ls: No suitable job: %d\n" msgstr "%ls: Inget passande jobb: %d\n" #: builtin.c:2978 #, c-format msgid "" "%ls: Can't put job %d, '%ls' to foreground because it is not under job " "control\n" msgstr "" "Kan inte skicka jobb %d, â€%ls†till förgrunden eftersom det inte anväder " "jobbkontroll\n" #: builtin.c:3032 #, c-format msgid "%ls: Unknown job '%ls'\n" msgstr "%ls: Okänt jobb â€%lsâ€\n" #: builtin.c:3041 #, c-format msgid "" "%ls: Can't put job %d, '%ls' to background because it is not under job " "control\n" msgstr "" "Kan inte skicka jobb %d, â€%ls†till bakgrunden eftersom det inte anväder " "jobbkontrol\n" #: builtin.c:3051 #, c-format msgid "Send job %d '%ls' to background\n" msgstr "Skicka jobb %d â€%ls†till bakgrunden\n" #: builtin.c:3089 msgid "(default)" msgstr "(standard)" #: builtin.c:3218 #, c-format msgid "%ls: Not inside of block\n" msgstr "%ls: Inte i ett block\n" #: builtin.c:3308 #, c-format msgid "%ls: Missing function definition information." msgstr "%ls: Funktionsdefinition saknas." #: builtin.c:3339 #, c-format msgid "%ls: Not inside of 'if' block\n" msgstr "%ls: Inte i ett â€if†block\n" #: builtin.c:3391 #, c-format msgid "%ls: Not inside of loop\n" msgstr "%ls: Inte i en loop\n" #: builtin.c:3453 builtin_complete.c:601 builtin.h:76 #, c-format msgid "%ls: Too many arguments\n" msgstr "%ls: För mÃ¥nga argument\n" #: builtin.c:3469 #, c-format msgid "%ls: Not inside of function\n" msgstr "%ls: Inte i en funktion\n" #: builtin.c:3499 #, c-format msgid "%ls: Expected exactly one argument, got %d\n" msgstr "%ls: Förväntade exakt ett argument, fick %d\n" #: builtin.c:3531 #, c-format msgid "%ls: 'case' command while not in switch block\n" msgstr "%ls: â€case†kommandot kan bara användas i ett â€switchâ€-block\n" #: builtin.c:3575 msgid "Temporarily block delivery of events" msgstr "Blockera tillfälligt leverans av händelser" #: builtin.c:3579 msgid "Run a builtin command instead of a function" msgstr "Utför ett inbyggt kommando istället för en funktion" #: builtin.c:3583 msgid "Change working directory" msgstr "Ändra arbetskatalog" #: builtin.c:3587 msgid "Count the number of arguments" msgstr "Räkna antalet argument" #: builtin.c:3591 msgid "Search for a specified string in a list" msgstr "Sök efter en angiven sträng i en lista" #: builtin.c:3595 msgid "Emit an event" msgstr "Sänd en händelse" #: builtin.c:3599 msgid "Exit the shell" msgstr "Avsluta fish" #: builtin.c:3603 msgid "Define a new function" msgstr "Definera ny funktion" #: builtin.c:3607 msgid "List or remove functions" msgstr "Visa eller ta bort funktioner" #: builtin.c:3611 msgid "Edit command specific completions" msgstr "Redigera kommando-specifika kompletteringar" #: builtin.c:3615 msgid "End a block of commands" msgstr "Avsluta ett block av kommandon" #: builtin.c:3619 msgid "Evaluate block if condition is false" msgstr "Utför block om ett villkor inte är uppfyllt" #: builtin.c:3623 msgid "Perform a set of commands multiple times" msgstr "Utför ett block flera gÃ¥nger" #: builtin.c:3627 msgid "Evaluate contents of file" msgstr "Utför filinnehÃ¥ll som kommandon" #: builtin.c:3631 msgid "Handle environment variables" msgstr "Redigera miljövariabler" #: builtin.c:3635 msgid "Send job to foreground" msgstr "Skick jobb till förgrunden" #: builtin.c:3639 msgid "Send job to background" msgstr "Skicka jobb till bakgrunden" #: builtin.c:3643 msgid "Print currently running jobs" msgstr "Visa nuvarande jobb" #: builtin.c:3647 msgid "Read a line of input into variables" msgstr "Läs in en rad till variabler" #: builtin.c:3651 msgid "Stop the innermost loop" msgstr "Avbryt den innersta loopen" #: builtin.c:3655 msgid "Skip the rest of the current lap of the innermost loop" msgstr "Avbryt nuvarande varv i den innersta loopen" #: builtin.c:3659 msgid "Stop the currently evaluated function" msgstr "Avbryt den nuvarande funktionen" #: builtin.c:3663 msgid "Set or get the commandline" msgstr "Ändra eller visa kommandoraden" #: builtin.c:3667 builtin.c:3671 msgid "Conditionally execute a block of commands" msgstr "Utför ett kommando om ett villkor är uppfyllt" #: builtin.c:3675 msgid "Handle fish key bindings" msgstr "Hantera tangentbordsgenvägar för fish" #: builtin.c:3679 msgid "Generate random number" msgstr "Generera ett slumptal" #: builtin.c:3683 msgid "Return status information about fish" msgstr "Visa statusinformation om fish" #: builtin.c:3687 msgid "Set or get the shells resource usage limits" msgstr "Redigera eller visa skalets resursanvändningsgränser" #: builtin.c:3691 msgid "Create a block of code" msgstr "Skapa ett kodblock" #: builtin.c:3695 msgid "Temporarily halt execution of a script and launch an interactive debug prompt" msgstr "Avbryt exekvering tillfälligt och starta en interaktiv debugprompt" #: builtin.c:3705 msgid "Run a program instead of a function or builtin" msgstr "Kör ett program istället för en funktion eller ett inbuggt kommando" #: builtin.c:3709 msgid "Evaluate block if condition is true" msgstr "Utför ett block om ett villkor är uppfyllt" #: builtin.c:3713 msgid "Perform a command multiple times" msgstr "Utför ett kommando upprepade gÃ¥nger" #: builtin.c:3717 msgid "Negate exit status of job" msgstr "Negera resultatet av ett kommando" #: builtin.c:3721 msgid "Execute command if previous command suceeded" msgstr "Utför kommando om föregÃ¥ende kommando lyckades" #: builtin.c:3725 msgid "Execute command if previous command failed" msgstr "Utför kommando om föregÃ¥ende kommando misslyckades" #: builtin.c:3729 msgid "Run command in current process" msgstr "Kör ett kommando i den nuvarande processen" #: builtin.c:3817 parser.c:63 #, c-format msgid "Unknown builtin '%ls'" msgstr "Okänt inbyggt kommando â€%lsâ€" #: builtin_commandline.c:464 #, c-format msgid "%ls: Unknown input function '%ls'\n" msgstr "%ls: Okänd inläsnings-function â€%lsâ€\n" #: builtin_complete.c:313 #, c-format msgid "%ls: Command only available in interactive sessions" msgstr "%ls: Kommandot finns bara tillgängligt under interaktiva sessioner" #: builtin_jobs.c:87 msgid "Job\tGroup\t" msgstr "Jobb\tGrupp\t" #: builtin_jobs.c:89 msgid "CPU\t" msgstr "CPU\t" #: builtin_jobs.c:91 msgid "State\tCommand\n" msgstr "Status\tKommando\n" #: builtin_jobs.c:100 proc.c:661 msgid "stopped" msgstr "stannat" #: builtin_jobs.c:100 msgid "running" msgstr "kör" #: builtin_jobs.c:115 msgid "Group\n" msgstr "Grupp\n" #: builtin_jobs.c:128 msgid "Procces\n" msgstr "Process\n" #: builtin_jobs.c:145 msgid "Command\n" msgstr "Kommando\n" #: builtin_jobs.c:342 #, c-format msgid "%ls: There are no jobs\n" msgstr "%ls: Det finns inga jobb\n" #: builtin_set.c:158 #, c-format msgid "%ls: Tried to change the read-only variable '%ls'\n" msgstr "%ls: Försökte ändra den skrivskyddade variablen â€%lsâ€\n" #: builtin_set.c:165 #, c-format msgid "%ls: Unknown error" msgstr "%ls: Okänt fel" #: builtin_set.c:217 #, c-format msgid "%ls: Multiple variable names specified in single call (%ls and %.*ls)\n" msgstr "%ls: Flera variabelnamn angivna i ett anrop (%ls och %.*ls)\n" #: builtin_set.c:244 #, c-format msgid "%ls: Invalid index starting at '%ls'\n" msgstr "%ls: Ogiltigt index vid â€%lsâ€\n" #: builtin_set.c:689 #, c-format msgid "" "%ls: Erase needs a variable name\n" "%ls\n" msgstr "" "%ls: Radering kräver ett variabelnamn\n" "%ls\n" #: builtin_set.c:733 #, c-format msgid "%ls: Can not specify scope when erasing array slice\n" msgstr "%ls: Kan inte ange definitionsomrÃ¥de vid radering av arraydel\n" #: builtin_set.c:847 #, c-format msgid "%ls: Values cannot be specfied with erase\n" msgstr "%ls: Värden kan inte anges vid radering\n" #: common.c:1756 msgid "This is a bug. " msgstr "Detta är en bug. " #: complete.c:61 #, c-format msgid "Home for %s" msgstr "Hemkatalog för %s" #: complete.c:66 #, c-format msgid "Variable: %ls" msgstr "Variabel: %ls" #: complete.c:808 complete.c:826 msgid "Unknown option: " msgstr "Okänd flagga: " #: complete.c:831 msgid "Multiple matches for option: " msgstr "Mer än en flagga matchar: " #: env.c:238 msgid "Could not get user information" msgstr "Kunde inte hitta information om användare" #: env.c:340 env.c:344 msgid "Changing language to English" msgstr "Byter sprÃ¥k till svenska" #: env.c:1309 msgid "Tried to pop empty environment stack." msgstr "Försökte ta bort element frÃ¥n tom variabelstack" #: env_universal_common.c:510 #, c-format msgid "Could not convert message '%s' to wide character string" msgstr "Kunde inte konvertera meddelandet â€%s†till en bred teckensträng" #: event.c:225 #, c-format msgid "signal handler for %ls (%ls)" msgstr "signalhanterare för %ls (%ls)" #: event.c:229 #, c-format msgid "handler for variable '%ls'" msgstr "hanterare för variabel â€%lsâ€" #: event.c:235 #, c-format msgid "exit handler for process %d" msgstr "avslutshanterare för process %d" #: event.c:241 event.c:252 #, c-format msgid "exit handler for job %d, '%ls'" msgstr "avslutshanterare för jobb %d, â€%lsâ€" #: event.c:243 #, c-format msgid "exit handler for job with process group %d" msgstr "avslutshanterare för jobb med processgrupp %d" #: event.c:254 #, c-format msgid "exit handler for job with job id %d" msgstr "avslutshanterare för jobb med jobid %d" #: event.c:260 #, c-format msgid "handler for generic event '%ls'" msgstr "hanterare för generisk händelse â€%lsâ€" #: event.c:264 msgid "Unknown event type" msgstr "Okänd händelsetyp" #: event.c:588 msgid "Signal list overflow. Signals have been ignored." msgstr "Signallistan är full. Signaler har ignorerats." #: exec.c:54 #, c-format msgid "An error occurred while redirecting file descriptor %d" msgstr "Ett fel inträffade vid IO dirigering av filidentifierare %d" #: exec.c:59 #, c-format msgid "An error occurred while redirecting file '%ls'" msgstr "Ett fel inträffade vid IO dirigering av filen â€%lsâ€" #: exec.c:64 #, c-format msgid "The file '%ls' already exists" msgstr "Filen â€%ls†existerar redan" #: exec.c:69 msgid "Could not create child process - exiting" msgstr "Kunde inte skapa barnprocess - avslutar programmet" #: exec.c:289 #, c-format msgid "Failed to close file descriptor %d" msgstr "Misslyckades med att stänga filidentifierare %d" #: exec.c:509 #, c-format msgid "Failed to execute process '%ls'" msgstr "Misslyckades med att exekvera processen â€%lsâ€" #: exec.c:689 #, c-format msgid "" "Could not send process %d, '%ls' in job %d, '%ls' from group %d to group %d" msgstr "" "Kunde inte skicka process %d, â€%lsâ€, i jobb %d, â€%ls†frÃ¥n grupp %d till " "grupp %d" #: exec.c:711 proc.c:893 proc.c:905 #, c-format msgid "Could not send job %d ('%ls') to foreground" msgstr "Kunde inte skicka jobb %d (â€%lsâ€) till förgrunden" #: exec.c:1047 #, c-format msgid "Unknown function '%ls'" msgstr "Okänd funktion â€%lsâ€" #: exec.c:1167 #, c-format msgid "Unknown input redirection type %d" msgstr "Okänd dirigering av standard in av typ %d" #: expand.c:53 #, c-format msgid "" "The '$' character begins a variable name. The character '%lc', which " "directly followed a '$', is not allowed as a part of a variable name, and " "variable names may not be zero characters long. To learn more about variable " "expansion in fish, type 'help expand-variable'." msgstr "" "Tecknet â€$†börjar ett variabelnamn. Tecknet â€%lcâ€, som direkt följde ett " "â€$â€, är inte tillÃ¥tet som del av ett variabelnamn, och variabelnamn fÃ¥r inte " "vara noll tecken lÃ¥nga. För mer information om variabelexpansion i fish, " "skriv â€help expand-variableâ€." #: expand.c:58 msgid "" "The '$' begins a variable name. It was given at the end of an argument. " "Variable names may not be zero characters long. To learn more about variable " "expansion in fish, type 'help expand-variable'." msgstr "" "Tecknet â€$†börjar ett variabelnamn. Det pÃ¥träffades som det sista tecknet i " "ett argument. Variabelnamn fÃ¥r inte vara noll tecken lÃ¥nga. För mer " "information om variabelexpansion i fish, skriv â€help expand-variableâ€." #: expand.c:63 #, c-format msgid "" "Did you mean %ls{$%ls}%ls? The '$' character begins a variable name. A " "bracket, which directly followed a '$', is not allowed as a part of a " "variable name, and variable names may not be zero characters long. To learn " "more about variable expansion in fish, type 'help expand-variable'." msgstr "" "Menade du %ls{$%ls}%ls? Tecknet â€$†börjar ett variabelnamn. En " "klammerparantes, som direkt följde ett â€$â€, är inte tillÃ¥tet som del av ett " "variabelnamn, och variabelnamn fÃ¥r inte vara noll tecken lÃ¥nga. För mer " "information om variabelexpansion i fish, skriv â€help expand-variableâ€." #: expand.c:68 msgid "" "Did you mean (COMMAND)? In fish, the '$' character is only used for " "accessing variables. To learn more about command substitution in fish, type " "'help expand-command-substitution'." msgstr "" "Menade du (KOMMANDO)? I fish används tecknet â€$†bara för att komma Ã¥t " "variabler. För att lära dig mer om kommandosubstitutionm skriv â€help expand-" "command-substitutionâ€." #: expand.c:73 msgid "Child process" msgstr "Barnprocess" #: expand.c:78 msgid "Process" msgstr "Process" #: expand.c:83 msgid "Job" msgstr "Jobb" #: expand.c:88 #, c-format msgid "Job: %ls" msgstr "Jobb: %ls" #: expand.c:93 msgid "Shell process" msgstr "Skalprocess" #: expand.c:98 msgid "Last background job" msgstr "Senaste bakgrundsjobb" #: expand.c:1185 msgid "Mismatched brackets" msgstr "Klammerparanteser matchar inte varandra" #: fish_indent.c:310 #, c-format msgid "%ls, version %s\n" msgstr "%ls, version %s\n" #: fish_pager.c:118 #, c-format msgid "%ls: Argument '%s' is not a valid file descriptor\n" msgstr "%ls: Argumentet â€%s†är inte en giltig filidentifierare\n" #: fish_pager.c:706 #, c-format msgid " %d to %d of %d" msgstr " %d till %d av %d" #: fish_pager.c:1041 msgid "Could not set up output file descriptors for pager" msgstr "Kunde inte initiera utdata-filidentifierare för visare" #: fish_pager.c:1047 msgid "Could not set up input file descriptors for pager" msgstr "Kunde inte initiera indata-filidentifierare för visare" #: fish_pager.c:1053 msgid "Could not open tty for pager" msgstr "Kunde inte öppna tty för visare" #: fish_pager.c:1060 msgid "Could not initialize result pipe" msgstr "Kunde inte initiera rör för utskrift av resultat" #: fish_pager.c:1111 input.c:336 msgid "Could not set up terminal" msgstr "Kunde inte initiera terminalen" #: fish_pager.c:1135 input.c:362 set_color.c:335 #, c-format msgid "Error while closing terminfo" msgstr "Ett fel inträffade medan terminfo stängdes" # #: fish_pager.c:1347 msgid "Unspecified file descriptors" msgstr "Ospecificerad filidentifierare" # #: fish_pager.c:1359 msgid "Could not read completions" msgstr "Kunde inte läsa kompletteringar" #: fishd.c:465 path.c:286 msgid "" "Unable to create a configuration directory for fish. Your personal settings " "will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory " "where the current user has write access." msgstr "" "Kunde inte skapa en konfigurationskatalog för fish. Dina personliga " "inställningar kommer inte sparas. Var vänlig sätt variabeln $XDH_CONFIG_HOME " "till en katalog där den nuvarande användaren har skrivrättigheter." #: io.c:87 #, c-format msgid "" "An error occured while reading output from code block on file descriptor %d" msgstr "" "Ett fel inträffade under inläsning av utdata frÃ¥n kodblock pÃ¥ " "filidentifierare %d" #: main.c:219 #, c-format msgid "Invalid value '%s' for debug level switch" msgstr "Ogiltigt värde â€%s†för debugnivÃ¥flagga" #: main.c:258 mimedb.c:1286 set_color.c:226 #, c-format msgid "%s, version %s\n" msgstr "%s, version %s\n" #: main.c:310 msgid "Can not use the no-execute mode when running an interactive session" msgstr "no-execute läget kan inte användas i en i interaktiv session" #: main.c:388 #, c-format msgid "Error while reading file %ls\n" msgstr "Ett fel uppstod medan filen â€%ls†lästes\n" #: mimedb.c:157 mimedb.c:171 mimedb.c:1114 #, c-format msgid "%s: Out of memory\n" msgstr "%s: Slut pÃ¥ minne\n" #: mimedb.c:406 #, c-format msgid "%s: Unknown error in munge()\n" msgstr "%s: Okänt fel i munge()\n" #: mimedb.c:424 #, c-format msgid "%s: Locale string too long\n" msgstr "%s: Lokalsträng för lÃ¥ng\n" #: mimedb.c:494 mimedb.c:502 #, c-format msgid "%s: Could not compile regular expressions %s with error %s\n" msgstr "%s: Kunde inte kompilera reguljärt uttryck %s med fel %s\n" #: mimedb.c:615 #, c-format msgid "%s: No description for type %s\n" msgstr "%s: Beskrivning saknas för typ %s\n" #: mimedb.c:679 #, c-format msgid "%s: Could not parse launcher string '%s'\n" msgstr "%s: Kunde inte tolka körsträng â€%lsâ€\n" #: mimedb.c:712 #, c-format msgid "%s: Default launcher '%s' does not specify how to start\n" msgstr "%s: Standardkörsträng â€%s†anger inte hur programmet ska startas\n" #: mimedb.c:1093 #, c-format msgid "%s: Unsupported switch '%c' in launch string '%s'\n" msgstr "%s: Flaggan â€%c†i körsträng â€%s†stöds inte\n" #: mimedb.c:1297 #, c-format msgid "%s: Can not launch a mimetype\n" msgstr "%s: Kan inte köra en mimetyp\n" #: mimedb.c:1329 #, c-format msgid "%s: Could not parse mimetype from argument '%s'\n" msgstr "%s: Kunde inte tolka mimetyp frÃ¥n argument â€%sâ€\n" #: mimedb.c:1349 signal.c:407 signal.c:422 msgid "Unknown" msgstr "Okänd" #: mimedb.c:1410 #, c-format msgid "%s: Unknown error\n" msgstr "%s: Okänt fel\n" #: parse_util.c:892 #, c-format msgid "Could not autoload item '%ls', it is already being autoloaded. " msgstr "Kunde inte automatiskt ladda elementet â€%lsâ€, det autoladdas redan. " #: parser.c:68 msgid "This command can not be used in a pipeline" msgstr "Detta kommando kan ej användas i ett rör" #: parser.c:74 #, c-format msgid "Tokenizer error: '%ls'" msgstr "Ett fel inträffade vid symboluppdelning: â€%lsâ€" #: parser.c:79 msgid "An additional command is required" msgstr "Ett till kommand krävs" #: parser.c:84 msgid "Maximum recursion depth reached. Accidental infinite loop?" msgstr "Maximalt rekursionsdjup uppnÃ¥tt. Oavsiktlig oändlig upprepning?" #: parser.c:89 msgid "" "Could not locate end of block. The 'end' command is missing, misspelled or a " "';' is missing." msgstr "" "Kunde inte hitta slutet pÃ¥ kodblock. Kommandot â€end†saknas, är felstavat " "eller ett â€;†saknas." #: parser.c:94 msgid "Maximum number of nested blocks reached." msgstr "Maximalt antal nästade block har uppnÃ¥tts." #: parser.c:99 #, c-format msgid "Expected a command name, got token of type '%ls'" msgstr "" "Förväntade att hitta ett kommandonamn, hittade en symbol av typen â€%lsâ€" #: parser.c:104 #, c-format msgid "" "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; or " "COMMAND'? See the help section for the 'or' builtin command by typing 'help " "or'." msgstr "" "Förväntade att hitta ett kommandonamn, hittade en symbol av typen â€%lsâ€. " "Menade du â€KOMMANDO; or KOMMANDOâ€? Se hjälpsektionen om â€or†genom att " "skriva â€help orâ€." #: parser.c:109 #, c-format msgid "" "Expected a command name, got token of type '%ls'. Did you mean 'COMMAND; and " "COMMAND'? See the help section for the 'and' builtin command by typing 'help " "and'." msgstr "" "Förväntade att hitta ett kommandonamn, hittade en symbol av typen â€%lsâ€. " "Menade du â€KOMMANDO; and KOMMANDOâ€? Se hjälpsektionen om â€and†genom att " "skriva â€help andâ€." #: parser.c:114 #, c-format msgid "Illegal command name '%ls'" msgstr "Ogiltigt kommandonamn â€%lsâ€" #: parser.c:119 #, c-format msgid "Illegal file descriptor '%ls'" msgstr "Ogiltig filidentifierare â€%lsâ€" #: parser.c:124 #, c-format msgid "Warning: No match for wildcard '%ls'. The command will not be executed." msgstr "Varning: Inga matchningar för jokertecknen i â€%lsâ€. Kommandot kommer inte " "utföras." #: parser.c:129 msgid "'case' builtin not inside of switch block" msgstr "Det inbyggda kommandot â€case†fÃ¥r bara användas i ett â€switchâ€-block." #: parser.c:134 msgid "Loop control command while not inside of loop" msgstr "Loopstyrningskommandon fÃ¥r bara användas i loopar." #: parser.c:139 msgid "'return' builtin command outside of function definition" msgstr "Det inbyggda kommandot â€return†pÃ¥träffades utanför en funktionsdefinition" #: parser.c:144 msgid "'else' builtin not inside of if block" msgstr "Det inbyggda kommandot â€else†fÃ¥r bara användas i ett if-block" #: parser.c:149 msgid "'end' command outside of block" msgstr "Det inbyggda kommandot â€end†fÃ¥r bara användas i ett block" #: parser.c:154 #, c-format msgid "" "Unknown command '%ls'. Did you mean 'set %ls %ls'? For information on " "assigning values to variables, see the help section on the set command by " "typing 'help set'." msgstr "" "Okänt kommando â€%lsâ€. Menade du â€set %ls %lsâ€? För mer information om hur " "man tilldelar variabler, se hjälpsektionen om det inbyggda kommandot â€set†" "genom att skriva â€help setâ€." #: parser.c:159 #, c-format msgid "Expected redirection specification, got token of type '%ls'" msgstr "Förväntade en IO dirigering, hittade en symbol av typen â€%lsâ€" #: parser.c:164 msgid "" "Encountered redirection when expecting a command name. Fish does not allow a " "redirection operation before a command." msgstr "" "Förväntade ett kommandonamn, hittade en IO dirigering. Fish tillÃ¥ter into IO " "dirigeringar före kommandonamn" #: parser.c:169 msgid "Tried to evaluate null pointer." msgstr "Försökte evaluera nollpekare." #: parser.c:174 #, c-format msgid "Tried to evaluate commands using invalid block type '%ls'" msgstr "Försökte utföra kommandon i ogiltig blocktyp â€%lsâ€" #: parser.c:180 #, c-format msgid "Unexpected token of type '%ls'" msgstr "Oväntad symbol av typ â€%lsâ€" #: parser.c:185 msgid "'while' block" msgstr "â€while†block" #: parser.c:190 msgid "'for' block" msgstr "â€for†block" #: parser.c:195 msgid "Block created by breakpoint" msgstr "Block skapat av det inbuggde kommandot breakpoint" #: parser.c:202 msgid "'if' conditional block" msgstr "â€if†villkorligt block" #: parser.c:208 msgid "function definition block" msgstr "funktionsdefinition-block" #: parser.c:214 msgid "function invocation block" msgstr "funktionsanropp-block" #: parser.c:219 msgid "function invocation block with no variable shadowing" msgstr "funktionsanroppsblock utan variabelskuggning" #: parser.c:225 msgid "'switch' block" msgstr "â€switch†block" #: parser.c:231 msgid "unexecutable block" msgstr "oexekverbart block" #: parser.c:237 msgid "global root block" msgstr "globalt rot-block" #: parser.c:243 msgid "command substitution block" msgstr "kommandosubstitution-block" #: parser.c:249 msgid "'begin' unconditional block" msgstr "â€begin†ovillkorligen exekverat block" #: parser.c:255 msgid "Block created by the . builtin" msgstr "Block skapat av det inbyggda kommandot â€.â€" #: parser.c:260 msgid "event handler block" msgstr "händelsehanterarblock" #: parser.c:266 msgid "unknown/invalid block" msgstr "okänt/ogiltigt block" #: parser.c:761 #, c-format msgid "Could not write profiling information to file '%s'" msgstr "Kunde inte skriva profileringsinformation till filen â€%sâ€" #: parser.c:767 msgid "Time\tSum\tCommand\n" msgstr "Tid\tSumma\tKommando\n" #: parser.c:945 #, c-format msgid "in event handler: %ls\n" msgstr "i händelsehanterare: %ls\n" #: parser.c:972 #, c-format msgid "in . (source) call of file '%ls',\n" msgstr "i â€.â€-anrop av fil â€%lsâ€,\n" #: parser.c:977 #, c-format msgid "in function '%ls',\n" msgstr "i funktion â€%lsâ€,\n" #: parser.c:982 msgid "in command substitution\n" msgstr "i kommandosubstitution\n" #: parser.c:992 #, c-format msgid "\tcalled on line %d of file '%ls',\n" msgstr "\tanropad pÃ¥ rad %d i fil â€%lsâ€,\n" #: parser.c:999 msgid "\tcalled on standard input,\n" msgstr "\tanropad frÃ¥n standard in,\n" #: parser.c:1013 #, c-format msgid "\twith parameter list '%ls'\n" msgstr "\tmed parameterlista â€%lsâ€\n" #: parser.c:1202 #, c-format msgid "%ls (line %d): " msgstr "%ls (rad %d): " #: parser.c:1424 #, c-format msgid "Could not expand string '%ls'" msgstr "Kunde inte expandera strängen â€%lsâ€" #: parser.c:1541 msgid "Invalid IO redirection" msgstr "Ogiltig IO omdirigering" #: parser.c:1595 #, c-format msgid "Requested redirection to something that is not a file descriptor %ls" msgstr "IO dirigering till nÃ¥gonting som inte är en filidentifierare" #: parser.c:2046 #, c-format msgid "" "Variables may not be used as commands. Instead, define a function like " "'function %ls; %ls $argv; end'. See the help section for the function " "command by typing 'help function'." msgstr "" "Variabler fÃ¥r inte användas som kommandon. Definera istället en funktion, t." "ex. â€function %ls; %ls $argv; endâ€. Se hjälpsektionen för function-kommandot " "genom att skriva â€help functionâ€" #: parser.c:2054 msgid "" "Variables may not be used as commands. Instead, define a function. See the " "help section for the function command by typing 'help function'." msgstr "" "Variabler fÃ¥r inte användas som kommandon. Definera istället en funktion. Se " "hjälpsektionen för function-kommandot genom att skriva â€help functionâ€" #: parser.c:2061 #, c-format msgid "" "Commands may not contain variables. Use the eval builtin instead, like 'eval " "%ls'. See the help section for the eval command by typing 'help eval'." msgstr "" "Okänt kommando â€%lsâ€. Menade du â€set VARIABEL VÄRDEâ€? Se hjälpsektionen om " "det inbyggda kommandot â€set†genom att skriva â€help setâ€." #: parser.c:2068 #, c-format msgid "Unknown command '%ls'" msgstr "Okänt kommando â€%lsâ€" #: parser.c:2551 msgid "End of block mismatch. Program terminating." msgstr "Blockslut matchar inte. Programmet avslutas." #: path.c:26 #, c-format msgid "Error while searching for command '%ls'" msgstr "Ett fel uppstod under sökning efter kommandot â€%lsâ€" #: proc.c:155 msgid "Job inconsistency" msgstr "Jobb i ogiltigt tillstÃ¥nd" #: proc.c:523 #, c-format msgid "Job %d, '%ls' has %ls" msgstr "Jobb %d, â€%ls†har %ls" #: proc.c:609 #, c-format msgid "%ls: Job %d, '%ls' terminated by signal %ls (%ls)" msgstr "%ls: Jobb %d, â€%ls†avslutat av signal %ls (%ls)" #: proc.c:617 #, c-format msgid "" "%ls: Process %d, '%ls' from job %d, '%ls' terminated by signal %ls (%ls)" msgstr "" "%ls: Process %d, â€%lsâ€, frÃ¥n jobb %d, â€%ls†avslutat av signal %ls (%ls)" #: proc.c:646 msgid "ended" msgstr "avslutat" #: proc.c:873 msgid "An error occured while reading output from code block" msgstr "Ett fel inträffade under läsandet av utdata frÃ¥n kodblock" #: proc.c:923 proc.c:933 proc.c:943 msgid "Could not return shell to foreground" msgstr "Kunde inte Ã¥terställa skalet till förgrunden" #: proc.c:1149 msgid "Job command" msgstr "Jobb kommando" #: proc.c:1152 proc.c:1179 msgid "Process list pointer" msgstr "Processlistepekare" #: proc.c:1155 msgid "Job list pointer" msgstr "Jobblistepekare" #: proc.c:1166 #, c-format msgid "More than one job in foreground: job 1: '%ls' job 2: '%ls'" msgstr "Mer än ett jobb i förgrunden: job 1: â€%lsâ€, jobb 2 â€%lsâ€" #: proc.c:1177 msgid "Process argument list" msgstr "Processargumentlista" #: proc.c:1178 msgid "Process name" msgstr "Processnamn" #: proc.c:1180 msgid "Process command" msgstr "Processkommando" #: proc.c:1185 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'stopped'=%d" msgstr "Jobb â€%lsâ€, process â€%ls†har ogiltigt tillstÃ¥nd â€stoppedâ€=%d" #: proc.c:1195 #, c-format msgid "Job '%ls', process '%ls' has inconsistent state 'completed'=%d" msgstr "Jobb â€%lsâ€, process â€%ls†har ogiltigt tillstÃ¥nd â€completedâ€=%d" #: reader.c:341 msgid "Could not set terminal mode for new job" msgstr "Kunde inte Ã¥terställa terminalen för nytt jobb" #: reader.c:365 msgid "Could not set terminal mode for shell" msgstr "Kunde inte Ã¥terställa terminalen till skalet" #: reader.c:1486 msgid "Couldn't put the shell in its own process group" msgstr "Kunde inte skicka skalet till sin egen processgrupp" #: reader.c:1496 msgid "Couldn't grab control of terminal" msgstr "Kunde inte ta kontroll över terminalen" #: reader.c:2077 msgid "Pop null reader block" msgstr "Ta bort element frÃ¥n tomt läsarblock" #: reader.c:2215 msgid "There are stopped jobs\n" msgstr "Det finns stannade jobb\n" #: reader.c:2964 #, c-format msgid "Unknown keybinding %d" msgstr "Okänd tangentbordsbindning %d" #: reader.c:3053 msgid "Error while reading from file descriptor" msgstr "Ett fel uppstod under inläsning frÃ¥n filidentifierare" #: reader.c:3073 msgid "Error while closing input stream" msgstr "Ett fel inträffade medan indataström stängdes" #: reader.c:3101 #, c-format msgid "Could not convert input. Read %d bytes." msgstr "Kunde inte konvertera indata. Läste %d bytes." #: reader.c:3107 msgid "Could not read input stream" msgstr "Kunde inte läsa frÃ¥n indataström" #: reader.c:3116 msgid "Error while opening input stream" msgstr "Ett fel inträffade medan indataström öppnades" #: sanity.c:37 msgid "Errors detected, shutting down" msgstr "Fel har upptäckts, avslutar programmet" #: sanity.c:65 #, c-format msgid "The pointer '%ls' is invalid" msgstr "Pekaren â€%ls†är ogiltig" #: sanity.c:71 #, c-format msgid "The pointer '%ls' is null" msgstr "Pekaren â€%ls†är noll" #: set_color.c:253 #, c-format msgid "%s: Too many arguments\n" msgstr "%s: För mÃ¥nga argument\n" #: set_color.c:260 #, c-format msgid "%s: Expected an argument\n" msgstr "%s: Förväntade argument\n" #: set_color.c:269 set_color.c:277 #, c-format msgid "%s: Unknown color '%s'\n" msgstr "%s: Okänd färg â€%sâ€\n" #: signal.c:69 msgid "Terminal hung up" msgstr "Terminalen bröt uppkopplingen" #: signal.c:77 msgid "Quit request from job control (^C)" msgstr "Avslutning via jobbkontroll (^C)" #: signal.c:85 msgid "Quit request from job control with core dump (^\\)" msgstr "Avslutning via jobbkontroll med minnesdump (^\\)" #: signal.c:93 msgid "Illegal instruction" msgstr "Ogiltig instruktion" #: signal.c:101 msgid "Trace or breakpoint trap" msgstr "SpÃ¥rnings eller brytpunktsfälla utlöstes" #: signal.c:109 msgid "Abort" msgstr "Avbrott" #: signal.c:117 msgid "Misaligned address error" msgstr "Bussfel (Ogiltigt justerad minnesadress)" #: signal.c:125 msgid "Floating point exception" msgstr "Flyttalsundantag" #: signal.c:133 msgid "Forced quit" msgstr "Tvingad avslutning" #: signal.c:141 msgid "User defined signal 1" msgstr "Användardefinerad signal 1" #: signal.c:148 msgid "User defined signal 2" msgstr "Användardefinerad signal 2" #: signal.c:156 msgid "Address boundary error" msgstr "Minnesadress korsar segmentgräns" #: signal.c:164 msgid "Broken pipe" msgstr "Avbrutet rör" #: signal.c:172 msgid "Timer expired" msgstr "Timer utlöstes" #: signal.c:180 msgid "Polite quit request" msgstr "Artig avslutning" #: signal.c:188 msgid "Child process status changed" msgstr "Barnprocess fick ändrad status" #: signal.c:196 msgid "Continue previously stopped process" msgstr "Fortsätt tidigare stannad process" #: signal.c:204 msgid "Forced stop" msgstr "Tvingad att stoppa" #: signal.c:212 msgid "Stop request from job control (^Z)" msgstr "Stoppad genom jobbkontroll (^Z)" #: signal.c:220 msgid "Stop from terminal input" msgstr "Stoppad frÃ¥n terminalläsning" #: signal.c:228 msgid "Stop from terminal output" msgstr "Stoppad frÃ¥n terminalskrivning" #: signal.c:236 msgid "Urgent socket condition" msgstr "Viktig socket-situation" #: signal.c:244 msgid "CPU time limit exceeded" msgstr "Slut pÃ¥ processortid" #: signal.c:252 msgid "File size limit exceeded" msgstr "Maximal filstorlek överskriden" #: signal.c:260 msgid "Virtual timer expired" msgstr "Virtuell timer utlöst" #: signal.c:268 msgid "Profiling timer expired" msgstr "Profileringstimer utlöst" #: signal.c:276 signal.c:284 msgid "Window size change" msgstr "Terminalfönstret ändrade storlek" #: signal.c:292 msgid "I/O on asynchronous file descriptor is possible" msgstr "Läsning/skrivning pÃ¥ asynkron filidentifierare möjligt" #: signal.c:300 msgid "Power failure" msgstr "Strömavbrott" #: signal.c:308 msgid "Bad system call" msgstr "Felaktigt systemanrop" #: signal.c:316 msgid "Information request" msgstr "Informationsbegäran" #: signal.c:324 msgid "Stack fault" msgstr "Stackfel" #: signal.c:332 msgid "Emulator trap" msgstr "Emulatorfälla" #: signal.c:340 msgid "Abort (Alias for SIGABRT)" msgstr "Avbrott (Alias för SIGABRT)" #: signal.c:348 msgid "Unused signal" msgstr "Oanvänd signal" #: signal.c:667 msgid "Signal block mismatch" msgstr "Signalblockeringar matchar inte varandra" #: tokenizer.c:30 msgid "Unexpected end of string, quotes are not balanced" msgstr "Oväntat slut pÃ¥ textsträng, citationstecknen är inte balanserade" #: tokenizer.c:35 msgid "Unexpected end of string, parenthesis do not match" msgstr "Oväntat slut pÃ¥ textsträng, paranteserna är inte balanserade" #: tokenizer.c:40 msgid "Invalid input/output redirection" msgstr "Ogiltig IO dirigering" #: tokenizer.c:45 msgid "Can not use fd 0 as pipe output" msgstr "Kan inte skicka rördata till filidentifierare 0" #: tokenizer.c:62 msgid "Tokenizer not yet initialized" msgstr "Symbolavdelaren inte initierad" #: tokenizer.c:63 msgid "Tokenizer error" msgstr "Symbolavdelarfel" #: tokenizer.c:64 msgid "Invalid token" msgstr "Ogiltig symbol" #: tokenizer.c:65 msgid "String" msgstr "Textsträng" #: tokenizer.c:66 msgid "Pipe" msgstr "Rör" #: tokenizer.c:67 msgid "End of command" msgstr "Slut av kommando" #: tokenizer.c:68 msgid "Redirect output to file" msgstr "IO dirigering av utdata till fil" #: tokenizer.c:69 msgid "Append output to file" msgstr "IO dirigering av utdata till slutet av fil" #: tokenizer.c:70 msgid "Redirect input to file" msgstr "IO dirigering av indata till fil" #: tokenizer.c:71 msgid "Redirect to file descriptor" msgstr "IO dirigering till filidentifierare" #: tokenizer.c:72 msgid "Redirect output to file if file does not exist" msgstr "IO dirigering av utdata till fil om filen inte existerar" #: tokenizer.c:73 msgid "Run job in background" msgstr "Kör jobb i bakgrunden" #: tokenizer.c:74 msgid "Comment" msgstr "Kommentar" #: tokenizer.c:512 msgid "Invalid token type" msgstr "Ogiltig symboltyp" #: wgetopt.c:542 #, c-format msgid "%ls: Option '%ls' is ambiguous\n" msgstr "%ls: Flaggan â€%ls†är tvetydig\n" #: wgetopt.c:566 #, c-format msgid "%ls: Option '--%ls' doesn't allow an argument\n" msgstr "%ls: Flaggan â€--%ls†tar inget argument\n" #: wgetopt.c:571 #, c-format msgid "%ls: Option '%lc%ls' doesn't allow an argument\n" msgstr "%ls: Flaggan â€%lc%ls†tar inget argument\n" #: wgetopt.c:585 #, c-format msgid "%ls: Option '%ls' requires an argument\n" msgstr "%ls: Flaggan â€%ls†kräver ett argument\n" #: wgetopt.c:613 #, c-format msgid "%ls: Unrecognized option '--%ls'\n" msgstr "%ls: Okänd flagga â€--%lsâ€\n" #: wgetopt.c:617 #, c-format msgid "%ls: Unrecognized option '%lc%ls'\n" msgstr "%ls: Okänd flagga â€%lc%lsâ€\n" #: wgetopt.c:642 #, c-format msgid "%ls: Illegal option -- %lc\n" msgstr "%ls: Ogiltig flagga -- â€%lcâ€\n" #: wgetopt.c:644 #, c-format msgid "%ls: Invalid option -- %lc\n" msgstr "%ls: Ogiltigt flagga -- %lc\n" #: wgetopt.c:678 #, c-format msgid "%ls: Option requires an argument -- %lc\n" msgstr "%ls: Flaggan kräver ett argument -- %lc\n" #: wildcard.c:58 msgid "Executable" msgstr "Program" #: wildcard.c:62 msgid "Executable link" msgstr "Länk till program" #: wildcard.c:67 msgid "File" msgstr "Fil" #: wildcard.c:71 msgid "Character device" msgstr "Teckenenhet" #: wildcard.c:75 msgid "Block device" msgstr "Blockenhet" #: wildcard.c:79 msgid "Fifo" msgstr "Fifo" #: wildcard.c:83 msgid "Symbolic link" msgstr "Symbolisk länk" # #: wildcard.c:87 msgid "Symbolic link to directory" msgstr "Symboliska länk till katalog" #: wildcard.c:91 msgid "Rotten symbolic link" msgstr "Rutten symbolisk länk" #: wildcard.c:95 msgid "Symbolic link loop" msgstr "Slinga av symboliska länkar" #: wildcard.c:99 msgid "Socket" msgstr "Uttag (socket)" #: wildcard.c:103 share/completions/ruby.fish:23 #: share/functions/__fish_complete_directories.fish:8 msgid "Directory" msgstr "Katalog" #: wildcard.c:737 msgid "empty" msgstr "tom" #: builtin.h:24 #, c-format msgid "%ls: Expected argument\n" msgstr "%ls: Förväntade argument\n" #: builtin.h:34 #, c-format msgid "" "%ls: Invalid combination of options,\n" "%ls\n" msgstr "" "%ls: Ogiltig kombination av flaggor,\n" "%ls\n" #: builtin.h:39 #, c-format msgid "%ls: Variable scope can only be one of universal, global and local\n" msgstr "%ls: En variabels definitionsomrÃ¥de kan bara vara en av universal, global och lokal\n" #: builtin.h:44 #, c-format msgid "%ls: Variable can't be both exported and unexported\n" msgstr "%ls: Variabel kan inte vara bÃ¥de exporterad och oexporterad\n" #: builtin.h:49 #, c-format msgid "%ls: Unknown option '%ls'\n" msgstr "%ls: Okänd flagga â€%lsâ€\n" #: builtin.h:54 #, c-format msgid "" "%ls: Invalid character '%lc' in variable name. Only alphanumerical " "characters and underscores are valid in a variable name.\n" msgstr "" "%ls: Ogiltigt tecken â€%lc†i variabelnamn. Bara alfanumeriska tecken och " "understreck är tillÃ¥tna i variabelnamn.\n" #: builtin.h:59 #, c-format msgid "%ls: Variable name can not be the empty string\n" msgstr "%ls: Den tomma strängen är inte ett tillÃ¥tet variabelnamn\n" #: builtin.h:64 #, c-format msgid "%ls: Second argument must be 'in'\n" msgstr "%ls: Andra argumentet mÃ¥ste vara â€inâ€\n" #: builtin.h:69 #, c-format msgid "%ls: Expected at least two arguments, got %d\n" msgstr "%ls: Förväntade minst tvÃ¥ argument, fick %d\n" #: builtin.h:71 #, c-format msgid "%ls: '%ls' is not a valid variable name\n" msgstr "%ls: â€%ls†är ett ogiltigt variabelnamn\n" #: builtin.h:81 #, c-format msgid "%ls: Block mismatch: '%ls' vs. '%ls'\n" msgstr "%ls: Blockmismatchning: â€%ls†mot â€%lsâ€\n" #: builtin.h:86 #, c-format msgid "%ls: Unknown block type '%ls'\n" msgstr "%ls: Okänd blocktyp â€%lsâ€\n" #: builtin.h:88 #, c-format msgid "%ls: Argument '%ls' is not a number\n" msgstr "%ls: Argumentet â€%ls†är inte ett nummer\n" #: common.h:100 #, c-format msgid "function %s called with null value for argument %s. " msgstr "funktionen %s anropades med nollvärde som argument %s. " #: common.h:140 #, c-format msgid "function %s called while blocking signals. " msgstr "funktionen %s anropades medan signaler var blockerade. " #: exec.h:19 msgid "An error occurred while setting up pipe" msgstr "Ett fel inträffade under skapandet av ett rör" #: expand.h:118 msgid "Array index out of bounds" msgstr "Arrayindexet är otÃ¥llÃ¥tet" #: output.h:87 #, c-format msgid "" "Tried to use terminfo string %s on line %d of %s, which is undefined in " "terminal of type \"%ls\". Please report this error to %s" msgstr "Försökte använda terminfosträng %s pÃ¥ rad %d av %s, vilken är odefinerad i terminaler av typen â€%lsâ€. Vänligen rapportera detta fel till %s" #: share/completions/apm.fish:2 share/completions/apropos.fish:20 #: share/completions/apt-build.fish:29 share/completions/apt-cache.fish:28 #: share/completions/apt-cdrom.fish:11 share/completions/apt-config.fish:5 #: share/completions/apt-file.fish:12 share/completions/apt-ftparchive.fish:15 #: share/completions/apt-proxy-import.fish:3 #: share/completions/apt-rdepends.fish:12 #: share/completions/apt-show-source.fish:8 #: share/completions/apt-sortpkgs.fish:4 share/completions/apt-zip-inst.fish:3 #: share/completions/apt-zip-list.fish:3 share/completions/at.fish:2 #: share/completions/atq.fish:2 share/completions/atrm.fish:2 #: share/functions/__fish_complete_ls.fish:96 #: share/functions/__fish_complete_tex.fish:5 msgid "Display version and exit" msgstr "Visa version och avsluta" #: share/completions/apm.fish:3 msgid "Print APM info" msgstr "Visa APM-information" #: share/completions/apm.fish:4 msgid "Print time remaining" msgstr "Visa kvarvarande tid" #: share/completions/apm.fish:5 msgid "Monitor status info" msgstr "Bevaka statusinformation" #: share/completions/apm.fish:6 msgid "Request APM standby mode" msgstr "Begär APM-standbyläge" #: share/completions/apm.fish:7 msgid "Request APM suspend mode" msgstr "Begär APM-suspendläge" #: share/completions/apm.fish:8 msgid "APM status debugging info" msgstr "APM-status debuginformation" #: share/completions/apropos.fish:12 msgid "Print debugging info" msgstr "Visa debuginformation" #: share/completions/apropos.fish:13 share/completions/apt-file.fish:8 #: share/completions/apt-listchanges.fish:4 #: share/completions/apt-proxy-import.fish:4 #: share/completions/apt-show-source.fish:10 #: share/functions/__fish_complete_ssh.fish:59 #: share/functions/__fish_complete_vi.fish:106 msgid "Verbose mode" msgstr "Utförligt läge" #: share/completions/apropos.fish:14 msgid "Keyword as regex" msgstr "Nyckelord är ett reguljärt uttryck" #: share/completions/apropos.fish:15 msgid "Keyword as wildcards" msgstr "Nyckelord har jokertecken" #: share/completions/apropos.fish:16 msgid "Keyword as exactly match" msgstr "Nyckelord är en exakt matchning" #: share/completions/apropos.fish:17 msgid "Search for other system" msgstr "Sök efter annat system" #: share/completions/apropos.fish:18 msgid "Specify man path" msgstr "Välj manualsökväg" #: share/completions/apropos.fish:19 msgid "Specify a configuration file" msgstr "Välj en konfigurationsfil" #: share/completions/apt-build.fish:4 msgid "Update list of packages" msgstr "Updatera paketlista" #: share/completions/apt-build.fish:5 msgid "Upgrade packages" msgstr "Upgradera paket" #: share/completions/apt-build.fish:6 msgid "Rebuild your system" msgstr "Ã…terbygg systemet" #: share/completions/apt-build.fish:7 msgid "Build and install a new package" msgstr "Bygg och installera nytt paket" #: share/completions/apt-build.fish:8 msgid "Download and extract a source" msgstr "Nedladda och extrahera källkod" #: share/completions/apt-build.fish:9 msgid "Info on a package" msgstr "Visa info om paket" #: share/completions/apt-build.fish:10 msgid "Remove packages" msgstr "Radera paket" #: share/completions/apt-build.fish:11 msgid "Erase built packages" msgstr "Radera byggda paket" #: share/completions/apt-build.fish:12 msgid "Build source without install" msgstr "Bygg källkod utan att installera" #: share/completions/apt-build.fish:13 msgid "Clean source directories" msgstr "Rengör källkodskataloger" #: share/completions/apt-build.fish:14 msgid "Update source and rebuild" msgstr "Uppdatera källkod och bygg om dem" #: share/completions/apt-build.fish:15 msgid "Update the repository" msgstr "Uppdatera förrÃ¥d" #: share/completions/apt-build.fish:16 msgid "Do not use gcc wrapper" msgstr "Använd inte omslag (wrapper) kring gcc" #: share/completions/apt-build.fish:17 msgid "Remove build-dep" msgstr "Ta bort bygg-beroenden" #: share/completions/apt-build.fish:18 msgid "Do not download source" msgstr "Ladda inte ner källkod" #: share/completions/apt-build.fish:19 msgid "Specify build-dir" msgstr "Välj bygg-katalog" #: share/completions/apt-build.fish:20 msgid "Rebuild a package" msgstr "Bygg om paket" #: share/completions/apt-build.fish:21 msgid "Rebuild and install an installed package" msgstr "Bygg och installera ett installerat paket" #: share/completions/apt-build.fish:23 msgid "Apply patch" msgstr "Applicera som fix" #: share/completions/apt-build.fish:28 msgid "Specify sources.list file" msgstr "Välj sources.list fil" #: share/completions/apt-cache.fish:3 msgid "Build apt cache" msgstr "Bygg aptcache" #: share/completions/apt-cache.fish:4 msgid "Show package info" msgstr "Visa paketinfo" #: share/completions/apt-cache.fish:5 msgid "Show cache statistics" msgstr "Visa cachestatistik" #: share/completions/apt-cache.fish:6 msgid "Show source package" msgstr "Visa alla källkodspaket" #: share/completions/apt-cache.fish:7 msgid "Show packages in cache" msgstr "Visa paket i cache" #: share/completions/apt-cache.fish:8 msgid "Print available list" msgstr "Visa tillgängliga paket" #: share/completions/apt-cache.fish:9 msgid "List unmet dependencies in cache" msgstr "Visa ouppklarade beroenden i cache" #: share/completions/apt-cache.fish:10 msgid "Display package record" msgstr "Visa paketpost" #: share/completions/apt-cache.fish:11 msgid "Search packagename by REGEX" msgstr "Sök paketnamn som matchar reguljärt uttryck" #: share/completions/apt-cache.fish:13 msgid "Search packagename only" msgstr "Sök enbart paketnamn" #: share/completions/apt-cache.fish:14 msgid "List dependencies for the package" msgstr "Visa beroenden för paket" #: share/completions/apt-cache.fish:15 msgid "List reverse dependencies for the package" msgstr "Visa paket som beror pÃ¥ det givna paketet" #: share/completions/apt-cache.fish:16 msgid "Print package name by prefix" msgstr "Visa paket som matchar det givna prefixet" #: share/completions/apt-cache.fish:17 msgid "Generate dotty output for packages" msgstr "Generera utdata för dotty" #: share/completions/apt-cache.fish:18 msgid "Debug preferences file" msgstr "Fil för debuginställningar" #: share/completions/apt-cache.fish:19 msgid "Select file to store package cache" msgstr "Välj paketcache" #: share/completions/apt-cache.fish:20 msgid "Select file to store source cache" msgstr "Välj fil för källkodscache" #: share/completions/apt-cache.fish:21 #: share/completions/apt-ftparchive.fish:10 msgid "Quiet mode" msgstr "Tyst läge" #: share/completions/apt-cache.fish:22 msgid "Print important dependencies" msgstr "Visa viktiga beroenden" #: share/completions/apt-cache.fish:23 msgid "Print full records" msgstr "Visa fulla poster" #: share/completions/apt-cache.fish:24 msgid "Auto-gen package cache" msgstr "Autogenerera paketcache" #: share/completions/apt-cache.fish:25 msgid "Print all names" msgstr "Visa alla namn" #: share/completions/apt-cache.fish:26 msgid "Dep and rdep recursive" msgstr "Rekursiva beroendeberäkningar" #: share/completions/apt-cache.fish:27 msgid "Limit to installed" msgstr "Bara installerade paket" #: share/completions/apt-cache.fish:29 share/completions/apt-cdrom.fish:12 #: share/completions/apt-config.fish:6 msgid "Specify config file" msgstr "Välj konfigurationsfil" #: share/completions/apt-cache.fish:30 share/completions/apt-cdrom.fish:13 #: share/completions/apt-config.fish:7 #: share/completions/apt-extracttemplates.fish:6 msgid "Specify options" msgstr "Välj inställningar" #: share/completions/apt-cdrom.fish:3 msgid "Add new disc to source list" msgstr "Lägg till skiva till källlista" #: share/completions/apt-cdrom.fish:4 msgid "Report identity of disc" msgstr "Visa skivas identitet" #: share/completions/apt-cdrom.fish:5 share/completions/mount.fish:7 msgid "Mount point" msgstr "Monteringskatalog" #: share/completions/apt-cdrom.fish:6 msgid "Rename a disc" msgstr "Byt namn pÃ¥ skiva" #: share/completions/apt-cdrom.fish:7 msgid "No mounting" msgstr "Montera inte" #: share/completions/apt-cdrom.fish:8 msgid "Fast copy" msgstr "Snabb kopiering" #: share/completions/apt-cdrom.fish:9 msgid "Thorough package scan" msgstr "Nogrann paketskanning" #: share/completions/apt-cdrom.fish:10 msgid "No changes" msgstr "Inga förändringar" #: share/completions/apt-config.fish:4 msgid "Dump contents of config file" msgstr "Skriv ut innehÃ¥ll av konfigureringsfil" #: share/completions/apt-extracttemplates.fish:4 msgid "Set temp dir" msgstr "Välj temporär katalog" #: share/completions/apt-extracttemplates.fish:5 msgid "Specifiy config file" msgstr "Välj konfigurationsfil" #: share/completions/apt-file.fish:3 msgid "Resync package contents from source" msgstr "Ã…tersynkronisera paketinnehÃ¥ll frÃ¥n källkod" #: share/completions/apt-file.fish:4 msgid "Search package containing pattern" msgstr "Sök paket innehÃ¥llande mönster" #: share/completions/apt-file.fish:5 msgid "List contents of a package matching pattern" msgstr "Lista innehÃ¥ll av paket som matchar mönster" #: share/completions/apt-file.fish:6 msgid "Remove all gz files from cache" msgstr "Ta bort alla gz-filer frÃ¥n cache" #: share/completions/apt-file.fish:7 msgid "Set cache dir" msgstr "Välj cache katalog" #: share/completions/apt-file.fish:10 share/completions/apt-file.fish:16 msgid "Do not expand pattern" msgstr "Expandera inte mönster" #: share/completions/apt-file.fish:11 msgid "Pattern is regexp" msgstr "Mönster är ett reguljärt uttryck" #: share/completions/apt-file.fish:13 msgid "Set arch" msgstr "Välj arkitektur" #: share/completions/apt-file.fish:14 msgid "Set sources.list file" msgstr "Välj sources.list fil" #: share/completions/apt-file.fish:15 msgid "Only display package name" msgstr "Visa bara paketnamn" #: share/completions/apt-file.fish:17 msgid "Run in dummy mode" msgstr "Kör i dummyläge" #: share/completions/apt-ftparchive.fish:3 msgid "Generate package from source" msgstr "Generera paket frÃ¥n källkod" #: share/completions/apt-ftparchive.fish:4 msgid "Generate source index file" msgstr "Generera källindexfil" #: share/completions/apt-ftparchive.fish:5 msgid "Generate contents file" msgstr "Generera filinnehÃ¥ll" #: share/completions/apt-ftparchive.fish:6 msgid "Generate release file" msgstr "Skapa release-fil" #: share/completions/apt-ftparchive.fish:7 msgid "Remove records" msgstr "Ta bort poster" #: share/completions/apt-ftparchive.fish:8 msgid "Generate MD5 sums" msgstr "Generera MD5-summa" #: share/completions/apt-ftparchive.fish:9 msgid "Use a binary db" msgstr "Använd binär databas" #: share/completions/apt-ftparchive.fish:11 msgid "Perform delinking" msgstr "Utför avlinkning" #: share/completions/apt-ftparchive.fish:12 msgid "Perform contents generation" msgstr "Utför innehÃ¥llsgenerering" #: share/completions/apt-ftparchive.fish:14 msgid "Make caching db readonly" msgstr "Gör cache skrivskyddad" #: share/completions/apt-ftparchive.fish:16 msgid "Use config file" msgstr "Välj konfigurationsfil" #: share/completions/apt-ftparchive.fish:17 msgid "Set config options" msgstr "Välj konfigurationsinställningar" #: share/completions/apt-get.fish:3 msgid "Test if apt has yet to be given the subcommand" msgstr "Testa om apt har tagit emot ett underkommando" #: share/completions/apt-get.fish:12 msgid "Test if apt command should have packages as potential completion" msgstr "Testa om aptkommando borde ha paket som potentiell komplettering" #: share/completions/apt-get.fish:24 msgid "Update sources" msgstr "Uppdatera källor" #: share/completions/apt-get.fish:25 msgid "Upgrade or install newest packages" msgstr "Bygg och installera nyaste paket" #: share/completions/apt-get.fish:26 msgid "Use with dselect front-end" msgstr "Använd med dselect-gränssnitt" #: share/completions/apt-get.fish:27 msgid "Distro upgrade" msgstr "Distibutionsuppgradering" #: share/completions/apt-get.fish:28 msgid "Install one or more packages" msgstr "Installera ett eller flera paket" #: share/completions/apt-get.fish:29 msgid "Remove one or more packages" msgstr "Radera ett eller flera paket" #: share/completions/apt-get.fish:30 msgid "Fetch source packages" msgstr "Hämta källkodspaket" #: share/completions/apt-get.fish:31 msgid "Install/remove packages for dependencies" msgstr "Installera/ta bort paket för beroenden" #: share/completions/apt-get.fish:32 msgid "Update cache and check dependencies" msgstr "Uppdatera källkod och verifiera beroenden" #: share/completions/apt-get.fish:33 msgid "Clean local caches and packages" msgstr "Rengör lokala cachear och paket" #: share/completions/apt-get.fish:34 msgid "Clean packages no longer be downloaded" msgstr "Rengör paket som inte längre skall nedladdas" #: share/completions/apt-get.fish:62 msgid "Specify a config file" msgstr "Välj en konfigurationsfil" #: share/completions/apt-get.fish:63 msgid "Set a config option" msgstr "Välj en konfigurationsinställning" #: share/completions/apt-key.fish:2 msgid "Add a new key" msgstr "Lägg till ny nyckel" #: share/completions/apt-key.fish:3 msgid "Remove a key" msgstr "Ta bort en nyckel" #: share/completions/apt-key.fish:4 msgid "List trusted keys" msgstr "Visa pÃ¥litliga nycklar" #: share/completions/apt-listbugs.fish:3 msgid "Set severity" msgstr "Välj allvarlighetgrad" #: share/completions/apt-listbugs.fish:4 msgid "Tags you want to see" msgstr "Välj taggar du vill se" #: share/completions/apt-listbugs.fish:5 msgid "Bug-status you want to see" msgstr "Bugg-status du vill se" #: share/completions/apt-listbugs.fish:6 msgid "Ignore bugs in your system" msgstr "Ignorera buggar i ditt system" #: share/completions/apt-listbugs.fish:7 msgid "Ignore newer bugs than upgrade packages" msgstr "Ignorera nyare buggar än uppgraderade paket" #: share/completions/apt-listbugs.fish:8 msgid "Bugs for downgrade packages" msgstr "Buggar för nedgraderade paket" #: share/completions/apt-listbugs.fish:9 msgid "Bug Tracking system" msgstr "Buggtrackingsystem" #: share/completions/apt-listbugs.fish:10 msgid "Specify port for web interface" msgstr "Välj port för webbinterface" #: share/completions/apt-listbugs.fish:11 msgid "Use daily bug report" msgstr "Använd daglig buggrapport" #: share/completions/apt-listbugs.fish:12 msgid "Use the raw index.db" msgstr "Använd bar index.db" #: share/completions/apt-listbugs.fish:13 msgid "Specify index dir" msgstr "Välj indexkatalog" #: share/completions/apt-listbugs.fish:14 msgid "Specify Pin-Priority value" msgstr "Välj Pin-prioritetsvärde" #: share/completions/apt-listbugs.fish:15 msgid "Specify the title of rss" msgstr "Välj rss-titel" #: share/completions/apt-listbugs.fish:16 msgid "Retrieve fresh bugs" msgstr "Hämta färska buggar" #: share/completions/apt-listbugs.fish:17 msgid "Do not display progress bar" msgstr "Visa inte förloppsindikator" #: share/completions/apt-listbugs.fish:18 msgid "Specify local cache dir" msgstr "Välj lokal cachekatalog" #: share/completions/apt-listbugs.fish:19 msgid "Specify the expire cache timer" msgstr "Välj cacheexpireringstimer" #: share/completions/apt-listbugs.fish:21 msgid "Assume yes to all questions" msgstr "Anta ja pÃ¥ alla frÃ¥gor" #: share/completions/apt-listbugs.fish:22 msgid "Assume no to all questions" msgstr "Anta nej pÃ¥ alla frÃ¥gor" #: share/completions/apt-listchanges.fish:5 msgid "Select frontend interface" msgstr "Välj gränssnitt" #: share/completions/apt-listchanges.fish:7 msgid "Ask confirmation" msgstr "Bekräfta val" #: share/completions/apt-listchanges.fish:8 msgid "Display all changelogs" msgstr "Visa alla händelseloggar" #: share/completions/apt-listchanges.fish:9 msgid "Avoid changelogs from db in named file" msgstr "Undvik händelseloggar frÃ¥n databas i fil" #: share/completions/apt-listchanges.fish:11 msgid "Insert header" msgstr "Lägg till huvud" #: share/completions/apt-listchanges.fish:12 msgid "Display debug info" msgstr "Visa debuginformation" #: share/completions/apt-listchanges.fish:13 msgid "Select an option profile" msgstr "Välj än inställningsprofil" #: share/completions/apt-move.fish:4 msgid "Move packages to local tree" msgstr "Flytta paket till lokalt träd" #: share/completions/apt-move.fish:5 msgid "Delete obsolete package files" msgstr "Radera obsoleta paketfiler" #: share/completions/apt-move.fish:6 msgid "Build new local files" msgstr "Bygg nya lokala filer" #: share/completions/apt-move.fish:7 msgid "Rebuild index files" msgstr "Bygg om indexfiler" #: share/completions/apt-move.fish:8 msgid "Move packages from cache to local mirror" msgstr "Flytta paket frÃ¥n cache till lokal spegel" #: share/completions/apt-move.fish:9 msgid "Alias for 'move delete packages'" msgstr "Alias för â€move delete packagesâ€" #: share/completions/apt-move.fish:10 msgid "Alias for 'update'" msgstr "Alias för â€updateâ€" #: share/completions/apt-move.fish:11 msgid "Download package missing from mirror" msgstr "Ladde ner paket som saknas frÃ¥n spegel" #: share/completions/apt-move.fish:12 msgid "Sync packages installed" msgstr "Synkronisera installerade paket" #: share/completions/apt-move.fish:15 msgid "List packages that may serve as input to mirrorbin or mirrorsource" msgstr "Visa paket som kan användas som input till mirrorbin eller mirrorsrc" #: share/completions/apt-move.fish:16 msgid "Fetch package from STDIN" msgstr "Hämta paket frÃ¥n standard in" #: share/completions/apt-move.fish:17 msgid "Fetch source package from STDIN" msgstr "Hämta källkodspaket frÃ¥n standard in" #: share/completions/apt-move.fish:18 msgid "Process all packages" msgstr "Behandla alla paket" #: share/completions/apt-move.fish:20 msgid "Force deletion" msgstr "Tvinga radering" #: share/completions/apt-move.fish:21 msgid "Suppresses normal output" msgstr "Tyst läge" #: share/completions/apt-move.fish:22 msgid "Test run" msgstr "Testkörning" #: share/completions/apt-proxy-import.fish:5 msgid "No message to STDOUT" msgstr "Inga meddelanden till standard ut" #: share/completions/apt-proxy-import.fish:6 msgid "Recurse into subdir" msgstr "Rekursera till underkataloger" #: share/completions/apt-proxy-import.fish:7 msgid "Dir to import" msgstr "Katalog att importera" #: share/completions/apt-proxy-import.fish:8 msgid "Change to user" msgstr "Ändra till användare" #: share/completions/apt-proxy-import.fish:9 msgid "Debug level[default 0]" msgstr "DebugnivÃ¥ [Standard är 0]" #: share/completions/apt-rdepends.fish:3 msgid "Show build dependencies" msgstr "Visa byggberoenden" #: share/completions/apt-rdepends.fish:4 msgid "Generate a dotty graph" msgstr "Generera en dottygraf" #: share/completions/apt-rdepends.fish:5 msgid "Show state of dependencies" msgstr "Visa beroendens tillstÃ¥nd" #: share/completions/apt-rdepends.fish:6 msgid "List packages depending on" msgstr "Visa paket som beror pÃ¥" #: share/completions/apt-rdepends.fish:11 msgid "Display man page" msgstr "Visa manualsida" #: share/completions/apt-show-source.fish:3 #: share/completions/apt-show-source.fish:4 #: share/completions/apt-show-versions.fish:10 #: share/completions/apt-show-versions.fish:11 msgid "Read package from file" msgstr "Läs paket frÃ¥n fil" #: share/completions/apt-show-source.fish:5 #: share/completions/apt-show-source.fish:6 #: share/completions/apt-show-versions.fish:12 #: share/completions/apt-show-versions.fish:13 msgid "Specify APT list dir" msgstr "Välj APT listningskatalog" #: share/completions/apt-show-source.fish:7 msgid "List PKG info" msgstr "Lista paketinformation" #: share/completions/apt-show-source.fish:9 msgid "Print all source packages with version" msgstr "Visa alla källkodspaket med version" #: share/completions/apt-show-versions.fish:3 msgid "Print PKG versions" msgstr "Visa paketversioner" #: share/completions/apt-show-versions.fish:4 msgid "Using regex" msgstr "Använd reguljära uttryck" #: share/completions/apt-show-versions.fish:5 msgid "Print only upgradeable packages" msgstr "Visa bara paket som kan uppgraderas" #: share/completions/apt-show-versions.fish:6 msgid "Print all versions" msgstr "Visa alla versioner" #: share/completions/apt-show-versions.fish:7 msgid "Print package name/distro" msgstr "Visa paketnamn/distribution" #: share/completions/apt-show-versions.fish:8 msgid "Print verbose info" msgstr "Visa utförlig information" #: share/completions/apt-show-versions.fish:9 msgid "Init or update cache only" msgstr "Bara initiera eller uppdatera cachen" #: share/completions/apt-sortpkgs.fish:3 msgid "Use source index field" msgstr "Använd köllindexfält" #: share/completions/apt-sortpkgs.fish:5 msgid "Specify conffile" msgstr "Välj konfigurationsfil" #: share/completions/apt-spy.fish:3 msgid "Debian distribution" msgstr "Debiandistribution" #: share/completions/apt-spy.fish:4 msgid "Servers in the areas" msgstr "Servrar i omrÃ¥den" #: share/completions/apt-spy.fish:6 msgid "Finish after number of servers" msgstr "Avsluta efter antal servrar" #: share/completions/apt-spy.fish:11 msgid "Use proxy server" msgstr "Använd proxyserver" #: share/completions/apt-spy.fish:12 msgid "Comma separated country list" msgstr "Kommasepararad landslista" #: share/completions/apt-spy.fish:13 msgid "How long in sec to download" msgstr "Hur länga i sekunder som nedladdning fÃ¥r ske" #: share/completions/apt-spy.fish:14 msgid "Custom URL to get mirror list" msgstr "Egen URL för att hämta lista av speglar" #: share/completions/apt-spy.fish:16 msgid "Number of top servers" msgstr "Antal toppservrar" #: share/completions/apt-spy.fish:17 msgid "Update mirror list" msgstr "Uppdatera spegellista" #: share/completions/apt-spy.fish:18 msgid "Version number" msgstr "Visa versionsnummer" #: share/completions/apt-src.fish:3 msgid "Update list of source packages" msgstr "Updatera källkodpaketlista" #: share/completions/apt-src.fish:4 msgid "Install source packages" msgstr "Installera källkodpaket" #: share/completions/apt-src.fish:5 msgid "Upgrade source packages" msgstr "Upgradera källkodpaket" #: share/completions/apt-src.fish:6 msgid "Remove source packages" msgstr "Radera källkodpaket" #: share/completions/apt-src.fish:7 share/completions/apt-src.fish:14 msgid "Build source packages" msgstr "Bygg källkodpaket" #: share/completions/apt-src.fish:8 msgid "Clean source packages" msgstr "Rengör källkodpaket" #: share/completions/apt-src.fish:9 msgid "Detect known source tree" msgstr "Detektera känt källkodsträd" #: share/completions/apt-src.fish:10 msgid "List installed source package\\(s\\)" msgstr "Lista installerade källkodpaket" #: share/completions/apt-src.fish:11 msgid "Root source tree" msgstr "Rotkällträd" #: share/completions/apt-src.fish:12 msgid "Version of source package" msgstr "Version pÃ¥ källkodpaket" #: share/completions/apt-src.fish:13 msgid "Name of the source package" msgstr "Namn pÃ¥ källkodpaket" #: share/completions/apt-src.fish:15 msgid "Install after build" msgstr "Installera efter byggande" #: share/completions/apt-src.fish:16 msgid "Patch local changes" msgstr "Utför fixar för lokala ändringar" #: share/completions/apt-src.fish:17 msgid "Specify a dir" msgstr "Ange katalog" #: share/completions/apt-src.fish:19 msgid "Omit debian version" msgstr "Ange inte Debian-version" #: share/completions/apt-src.fish:20 msgid "Do not del built files" msgstr "Radera inte byggda filer" #: share/completions/apt-src.fish:21 msgid "Do not del source files" msgstr "Radera inte källfiler" #: share/completions/apt-src.fish:22 msgid "Source tree version" msgstr "Källkodsträdsversion" #: share/completions/apt-src.fish:23 msgid "Output to /dev/null" msgstr "Skriv utdata till /dev/null" #: share/completions/apt-src.fish:24 msgid "Output trace" msgstr "UtdataspÃ¥r" #: share/completions/apt-zip-inst.fish:5 share/completions/apt-zip-list.fish:5 msgid "Select an action" msgstr "Välj en handling" #: share/completions/apt-zip-inst.fish:7 share/completions/apt-zip-list.fish:7 msgid "Fix broken option" msgstr "Fixa trasig flagga" #: share/completions/aptitude.fish:3 msgid "Test if aptitude has yet to be given the subcommand" msgstr "Testa om aptitude har tagit emot ett underkommando" #: share/completions/aptitude.fish:12 #, fuzzy msgid "Test if aptitude command should have packages as potential completion" msgstr "Testa om aptkommando borde ha paket som potentiell komplettering" #: share/completions/aptitude.fish:24 #, fuzzy msgid "Remove any cached packages which can no longer be downloaded" msgstr "Rengör paket som inte längre skall nedladdas" #: share/completions/aptitude.fish:25 msgid "Remove all downloaded .deb files from the package cache directory" msgstr "" #: share/completions/aptitude.fish:26 msgid "Forget all internal information about what packages are \\new" msgstr "" #: share/completions/aptitude.fish:27 msgid "Cancel all scheduled actions on all packages" msgstr "" #: share/completions/aptitude.fish:28 #, fuzzy msgid "Update the list of available packages from the apt sources" msgstr "Updatera källkodpaketlista" #: share/completions/aptitude.fish:29 #, fuzzy msgid "Upgrade installed packages to their most recent version" msgstr "Visa alla källkodspaket med version" #: share/completions/aptitude.fish:30 #, fuzzy msgid "Download and displays the Debian changelog for the packages" msgstr "Visa ändringsinformation för paket" #: share/completions/aptitude.fish:31 #, fuzzy msgid "Upgrade, removing or installing packages as necessary" msgstr "Bygg och installera nyaste paket" #: share/completions/aptitude.fish:32 #, fuzzy msgid "Download the packages to the current directory" msgstr "Nedstig aldrig i föräldrakatalog" #: share/completions/aptitude.fish:33 msgid "Forbid the upgrade to a particular version" msgstr "" #: share/completions/aptitude.fish:34 msgid "Ignore the packages by future upgrade commands" msgstr "" #: share/completions/aptitude.fish:35 #, fuzzy msgid "Install the packages" msgstr "Installera nytt paket" #: share/completions/aptitude.fish:36 #, fuzzy msgid "Cancel any scheduled actions on the packages" msgstr "Visa ändringsinformation för paket" #: share/completions/aptitude.fish:37 #, fuzzy msgid "Mark packages as automatically installed" msgstr "Upgradera paket om det är installerat" #: share/completions/aptitude.fish:38 msgid "Remove and delete all associated configuration and data files" msgstr "" #: share/completions/aptitude.fish:39 #, fuzzy msgid "Reinstall the packages" msgstr "Ominstallera paket" #: share/completions/aptitude.fish:40 #, fuzzy msgid "Remove the packages" msgstr "Radera paket" #: share/completions/aptitude.fish:41 #, fuzzy msgid "Display detailed information about the packages" msgstr "Visa ändringsinformation för paket" #: share/completions/aptitude.fish:42 msgid "Consider the packages by future upgrade commands" msgstr "" #: share/completions/aptitude.fish:43 #, fuzzy msgid "Mark packages as manually installed" msgstr "Upgradera paket om det är installerat" #: share/completions/aptitude.fish:44 #, fuzzy msgid "Search for packages matching one of the patterns" msgstr "Sök paket innehÃ¥llande mönster" #: share/completions/aptitude.fish:45 msgid "Display brief summary of the available commands and options" msgstr "" #: share/completions/arp.fish:4 msgid "Class of hw type" msgstr "Klass av hÃ¥rdvara" #: share/completions/arp.fish:5 msgid "Show arp entries" msgstr "Visa ARP-inlägg" #: share/completions/arp.fish:6 msgid "Remove an entry for hostname" msgstr "Ta bort hostname-inlägg" #: share/completions/arp.fish:8 msgid "Select interface" msgstr "Välj gränssnitt" #: share/completions/arp.fish:9 msgid "Manually create ARP address" msgstr "Skapa ARP adress manuellt" #: share/completions/arp.fish:10 msgid "Take addr from filename, default /etc/ethers" msgstr "Hämta adress frÃ¥n filnamn, standard är /etc/ethers" #: share/completions/at.fish:3 share/completions/atq.fish:3 msgid "Use specified queue" msgstr "Använd angiven kö" #: share/completions/at.fish:4 msgid "Send mail to user" msgstr "Skicka e-post till användare" #: share/completions/at.fish:5 msgid "Read job from file" msgstr "Läs in jobb frÃ¥n fil" #: share/completions/at.fish:6 msgid "Alias for atq" msgstr "Alias för atq" #: share/completions/at.fish:7 msgid "Alias for atrm" msgstr "Alias för atrm" #: share/completions/at.fish:8 msgid "Show the time" msgstr "Visa tid" #: share/completions/at.fish:9 msgid "Print the jobs listed" msgstr "Visa listade jobb" #: share/completions/atd.fish:2 msgid "Limiting load factor" msgstr "Begränsande lastfaktor" #: share/completions/atd.fish:3 msgid "Minimum interval in seconds" msgstr "Minimalt intervall i sekunder" #: share/completions/atd.fish:4 msgid "Debug mode" msgstr "Debugläge" #: share/completions/atd.fish:5 msgid "Process at queue only once" msgstr "Processa â€atâ€-kö bara en gÃ¥ng" #: share/completions/configure.fish:1 #: share/functions/__fish_complete_ls.fish:95 #: share/functions/__fish_complete_tex.fish:4 msgid "Display help and exit" msgstr "Visa hjälp och avsluta" #: share/completions/configure.fish:4 msgid "Cache test results in specified file" msgstr "Cache:a resultat i angiven fil" #: share/completions/cp.fish:10 share/completions/mv.fish:6 msgid "Backup suffix" msgstr "Backup-ändelse" #: share/completions/cp.fish:20 msgid "Don't preserve the specified attributes" msgstr "BehÃ¥ll inte de angivna attributen" #: share/completions/cp.fish:24 msgid "Control creation of sparse files" msgstr "Kontrollera skapandet av glesa filer" #: share/completions/cp.fish:28 msgid "Set security context of copy to CONTEXT" msgstr "Ange säkerhetskontext för kopia" #: share/completions/cut.fish:1 msgid "Output byte range" msgstr "Välj bytsekvens" #: share/completions/cut.fish:2 msgid "Output character range" msgstr "Välj teckensekvens" #: share/completions/cut.fish:3 msgid "Select field delimiter" msgstr "Välj fältavgränsare" #: share/completions/cut.fish:4 msgid "Select fields" msgstr "Välj fält" #: share/completions/cvs.fish:25 #, fuzzy msgid "Use \\tmpdir for temporary files." msgstr "Välj temporär katalog" #: share/completions/cvs.fish:26 #, fuzzy msgid "Use \\editor for editing log information." msgstr "Välj editor för loginformationsredigering" #: share/completions/cvs.fish:27 #, sh-format msgid "Overrides $CVSROOT as the root of the CVS tree." msgstr "" #: share/completions/cvs.fish:29 #, fuzzy msgid "Use compression level \\# for net traffic." msgstr "KompressionsnivÃ¥ för nätverkstrafik" #: share/completions/cvs.fish:34 #, fuzzy msgid "Set CVS user variable." msgstr "Välj CVS-användare" #: share/completions/cvs.fish:40 msgid "Add a new file/directory to the repository" msgstr "Lägg till fil/katalog till förrÃ¥d" #: share/completions/cvs.fish:41 msgid "Administration front end for rcs" msgstr "Administrationsfrontend för rcs" #: share/completions/cvs.fish:42 msgid "Show last revision where each line was modified" msgstr "Visa senaste revision vid vilken vare rad ändrades" #: share/completions/cvs.fish:43 msgid "Checkout sources for editing" msgstr "Checka ut källkod för redigering" #: share/completions/cvs.fish:44 msgid "Check files into the repository" msgstr "Checka in filer till förrÃ¥d" #: share/completions/cvs.fish:45 msgid "Show differences between revisions" msgstr "Visa skillnader mellan revisioner" #: share/completions/cvs.fish:46 msgid "Get ready to edit a watched file" msgstr "Förbered redigering av övervakad fil" #: share/completions/cvs.fish:47 msgid "See who is editing a watched file" msgstr "Se vem som redigerar övervakad fil" #: share/completions/cvs.fish:48 msgid "Export sources from CVS, similar to checkout" msgstr "Exportera källkod frÃ¥n CSV" #: share/completions/cvs.fish:49 msgid "Show repository access history" msgstr "Visa förrÃ¥dets Ã¥tkomsthistorik" #: share/completions/cvs.fish:50 msgid "Import sources into CVS, using vendor branches" msgstr "Importera källor till CVS" #: share/completions/cvs.fish:51 #, fuzzy msgid "Create a CVS repository if it doesn\\t" msgstr "Skapa förrÃ¥d om det inte redan existerar" #: share/completions/cvs.fish:88 msgid "Set comment leader." msgstr "" #: share/completions/cvs.fish:91 #, fuzzy msgid "Set keyword substitution mode:" msgstr "Ange standardnyckelordssubstitution" #: share/completions/cvs.fish:94 #, fuzzy msgid "Replace revision\\s" msgstr "SlÃ¥ ihop revisioner" #: share/completions/cvs.fish:132 msgid "Check out revision or tag. (implies -P) (is sticky)" msgstr "" #: share/completions/cvs.fish:133 msgid "Check out revisions as of date. (implies -P) (is sticky)" msgstr "" #: share/completions/cvs.fish:134 msgid "Check out into dir instead of module name." msgstr "" #: share/completions/cvs.fish:135 msgid "Use RCS kopt -k option on checkout. (is sticky)" msgstr "" #: share/completions/cvs.fish:136 msgid "Merge in changes made between current revision and rev." msgstr "" #: share/completions/cvs.fish:146 #, fuzzy msgid "Read the log message from file." msgstr "Läs loggmeddelande frÃ¥n fil" #: share/completions/cvs.fish:147 #, fuzzy msgid "Log message." msgstr "Ersätt ett loggmeddelande" #: share/completions/cvs.fish:148 msgid "Commit to this branch or trunk revision." msgstr "" #: share/completions/cvs.fish:157 #, fuzzy msgid "Specify keyword expansion mode." msgstr "Välj kärnversion" #: share/completions/cvs.fish:158 msgid "Diff revision for date against working file." msgstr "" #: share/completions/cvs.fish:159 msgid "Diff rev1/date1 against date2." msgstr "" #: share/completions/cvs.fish:160 msgid "Diff revision for rev1 against working file." msgstr "" #: share/completions/cvs.fish:161 msgid "Diff rev1/date1 against rev2." msgstr "" #: share/completions/cvs.fish:166 #, fuzzy msgid "--ignore-matching-lines=RE Ignore changes whose lines all match RE." msgstr "Ignorera ändringar som matchar REGEX" #: share/completions/cvs.fish:172 msgid "--label LABEL Use LABEL instead of file name." msgstr "" #: share/completions/cvs.fish:174 msgid "--show-function-line=RE Show the most recent line matching RE." msgstr "" #: share/completions/cvs.fish:180 msgid "--width=NUM Output at most NUM (default 130) characters per line." msgstr "" #: share/completions/cvs.fish:222 #, fuzzy msgid "Export tagged revisions." msgstr "SlÃ¥ ihop revisioner" #: share/completions/cvs.fish:223 msgid "Export revisions as of date." msgstr "" #: share/completions/cvs.fish:224 msgid "Export into dir instead of module name." msgstr "" #: share/completions/cvs.fish:225 msgid "Use RCS kopt -k option on checkout." msgstr "" #: share/completions/cvs.fish:235 msgid "Look for specified module (repeatable)" msgstr "" #: share/completions/cvs.fish:236 #, fuzzy msgid "Extract by record type" msgstr "Ange posttyp" #: share/completions/cvs.fish:241 #, fuzzy msgid "Since date (Many formats)" msgstr "Format för profileringsdata" #: share/completions/cvs.fish:242 msgid "Back to record with str in module/file/repos field" msgstr "" #: share/completions/cvs.fish:243 msgid "Specified file (same as command line) (repeatable)" msgstr "" #: share/completions/cvs.fish:244 msgid "In module (repeatable)" msgstr "" #: share/completions/cvs.fish:245 msgid "In repository (repeatable)" msgstr "" #: share/completions/cvs.fish:246 msgid "Since rev or tag (looks inside RCS files!)" msgstr "" #: share/completions/cvs.fish:247 msgid "Since tag record placed in history file (by anyone)." msgstr "" #: share/completions/cvs.fish:248 msgid "For user name (repeatable)" msgstr "" #: share/completions/cvs.fish:249 msgid "Output for time zone (e.g. -z -0700)" msgstr "" #: share/completions/darcs.fish:19 #, fuzzy msgid "Display help for darcs or a single commands" msgstr "Visa användningsinformation för kommando" #: share/completions/darcs.fish:20 msgid "Add one or more new files or directories" msgstr "Lägg till filer eller kataloger till lagret" #: share/completions/darcs.fish:21 msgid "Remove one or more files or directories from the repository" msgstr "Ta bort filer eller kataloger frÃ¥n lagret" #: share/completions/darcs.fish:22 msgid "Move/rename one or more files or directories" msgstr "Flytta/byt namn pÃ¥ en eller flera filer eller kataloger" #: share/completions/darcs.fish:23 msgid "Replace a token with a new value for that token" msgstr "Ersätt en symbol med ett nytt värde för den symbolen" #: share/completions/darcs.fish:24 msgid "Revert to the recorded version (safe the first time only)" msgstr "Backa till senaste lagrade version (Är bara säkert en gÃ¥ng)" #: share/completions/darcs.fish:25 msgid "Undo the last revert (may fail if changes after the revert)" msgstr "" "Ã…ngra senaste revert-operation (kan misslyckas om ändringar har utförts " "efter revert-operationen)" #: share/completions/darcs.fish:26 msgid "Display unrecorded changes in the working copy" msgstr "Visa olagrade ändringar i arbetskopian" #: share/completions/darcs.fish:27 msgid "Save changes in the working copy to the repository as a patch" msgstr "Spara ändringar i arbetskopian till lagret som en fix" #: share/completions/darcs.fish:28 msgid "Remove recorded patches without changing the working copy" msgstr "Ta bort lagrade fixar utan att ändra arbetskopian" #: share/completions/darcs.fish:29 #, fuzzy msgid "Replace a patch with a better version before it leaves your repository" msgstr "Ersätt den lagrade fixen med en bättre version" #: share/completions/darcs.fish:30 msgid "Mark any conflicts to the working copy for manual resolution" msgstr "Markera konflikter mot arketskopian för manuell lösning" #: share/completions/darcs.fish:31 msgid "Tag the contents of the repository with a version name" msgstr "Tagga innehÃ¥llet i lagret med ett versionsnummer" #: share/completions/darcs.fish:32 msgid "Set a value for a preference (test, predist, ...)" msgstr "Välj ett värde för en preferens (test, predisk, ...)" #: share/completions/darcs.fish:33 #, fuzzy msgid "Record an inverse patch without changing the working directory" msgstr "Lagra en omvänd fix utan att ändra arbetskopian" #: share/completions/darcs.fish:34 msgid "Create a diff between two versions of the repository" msgstr "Skappa en diff mellan tvÃ¥ versioner i lagret" #: share/completions/darcs.fish:35 #, fuzzy msgid "Gives a changelog-style summary of the repository history" msgstr "Ge en changelog-formaterad summering av förrÃ¥dhistorik" #: share/completions/darcs.fish:36 msgid "Display which patch last modified something" msgstr "Visa vilken fix som senast ändrade nÃ¥gonting" #: share/completions/darcs.fish:37 msgid "Create a distribution tarball" msgstr "Skapa distribuerbar tar-fil" #: share/completions/darcs.fish:38 msgid "Locate the most recent version lacking an error" msgstr "Hitta senaste version utan ett givet fel" #: share/completions/darcs.fish:39 msgid "Query information which is stored by darcs" msgstr "" #: share/completions/darcs.fish:40 msgid "Copy and apply patches from another repository to this one" msgstr "Kopiera och applicera fixar frÃ¥n ett annat förrÃ¥d till detta" #: share/completions/darcs.fish:41 #, fuzzy msgid "Opposite of pull; unsafe if patch is not in remote repository" msgstr "Motsatsen till pull, osäker om fixen inte finns i fjärrlagret" #: share/completions/darcs.fish:42 #, fuzzy msgid "Delete selected patches from the repository. (UNSAFE!)" msgstr "Ordna om fixarna i förrÃ¥det" #: share/completions/darcs.fish:43 msgid "Copy and apply patches from this repository to another one" msgstr "Kopiera och applicera fixar frÃ¥n detta förrÃ¥d till ett annat" #: share/completions/darcs.fish:44 msgid "Send by email a bundle of one or more patches" msgstr "Skicka e-postpaket av en eller flera fixar" #: share/completions/darcs.fish:45 msgid "Apply patches (from an email bundle) to the repository" msgstr "Applicera fixar (frÃ¥n e-postpaket) till lagret" #: share/completions/darcs.fish:46 msgid "Create a local copy of another repository" msgstr "Skapa lokal kopia av förrÃ¥d" #: share/completions/darcs.fish:47 #, fuzzy msgid "Makes a copy of the repository" msgstr "Skapa lokal kopia av förrÃ¥d" #: share/completions/darcs.fish:48 #, fuzzy msgid "Initialize a new source tree as a darcs repository" msgstr "Checka in filer till förrÃ¥d" #: share/completions/darcs.fish:49 msgid "Optimize the repository" msgstr "Optimera förrÃ¥d" #: share/completions/darcs.fish:50 msgid "Check the repository for consistency" msgstr "Kontrollera lagrets konsistens" #: share/completions/darcs.fish:51 msgid "Repair the corrupted repository" msgstr "Reparera trasigt förrÃ¥d" #: share/completions/darcs.fish:85 share/completions/darcs.fish:228 #: share/completions/darcs.fish:252 share/completions/darcs.fish:410 #: share/completions/darcs.fish:434 share/completions/darcs.fish:465 #: share/completions/darcs.fish:510 share/completions/darcs.fish:560 #: share/completions/darcs.fish:593 share/completions/darcs.fish:636 #: share/completions/darcs.fish:674 share/completions/darcs.fish:704 #, fuzzy msgid "Specify command to run after this darcs command" msgstr "Ange kommando att köra efter detta darcs-kommando" #: share/completions/darcs.fish:225 share/completions/darcs.fish:249 #: share/completions/darcs.fish:405 share/completions/darcs.fish:431 #: share/completions/darcs.fish:462 share/completions/darcs.fish:557 #: share/completions/darcs.fish:632 share/completions/darcs.fish:700 #: share/completions/darcs.fish:717 msgid "Specify the repository directory in which to run" msgstr "Välj vilket förrÃ¥d som skall användas" #: share/completions/darcs.fish:238 share/completions/darcs.fish:520 msgid "Select changes starting with a patch matching PATTERN" msgstr "Välj ändringar som börjar med fix som matchar MÖNSTER" #: share/completions/darcs.fish:239 share/completions/darcs.fish:521 msgid "Select changes starting with a patch matching REGEXP" msgstr "Välj ändringar som börjar med fix som matchar REGEXP" #: share/completions/darcs.fish:240 share/completions/darcs.fish:522 msgid "Select changes starting with a tag matching REGEXP" msgstr "Välj ändringar som börjar med tagg som matchar REGEXP" #: share/completions/darcs.fish:241 share/completions/darcs.fish:523 msgid "Select the last NUMBER patches" msgstr "Välj angivet antal fixar av de senaste fixarna" #: share/completions/darcs.fish:242 share/completions/darcs.fish:482 #: share/completions/darcs.fish:524 share/completions/darcs.fish:573 #: share/completions/darcs.fish:606 msgid "Select patches matching PATTERN" msgstr "Välj fixar som matchar MÖNSTER" #: share/completions/darcs.fish:243 share/completions/darcs.fish:483 #: share/completions/darcs.fish:525 share/completions/darcs.fish:574 #: share/completions/darcs.fish:607 msgid "Select patches matching REGEXP" msgstr "Välj fixar som matchar REGEXP" #: share/completions/darcs.fish:244 share/completions/darcs.fish:484 #: share/completions/darcs.fish:526 share/completions/darcs.fish:575 #: share/completions/darcs.fish:608 msgid "Select tags matching REGEXP" msgstr "Välj taggar som matchar REGEXP" #: share/completions/darcs.fish:262 share/completions/darcs.fish:427 msgid "Select patch matching PATTERN" msgstr "Välj fix som matchar MÖNSTER" #: share/completions/darcs.fish:263 share/completions/darcs.fish:428 msgid "Select patch matching REGEXP" msgstr "Välj fix som matchar REGEXP" #: share/completions/darcs.fish:404 msgid "Specify the repository URL" msgstr "Ange förrÃ¥d-URL" #: share/completions/darcs.fish:429 share/completions/darcs.fish:689 #: share/completions/darcs.fish:720 msgid "Select tag matching REGEXP" msgstr "Välj tagg som matchar REGEXP" #: share/completions/darcs.fish:430 msgid "Specify hash of creator patch (see docs)" msgstr "Ange hash av skaparfix (se dokumentationen)" #: share/completions/darcs.fish:444 #, fuzzy msgid "Name of version" msgstr "NAmn pÃ¥ version at använda som kontrollpunkt" #: share/completions/darcs.fish:489 msgid "Use external tool to merge conflicts" msgstr "Använd externt verktyg för att hantera sammanslagningskonflikter" #: share/completions/darcs.fish:578 share/completions/darcs.fish:722 msgid "Apply patch as another user using sudo" msgstr "" #: share/completions/darcs.fish:611 msgid "Specify email address" msgstr "Välj e-postkatalog" #: share/completions/darcs.fish:612 msgid "Specify author id" msgstr "Ange författar-id" #: share/completions/darcs.fish:613 msgid "Specify destination email" msgstr "Välj destinationsadress" #: share/completions/darcs.fish:614 msgid "Mail results to additional EMAIL(s). Requires --reply" msgstr "Posta resultat till extra adresser. (Kräver --reply)" #: share/completions/darcs.fish:615 #, fuzzy msgid "Specify mail subject" msgstr "Ange makefil" #: share/completions/darcs.fish:616 msgid "Specify output filename" msgstr "Välj utfil" #: share/completions/darcs.fish:618 msgid "Sign the patch with a given keyid" msgstr "Signera fix med givet nyckelid" #: share/completions/darcs.fish:619 msgid "Sign the patch using openssl with a given private key" msgstr "Signera fix via openssl med en given hemlig nyckel" #: share/completions/darcs.fish:625 msgid "Send to context stored in FILENAME" msgstr "Skicka till sammanhang lagrat i FILNAMN" #: share/completions/darcs.fish:633 msgid "Specify sendmail command" msgstr "Ange sendmailkommando" #: share/completions/darcs.fish:646 msgid "Verify that the patch was signed by a key in PUBRING" msgstr "Verifiera att fix är signerad frÃ¥n nyckel i angiven nyckelring" #: share/completions/darcs.fish:647 #, fuzzy msgid "Verify using openSSL with authorized keys from file KEYS" msgstr "Verifiera med openSSL med auktoriserade nycklar frÃ¥n angiven fil" #: share/completions/darcs.fish:684 #, fuzzy msgid "Path of output directory" msgstr "Välj källkatalog" #: share/completions/darcs.fish:687 share/completions/darcs.fish:718 msgid "Select changes up to a patch matching PATTERN" msgstr "Välj ändringar fram till fix som matchar MÖNSTER" #: share/completions/darcs.fish:688 share/completions/darcs.fish:719 msgid "Select changes up to a patch matching REGEXP" msgstr "Välj ändringar fram till fix som matchar REGEXP" #: share/completions/darcs.fish:690 share/completions/darcs.fish:721 #, fuzzy msgid "Version specified by the context in FILENAME" msgstr "Skicka till sammanhang lagrat i FILNAMN" #: share/completions/darcs.fish:758 msgid "Name of version to checkpoint" msgstr "NAmn pÃ¥ version at använda som kontrollpunkt" #: share/completions/dcop.fish:34 msgid "Show help about options" msgstr "Visa hjälp om flaggor" #: share/completions/dcop.fish:35 msgid "Connect to the given user's DCOP server" msgstr "Koppla till den angivna användarens DCOP-server" #: share/completions/dcop.fish:36 msgid "Send the same DCOP call to all users with a running DCOP server" msgstr "" "Skicka samma DCOP-signal till alla användare med en körande DCOP-server" #: share/completions/dcop.fish:37 msgid "List all active KDE session for a user or all users" msgstr "Visa alla aktiva KDE-sessioner för en användare eller alla användare" #: share/completions/dcop.fish:38 msgid "Send to the given KDE session" msgstr "Skicka till den angivna KDE-sessionen" #: share/completions/dcop.fish:39 msgid "Don't update the user activity timestamp in the called application" msgstr "" "Uppdatera inte tidsstämpeln för användaraktivitet i det anropade programmet" #: share/completions/dcop.fish:40 msgid "Call DCOP for each line read from stdin" msgstr "Anropa DCOP för varje rad läst frÃ¥n standard in" #: share/completions/df.fish:17 msgid "Show filesystems of specified type" msgstr "Visa filsystem av angiven typ" #: share/completions/df.fish:22 msgid "Block size" msgstr "Blockstorlek" #: share/completions/diff.fish:9 msgid "Ignore changes whose lines match the REGEX" msgstr "Ignorera ändringar som matchar REGEX" #: share/completions/diff.fish:13 msgid "Output NUM lines of copied context" msgstr "Skriv ut NUM rader av kopierad sammanhang" #: share/completions/diff.fish:15 msgid "Output NUM lines of unified context" msgstr "Skriv ut NUM rader av unifieradt sammanhang" #: share/completions/diff.fish:20 msgid "Output at most NUM print columns" msgstr "Skriv ut som mest NUM kolumner" #: share/completions/diff.fish:22 msgid "Compare FILE1 to all operands" msgstr "Jämför FIL1 med alla operander" #: share/completions/diff.fish:23 msgid "Compare FILE2 to all operands" msgstr "Jämför FIL2 med alla operander" #: share/completions/du.fish:15 msgid "Exclude files thet match pattern in file" msgstr "Exkludera filer som matchar mönster frÃ¥n fil" #: share/completions/du.fish:16 msgid "Exclude files that match pattern" msgstr "Exkludera filer som matchar mönster" #: share/completions/du.fish:17 msgid "Recursion limit" msgstr "Rekursionsgräns" #: share/completions/emerge.fish:5 share/completions/equery.fish:5 msgid "" "Prints completions for installed packages on the system from /var/db/pkg" msgstr "" "Visa kompletteringar för installerade packet pÃ¥ systemet frÃ¥n /var/db/pkg" #: share/completions/emerge.fish:12 share/completions/equery.fish:12 msgid "" "Prints completions for all available packages on the system from /usr/portage" msgstr "" "Visa kompletteringar för alla tillgängliga packet pÃ¥ systemet frÃ¥n /usr/" "portage" #: share/completions/emerge.fish:19 msgid "" "Tests if emerge command should have an installed package as potential " "completion" msgstr "" "Testa om emergekommando borde ha ett installerat paket som potentiell " "komplettering" #: share/completions/emerge.fish:30 share/completions/emerge.fish:31 msgid "All base system packages" msgstr "Alla bassystempaket" #: share/completions/emerge.fish:30 share/completions/emerge.fish:31 msgid "All packages in world" msgstr "Alla paket i världen" #: share/completions/emerge.fish:30 msgid "Installed package" msgstr "Installerade paket" #: share/completions/emerge.fish:31 #: share/functions/__fish_print_packages.fish:13 msgid "Package" msgstr "Paket" #: share/completions/emerge.fish:35 msgid "Usage overview of emerge" msgstr "Användningsöversikt av emerge" #: share/completions/emerge.fish:35 msgid "Help on subject system" msgstr "Hjälp för ämnet system" #: share/completions/emerge.fish:35 msgid "Help on subject config" msgstr "Hjäl för ämnet konfiguration" #: share/completions/emerge.fish:35 msgid "Help on subject sync" msgstr "Hjälp för ämnet sync" #: share/completions/emerge.fish:57 msgid "Use colors in output" msgstr "Använd färger" #: share/completions/emerge.fish:57 msgid "Don't use colors in output" msgstr "Använd inte färger" #: share/completions/emerge.fish:81 #, fuzzy msgid "Pull in build time dependencies" msgstr "Visa byggberoenden" #: share/completions/emerge.fish:81 #, fuzzy msgid "Don't pull in build time dependencies" msgstr "FrÃ¥ga efter extra beroenden" #: share/completions/env.fish:2 msgid "Redefine variable" msgstr "Omdefinera variabel" #: share/completions/equery.fish:19 #, fuzzy msgid "" "Prints completions for all available categories on the system from /usr/" "portage" msgstr "" "Visa kompletteringar för installerade packet pÃ¥ systemet frÃ¥n /var/db/pkg" #: share/completions/equery.fish:38 #, fuzzy msgid "list all packages owning file(s)" msgstr "Visa alla paket som äger filer" #: share/completions/equery.fish:39 msgid "check MD5sums and timestamps of package" msgstr "Kontrollera MD5-summor och tidsstämplar pÃ¥ paket" #: share/completions/equery.fish:40 #, fuzzy msgid "list all packages depending on specified package" msgstr "Visa paket som beror pÃ¥" #: share/completions/equery.fish:41 #, fuzzy msgid "display a dependency tree for package" msgstr "Visa beroenden för paket" #: share/completions/equery.fish:42 #, fuzzy msgid "list files owned by package" msgstr "Visa filer i paket" #: share/completions/equery.fish:43 #, fuzzy msgid "list all packages with specified useflag" msgstr "FrÃ¥ga ett (oinstallerat) paket i angiven fil" #: share/completions/equery.fish:44 #, fuzzy msgid "list all packages matching pattern" msgstr "Lista innehÃ¥ll av paket som matchar mönster" #: share/completions/equery.fish:45 #, fuzzy msgid "print size of files contained in package" msgstr "Visa paketets triggerskript" #: share/completions/equery.fish:46 #, fuzzy msgid "display USE flags for package" msgstr "Visa ändringsinformation för paket" #: share/completions/equery.fish:47 #, fuzzy msgid "print full path to ebuild for package" msgstr "Visa full sökväg till källkod" #: share/completions/fusermount.fish:15 share/completions/sshfs.fish:27 msgid "Mount options" msgstr "Monteringsflagga" #: share/completions/gcc.fish:25 msgid "Set maximum template depth" msgstr "Sätt maximalt malldjup" #: share/completions/gcc.fish:31 share/completions/gcc.fish:513 msgid "Use dir as the logical root directory for headers and libraries" msgstr "" #: share/completions/gcc.fish:261 msgid "" "Print the full absolute name of the library file library that would be used " "when linking---and don\\t" msgstr "" #: share/completions/gcc.fish:512 msgid "" "Process file after the compiler reads in the standard specs file, in order " "to override the defaults that the gcc driver program uses when determining " "what switches to pass to cc1, cc1plus, as, ld, etc" msgstr "" #: share/completions/gcc.fish:539 share/completions/gcc.fish:540 #: share/completions/gcc.fish:541 msgid "" "This specifies what floating point hardware (or hardware emulation) is " "available on the target" msgstr "" #: share/completions/gcc.fish:542 msgid "" "The size of all structures and unions will be rounded up to a multiple of " "the number of bits set by this option" msgstr "" #: share/completions/gcc.fish:548 msgid "Specify the register to be used for PIC addressing" msgstr "" #: share/completions/gcc.fish:556 msgid "Specify the access model for the thread local storage pointer" msgstr "" #: share/completions/gcc.fish:557 msgid "Specify ATMEL AVR instruction set or MCU type" msgstr "" #: share/completions/gcc.fish:559 msgid "" "Specify the initial stack address, which may be a symbol or numeric value, " "__stack is the default" msgstr "" #: share/completions/gcc.fish:574 msgid "" "Specified the identification number of the ID based shared library being " "compiled" msgstr "" #: share/completions/gem.fish:12 msgid "Build a gem from a gemspec" msgstr "" #: share/completions/gem.fish:13 msgid "Adjust RubyGems certificate settings" msgstr "" #: share/completions/gem.fish:14 #, fuzzy msgid "Check installed gems" msgstr "FrÃ¥ga installerat paket" #: share/completions/gem.fish:15 #, fuzzy msgid "Cleanup old versions of installed gems in the local repository" msgstr "Lägg till fil eller träd utan version till förrÃ¥det" #: share/completions/gem.fish:16 #, fuzzy msgid "Display the contents of the installed gems" msgstr "Visa lÃ¥tsasinstallationsutdata i tabellform" #: share/completions/gem.fish:17 #, fuzzy msgid "Show the dependencies of an installed gem" msgstr "Verifiera inte beroenden före paketen avinstalleras" #: share/completions/gem.fish:18 #, fuzzy msgid "Display RubyGems environmental information" msgstr "Visa uppdateringsinformation" #: share/completions/gem.fish:19 #, fuzzy msgid "Provide help on the 'gem' command" msgstr "Hjälp för det angivna kommandot" #: share/completions/gem.fish:20 #, fuzzy msgid "Install a gem into the local repository" msgstr "Checka in filer till förrÃ¥d" #: share/completions/gem.fish:21 msgid "Display all gems whose name starts with STRING" msgstr "" #: share/completions/gem.fish:22 #, fuzzy msgid "Query gem information in local or remote repositories" msgstr "Visa information om lokal eller fjärrelement" #: share/completions/gem.fish:23 msgid "Generates RDoc for pre-installed gems" msgstr "" #: share/completions/gem.fish:24 msgid "Display all gems whose name contains STRING" msgstr "" #: share/completions/gem.fish:25 #, fuzzy msgid "Display gem specification (in yaml)" msgstr "Visa senaste ändringsdatum för fil" #: share/completions/gem.fish:26 #, fuzzy msgid "Uninstall a gem from the local repository" msgstr "Ta bort ett inlägg frÃ¥n förrÃ¥d" #: share/completions/gem.fish:27 #, fuzzy msgid "Unpack an installed gem to the current directory" msgstr "Nedstig aldrig i föräldrakatalog" #: share/completions/gem.fish:28 msgid "Update the named gem (or all installed gems) in the local repository" msgstr "" #: share/completions/gem.fish:35 msgid "Use URL as the remote source for gems" msgstr "" #: share/completions/gem.fish:36 msgid "Use the given HTTP proxy for remote operations" msgstr "" #: share/completions/gem.fish:37 #, fuzzy msgid "Use no HTTP proxy for remote operations" msgstr "Välj rot-katalog för rpm-operationer" #: share/completions/gem.fish:38 #, fuzzy msgid "Get help on this command" msgstr "Välj promptkommando" #: share/completions/gem.fish:39 #, fuzzy msgid "Set the verbose level of output" msgstr "Ã…terställ felrapporteringsnivÃ¥ till 0" #: share/completions/gem.fish:40 #, fuzzy msgid "Use this config file instead of default" msgstr "Använd angiven fil istället för standard-förtroendedatabasen" #: share/completions/gem.fish:41 msgid "Show stack backtrace on errors" msgstr "" #: share/completions/gem.fish:42 #, fuzzy msgid "Turn on Ruby debugging" msgstr "SlÃ¥ av avmangling" #: share/completions/gem.fish:47 msgid "Add a trusted certificate" msgstr "" #: share/completions/gem.fish:48 #, fuzzy msgid "List trusted certificates" msgstr "Visa pÃ¥litliga nycklar" #: share/completions/gem.fish:49 msgid "Remove trusted certificates containing STRING" msgstr "" #: share/completions/gem.fish:50 msgid "Build private key and self-signed certificate for EMAIL_ADDR" msgstr "" #: share/completions/gem.fish:51 msgid "Certificate for --sign command" msgstr "" #: share/completions/gem.fish:52 #, fuzzy msgid "Private key for --sign command" msgstr "Visa typ av kommando" #: share/completions/gem.fish:53 msgid "Sign a certificate with my key and certificate" msgstr "" #: share/completions/gem.fish:58 msgid "Verify gem file against its internal checksum" msgstr "" #: share/completions/gem.fish:59 #, fuzzy msgid "Report 'unmanaged' or rogue files in the gem repository" msgstr "Ta bort filer eller kataloger frÃ¥n lagret" #: share/completions/gem.fish:60 msgid "Run unit tests for gem" msgstr "" #: share/completions/gem.fish:61 #, fuzzy msgid "Specify version for which to run unit tests" msgstr "Välj vilket förrÃ¥d som skall användas" #: share/completions/gem.fish:66 #, fuzzy msgid "Don't really cleanup" msgstr "Avinstallera ingenting pÃ¥ riktigt" #: share/completions/gem.fish:71 #, fuzzy msgid "List the files inside a Gem" msgstr "Visa filer i paket" #: share/completions/gem.fish:72 #, fuzzy msgid "Specify version for gem to view" msgstr "Ange användare för frÃ¥ga" #: share/completions/gem.fish:73 #, fuzzy msgid "Search for gems under specific paths" msgstr "Välj drivrutinsspecifika inställningar" #: share/completions/gem.fish:74 msgid "Be verbose when showing status" msgstr "" #: share/completions/gem.fish:79 share/completions/gem.fish:172 #, fuzzy msgid "Specify version of gem to uninstall" msgstr "Lista av paket att installera" #: share/completions/gem.fish:80 #, fuzzy msgid "Include reverse dependencies in the output" msgstr "Visa paket som beror pÃ¥ det givna paketet" #: share/completions/gem.fish:81 #, fuzzy msgid "Don't include reverse dependencies in the output" msgstr "Visa paket som beror pÃ¥ det givna paketet" #: share/completions/gem.fish:82 msgid "Pipe Format (name --version ver)" msgstr "" #: share/completions/gem.fish:87 #, fuzzy msgid "display the package version" msgstr "Visa paketpost" #: share/completions/gem.fish:87 msgid "display the path where gems are installed" msgstr "" #: share/completions/gem.fish:87 #, fuzzy msgid "display path used to search for gems" msgstr "Visa sessionsnyckel som används för ett meddelande" #: share/completions/gem.fish:87 #, fuzzy msgid "display the gem format version" msgstr "Visa uppdateringsinformation" #: share/completions/gem.fish:87 #, fuzzy msgid "display the remote gem servers" msgstr "Fil att hämta servrar frÃ¥n" #: share/completions/gem.fish:92 #, fuzzy msgid "list all 'gem' commands" msgstr "Inaktivera kommando" #: share/completions/gem.fish:92 msgid "show some examples of usage" msgstr "" #: share/completions/gem.fish:97 #, fuzzy msgid "Specify version of gem to install" msgstr "Lista av paket att installera" #: share/completions/gem.fish:98 share/completions/gem.fish:121 #: share/completions/gem.fish:131 share/completions/gem.fish:150 #: share/completions/gem.fish:158 msgid "Restrict operations to the LOCAL domain (default)" msgstr "" #: share/completions/gem.fish:99 share/completions/gem.fish:122 #: share/completions/gem.fish:132 share/completions/gem.fish:151 #: share/completions/gem.fish:159 msgid "Restrict operations to the REMOTE domain" msgstr "" #: share/completions/gem.fish:100 share/completions/gem.fish:123 #: share/completions/gem.fish:133 share/completions/gem.fish:152 #: share/completions/gem.fish:160 msgid "Allow LOCAL and REMOTE operations" msgstr "" #: share/completions/gem.fish:101 share/completions/gem.fish:182 msgid "Gem repository directory to get installed gems" msgstr "" #: share/completions/gem.fish:102 share/completions/gem.fish:183 msgid "Generate RDoc documentation for the gem on install" msgstr "" #: share/completions/gem.fish:103 share/completions/gem.fish:184 msgid "Don't generate RDoc documentation for the gem on install" msgstr "" #: share/completions/gem.fish:104 share/completions/gem.fish:185 msgid "Generate RI documentation for the gem on install" msgstr "" #: share/completions/gem.fish:105 share/completions/gem.fish:186 msgid "Don't generate RI documentation for the gem on install" msgstr "" #: share/completions/gem.fish:106 share/completions/gem.fish:187 msgid "Force gem to install, bypassing dependency checks" msgstr "" #: share/completions/gem.fish:107 share/completions/gem.fish:188 #, fuzzy msgid "Don't force gem to install, bypassing dependency checks" msgstr "Utför inte beroendeverifiering" #: share/completions/gem.fish:108 share/completions/gem.fish:189 msgid "Run unit tests prior to installation" msgstr "" #: share/completions/gem.fish:109 share/completions/gem.fish:190 #, fuzzy msgid "Don't run unit tests prior to installation" msgstr "Kontrollera inte diskutrymme före installation" #: share/completions/gem.fish:110 share/completions/gem.fish:191 #, fuzzy msgid "Use bin wrappers for executables" msgstr "Fil är program" #: share/completions/gem.fish:111 share/completions/gem.fish:192 #, fuzzy msgid "Don't use bin wrappers for executables" msgstr "Gör inte skript exekverbara" #: share/completions/gem.fish:112 share/completions/gem.fish:193 #, fuzzy msgid "Specify gem trust policy" msgstr "Ange förtroendemodell" #: share/completions/gem.fish:113 share/completions/gem.fish:194 msgid "Do not install any required dependent gems" msgstr "" #: share/completions/gem.fish:114 share/completions/gem.fish:195 msgid "Unconditionally install the required dependent gems" msgstr "" #: share/completions/gem.fish:119 share/completions/gem.fish:129 #: share/completions/gem.fish:148 #, fuzzy msgid "Display detailed information of gem(s)" msgstr "Visa uppdateringsinformation" #: share/completions/gem.fish:120 share/completions/gem.fish:130 #: share/completions/gem.fish:149 #, fuzzy msgid "Don't display detailed information of gem(s)" msgstr "Visa uppdateringsinformation" #: share/completions/gem.fish:128 msgid "Name of gem(s) to query on matches the provided REGEXP" msgstr "" #: share/completions/gem.fish:138 msgid "Generate RDoc/RI documentation for all installed gems" msgstr "" #: share/completions/gem.fish:139 msgid "Include RDoc generated documents" msgstr "" #: share/completions/gem.fish:140 msgid "Don't include RDoc generated documents" msgstr "" #: share/completions/gem.fish:141 msgid "Include RI generated documents" msgstr "" #: share/completions/gem.fish:142 msgid "Don't include RI generated documents" msgstr "" #: share/completions/gem.fish:143 #, fuzzy msgid "Specify version of gem to rdoc" msgstr "Ange extern editor" #: share/completions/gem.fish:157 #, fuzzy msgid "Specify version of gem to examine" msgstr "Välj destinationsadress" #: share/completions/gem.fish:161 msgid "Output specifications for all versions of the gem" msgstr "" #: share/completions/gem.fish:166 #, fuzzy msgid "Uninstall all matching versions" msgstr "Visa alla versioner" #: share/completions/gem.fish:167 #, fuzzy msgid "Don't uninstall all matching versions" msgstr "Avinstallera ingenting pÃ¥ riktigt" #: share/completions/gem.fish:168 msgid "Ignore dependency requirements while uninstalling" msgstr "" #: share/completions/gem.fish:169 #, fuzzy msgid "Don't ignore dependency requirements while uninstalling" msgstr "Verifiera inte beroenden före paketen avinstalleras" #: share/completions/gem.fish:170 msgid "Uninstall applicable executables without confirmation" msgstr "" #: share/completions/gem.fish:171 msgid "Don't uninstall applicable executables without confirmation" msgstr "" #: share/completions/gem.fish:177 msgid "Specify version of gem to unpack" msgstr "" #: share/completions/gem.fish:196 msgid "Update the RubyGems system software" msgstr "" #: share/completions/gpg.fish:116 msgid "Write output to specified file" msgstr "Skriv utdata till angiven fil" #: share/completions/gpg.fish:161 msgid "Use specified keyserver" msgstr "Använd angiven nyckelserver" #: share/completions/gpg.fish:169 msgid "The command line that should be run to view a photo ID" msgstr "Kommandoraden som skall köras för att visa ett fotoid" #: share/completions/gpg.fish:170 msgid "" "Sets a list of directories to search for photo viewers and keyserver helpers" msgstr "" "Sätt en lista av kataloger att söka efter fotovisare och nyckelserverhjälpare" #: share/completions/gpg.fish:173 msgid "Add specified file to the current list of keyrings" msgstr "Lägg till angiven fil fill den nuvarande listan av nyckelringar" #: share/completions/gpg.fish:175 msgid "Add specified file to the current list of secret keyrings" msgstr "" "Lägg till angiven fil fill den nuvarande listan av hemliga nyckelringar" #: share/completions/gpg.fish:176 msgid "Designate specified file as the primary public keyring" msgstr "Välj den angivna filen som den primära öppna nyckelring" #: share/completions/gpg.fish:178 msgid "Use specified file instead of the default trustdb" msgstr "Använd angiven fil istället för standard-förtroendedatabasen" #: share/completions/gpg.fish:184 msgid "Read options from specified file, do not read the default options file" msgstr "Läs inställningar frÃ¥n angivan fil, läs inte standardinställningsfil" #: share/completions/gpg.fish:186 msgid "Load an extension module" msgstr "Ladda en förlängningsmodul" #: share/completions/gpg.fish:188 msgid "Write special status strings to the specified file descriptor" msgstr "Skriv speciella statussträngar till den angivna filidentifieraren" #: share/completions/gpg.fish:189 msgid "Write log output to the specified file descriptor" msgstr "Skriv loggdata till angiven filidentifierare" #: share/completions/gpg.fish:195 msgid "Use specified string as comment string" msgstr "Använd angiven sträng som kommentarsträng" #: share/completions/gpg.fish:204 msgid "Put the specified name value pair into the signature as notation data" msgstr "Lägg angivet namn/värde-par i signaturen som notationsdata" #: share/completions/gpg.fish:205 msgid "Set signature policy" msgstr "Välj signaturpolicy" #: share/completions/gpg.fish:206 msgid "Set certificate policy" msgstr "Välj certifikatpolicy" #: share/completions/gpg.fish:207 msgid "Set signature and certificate policy" msgstr "Välj signatur- och certifikatpolicy" #: share/completions/gpg.fish:208 msgid "Use specified URL as a preferred keyserver for data signatures" msgstr "Använd angiven URL som preferrerad nyckelserver för datasignaturer" #: share/completions/gpg.fish:210 msgid "Use specified string as the filename which is stored inside messages" msgstr "Använd angiven sträng som filnamn att lagra i meddelande" #: share/completions/gpg.fish:218 msgid "" "Number of completely trusted users to introduce a new key signer (defaults " "to 1)" msgstr "" "Antal användare med fullt förtroende för att introducera nya " "nyckelunderskrivare (standard är 1)" #: share/completions/gpg.fish:219 msgid "" "Number of marginally trusted users to introduce a new key signer (defaults " "to 3)" msgstr "" "Antal användare med marginellt förtroende för att introducera nya " "nyckelunderskrivare (standard är 3)" #: share/completions/gpg.fish:221 msgid "Maximum depth of a certification chain (default is 5)" msgstr "MAximalt djup i certifieringskedjan (standard är 5)" #: share/completions/gpg.fish:249 msgid "Read passphrase from specified file descriptor" msgstr "Läss passfras frÃ¥n angiven filidentifierare" #: share/completions/gpg.fish:250 msgid "Read user input from specified file descriptor" msgstr "Läs användarindata frÃ¥n angiven filidentifierare" #: share/completions/gpg.fish:254 msgid "Override value of GPG_AGENT_INFO environment variable" msgstr "Ã…sidosätt värdet pÃ¥ GPG_AGENT_INFO-miljövariablen" #: share/completions/gpg.fish:304 msgid "Don't use the public key but the specified session key" msgstr "Använd inte den öppna nyckel utan den angivna sessionsnyckeln" #: share/completions/gpg.fish:315 msgid "Sets up a named group, which is similar to aliases in email programs" msgstr "Skapa en namngiven grupp, liknande alias i e-postprogram" #: share/completions/gpg.fish:321 msgid "Set the list of personal cipher preferences to the specified string" msgstr "Sätt listan pÃ¥ personliga chifferpreferenser till den angivna strängen" #: share/completions/gpg.fish:322 msgid "Set the list of personal digest preferences to the specified string" msgstr "" "Sätt listan pÃ¥ personliga digestinställningar till den angivna strängen" #: share/completions/gpg.fish:323 msgid "" "Set the list of personal compression preferences to the specified string" msgstr "" "Sätt listan pÃ¥ personliga kompressionsinställningar till den angivna strängen" #: share/completions/gpg.fish:324 msgid "Set the list of default preferences to the specified string" msgstr "Sätt listan pÃ¥ standardinställningar till den angivna strängen" #: share/completions/gprof.fish:24 msgid "Delete arcs from callgraph" msgstr "Radera arker frÃ¥n anropsgraf" #: share/completions/gprof.fish:26 msgid "Supress output when executed less than specified times" msgstr "Visa inte utdata för kod som exekverats färre gÃ¥nger än angivet antal" #: share/completions/gprof.fish:33 msgid "Profile data format" msgstr "Format för profileringsdata" #: share/completions/grep.fish:14 msgid "Action for devices" msgstr "Handling för enheter" #: share/completions/grep.fish:15 msgid "Action for directories" msgstr "Handling för kataloger" #: share/completions/grep.fish:19 msgid "Use pattern from file" msgstr "Använd mönster frÃ¥n fil" #: share/completions/gunzip.fish:15 share/completions/gzip.fish:17 msgid "Suffix" msgstr "Suffix" #: share/completions/help.fish:6 msgid "Help for the specified command" msgstr "Hjälp för det angivna kommandot" #: share/completions/help.fish:9 msgid "Introduction to the fish syntax" msgstr "" #: share/completions/help.fish:10 msgid "Incomplete aspects of fish" msgstr "" #: share/completions/help.fish:11 msgid "Known fish bugs" msgstr "" #: share/completions/help.fish:12 msgid "Help on how to reuse previously entered commands" msgstr "" #: share/completions/help.fish:14 msgid "Help on how tab-completion works" msgstr "Hjälp om hur tabbkomplettering fungerar" #: share/completions/help.fish:15 msgid "Help on how job control works" msgstr "Hjälp om hur jobbkontroll fungerar" #: share/completions/help.fish:16 msgid "Summary on how fish differs from other shells" msgstr "Summera hur fish skiljer sig frÃ¥n andra skal" #: share/completions/help.fish:18 msgid "Help on how to set the prompt" msgstr "Hjälp om hur man ändrar prompten" #: share/completions/help.fish:19 msgid "Help on how to set the titlebar message" msgstr "Hjälp om hur man ändrar titelradsmeddelandet" #: share/completions/help.fish:20 msgid "Help on how to copy and paste" msgstr "Hjälp om hur man kopierar och klistrar in" #: share/completions/help.fish:21 msgid "Help on editor shortcuts" msgstr "Hjälp om tangentbordsgenvägar" #: share/completions/help.fish:22 msgid "Help on environment variables" msgstr "Hjälp om miljövariabler" #: share/completions/help.fish:23 msgid "Help on setting syntax highlighting colors" msgstr "Hjälp om syntaxfärgläggningsfärger" #: share/completions/help.fish:25 share/completions/help.fish:26 msgid "Help on parameter expansion (Globbing)" msgstr "Hjälp om parameterexpansion (Globbing)" #: share/completions/help.fish:27 #, sh-format msgid "Help on variable expansion $VARNAME" msgstr "Hjälp om variabelexpansion $VARIABEL" #: share/completions/help.fish:28 msgid "Help on home directory expansion ~USER" msgstr "Hjälp om hemkatalogexpansion ~ANVÄNDARE" #: share/completions/help.fish:29 msgid "Help on brace expansion {a,b,c}" msgstr "Hjälp om klammerparantesexpansion {a,b,c}" #: share/completions/help.fish:30 msgid "Help on wildcard expansion *.*" msgstr "Hjälp om jokertecken *.*" #: share/completions/help.fish:31 msgid "Help on command substitution (SUBCOMMAND)" msgstr "Hjälp om kommandosubstitution (UNDERKOMMANDO)" #: share/completions/help.fish:32 msgid "Help on process expansion %JOB" msgstr "Hjälp om processexpansion %JOB" #: share/completions/hg.fish:17 #, fuzzy msgid "add the specified files on the next commit" msgstr "Lägg till angiven fil fill den nuvarande listan av nyckelringar" #: share/completions/hg.fish:18 #, fuzzy msgid "show changeset information per file line" msgstr "Visa ändringsinformation för paket" #: share/completions/hg.fish:19 msgid "create unversioned archive of a repository revision" msgstr "" #: share/completions/hg.fish:20 msgid "reverse effect of earlier changeset" msgstr "" #: share/completions/hg.fish:21 #, fuzzy msgid "create a changegroup file" msgstr "Skapa en kontrollpunktfil" #: share/completions/hg.fish:22 #, fuzzy msgid "output the latest or given revisions of files" msgstr "Visa loggmeddelanden för en uppsättning revisioner och/eller filer" #: share/completions/hg.fish:23 #, fuzzy msgid "make a copy of an existing repository" msgstr "Skapa lokal kopia av förrÃ¥d" #: share/completions/hg.fish:24 #, fuzzy msgid "commit the specified files or all outstanding changes" msgstr "Dekryptera angiven fil eller standard in" #: share/completions/hg.fish:25 msgid "mark files as copied for the next commit" msgstr "" #: share/completions/hg.fish:26 #, fuzzy msgid "diff repository (or selected files)" msgstr "Radera urval" #: share/completions/hg.fish:27 msgid "dump the header and diffs for one or more changesets" msgstr "" #: share/completions/hg.fish:28 msgid "search for a pattern in specified files and revisions" msgstr "" #: share/completions/hg.fish:29 msgid "show current repository heads" msgstr "" #: share/completions/hg.fish:30 msgid "show help for a command, extension, or list of commands" msgstr "" #: share/completions/hg.fish:31 #, fuzzy msgid "print information about the working copy" msgstr "Hämta ändringar frÃ¥n förrÃ¥det till arbetskopian" #: share/completions/hg.fish:32 #, fuzzy msgid "import an ordered set of patches" msgstr "Visa byteavstÃ¥nd för matchningar" #: share/completions/hg.fish:33 msgid "show new changesets found in source" msgstr "" #: share/completions/hg.fish:34 #, fuzzy msgid "create a new repository in the given directory" msgstr "Skapa förrÃ¥d om det inte redan existerar" #: share/completions/hg.fish:35 #, fuzzy msgid "locate files matching specific patterns" msgstr "Visa inte filer som matchar mönster" #: share/completions/hg.fish:36 msgid "show revision history of entire repository or files" msgstr "" #: share/completions/hg.fish:37 msgid "output the latest or given revision of the project manifest" msgstr "" #: share/completions/hg.fish:38 msgid "Merge working directory with another revision" msgstr "" #: share/completions/hg.fish:39 msgid "show changesets not found in destination" msgstr "" #: share/completions/hg.fish:40 msgid "show the parents of the working dir or revision" msgstr "" #: share/completions/hg.fish:41 msgid "show definition of symbolic path names" msgstr "" #: share/completions/hg.fish:42 #, fuzzy msgid "pull changes from the specified source" msgstr "FrÃ¥ga paket med angiven grupp" #: share/completions/hg.fish:43 #, fuzzy msgid "push changes to the specified destination" msgstr "FrÃ¥ga paket med angiven grupp" #: share/completions/hg.fish:44 msgid "roll back an interrupted transaction" msgstr "" #: share/completions/hg.fish:45 #, fuzzy msgid "remove the specified files on the next commit" msgstr "Flytta filen angiven pÃ¥ kommandoraden" #: share/completions/hg.fish:46 msgid "rename files; equivalent of copy + remove" msgstr "" #: share/completions/hg.fish:47 msgid "revert files or dirs to their states as of some revision" msgstr "" #: share/completions/hg.fish:48 #, fuzzy msgid "roll back the last transaction in this repository" msgstr "Ordna om fixarna i förrÃ¥det" #: share/completions/hg.fish:49 msgid "print the root (top) of the current working dir" msgstr "" #: share/completions/hg.fish:50 #, fuzzy msgid "export the repository via HTTP" msgstr "Uppdatera förrÃ¥d" #: share/completions/hg.fish:51 #, fuzzy msgid "show changed files in the working directory" msgstr "Ändra arbetskatalog" #: share/completions/hg.fish:52 msgid "add a tag for the current tip or a given revision" msgstr "" #: share/completions/hg.fish:53 #, fuzzy msgid "list repository tags" msgstr "Inaktivera förrÃ¥d" #: share/completions/hg.fish:54 #, fuzzy msgid "show the tip revision" msgstr "Visa tid" #: share/completions/hg.fish:55 #, fuzzy msgid "apply a changegroup file" msgstr "Läs paket frÃ¥n fil" #: share/completions/hg.fish:56 #, fuzzy msgid "update or merge working directory" msgstr "Ändra arbetskatalog" #: share/completions/hg.fish:57 #, fuzzy msgid "verify the integrity of the repository" msgstr "Ta bort ett inlägg frÃ¥n förrÃ¥d" #: share/completions/hg.fish:58 #, fuzzy msgid "output version and copyright information" msgstr "Ignorera versionsmagiinformation" #: share/completions/hg.fish:100 #, fuzzy msgid "Remembers the parent of the working directory" msgstr "Ändra arbetskatalog" #: share/completions/ifconfig.fish:1 msgid "Stop interface" msgstr "Stanna gränssnitt" #: share/completions/ifconfig.fish:2 msgid "Start interface" msgstr "Starta gränssnitt" #: share/completions/ifconfig.fish:25 msgid "Network interface" msgstr "Nätverkgränssnitt" #: share/completions/less.fish:3 msgid "Buffer space" msgstr "Buffert-utrymme" #: share/completions/locate.fish:22 msgid "Search the file name databases in these directories" msgstr "" #: share/completions/locate.fish:23 #, fuzzy msgid "Limit the number of matches" msgstr "Skriv bara ut angivet antal matchningar" #: share/completions/make.fish:12 msgid "Target" msgstr "MÃ¥l" #: share/completions/make.fish:13 msgid "Use file as makefile" msgstr "Använd som make-fil" #: share/completions/make.fish:18 msgid "Search directory for makefile" msgstr "Sökkatalog för make-fil" #: share/completions/make.fish:19 msgid "Number of concurrent jobs" msgstr "Antal simultana jobb" #: share/completions/make.fish:23 msgid "Ignore specified file" msgstr "Ignorera angiven fil" #: share/completions/make.fish:32 msgid "Pretend file is modified" msgstr "LÃ¥tsas att fil modifierats" #: share/completions/makedepend.fish:1 msgid "Define" msgstr "Definering" #: share/completions/makedepend.fish:2 msgid "Include directory" msgstr "Inkluderingskatalog" #: share/completions/makedepend.fish:3 msgid "Replace include directories" msgstr "Ersätt inkluderingskataloger" #: share/completions/makedepend.fish:5 msgid "Specify makefile" msgstr "Ange makefil" #: share/completions/makedepend.fish:6 msgid "Prepend file to input" msgstr "Lägg till fil före indata" #: share/completions/makedepend.fish:7 msgid "Object file suffix" msgstr "Objektfilsuffix" #: share/completions/makedepend.fish:8 msgid "Object file prefix" msgstr "Objektfilprefix" #: share/completions/makedepend.fish:9 msgid "Starting string delimiter" msgstr "Avdelare för start av sträng" #: share/completions/makedepend.fish:10 msgid "Line width" msgstr "Radbredd" #: share/completions/mount.fish:19 msgid "Mount partition with specified label" msgstr "Montera partitioner med angiven etikett" #: share/completions/mount.fish:20 msgid "Mount partition with specified UID" msgstr "Montera partition med angivet UID" #: share/completions/mount.fish:21 msgid "Exclude filesystems" msgstr "Exkludera filsystem" #: share/completions/mount.fish:22 msgid "Remount a subtree to a second position" msgstr "Montera om ett subträd till en andra plats" #: share/completions/mount.fish:23 msgid "Move a subtree to a new position" msgstr "Flytta ett subträd till en ny plats" #: share/completions/mount.fish:24 msgid "Filesystem" msgstr "Filsystem" #: share/completions/mount.fish:26 msgid "Mount option" msgstr "Monteringsflagga" #: share/completions/mplayer.fish:28 msgid "A/V sync speed" msgstr "Ljud/bild synkroniseringshastighet" #: share/completions/mplayer.fish:32 msgid "Loop playback" msgstr "Upprepa uppspelning" #: share/completions/mplayer.fish:58 share/completions/mplayer.fish:76 msgid "Video output" msgstr "Bildutdata" #: share/completions/mplayer.fish:64 share/completions/mplayer.fish:70 msgid "Audio output" msgstr "Ljudutdata" #: share/completions/mutt.fish:14 msgid "An expanded version of the given alias is passed to stdout" msgstr "" #: share/completions/mutt.fish:15 msgid "Attach a file to your message using MIME" msgstr "" #: share/completions/mutt.fish:16 msgid "Specify a blind-carbon-copy (BCC) recipient" msgstr "" #: share/completions/mutt.fish:17 msgid "Specify a carbon-copy (CC) recipient" msgstr "" #: share/completions/mutt.fish:18 msgid "Run command after processing of initialization files" msgstr "" #: share/completions/mutt.fish:19 #, fuzzy msgid "Specify which mailbox to load" msgstr "Ange sendmailkommando" #: share/completions/mutt.fish:20 #, fuzzy msgid "Specify an initialization file to read instead of ~/.muttrc" msgstr "Ange logmeddelande istället för att anropa editor" #: share/completions/mutt.fish:21 msgid "Specify a draft file containing header and body for the message" msgstr "" #: share/completions/mutt.fish:22 msgid "Specify a file to include into the body of a message" msgstr "" #: share/completions/mutt.fish:23 #, fuzzy msgid "Specify a default mailbox type" msgstr "Välj kärnversion" #: share/completions/mutt.fish:24 #, fuzzy msgid "Query a configuration variables value" msgstr "Välj en konfigurationsfil" #: share/completions/mutt.fish:25 #, fuzzy msgid "Specify the subject of the message" msgstr "Ange meddelande för tillägg" #: share/completions/mv.fish:4 msgid "Answer for overwrite questions" msgstr "Svar till överskrivningsfrÃ¥gor" #: share/completions/perl.fish:5 msgid "Debug option" msgstr "Debugflagga" #: share/completions/perl.fish:6 share/completions/ruby.fish:7 msgid "Execute command" msgstr "Utför kommando" #: share/completions/python.fish:1 msgid "Execute argument as command" msgstr "Utför parameter som kommando" #: share/completions/python.fish:7 msgid "Division control" msgstr "Divisionskontroll" #: share/completions/python.fish:13 msgid "Warning control" msgstr "Varningsläge" #: share/completions/rpm.fish:22 msgid "Add suggested packages to the transaction set when needed" msgstr "Lägg till föreslagna paket till transkation vid behov" #: share/completions/rpm.fish:23 msgid "" "Installs or upgrades all the files in the package, even if they aren't " "needed (missingok) and don't exist" msgstr "" "Installerar eller uppgraderar alla saknade filer i paketet, även om de inte " "behövs (missingok) och inte existerar" #: share/completions/rpm.fish:24 msgid "" "Used with --relocate, permit relocations on all file paths, not just those " "OLD-PATH's included in the binary package relocation hint(s)" msgstr "" "Använd tillsammans med --relocate, tillÃ¥ter flyttning pÃ¥ alla fökvägar, inte " "bara de OLD_PATH inkluderade i de binära paketflyttningshintarna" #: share/completions/rpm.fish:25 msgid "Don't install files whose name begins with specified path" msgstr "Installera inte filer vars namn börjar med angiven sökväg" #: share/completions/rpm.fish:26 msgid "Don't install any files which are marked as documentation" msgstr "Installera inte filer som markerats som dokumentation" #: share/completions/rpm.fish:27 msgid "Same as using --replacepkgs, --replacefiles, and --oldpackage" msgstr "Samma sak som --replacepkgs, --replacefiles, och --oldpackage" #: share/completions/rpm.fish:28 msgid "Print 50 hash marks as the package archive is unpacked" msgstr "Visa 50 brädgÃ¥rdstecken medan arkivet packas upp" #: share/completions/rpm.fish:29 msgid "Don't check for sufficient disk space before installation" msgstr "Kontrollera inte diskutrymme före installation" #: share/completions/rpm.fish:30 msgid "" "Allow installation or upgrading even if the architectures of the binary " "package and host don't match" msgstr "" "TillÃ¥t installation eller uppgradering även om binärt pakets arkitetkur inte " "matchar värddatorns" #: share/completions/rpm.fish:31 msgid "" "Allow installation or upgrading even if the operating systems of the binary " "package and host don't match" msgstr "" "TillÃ¥t installation eller uppgradering även om binärt pakets operativsystem " "inte matchar värddatorns" #: share/completions/rpm.fish:32 msgid "Install documentation files (default)" msgstr "Installera dokumentation (standard)" #: share/completions/rpm.fish:33 msgid "Update only the database, not the filesystem" msgstr "Uppdatera bara databasen, inte filsystemet" #: share/completions/rpm.fish:34 share/completions/rpm.fish:94 msgid "Don't verify package or header digests when reading" msgstr "Kontrollera inte paket- eller huvudsammanfattningar vid inläsning" #: share/completions/rpm.fish:35 share/completions/rpm.fish:97 msgid "Don't verify package or header signatures when reading" msgstr "Kontrollera inte paket- eller huvudsignatur vid inläsning" #: share/completions/rpm.fish:36 msgid "Don't do a dependency check" msgstr "Utför inte beroendeverifiering" #: share/completions/rpm.fish:37 msgid "Don't suggest package(s) that provide a missing dependency" msgstr "FöreslÃ¥ inte paket som upfyller ett ouppfyllt beroende" #: share/completions/rpm.fish:38 msgid "Don't change the package installation order" msgstr "Byt inte paketinstallationsordning " #: share/completions/rpm.fish:39 msgid "Don't execute scripts" msgstr "Kör inte skript" #: share/completions/rpm.fish:40 msgid "Don't execute pre scripts" msgstr "Kör inte pre-skript" #: share/completions/rpm.fish:41 msgid "Don't execute post scripts" msgstr "Kör inte post-skript" #: share/completions/rpm.fish:42 msgid "Don't execute preun scripts" msgstr "Kör inte preun-skript" #: share/completions/rpm.fish:43 msgid "Don't execute postun scripts" msgstr "Kör inte postun-skript" #: share/completions/rpm.fish:44 share/completions/rpm.fish:115 msgid "Don't execute trigger scriptlets" msgstr "Kör inte trigger-skriptlets" #: share/completions/rpm.fish:45 msgid "Don't execute triggerin scriptlets" msgstr "Kör inte triggerin-skriptlets" #: share/completions/rpm.fish:46 share/completions/rpm.fish:116 msgid "Don't execute triggerun scriptlets" msgstr "Kör inte triggerun-skriptlets" #: share/completions/rpm.fish:47 share/completions/rpm.fish:117 msgid "Don't execute triggerpostun scriptlets" msgstr "Kör inte triggerpostun-skriptlets" #: share/completions/rpm.fish:48 msgid "Allow an upgrade to replace a newer package with an older one" msgstr "TillÃ¥t en uppgradering att ersätta ett nyare paket med ett äldre" #: share/completions/rpm.fish:49 msgid "" "Print percentages as files are unpacked from the package archive. This is " "intended to make rpm easy to run from other tools" msgstr "" "Visa procentandel medan filer packas upp frÃ¥n paketarkiv. Detta är tänkt att " "användas för att göra rpm lättare att köra frÃ¥n andra verktyg" #: share/completions/rpm.fish:50 msgid "" "For relocatable binary packages, translate all file paths that start with " "the installation prefix in the package relocation hint(s) to NEWPATH" msgstr "" "För flyttbara binära paket, översätt alla sökvägar som startar med " "installationsprefixet i paketets flytthintar till den angivna sökvägen" #: share/completions/rpm.fish:52 share/completions/rpm.fish:118 msgid "Re-package the files before erasing" msgstr "Ompaketera paket inan radering" #: share/completions/rpm.fish:53 msgid "" "Install the packages even if they replace files from other, already " "installed, packages" msgstr "" "Installera paket även om de ersätter filer frÃ¥n andra, redan installerade " "paket" #: share/completions/rpm.fish:54 msgid "" "Install the packages even if some of them are already installed on this " "system" msgstr "Installera paket även om somliga redan är installerade" #: share/completions/rpm.fish:55 msgid "" "Don't install the package, simply check for and report potential conflicts" msgstr "" "Installera inte paket, kontrollera och rapportera potentiella konflikter" #: share/completions/rpm.fish:59 msgid "Display change information for the package" msgstr "Visa ändringsinformation för paket" #: share/completions/rpm.fish:60 msgid "List only configuration files (implies -l)" msgstr "Visa bara konfigurationsfiler (implicerar -l)" #: share/completions/rpm.fish:61 msgid "List only documentation files (implies -l)" msgstr "Visa bara dokumentationsfiler (implicerar -l)" #: share/completions/rpm.fish:62 msgid "Dump file information. Must be used with at least one of -l, -c, -d" msgstr "Dumpa filinformation. Kräver minst en av -l, -c, -d" #: share/completions/rpm.fish:63 msgid "List all the files in each selected package" msgstr "Visa alla filer i varje valt paket" #: share/completions/rpm.fish:64 msgid "" "Display package information, including name, version, and description. Uses " "--queryformat if specified" msgstr "" "Visa paketinformation, inklusive namn, version och beskrivning. Använder --" "queryfromet om angivet" #: share/completions/rpm.fish:65 msgid "Orders the package listing by install time" msgstr "Sortera paketlistning efter installationstid" #: share/completions/rpm.fish:66 msgid "List files in package" msgstr "Visa filer i paket" #: share/completions/rpm.fish:67 msgid "List capabilities this package provides" msgstr "Visa förmÃ¥gor som detta paket tillhandahÃ¥ller" #: share/completions/rpm.fish:68 msgid "List packages on which this package depends" msgstr "Visa paket som detta paket beror pÃ¥" #: share/completions/rpm.fish:69 msgid "List the package specific scriptlets" msgstr "Visa paket-specifika skriptlets" #: share/completions/rpm.fish:70 msgid "" "Display the states of files in the package. The state of each file is one of " "normal, not installed, or replaced" msgstr "" "Visa tillstÃ¥nd för paketets filer. TillstÃ¥ndet är en av normal, inte " "installerad och ersatt" #: share/completions/rpm.fish:71 share/completions/rpm.fish:72 msgid "Display the trigger scripts contained in the package" msgstr "Visa paketets triggerskript" #: share/completions/rpm.fish:78 msgid "Query all installed packages" msgstr "FrÃ¥ga alla installerade paket" #: share/completions/rpm.fish:79 msgid "Query package owning specified file" msgstr "FrÃ¥ga paket som äger angiven fil" #: share/completions/rpm.fish:80 msgid "" "Query package that contains a given file identifier, i.e. the MD5 digest of " "the file contents" msgstr "" "FrÃ¥ga paket som innehÃ¥ller en given filidentitet, dvs. MD5-summa av " "filinnehÃ¥ll" #: share/completions/rpm.fish:81 msgid "Query packages with the specified group" msgstr "FrÃ¥ga paket med angiven grupp" #: share/completions/rpm.fish:82 msgid "" "Query package that contains a given header identifier, i.e. the SHA1 digest " "of the immutable header region" msgstr "" "FrÃ¥ga paket som innehÃ¥ller en given huvudidentitet, dvs. SHA1-summa av den " "konstanta huvud-regionen" #: share/completions/rpm.fish:83 msgid "Query an (uninstalled) package in specified file" msgstr "FrÃ¥ga ett (oinstallerat) paket i angiven fil" #: share/completions/rpm.fish:84 msgid "" "Query package that contains a given package identifier, i.e. the MD5 digest " "of the combined header and payload contents" msgstr "" "FrÃ¥ga paket som innehÃ¥ller en given paketidentitet, dvs. MD5-summa av den " "kombinerade huvud- och filinnehÃ¥llet" #: share/completions/rpm.fish:85 msgid "Parse and query specified spec-file as if it were a package" msgstr "Tolka och frÃ¥ga angiven spec-fil som om det vore ett paket" #: share/completions/rpm.fish:86 msgid "Query package(s) that have the specified TID (transaction identifier)" msgstr "FrÃ¥ga paket med angiven TID (transaktions-id)" #: share/completions/rpm.fish:87 msgid "Query packages that are triggered by the specified packages" msgstr "FrÃ¥ga paket som triggas av angivna paket" #: share/completions/rpm.fish:88 msgid "Query all packages that provide the specified capability" msgstr "FrÃ¥ga alla paket som tillhandahÃ¥ller den angivna förmÃ¥gan" #: share/completions/rpm.fish:89 msgid "" "Query all packages that requires the specified capability for functioning" msgstr "FrÃ¥ga alla paket som kräver den angivna förmÃ¥gan för att fungera" #: share/completions/rpm.fish:93 msgid "Don't verify dependencies of packages" msgstr "Verifiera inte paketens beroenden" #: share/completions/rpm.fish:95 msgid "Don't verify any attributes of package files" msgstr "Verifiera inga attribut i paketfiler" #: share/completions/rpm.fish:96 msgid "Don't execute the %verifyscript scriptlet" msgstr "Utför inte %verifyskriptlet" #: share/completions/rpm.fish:98 msgid "Don't verify linkto attribute" msgstr "Verifiera inte linkto-attribut" #: share/completions/rpm.fish:99 msgid "Don't verify md5 attribute" msgstr "Verifiera inte md5-attribut" #: share/completions/rpm.fish:100 msgid "Don't verify size attribute" msgstr "Verifiera inte storleksattribut" #: share/completions/rpm.fish:101 msgid "Don't verify user attribute" msgstr "Verifiera inte användarattribut" #: share/completions/rpm.fish:102 msgid "Don't verify group attribute" msgstr "Verifiera inte gruppattribut" #: share/completions/rpm.fish:103 msgid "Don't verify time attribute" msgstr "Verifiera inte tidsattribut" #: share/completions/rpm.fish:104 msgid "Don't verify mode attribute" msgstr "Verifiera inte filrättighetsattribut" #: share/completions/rpm.fish:105 msgid "Don't verify dev attribute" msgstr "Verifiera inte enhetsattribut" #: share/completions/rpm.fish:110 msgid "Remove all versions of the package which match specified string" msgstr "Ta bort alla version av paketet som matchar angiven sträng" #: share/completions/rpm.fish:111 msgid "Don't check dependencies before uninstalling the packages" msgstr "Verifiera inte beroenden före paketen avinstalleras" #: share/completions/rpm.fish:112 msgid "Don't execute scriplets" msgstr "Kör inte skriptlets" #: share/completions/rpm.fish:113 msgid "Don't execute preun scriptlet" msgstr "Kör inte preun-skriptlet" #: share/completions/rpm.fish:114 msgid "Don't execute postun scriptlet" msgstr "Kör inte postun-skriptlet" #: share/completions/rpm.fish:119 msgid "Don't really uninstall anything" msgstr "Avinstallera ingenting pÃ¥ riktigt" #: share/completions/rpm.fish:123 msgid "Install new package" msgstr "Installera nytt paket" #: share/completions/rpm.fish:124 msgid "Upgrade existing package" msgstr "Upgradera existerande paket" #: share/completions/rpm.fish:125 msgid "Upgrade package if already installed" msgstr "Upgradera paket om det är installerat" #: share/completions/rpm.fish:126 msgid "Query installed packages" msgstr "FrÃ¥ga installerat paket" #: share/completions/rpm.fish:127 msgid "Verify package integrity" msgstr "Verifiera paketintegritet" #: share/completions/rpm.fish:128 msgid "Erase package" msgstr "Ta bort paket" #: share/completions/rsync.fish:41 msgid "Force a fixed checksum block-size" msgstr "" #: share/completions/rsync.fish:42 #, fuzzy msgid "Specify the remote shell to use" msgstr "Ange förrÃ¥d-URL" #: share/completions/rsync.fish:43 #, fuzzy msgid "Specify the rsync to run on remote machine" msgstr "Välj destinationsadress" #: share/completions/rsync.fish:69 msgid "Also compare received files relative to DIR" msgstr "" #: share/completions/rsync.fish:70 msgid "" "Also compare received files relative to DIR and include copies of unchanged " "files" msgstr "" #: share/completions/rsync.fish:93 #, fuzzy msgid "Output filenames using the specified format" msgstr "Exklidera filer listade i angiven fil" #: share/completions/rsync.fish:94 msgid "Read password from FILE" msgstr "" #: share/completions/rsync.fish:96 msgid "Limit I/O bandwidth; KBytes per second" msgstr "" #: share/completions/rsync.fish:97 msgid "Write a batched update to FILE" msgstr "" #: share/completions/rsync.fish:99 #, fuzzy msgid "Read a batched update from FILE" msgstr "Läs fix frÃ¥n patchfil" #: share/completions/rsync.fish:100 msgid "Force an older protocol version to be used" msgstr "" #: share/completions/rsync.fish:101 msgid "Set block/file checksum seed (advanced)" msgstr "" #: share/completions/ruby.fish:15 msgid "Require file" msgstr "Kräv fil" #: share/completions/scp.fish:29 msgid "Bandwidth limit" msgstr "Bandbreddsgräns" #: share/completions/scp.fish:30 share/completions/ssh.fish:36 #: share/completions/sshfs.fish:25 msgid "Port" msgstr "Port" #: share/completions/screen.fish:1 msgid "Print a list of running screen sessions" msgstr "Visa lista pÃ¥ alla körande screen-sessioner" #: share/completions/sed.fish:13 msgid "Evaluate expression" msgstr "Utför argument som kommandon" #: share/completions/sed.fish:14 msgid "Evalute file" msgstr "Utför filinnehÃ¥ll som kommandon" #: share/completions/sed.fish:22 msgid "Specify line-length" msgstr "Välj radlängd" #: share/completions/set.fish:73 share/completions/set_color.fish:1 msgid "Color" msgstr "Färg" #: share/completions/set.fish:74 share/completions/set_color.fish:2 msgid "Change background color" msgstr "Byt bakgrundsfärg" #: share/completions/set.fish:79 msgid "Locale" msgstr "Lokal" #: share/completions/sort.fish:12 msgid "Write to file" msgstr "Skriv till fil" #: share/completions/sort.fish:14 msgid "Set memory buffer size" msgstr "Välj minnesbuffertstorlek" #: share/completions/sort.fish:16 msgid "Set temporary directory" msgstr "Välj katalog för tillfälligt lagringsutrymme" #: share/completions/ssh.fish:21 msgid "Interface to transmit from" msgstr "Gränssnitt att skicka frÃ¥n" #: share/completions/ssh.fish:27 msgid "Escape character" msgstr "Avbrottstecken" #: share/completions/ssh.fish:32 msgid "User" msgstr "Användare" #: share/completions/su.fish:5 msgid "Pass command to shell" msgstr "Skicka kommando till skalet" #: share/completions/svn.fish:17 msgid "" "Put files and directories under version control, scheduling them for " "addition to repository. They will be added in next commit." msgstr "" #: share/completions/svn.fish:18 share/completions/svn.fish:19 #: share/completions/svn.fish:20 share/completions/svn.fish:21 #, fuzzy msgid "" "Output the content of specified files or URLs with revision and author " "information in-line." msgstr "Visa filer/URL:er med revisions- och författarinformation inbakat" #: share/completions/svn.fish:22 #, fuzzy msgid "Output the content of specified files or URLs." msgstr "Visa innehÃ¥ll av filer/URL:er" #: share/completions/svn.fish:23 share/completions/svn.fish:24 #, fuzzy msgid "Check out a working copy from a repository." msgstr "Hämta ut en arbetskopia frÃ¥n förrÃ¥det" #: share/completions/svn.fish:25 msgid "" "Recursively clean up the working copy, removing locks, resuming unfinished " "operations, etc." msgstr "" #: share/completions/svn.fish:26 share/completions/svn.fish:27 #, fuzzy msgid "Send changes from your working copy to the repository." msgstr "Skicka ändringar i arbetskopian till lagret" #: share/completions/svn.fish:28 share/completions/svn.fish:29 #, fuzzy msgid "Duplicate something in working copy or repository, remembering history." msgstr "Flytta och/eller byt namn pÃ¥ nÃ¥gonting i arbetskopian eller förrÃ¥det" #: share/completions/svn.fish:30 share/completions/svn.fish:31 #: share/completions/svn.fish:32 share/completions/svn.fish:33 #, fuzzy msgid "Remove files and directories from version control." msgstr "Placera filer och kataloger under versionskontroll" #: share/completions/svn.fish:34 share/completions/svn.fish:35 #, fuzzy msgid "Display the differences between two revisions or paths." msgstr "Applicera differensen mellan tvÃ¥ källor till en arbetskopiesökväg" #: share/completions/svn.fish:36 msgid "Create an unversioned copy of a tree." msgstr "" #: share/completions/svn.fish:37 share/completions/svn.fish:38 #: share/completions/svn.fish:39 #, fuzzy msgid "Describe the usage of this program or its subcommands." msgstr "Beskriv användandet av detta program eller dess underkommandon" #: share/completions/svn.fish:40 #, fuzzy msgid "Commit an unversioned file or tree into the repository." msgstr "Lägg till fil eller träd utan version till förrÃ¥det" #: share/completions/svn.fish:41 #, fuzzy msgid "Display information about a local or remote item." msgstr "Visa information om lokal eller fjärrelement" #: share/completions/svn.fish:42 share/completions/svn.fish:43 #, fuzzy msgid "List directory entries in the repository." msgstr "Lista kataloger i förrÃ¥det" #: share/completions/svn.fish:44 #, fuzzy msgid "" "Lock working copy paths or URLs in the repository, so that no other user can " "commit changes to them." msgstr "Läs arbetskopiwsökvägar eller URL:er i förrÃ¥det" #: share/completions/svn.fish:45 #, fuzzy msgid "Show the log messages for a set of revision(s) and/or file(s)." msgstr "Visa loggmeddelanden för en uppsättning revisioner och/eller filer" #: share/completions/svn.fish:46 #, fuzzy msgid "Apply the differences between two sources to a working copy path." msgstr "Applicera differensen mellan tvÃ¥ källor till en arbetskopiesökväg" #: share/completions/svn.fish:47 #, fuzzy msgid "Create a new directory under version control." msgstr "Skapa ny katalog under revisionskontroll" #: share/completions/svn.fish:48 share/completions/svn.fish:49 #: share/completions/svn.fish:50 share/completions/svn.fish:51 #, fuzzy msgid "Move and/or rename something in working copy or repository." msgstr "Flytta och/eller byt namn pÃ¥ nÃ¥gonting i arbetskopian eller förrÃ¥det" #: share/completions/svn.fish:52 share/completions/svn.fish:53 #: share/completions/svn.fish:54 #, fuzzy msgid "Remove a property from files, dirs, or revisions." msgstr "Ta bort en egenskap frÃ¥n filer, kataloger eller revisioner" #: share/completions/svn.fish:55 share/completions/svn.fish:56 #: share/completions/svn.fish:57 #, fuzzy msgid "Edit a property with an external editor." msgstr "Redigera en egenskap med extern edito för mÃ¥l" #: share/completions/svn.fish:58 share/completions/svn.fish:59 #: share/completions/svn.fish:60 #, fuzzy msgid "Print the value of a property on files, dirs, or revisions." msgstr "Skriv ut värde för en egenskap hos filer, kataloger eller revisioner" #: share/completions/svn.fish:61 share/completions/svn.fish:62 #: share/completions/svn.fish:63 #, fuzzy msgid "List all properties on files, dirs, or revisions." msgstr "Visa alla engenskaper hos filer, kataloger eller revisioner" #: share/completions/svn.fish:64 share/completions/svn.fish:65 #: share/completions/svn.fish:66 #, fuzzy msgid "Set the value of a property on files, dirs, or revisions." msgstr "Skriv ut värde för en egenskap hos filer, kataloger eller revisioner" #: share/completions/svn.fish:67 #, fuzzy msgid "Remove \\conflicted state on working copy files or directories." msgstr "Ta bort konflikttillstÃ¥nd hos arbetskopiefiler eller kataloger" #: share/completions/svn.fish:68 #, fuzzy msgid "Restore pristine working copy file (undo most local edits)." msgstr "Ã…terställ rensad arbetskopiefil" #: share/completions/svn.fish:69 share/completions/svn.fish:70 #: share/completions/svn.fish:71 #, fuzzy msgid "Print the status of working copy files and directories." msgstr "Visa status för arbetskopians filer och kataloger" #: share/completions/svn.fish:72 share/completions/svn.fish:73 #, fuzzy msgid "Update the working copy to a different URL." msgstr "Uppdatera arbetskopian till en annan URL" #: share/completions/svn.fish:74 #, fuzzy msgid "Unlock working copy paths or URLs." msgstr "LÃ¥s upp arbetskopians sökvägar eller URL:er" #: share/completions/svn.fish:75 share/completions/svn.fish:76 #, fuzzy msgid "Bring changes from the repository into the working copy." msgstr "Hämta ändringar frÃ¥n förrÃ¥det till arbetskopian" #: share/completions/svn.fish:83 share/completions/svn.fish:194 #: share/completions/svn.fish:255 share/completions/svn.fish:271 #: share/completions/svn.fish:287 share/completions/svn.fish:303 #: share/completions/svn.fish:406 share/completions/svn.fish:446 #: share/completions/svn.fish:461 share/completions/svn.fish:723 #: share/completions/svn.fish:738 share/completions/svn.fish:753 #: share/completions/svn.fish:767 share/completions/svn.fish:775 #: share/completions/svn.fish:854 #, fuzzy msgid "Pass contents of file ARG as additional args" msgstr "Skicka filinnehÃ¥ll som extra argument" #: share/completions/svn.fish:84 share/completions/svn.fish:102 #: share/completions/svn.fish:116 share/completions/svn.fish:130 #: share/completions/svn.fish:144 share/completions/svn.fish:155 #: share/completions/svn.fish:166 share/completions/svn.fish:178 #: share/completions/svn.fish:187 share/completions/svn.fish:219 #: share/completions/svn.fish:233 share/completions/svn.fish:247 #: share/completions/svn.fish:263 share/completions/svn.fish:279 #: share/completions/svn.fish:295 share/completions/svn.fish:311 #: share/completions/svn.fish:329 share/completions/svn.fish:347 #: share/completions/svn.fish:359 share/completions/svn.fish:368 #: share/completions/svn.fish:375 share/completions/svn.fish:382 #: share/completions/svn.fish:399 share/completions/svn.fish:413 #: share/completions/svn.fish:426 share/completions/svn.fish:439 #: share/completions/svn.fish:453 share/completions/svn.fish:469 #: share/completions/svn.fish:485 share/completions/svn.fish:499 #: share/completions/svn.fish:514 share/completions/svn.fish:529 #: share/completions/svn.fish:544 share/completions/svn.fish:559 #: share/completions/svn.fish:571 share/completions/svn.fish:583 #: share/completions/svn.fish:595 share/completions/svn.fish:610 #: share/completions/svn.fish:625 share/completions/svn.fish:640 #: share/completions/svn.fish:653 share/completions/svn.fish:666 #: share/completions/svn.fish:679 share/completions/svn.fish:691 #: share/completions/svn.fish:703 share/completions/svn.fish:715 #: share/completions/svn.fish:730 share/completions/svn.fish:745 #: share/completions/svn.fish:760 share/completions/svn.fish:768 #: share/completions/svn.fish:776 share/completions/svn.fish:790 #: share/completions/svn.fish:805 share/completions/svn.fish:820 #: share/completions/svn.fish:834 share/completions/svn.fish:847 #: share/completions/svn.fish:859 share/completions/svn.fish:872 #: share/completions/svn.fish:885 #, fuzzy msgid "Read user configuration files from directory ARG" msgstr "Läs användarkonfigurationsfiler frÃ¥n angiven katalog" #: share/completions/svn.fish:98 share/completions/svn.fish:112 #: share/completions/svn.fish:126 share/completions/svn.fish:140 #: share/completions/svn.fish:151 share/completions/svn.fish:162 #: share/completions/svn.fish:174 share/completions/svn.fish:215 #: share/completions/svn.fish:229 share/completions/svn.fish:243 #: share/completions/svn.fish:259 share/completions/svn.fish:275 #: share/completions/svn.fish:291 share/completions/svn.fish:307 #: share/completions/svn.fish:325 share/completions/svn.fish:343 #: share/completions/svn.fish:355 share/completions/svn.fish:395 #: share/completions/svn.fish:409 share/completions/svn.fish:422 #: share/completions/svn.fish:435 share/completions/svn.fish:449 #: share/completions/svn.fish:465 share/completions/svn.fish:481 #: share/completions/svn.fish:495 share/completions/svn.fish:510 #: share/completions/svn.fish:525 share/completions/svn.fish:540 #: share/completions/svn.fish:555 share/completions/svn.fish:567 #: share/completions/svn.fish:579 share/completions/svn.fish:591 #: share/completions/svn.fish:603 share/completions/svn.fish:618 #: share/completions/svn.fish:633 share/completions/svn.fish:649 #: share/completions/svn.fish:662 share/completions/svn.fish:675 #: share/completions/svn.fish:687 share/completions/svn.fish:699 #: share/completions/svn.fish:711 share/completions/svn.fish:725 #: share/completions/svn.fish:740 share/completions/svn.fish:755 #: share/completions/svn.fish:786 share/completions/svn.fish:801 #: share/completions/svn.fish:816 share/completions/svn.fish:830 #: share/completions/svn.fish:843 share/completions/svn.fish:855 #: share/completions/svn.fish:868 share/completions/svn.fish:881 #, fuzzy msgid "Specify a username ARG" msgstr "Välj användarnamn" #: share/completions/svn.fish:99 share/completions/svn.fish:113 #: share/completions/svn.fish:127 share/completions/svn.fish:141 #: share/completions/svn.fish:152 share/completions/svn.fish:163 #: share/completions/svn.fish:175 share/completions/svn.fish:216 #: share/completions/svn.fish:230 share/completions/svn.fish:244 #: share/completions/svn.fish:260 share/completions/svn.fish:276 #: share/completions/svn.fish:292 share/completions/svn.fish:308 #: share/completions/svn.fish:326 share/completions/svn.fish:344 #: share/completions/svn.fish:356 share/completions/svn.fish:396 #: share/completions/svn.fish:410 share/completions/svn.fish:423 #: share/completions/svn.fish:436 share/completions/svn.fish:450 #: share/completions/svn.fish:466 share/completions/svn.fish:482 #: share/completions/svn.fish:496 share/completions/svn.fish:511 #: share/completions/svn.fish:526 share/completions/svn.fish:541 #: share/completions/svn.fish:556 share/completions/svn.fish:568 #: share/completions/svn.fish:580 share/completions/svn.fish:592 #: share/completions/svn.fish:604 share/completions/svn.fish:619 #: share/completions/svn.fish:634 share/completions/svn.fish:650 #: share/completions/svn.fish:663 share/completions/svn.fish:676 #: share/completions/svn.fish:688 share/completions/svn.fish:700 #: share/completions/svn.fish:712 share/completions/svn.fish:726 #: share/completions/svn.fish:741 share/completions/svn.fish:756 #: share/completions/svn.fish:787 share/completions/svn.fish:802 #: share/completions/svn.fish:817 share/completions/svn.fish:831 #: share/completions/svn.fish:844 share/completions/svn.fish:856 #: share/completions/svn.fish:869 share/completions/svn.fish:882 #, fuzzy msgid "Specify a password ARG" msgstr "Välj lösenord" #: share/completions/svn.fish:186 share/completions/svn.fish:479 #: share/completions/svn.fish:828 share/completions/svn.fish:841 #: share/completions/svn.fish:867 share/completions/svn.fish:880 #, fuzzy msgid "Use ARG as merge command" msgstr "Ange sammanslagningskommando" #: share/completions/svn.fish:213 share/completions/svn.fish:227 #: share/completions/svn.fish:241 share/completions/svn.fish:257 #: share/completions/svn.fish:273 share/completions/svn.fish:289 #: share/completions/svn.fish:305 share/completions/svn.fish:392 #: share/completions/svn.fish:493 share/completions/svn.fish:508 #: share/completions/svn.fish:523 share/completions/svn.fish:538 #: share/completions/svn.fish:553 share/completions/svn.fish:608 #: share/completions/svn.fish:623 share/completions/svn.fish:638 #, fuzzy msgid "Use ARG as external editor" msgstr "Ange extern editor" #: share/completions/svn.fish:214 share/completions/svn.fish:228 #: share/completions/svn.fish:242 share/completions/svn.fish:258 #: share/completions/svn.fish:274 share/completions/svn.fish:290 #: share/completions/svn.fish:306 share/completions/svn.fish:393 #: share/completions/svn.fish:448 share/completions/svn.fish:494 #: share/completions/svn.fish:509 share/completions/svn.fish:524 #: share/completions/svn.fish:539 share/completions/svn.fish:554 #: share/completions/svn.fish:607 share/completions/svn.fish:622 #: share/completions/svn.fish:637 share/completions/svn.fish:722 #: share/completions/svn.fish:737 share/completions/svn.fish:752 msgid "Treat value as being in charset encoding ARG" msgstr "" #: share/completions/svn.fish:318 share/completions/svn.fish:336 msgid "Use ARG as the older target" msgstr "" #: share/completions/svn.fish:319 share/completions/svn.fish:337 msgid "Use ARG as the newer target" msgstr "" #: share/completions/svn.fish:320 share/completions/svn.fish:338 #, fuzzy msgid "Use ARG as diff command" msgstr "Ã…ngra ett redigeringskommando" #: share/completions/svn.fish:360 msgid "Use a different EOL marker than the standard" msgstr "" #: share/completions/svn.fish:470 msgid "Maximum number of log entries" msgstr "Maximalt antal logginlägg" #: share/completions/sylpheed.fish:8 msgid "Open composition window with address" msgstr "" #: share/completions/sylpheed.fish:9 msgid "Open composition window with attached files" msgstr "" #: share/completions/sylpheed.fish:10 #, fuzzy msgid "Receive new messages" msgstr "Ersätt ett loggmeddelande" #: share/completions/sylpheed.fish:11 msgid "Receive new messages of all accounts" msgstr "" #: share/completions/sylpheed.fish:12 msgid "Send all queued messages" msgstr "" #: share/completions/sylpheed.fish:13 msgid "Show the total number of messages for folder" msgstr "" #: share/completions/sylpheed.fish:14 msgid "Show the total number of messages for each folder" msgstr "" #: share/completions/sylpheed.fish:15 #, fuzzy msgid "Specify directory with configuration files" msgstr "Välj en konfigurationsfil" #: share/completions/tar.fish:19 share/functions/cd.fish:5 msgid "Change directory" msgstr "Ändra katalog" #: share/completions/tar.fish:21 msgid "Archive file" msgstr "Arkivfil" #: share/completions/tar.fish:31 msgid "Starting file in archive" msgstr "Startfil i arkiv" #: share/completions/tar.fish:33 msgid "Tape length" msgstr "Bandlängd" #: share/completions/tar.fish:36 msgid "Only store newer files" msgstr "Lagra bara nyare filer" #: share/completions/tar.fish:50 msgid "Extract file from file" msgstr "Axtrahera fil frÃ¥n fil" #: share/completions/tar.fish:54 msgid "Set volume name" msgstr "Välj volymnamn" #: share/completions/tar.fish:59 msgid "Exclude file" msgstr "Exkludera fil" #: share/completions/tar.fish:60 msgid "Exclude files listed in specified file" msgstr "Exklidera filer listade i angiven fil" #: share/completions/tar.fish:65 msgid "Filter through specified program" msgstr "Filtrera genom angivet program" #: share/completions/telnet.fish:9 share/completions/telnet.fish:14 msgid "Specifies an 8-bit data path" msgstr "Anger en 8-bitars dataväg" #: share/completions/telnet.fish:10 msgid "Do not try to negotiate TELNET BINARY option" msgstr "Försök inte förhandla TELNET BINARY-flaggan" #: share/completions/telnet.fish:11 msgid "Stops any character from being recognized as an escape character" msgstr "Hindra alla tecken frÃ¥n att kännas igen som specialsekvens" #: share/completions/telnet.fish:12 msgid "Use local Kerberos authentication, if possible" msgstr "Använd lokal kerberosautentisering, om möjligt" #: share/completions/telnet.fish:13 msgid "Specifies no automatic login to remote system" msgstr "Försök inte logga in automatiskt pÃ¥ fjärrsystem" #: share/completions/telnet.fish:15 msgid "Attempt automatic login" msgstr "Försök logga in automatiskt pÃ¥ fjärrsystem" #: share/completions/telnet.fish:16 msgid "Disables reading user's .telnetrc" msgstr "Inaktivera inläsning av användarens .telnetrc" #: share/completions/telnet.fish:17 msgid "Sets debug mode" msgstr "Väljer debugnivÃ¥" #: share/completions/telnet.fish:18 msgid "Sets IP TOS" msgstr "" #: share/completions/telnet.fish:19 msgid "Disables specified type of authentication" msgstr "Inaktivera angivna autentiseringstypen" #: share/completions/telnet.fish:20 msgid "User login" msgstr "Användarinloggning" #: share/completions/telnet.fish:21 msgid "Log to tracefile" msgstr "Logga till spÃ¥rfil" #: share/completions/telnet.fish:22 msgid "Turn on encryption" msgstr "SlÃ¥ pÃ¥ kryptering" #: share/completions/telnet.fish:23 msgid "User interface similar to rlogin" msgstr "Användargränssnitt liknande rlogin" #: share/completions/telnet.fish:24 msgid "Use Kerberos realm for authentication" msgstr "Använd Kerberos-realm för autentisering" #: share/completions/totem.fish:18 msgid "Tell any running totem instance: Add to playlist" msgstr "" #: share/completions/totem.fish:19 msgid "Tell any running totem instance: Play from playlist" msgstr "" #: share/completions/touch.fish:2 msgid "Set date back" msgstr "Sätt tillbaka datum" #: share/completions/touch.fish:4 msgid "Set date" msgstr "Välj datum" #: share/completions/touch.fish:5 msgid "Set date forward" msgstr "Sätt fram datum" #: share/completions/touch.fish:9 msgid "Set time" msgstr "Välj tid" #: share/completions/unrar.fish:5 #, fuzzy msgid "Extract files to current directory" msgstr "Läs filer i varje katalog" #: share/completions/unrar.fish:6 msgid "List archive" msgstr "Visa arkivinnehÃ¥ll" #: share/completions/unrar.fish:7 #, fuzzy msgid "List archive (technical)" msgstr "Visa arkivinnehÃ¥ll" #: share/completions/unrar.fish:8 #, fuzzy msgid "List archive (bare)" msgstr "Visa arkivinnehÃ¥ll" #: share/completions/unrar.fish:9 #, fuzzy msgid "Print file to stdout" msgstr "Skicka filer till standard ut" #: share/completions/unrar.fish:10 #, fuzzy msgid "Test archive files" msgstr "Arkivfil" #: share/completions/unrar.fish:11 #, fuzzy msgid "Verbosely list archive" msgstr "Verifiera arkiv" #: share/completions/unrar.fish:12 msgid "Verbosely list archive (technical)" msgstr "" #: share/completions/unrar.fish:13 msgid "Verbosely list archive (bare)" msgstr "" #: share/completions/unrar.fish:14 #, fuzzy msgid "Extract files with full path" msgstr "Axtrahera fil frÃ¥n fil" #: share/completions/update-eix-remote.fish:16 msgid "" "Fetch the eix-caches of some layman overlays into a temporary file resp. " "into FILE and add them to the eix database" msgstr "" #: share/completions/update-eix-remote.fish:16 msgid "Only fetch the overlays into FILE" msgstr "" #: share/completions/update-eix-remote.fish:16 msgid "Only add the overlays from FILE to the eix database" msgstr "" #: share/completions/update-eix-remote.fish:16 msgid "Remove all temporarily added virtual overlays from the eix database" msgstr "" #: share/completions/valgrind.fish:12 msgid "Skin" msgstr "Verktyg" #: share/completions/valgrind.fish:71 msgid "The number of bytes of heap overhead per allocation" msgstr "Antalet bytes av extra heap-utrymme som används per allokering" #: share/completions/valgrind.fish:72 msgid "Profile stack usage" msgstr "Profilera stackanvändning" #: share/completions/valgrind.fish:73 msgid "Depth of call chain" msgstr "Djup i anroppskedjan" #: share/completions/valgrind.fish:74 msgid "Profiling output format" msgstr "Utdataformat för profilering" #: share/completions/w.fish:6 msgid "Username" msgstr "Användarnamn" #: share/completions/wajig.fish:1 #, fuzzy msgid "Test if wajig has yet to be given the subcommand" msgstr "Testa om apt har tagit emot ett underkommando" #: share/completions/wajig.fish:10 #, fuzzy msgid "Test if wajig command should have packages as potential completion" msgstr "Testa om aptkommando borde ha paket som potentiell komplettering" #: share/completions/wajig.fish:97 #, fuzzy msgid "Download package and any packages it depends on" msgstr "Visa paket som detta paket beror pÃ¥" #: share/completions/wajig.fish:98 msgid "Install package and associated recommended packages" msgstr "" #: share/completions/wajig.fish:99 msgid "Reconfigure the named installed packages or run gkdebconf" msgstr "" #: share/completions/wajig.fish:100 #, fuzzy msgid "Reinstall each of the named packages" msgstr "Installera ett eller flera paket" #: share/completions/wajig.fish:101 msgid "Reload daemon configs, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:102 #, fuzzy msgid "Remove one or more packages (see also purge)" msgstr "Radera ett eller flera paket" #: share/completions/wajig.fish:103 msgid "Remove package and its dependees not required by others" msgstr "" #: share/completions/wajig.fish:104 msgid "Remove orphaned libraries (not required by installed packages)" msgstr "" #: share/completions/wajig.fish:105 #, fuzzy msgid "Generate a .deb file for an installed package" msgstr "Bygg och installera ett installerat paket" #: share/completions/wajig.fish:106 msgid "Initialise or reset the JIG archive files" msgstr "" #: share/completions/wajig.fish:107 msgid "Stop then start a daemon, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:108 #, fuzzy msgid "Install a RedHat .rpm package" msgstr "Installera nytt paket" #: share/completions/wajig.fish:109 msgid "Convert a RedHat .rpm file to a Debian .deb file" msgstr "" #: share/completions/wajig.fish:110 #, fuzzy msgid "Search for packages containing listed words" msgstr "Sök paket innehÃ¥llande mönster" #: share/completions/wajig.fish:111 msgid "Find local Debian archives suitable for sources.list" msgstr "" #: share/completions/wajig.fish:112 msgid "Configure the sources.list file which locates Debian archives" msgstr "" #: share/completions/wajig.fish:113 msgid "Provide a detailed description of package [same as detail]" msgstr "" #: share/completions/wajig.fish:114 msgid "Trace the steps that a dist-upgrade would perform" msgstr "" #: share/completions/wajig.fish:115 msgid "Trace the steps that an install would perform" msgstr "" #: share/completions/wajig.fish:116 msgid "Trace the steps that a remove would perform" msgstr "" #: share/completions/wajig.fish:117 msgid "Trace the steps that an upgrade would perform" msgstr "" #: share/completions/wajig.fish:118 share/completions/wajig.fish:119 msgid "Print out the size (in K) of all, or listed, installed packages" msgstr "" #: share/completions/wajig.fish:120 msgid "Generates list of package=version for all installed packages" msgstr "" #: share/completions/wajig.fish:121 #, fuzzy msgid "Retrieve and unpack sources for the named packages" msgstr "Visa paket som beror pÃ¥ det givna paketet" #: share/completions/wajig.fish:122 msgid "Start a daemon, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:123 #, fuzzy msgid "Show the version and available version of packages" msgstr "Visa fulla versioner för paket" #: share/completions/wajig.fish:124 share/completions/wajig.fish:125 msgid "Show the version and available version of matching packages" msgstr "" #: share/completions/wajig.fish:126 msgid "Stop a daemon, e.g., gdm, apache (see list-daemons)" msgstr "" #: share/completions/wajig.fish:127 msgid "Install package and associated suggested packages" msgstr "" #: share/completions/wajig.fish:128 msgid "Run the Gnome task selector to install groups of packages" msgstr "" #: share/completions/wajig.fish:129 #, fuzzy msgid "List packages with newer versions available for upgrading" msgstr "Uppdaterar till den bästa tillgängliga versionen" #: share/completions/wajig.fish:130 msgid "Remove listed packages from hold so they are again upgraded" msgstr "" #: share/completions/wajig.fish:131 msgid "Search for an unofficial Debian package at apt-get.org" msgstr "" #: share/completions/wajig.fish:132 #, fuzzy msgid "Update the list of down-loadable packages" msgstr "Updatera källkodpaketlista" #: share/completions/wajig.fish:133 msgid "Update default alternative for things like x-window-manager" msgstr "" #: share/completions/wajig.fish:134 msgid "Updates the local list of PCI ids from the internet master list" msgstr "" #: share/completions/wajig.fish:135 msgid "Updates the local list of USB ids from the internet master list" msgstr "" #: share/completions/wajig.fish:136 msgid "Upgrade all of the installed packages or just those listed" msgstr "" #: share/completions/wajig.fish:137 #, fuzzy msgid "List version and distribution of (all) packages." msgstr "Verifiera inga attribut i paketfiler" #: share/completions/wajig.fish:138 #, fuzzy msgid "A synonym for describe" msgstr "Synonym för -i" #: share/completions/wajig.fish:139 msgid "Find the package that supplies the given command or file" msgstr "" #: share/completions/wpa_cli.fish:3 msgid "get current WPA/EAPOL/EAP status" msgstr "" #: share/completions/wpa_cli.fish:4 msgid "get MIB variables (dot1x, dot11)" msgstr "" #: share/completions/wpa_cli.fish:5 msgid "show this usage help" msgstr "" #: share/completions/wpa_cli.fish:6 #, fuzzy msgid "show interfaces/select interface" msgstr "Välj gränssnitt" #: share/completions/wpa_cli.fish:7 #, fuzzy msgid "change debug level" msgstr "Välj debugnivÃ¥" #: share/completions/wpa_cli.fish:8 msgid "show full wpa_cli license" msgstr "" #: share/completions/wpa_cli.fish:9 msgid "IEEE 802.1X EAPOL state machine logoff" msgstr "" #: share/completions/wpa_cli.fish:10 msgid "IEEE 802.1X EAPOL state machine logon" msgstr "" #: share/completions/wpa_cli.fish:11 #, fuzzy msgid "set/list variables" msgstr "Radera variabel" #: share/completions/wpa_cli.fish:12 msgid "show PMKSA cache" msgstr "" #: share/completions/wpa_cli.fish:13 #, fuzzy msgid "force reassociation" msgstr "Tvinga namn/revision-association" #: share/completions/wpa_cli.fish:14 msgid "force wpa_supplicant to re-read its config file" msgstr "" #: share/completions/wpa_cli.fish:15 #, fuzzy msgid "force preauthentication" msgstr "Tvinga pseudo-tty-allokering" #: share/completions/wpa_cli.fish:16 msgid "configure identity for an SSID" msgstr "" #: share/completions/wpa_cli.fish:17 msgid "configure password for an SSID" msgstr "" #: share/completions/wpa_cli.fish:18 msgid "change password for an SSID" msgstr "" #: share/completions/wpa_cli.fish:19 #, fuzzy msgid "configure pin for an SSID" msgstr "Konfiurera för att bygga pÃ¥ given mÃ¥larkitektur" #: share/completions/wpa_cli.fish:20 msgid "configure one-time-password for an SSID" msgstr "" #: share/completions/wpa_cli.fish:21 msgid "configure private key passphrase for an SSID" msgstr "" #: share/completions/wpa_cli.fish:22 msgid "set preferred BSSID for an SSID" msgstr "" #: share/completions/wpa_cli.fish:23 msgid "list configured networks" msgstr "" #: share/completions/wpa_cli.fish:24 msgid "select a network (disable others)" msgstr "" #: share/completions/wpa_cli.fish:25 #, fuzzy msgid "enable a network" msgstr "Aktivera förrÃ¥d" #: share/completions/wpa_cli.fish:26 #, fuzzy msgid "disable a network" msgstr "Inaktivera förrÃ¥d" #: share/completions/wpa_cli.fish:27 #, fuzzy msgid "add a network" msgstr "Lägg till ny nyckel" #: share/completions/wpa_cli.fish:28 #, fuzzy msgid "remove a network" msgstr "Ta bort en nyckel" #: share/completions/wpa_cli.fish:29 msgid "set/list network variables" msgstr "" #: share/completions/wpa_cli.fish:30 #, fuzzy msgid "get network variables" msgstr "Välj CVS-användare" #: share/completions/wpa_cli.fish:31 #, fuzzy msgid "save the current configuration" msgstr "Ladda om konfiguration för tjänst" #: share/completions/wpa_cli.fish:32 msgid "disconnect and wait for reassociate command before connecting" msgstr "" #: share/completions/wpa_cli.fish:33 msgid "request new BSS scan" msgstr "" #: share/completions/wpa_cli.fish:34 msgid "get latest scan results" msgstr "" #: share/completions/wpa_cli.fish:35 #, fuzzy msgid "get capabilies" msgstr "Välj spellista" #: share/completions/wpa_cli.fish:36 msgid "request STAKey negotiation with " msgstr "" #: share/completions/wpa_cli.fish:37 msgid "set ap_scan parameter" msgstr "" #: share/completions/wpa_cli.fish:38 msgid "request STK negotiation with " msgstr "" #: share/completions/wpa_cli.fish:39 msgid "terminate wpa_supplicant" msgstr "" #: share/completions/xprop.fish:4 msgid "Select window by id" msgstr "Välj fönster via id" #: share/completions/xprop.fish:6 msgid "Display font properties" msgstr "Visa fontegenskaper" #: share/completions/xprop.fish:9 msgid "Maximum display length" msgstr "Maximal displaylängd" #: share/completions/xprop.fish:11 msgid "Set format file" msgstr "Välj formatfil" #: share/completions/xsel.fish:12 msgid "X server display" msgstr "X-serverdisplay" #: share/completions/xsel.fish:14 msgid "Error log" msgstr "Fellogg" #: share/completions/xterm.fish:101 msgid "Run program in xterm" msgstr "" #: share/completions/xterm.fish:103 msgid "Blinking cursor will be off for that many milliseconds" msgstr "" #: share/completions/xterm.fish:104 msgid "Blinking cursor will be on for that many milliseconds" msgstr "" #: share/completions/xterm.fish:105 msgid "Override xterm resource class" msgstr "" #: share/completions/xterm.fish:106 msgid "Color for the text cursor" msgstr "" #: share/completions/xterm.fish:107 #, fuzzy msgid "xterm encoding" msgstr "Tvinga kodning" #: share/completions/xterm.fish:108 msgid "Bold font" msgstr "" #: share/completions/xterm.fish:109 msgid "FreeType font pattern" msgstr "" #: share/completions/xterm.fish:110 msgid "FreeType double-width font pattern" msgstr "" #: share/completions/xterm.fish:111 #, fuzzy msgid "Font for active icons" msgstr "Tvinga interaktivt läge" #: share/completions/xterm.fish:112 msgid "Font size for FreeType font" msgstr "" #: share/completions/xterm.fish:113 msgid "Font for displaying wide text" msgstr "" #: share/completions/xterm.fish:114 msgid "Font for displaying bold wide text" msgstr "" #: share/completions/xterm.fish:115 msgid "Font for the preedit string in \"OverTheSpot\"" msgstr "" #: share/completions/xterm.fish:116 msgid "Color for highlighted text" msgstr "" #: share/completions/xterm.fish:117 #, fuzzy msgid "Embed xterm into window" msgstr "Visa trÃ¥dar" #: share/completions/xterm.fish:118 #, fuzzy msgid "Set keyboard type" msgstr "Ange posttyp" #: share/completions/xterm.fish:119 msgid "File name for the encoding converter" msgstr "" #: share/completions/xterm.fish:120 #, fuzzy msgid "Log filename" msgstr "Logga till fil" #: share/completions/xterm.fish:121 msgid "Maximum time in milliseconds between multi-click selections" msgstr "" #: share/completions/xterm.fish:122 msgid "Color for the pointer cursor" msgstr "" #: share/completions/xterm.fish:123 msgid "Distance from the right end for ringing the margin bell" msgstr "" #: share/completions/xterm.fish:124 #, fuzzy msgid "Number of scrolled off lines" msgstr "Numrera alla rader" #: share/completions/xterm.fish:125 #, fuzzy msgid "Terminal identification" msgstr "Visa all information" #: share/completions/xterm.fish:126 #, sh-format msgid "Terminal name for $TERM" msgstr "" #: share/completions/xterm.fish:127 #, fuzzy msgid "zIconBeep percentage" msgstr "Visa filposition i procent i prompten" #: share/completions/xterm.fish:129 #, fuzzy msgid "Size of the inner border" msgstr "Visa ändringar i omvänd ordning" #: share/completions/yum.fish:53 #, fuzzy msgid "Delete cached package files" msgstr "Radera obsoleta paketfiler" #: share/completions/yum.fish:54 #, fuzzy msgid "Delete cached header files" msgstr "Radera urval" #: share/completions/yum.fish:55 #, fuzzy msgid "Delete all cache contents" msgstr "Radera logfil" #: share/completions/zip.fish:19 msgid "Exclude the following names" msgstr "Exkludera följande namn" #: share/completions/zip.fish:20 msgid "Include only the following names" msgstr "Inkludera bara följande namn" #: share/completions/zip.fish:30 msgid "Don't compress files with these suffixes" msgstr "Komprimera inte filer med dessa ändelser" #: share/functions/N_.fish:3 msgid "No-op" msgstr "" #: share/functions/_.fish:8 share/functions/_.fish:12 #, fuzzy msgid "Alias for the gettext command" msgstr "Hjälp för det angivna kommandot" #: share/functions/_.fish:9 seq:17 msgid "fish" msgstr "" #: share/functions/__fish_complete_bittorrent.fish:9 msgid "IP to report to the tracker" msgstr "IP adress att rapportera till tracker" #: share/functions/__fish_complete_bittorrent.fish:10 msgid "Minimum port to listen to" msgstr "Lägsta portnummer att lyssna pÃ¥" #: share/functions/__fish_complete_bittorrent.fish:11 msgid "Maximum port to listen to" msgstr "Högsta portnummer att lyssna pÃ¥" #: share/functions/__fish_complete_command.fish:2 msgid "Complete using all available commands" msgstr "" #: share/functions/__fish_complete_groups.fish:2 msgid "Print a list of local groups, with group members as the description" msgstr "" #: share/functions/__fish_complete_ls.fish:16 msgid "Show hidden" msgstr "Visa dolda filer" #: share/functions/__fish_complete_ls.fish:17 msgid "Show hidden except . and .." msgstr "Visa dolda filer utom . och .." #: share/functions/__fish_complete_ls.fish:18 #: share/functions/__fish_complete_ls.fish:27 msgid "Append filetype indicator" msgstr "Lägg till filtypsindikator" #: share/functions/__fish_complete_ls.fish:19 #: share/functions/__fish_complete_ls.fish:20 msgid "Follow symlinks" msgstr "Följ symboliska länkar" #: share/functions/__fish_complete_ls.fish:21 msgid "List subdirectory recursively" msgstr "Visa underkataloger rekursivt" #: share/functions/__fish_complete_ls.fish:22 #: share/functions/__fish_complete_ls.fish:102 msgid "Octal escapes for non graphic characters" msgstr "Använd oktala specialsekvenser för ickegrafiska tecken" #: share/functions/__fish_complete_ls.fish:23 msgid "List directories, not their content" msgstr "Visa kataloger, inte deras innehÃ¥ll" #: share/functions/__fish_complete_ls.fish:24 msgid "Human readable sizes" msgstr "Människoanpassade storleksangivelser, bas 1024" #: share/functions/__fish_complete_ls.fish:25 msgid "Print inode number of files" msgstr "Visa inod för filer" #: share/functions/__fish_complete_ls.fish:26 msgid "Long format, numeric IDs" msgstr "LÃ¥ngt format, numeriska IDn" #: share/functions/__fish_complete_ls.fish:28 msgid "Replace non-graphic characters with '?'" msgstr "Ersätt ickegrafiska tecken med â€?â€" #: share/functions/__fish_complete_ls.fish:29 msgid "Reverse sort order" msgstr "Omvänd sorteringsordning" #: share/functions/__fish_complete_ls.fish:30 msgid "Print size of files" msgstr "Visa filstorlek" #: share/functions/__fish_complete_ls.fish:32 msgid "List by columns" msgstr "Visa kolumnvis" #: share/functions/__fish_complete_ls.fish:33 msgid "Sort by size" msgstr "Sortera pÃ¥ storlek" #: share/functions/__fish_complete_ls.fish:34 msgid "Show and sort by ctime" msgstr "Visa och sortera pÃ¥ skapelsetidpunkt" #: share/functions/__fish_complete_ls.fish:35 msgid "Don't sort" msgstr "Sortera ej filer" #: share/functions/__fish_complete_ls.fish:36 msgid "Long format without owner" msgstr "LÃ¥ngt format utan ägare" #: share/functions/__fish_complete_ls.fish:37 msgid "Set blocksize to 1kB" msgstr "Välj blockstorlek 1kB" #: share/functions/__fish_complete_ls.fish:38 msgid "Long format" msgstr "LÃ¥ngt format" #: share/functions/__fish_complete_ls.fish:39 msgid "Comma separated format" msgstr "Kommaseparerat format" #: share/functions/__fish_complete_ls.fish:40 msgid "Sort by modification time" msgstr "Sortera pÃ¥ ändringstid" #: share/functions/__fish_complete_ls.fish:41 msgid "Show access time" msgstr "Visa senaste Ã¥tkomsttid" #: share/functions/__fish_complete_ls.fish:42 msgid "List entries by lines" msgstr "Visa radvis" #: share/functions/__fish_complete_ls.fish:43 msgid "List one file per line" msgstr "Visa en fil per rad" #: share/functions/__fish_complete_ls.fish:49 msgid "Do not list implied entries matching specified shell pattern" msgstr "Visa inte filer som matchar mönster" #: share/functions/__fish_complete_ls.fish:50 msgid "Display security context" msgstr "Visa säkerhetskontext" #: share/functions/__fish_complete_ls.fish:51 msgid "Display security context so it fits on most displays" msgstr "" #: share/functions/__fish_complete_ls.fish:52 msgid "Display only security context and file name" msgstr "" #: share/functions/__fish_complete_ls.fish:54 msgid "Print author" msgstr "Visa författare" #: share/functions/__fish_complete_ls.fish:56 msgid "Ignore files ending with ~" msgstr "Ignorera filer som slutar pÃ¥ ~" #: share/functions/__fish_complete_ls.fish:58 msgid "Generate dired output" msgstr "Generera utdata för dired" #: share/functions/__fish_complete_ls.fish:60 msgid "Long format, full-iso time" msgstr "LÃ¥ngt format, full-iso-tid" #: share/functions/__fish_complete_ls.fish:61 msgid "Don't print group information" msgstr "Visa inte information om grupp" #: share/functions/__fish_complete_ls.fish:62 msgid "Human readable sizes, powers of 1000" msgstr "Människoanpassade storleksangivelser, bas 1000" #: share/functions/__fish_complete_ls.fish:66 #: share/functions/__fish_complete_ls.fish:110 msgid "Print raw entry names" msgstr "Skriv obehandlade filnamn" #: share/functions/__fish_complete_ls.fish:67 msgid "Long format without groups" msgstr "LÃ¥ngt fromat utan grupper" #: share/functions/__fish_complete_ls.fish:68 msgid "Non graphic as-is" msgstr "Ersätt inte icke-grafiska tecken" #: share/functions/__fish_complete_ls.fish:69 msgid "Enclose entry in quotes" msgstr "Omgärda namn med citattecken" #: share/functions/__fish_complete_ls.fish:91 msgid "Do not sort" msgstr "Sortera ej filer" #: share/functions/__fish_complete_ls.fish:92 msgid "Sort by version" msgstr "Sortera pÃ¥ version" #: share/functions/__fish_complete_ls.fish:94 msgid "Sort by extension" msgstr "Sortera pÃ¥ filändelse" #: share/functions/__fish_complete_ls.fish:103 msgid "Use colors" msgstr "Använd färger" #: share/functions/__fish_complete_ls.fish:104 msgid "Prevent -A from being automatically set for root" msgstr "Hindra -A frÃ¥n att automatiskt sättas för root" #: share/functions/__fish_complete_ls.fish:105 msgid "Don't follow symlinks" msgstr "Följ inte symboliska länkar" #: share/functions/__fish_complete_ls.fish:106 msgid "Show modification time" msgstr "Visa ändringstid" #: share/functions/__fish_complete_ls.fish:107 msgid "Show whiteouts when scanning directories" msgstr "Visa korrigeringstecken vid katalogskanning" #: share/functions/__fish_complete_ls.fish:108 msgid "Display each file's MAC label" msgstr "Visa varje file MAC-etikett" #: share/functions/__fish_complete_ls.fish:109 msgid "Include the file flags in a long (-l) output" msgstr "Visa filflaggor vid lÃ¥ngt (-l) formay" #: share/functions/__fish_complete_ssh.fish:4 msgid "Protocoll version 1 only" msgstr "Bara protokoll version 1" #: share/functions/__fish_complete_ssh.fish:5 msgid "Protocoll version 2 only" msgstr "Bara protokoll version 2" #: share/functions/__fish_complete_ssh.fish:6 msgid "IPv4 addresses only" msgstr "Bara IPv4-adresser" #: share/functions/__fish_complete_ssh.fish:7 msgid "IPv6 addresses only" msgstr "Bara IPv6-adresser" #: share/functions/__fish_complete_ssh.fish:8 msgid "Compress all data" msgstr "Komprimera all data" #: share/functions/__fish_complete_ssh.fish:9 msgid "Encryption algorithm" msgstr "Krypteringsalgoritm" #: share/functions/__fish_complete_ssh.fish:10 msgid "Configuration file" msgstr "Konfigureringsfil" #: share/functions/__fish_complete_ssh.fish:11 msgid "Identity file" msgstr "Identitetsfil" #: share/functions/__fish_complete_ssh.fish:12 msgid "Options" msgstr "Flaggor" #: share/functions/__fish_complete_tar.fish:14 #: share/functions/__fish_complete_tar.fish:21 #: share/functions/__fish_complete_tar.fish:28 #: share/functions/__fish_complete_unrar.fish:14 msgid "%s\\tArchived file\\n" msgstr "%s\\tArkivfil\\n" #: share/functions/__fish_complete_users.fish:2 msgid "Print a list of local users, with the real user name as a description" msgstr "" #: share/functions/__fish_complete_vi.fish:45 #, fuzzy msgid "Start in Arabic mode" msgstr "Starta gränssnitt" #: share/functions/__fish_complete_vi.fish:46 #, fuzzy msgid "Start in binary mode" msgstr "Standardläge" #: share/functions/__fish_complete_vi.fish:47 msgid "Behave mostly like vi" msgstr "" #: share/functions/__fish_complete_vi.fish:48 #, fuzzy msgid "Start in diff mode" msgstr "Börja i folderindex" #: share/functions/__fish_complete_vi.fish:49 #, fuzzy msgid "Debugging mode" msgstr "Debugläge" #: share/functions/__fish_complete_vi.fish:50 #, fuzzy msgid "Start in Ex mode" msgstr "Börja i folderindex" #: share/functions/__fish_complete_vi.fish:51 #, fuzzy msgid "Start in improved Ex mode" msgstr "Börja i folderindex" #: share/functions/__fish_complete_vi.fish:52 #: share/functions/__fish_complete_vi.fish:75 #, fuzzy msgid "Start in foreground mode" msgstr "Börja i folderindex" #: share/functions/__fish_complete_vi.fish:53 #, fuzzy msgid "Start in Farsi mode" msgstr "Standardläge" #: share/functions/__fish_complete_vi.fish:54 #, fuzzy msgid "Start in GUI mode" msgstr "Börja i folderindex" #: share/functions/__fish_complete_vi.fish:55 #: share/functions/__fish_complete_vi.fish:77 #, fuzzy msgid "Print help message and exit" msgstr "Visa version och avsluta" #: share/functions/__fish_complete_vi.fish:56 #, fuzzy msgid "Start in Hebrew mode" msgstr "Börja i folderindex" #: share/functions/__fish_complete_vi.fish:57 #, fuzzy msgid "List swap files" msgstr "Arkivfil" #: share/functions/__fish_complete_vi.fish:58 #, fuzzy msgid "Start in lisp mode" msgstr "Börja i folderindex" #: share/functions/__fish_complete_vi.fish:59 #, fuzzy msgid "Disable file modification" msgstr "Lita inte pÃ¥ filändringstid" #: share/functions/__fish_complete_vi.fish:60 #, fuzzy msgid "Disallow file modification" msgstr "Visa bara senaste modifiering" #: share/functions/__fish_complete_vi.fish:61 msgid "Reset compatibility mode" msgstr "" #: share/functions/__fish_complete_vi.fish:62 msgid "Don\\t" msgstr "" #: share/functions/__fish_complete_vi.fish:70 #, fuzzy msgid "Start in easy mode" msgstr "Starta gränssnitt" #: share/functions/__fish_complete_vi.fish:71 #, fuzzy msgid "Start in restricted mode" msgstr "Inskränkt läge" #: share/functions/__fish_complete_vi.fish:73 msgid "Become an editor server for NetBeans" msgstr "" #: share/functions/__fish_complete_vi.fish:76 msgid "Echo the Window ID on stdout (GTK GUI only)" msgstr "" #: share/functions/__fish_complete_vi.fish:78 #, fuzzy msgid "Do not expand wildcards" msgstr "Expandera inte mönster" #: share/functions/__fish_complete_vi.fish:79 msgid "Skip loading plugins" msgstr "" #: share/functions/__fish_complete_vi.fish:80 #: share/functions/__fish_complete_vi.fish:83 #: share/functions/__fish_complete_vi.fish:84 #: share/functions/__fish_complete_vi.fish:85 #, fuzzy msgid "Edit files on Vim server" msgstr "Redigera filer pÃ¥ plats" #: share/functions/__fish_complete_vi.fish:81 #, fuzzy msgid "Evaluate expr on Vim server" msgstr "Utför argument som kommandon" #: share/functions/__fish_complete_vi.fish:82 #, fuzzy msgid "Send keys to Vim server" msgstr "Skicka e-post till användare" #: share/functions/__fish_complete_vi.fish:86 msgid "List all Vim servers that can be found" msgstr "" #: share/functions/__fish_complete_vi.fish:87 #, fuzzy msgid "Set server name" msgstr "Namn pÃ¥ tjänst" #: share/functions/__fish_complete_vi.fish:88 #, fuzzy msgid "Print version information and exit" msgstr "Visa version och avsluta" #: share/functions/__fish_complete_vi.fish:99 msgid "Suppress all interactive user feedback" msgstr "" #: share/functions/__fish_complete_vi.fish:100 #: share/functions/__fish_complete_vi.fish:107 msgid "Encrypt/decrypt text" msgstr "" #: share/functions/__fish_complete_vi.fish:101 msgid "Set up for editing LISP programs" msgstr "" #: share/functions/__fish_complete_vi.fish:102 msgid "List saved file names after crash" msgstr "" #: share/functions/__fish_complete_vi.fish:103 #, fuzzy msgid "Readonly mode" msgstr "Skrivskyddad" #: share/functions/__fish_complete_vi.fish:104 msgid "Use linear search for tags if tag file not sorted" msgstr "" #: share/functions/__fish_complete_vi.fish:105 msgid "Start in display editing state" msgstr "" #: share/functions/__fish_config_interactive.fish:65 #, sh-format msgid "" "\\nWARNING\\n\\nThe location for fish configuration files has changed to %s." "\\nYour old files have been moved to this location.\\nYou can change to a " "different location by changing the value of the variable $XDG_CONFIG_HOME.\\n" "\\n" msgstr "" "\\nVARNING\\n\\nLagringsplatsen för fish-konfigureringsfiler har ändrats " "till %s. Dina gamla filer har flyttats till denna plats.\\nDu kan ändra " "denna plats genom att byta värde pÃ¥ variabeln $XDG_CONFIG_HOME.\\n\\n" # #: share/functions/__fish_config_interactive.fish:81 msgid "Welcome to fish, the friendly interactive shell" msgstr "Välkommen till fish, det vänliga interaktiva skalet" # #: share/functions/__fish_config_interactive.fish:82 msgid "Type %shelp%s for instructions on how to use fish" msgstr "Skriv %shelp%s för instruktioner om hur man använder fish" #: share/functions/__fish_config_interactive.fish:98 msgid "Commands to execute when fish exits" msgstr "Kommandon som utförs när fish avslutas" #: share/functions/__fish_config_interactive.fish:99 msgid "Good bye\\n" msgstr "Hej dÃ¥\\n" #: share/functions/__fish_config_interactive.fish:163 msgid "Event handler, repaints the prompt when fish_color_cwd changes" msgstr "Händelsehanterare, ritar om prompten när fish_color_cwd ändras" #: share/functions/__fish_config_interactive.fish:170 #, fuzzy msgid "Event handler, repaints the prompt when fish_color_cwd_root changes" msgstr "Händelsehanterare, ritar om prompten när fish_color_cwd ändras" #: share/functions/__fish_config_interactive.fish:182 msgid "Start service" msgstr "Starta tjänst" #: share/functions/__fish_config_interactive.fish:183 msgid "Stop service" msgstr "Stanna tjänst" #: share/functions/__fish_config_interactive.fish:184 msgid "Print service status" msgstr "Visa status för tjänst" #: share/functions/__fish_config_interactive.fish:185 msgid "Stop and then start service" msgstr "Stanna och starta tjänst" #: share/functions/__fish_config_interactive.fish:186 msgid "Reload service configuration" msgstr "Ladda om konfiguration för tjänst" #: share/functions/__fish_move_last.fish:9 msgid "Hit end of history...\\n" msgstr "Slut pÃ¥ kataloghistorik...\\n" #: share/functions/__fish_print_addresses.fish:1 #, fuzzy msgid "Print a list of known network addresses" msgstr "Visa lista pÃ¥ alla körande screen-sessioner" #: share/functions/__fish_print_help.fish:2 msgid "Print help message for the specified fish function or builtin" msgstr "" "Visa hjälpmeddelande för specificerad fish-funktion eller inbyggt kommando" #: share/functions/__fish_print_interfaces.fish:1 #, fuzzy msgid "Print a list of known network interfaces" msgstr "Visa en lista pÃ¥ alla tillÃ¥tna färgnamn" #: share/functions/__fish_print_users.fish:2 #, fuzzy msgid "Print a list of local users" msgstr "Visa en lista pÃ¥ alla tillÃ¥tna färgnamn" #: share/functions/__fish_test_arg.fish:2 msgid "Test if the token under the cursor matches the specified wildcard" msgstr "" #: share/functions/alias.fish:2 msgid "" "Legacy function for creating shellscript functions using an alias-like syntax" msgstr "" "BakÃ¥tkompatibilitetsfunktion för att skapa skalfunktioner med en alias-" "liknande syntax" #: share/functions/alias.fish:26 #, fuzzy msgid "%s: Expected one or two arguments, got %d\\n" msgstr "%ls: Förväntade ett eller tvÃ¥ argument, fick %d" #: share/functions/dirh.fish:2 msgid "Print the current directory history (the back- and fwd- lists)" msgstr "Visa arbetskatalogshistorik (bakÃ¥t och frammÃ¥t)" #: share/functions/dirs.fish:1 msgid "Print directory stack" msgstr "Visa katalogstack" #: share/functions/fish_prompt.fish:5 msgid "Write out the prompt" msgstr "Skriv prompten" #: share/functions/funced.fish:2 #, fuzzy msgid "Edit function definition" msgstr "funktionsdefinition-block" #: share/functions/funced.fish:11 share/functions/nextd.fish:21 #: share/functions/prevd.fish:21 share/functions/vared.fish:16 msgid "%s: Unknown option %s\\n" msgstr "%s: Okänd flagga â€%sâ€\\n" #: share/functions/funced.fish:38 #, fuzzy msgid "" "%s: Expected exactly one argument, got %s.\\n\\nSynopsis:\\n\\t%sfunced%s " "FUNCTION\\n" msgstr "" "%s: Förväntade exakt ett argument, fick %s\\n\\nSynopsis:\\n\\t%svared%s " "VARIABEL\\n" #: share/functions/funcsave.fish:2 msgid "Save the current definition of all specified functions to file" msgstr "" #: share/functions/funcsave.fish:24 msgid "%s: Could not create configuration directory\\n" msgstr "%s: Kunde inte skapa konfigurationskatalogen\\n" #: share/functions/funcsave.fish:35 msgid "%s: Unknown function '%s'\\n" msgstr "%s: Okänd funktion â€%sâ€\\n" #: share/functions/help.fish:10 msgid "Show help for the fish shell" msgstr "Visa hjälp för fish-skalet" #: share/functions/help.fish:68 msgid "%s: Could not find a web browser.\\n" msgstr "%s: Kunde inte hitta en webbrowser\\n" #: share/functions/help.fish:69 #, sh-format msgid "" "Please set the variable $BROWSER to a suitable browser and try again\\n\\n" msgstr "" "Var vänlig sätt variablen $BROWSER sÃ¥ den anger en lämplig browser och " "försök igen\\n\\n" #: share/functions/help.fish:105 msgid "help: Help is being displayed in your default browser\\n" msgstr "help: Hjälp visas i ditt standardsurfprogram" #: share/functions/help.fish:108 msgid "help: Help is being displayed in %s\\n" msgstr "help: Hjälp visas i %s\\n" #: share/functions/la.fish:4 msgid "" "List contents of directory, including hidden files in directory using long " "format" msgstr "Visa kataloginnehÃ¥ll, inklusive dolda filer i lÃ¥ngt format" #: share/functions/ll.fish:4 msgid "List contents of directory using long format" msgstr "Visa kataloginnehÃ¥ll i lÃ¥ngt format" #: share/functions/ls.fish:7 share/functions/ls.fish:24 msgid "List contents of directory" msgstr "Visa kataloginnehÃ¥ll" #: share/functions/math.fish:2 msgid "Perform math calculations in bc" msgstr "Utför matematiska beräkningar i bc" #: share/functions/nextd.fish:2 msgid "Move forward in the directory history" msgstr "GÃ¥ frammÃ¥t i kataloghistorik" #: share/functions/nextd.fish:27 msgid "%s: The number of positions to skip must be a non-negative integer\\n" msgstr "" "%s: Antalet positioner att hoppa över mÃ¥ste vara ett positivt heltal\\n" #: share/functions/open.fish:8 msgid "Open file in default application" msgstr "Öppna fil i standardprogram" #: share/functions/popd.fish:2 msgid "Pop dir from stack" msgstr "Ta bort katalog frÃ¥n stack" # #: share/functions/popd.fish:14 msgid "%s: Directory stack is empty...\\n" msgstr "%s: Katalogstacken är tom...\\n" #: share/functions/prevd.fish:2 msgid "Move back in the directory history" msgstr "GÃ¥ bakÃ¥t i kataloghistorik" #: share/functions/prevd.fish:27 msgid "The number of positions to skip must be a non-negative integer\\n" msgstr "Antalet positioner att hoppa över mÃ¥ste vara ett positivt heltal" #: share/functions/prompt_pwd.fish:3 share/functions/prompt_pwd.fish:12 msgid "Print the current working directory, shortend to fit the prompt" msgstr "Visa aktuell arbetskatalog, förkortad till att passa i kommandoraden" #: share/functions/psub.fish:3 msgid "" "Read from stdin into a file and output the filename. Remove the file when " "the command that called psub exits." msgstr "" "Läs frÃ¥n standard in och skriv till fil. Skriv filnamnet pÃ¥ standard ut. " "Radera filen när det anropande programmet avslutar." #: share/functions/pushd.fish:3 msgid "Push directory to stack" msgstr "Lägg till katalog till stack" #: share/functions/pwd.fish:9 share/functions/pwd.fish:14 msgid "Print working directory" msgstr "Visa nuvarande katalog" #: share/functions/setenv.fish:2 msgid "Set global variable. Alias for set -g, made for csh compatibility" msgstr "" #: share/functions/type.fish:2 msgid "Print the type of a command" msgstr "Visa typ av kommando" #: share/functions/type.fish:73 msgid "%s is a function with definition\\n" msgstr "%s är en funktion med definitionen\\n" #: share/functions/type.fish:77 msgid "function\\n" msgstr "funktion\\n" #: share/functions/type.fish:94 msgid "%s is a builtin\\n" msgstr "%s är ett inbyggt kommando\\n" #: share/functions/type.fish:97 msgid "builtin\\n" msgstr "inbyggt kommando\\n" #: share/functions/type.fish:115 msgid "%s is %s\\n" msgstr "%s är %s\\n" #: share/functions/type.fish:118 msgid "file\\n" msgstr "fil\\n" #: share/functions/type.fish:129 msgid "%s: Could not find '%s'\\n" msgstr "%s: Kunde inte hitta â€%sâ€\\n" #: share/functions/umask.fish:11 share/functions/umask.fish:69 #: share/functions/umask.fish:76 msgid "%s: Invalid mask '%s'\\n" msgstr "%s: Ogiltigt mask â€%sâ€\\n" #: share/functions/umask.fish:137 msgid "Set default file permission mask" msgstr "Välj standardfilrättighetsmask" #: share/functions/umask.fish:204 msgid "%s: Too many arguments\\n" msgstr "%s: För mÃ¥nga argument\\n" #: share/functions/vared.fish:7 msgid "Edit variable value" msgstr "Redigera variabelvärde" #: share/functions/vared.fish:42 msgid "" "%s: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of " "%s\\n" msgstr "" "%s: %s är en arrayvariabel. Använd %svared%s %s[n] för att redigera det n:te " "elementet av %s\\n" #: share/functions/vared.fish:46 msgid "" "%s: Expected exactly one argument, got %s.\\n\\nSynopsis:\\n\\t%svared%s " "VARIABLE\\n" msgstr "" "%s: Förväntade exakt ett argument, fick %s\\n\\nSynopsis:\\n\\t%svared%s " "VARIABEL\\n" #: seq:15 msgid "^/dev/null" msgstr "" #: seq:36 msgid "%s: Expected 1, 2 or 3 arguments, got %d\\n" msgstr "%s: Förväntade 1, 2 eller 3 argument, fick %d\\n" #: seq:43 msgid "%s: '%s' is not a number\\n" msgstr "%s: â€%s†är inte ett nummer\\n" #~ msgid "" #~ "%ls: '%ls' is not a directory or you do not have permission to enter it\n" #~ msgstr "" #~ "%ls: â€%ls†är inte en katalog eller sÃ¥ har du inte rättigheter att läsa " #~ "denna katalog\n" #~ msgid "%ls: Expected at least one argument, got %d\n" #~ msgstr "%ls: Förväntade minst ett argument, fick %d\n" #~ msgid "Evaluate parameters as a command" #~ msgstr "Utför argument som kommando" #~ msgid "If you can reproduce it, please send a bug report to %s." #~ msgstr "" #~ "Om du kan reproducera det, var vänlig skicka en buggrapport till %s." #~ msgid "User home" #~ msgstr "Hemkatalog" #~ msgid "Function" #~ msgstr "Funktion" #~ msgid "Builtin" #~ msgstr "Inbyggt kommando" #~ msgid "Invalid Control sequence" #~ msgstr "Ogiltig kontroll-sekvens" #~ msgid "Could not parse sequence '%ls'" #~ msgstr "Kunde inte tolka sekvens â€%lsâ€" #~ msgid "Invalid sequence - no dash after control\n" #~ msgstr "Ogiltig sekvens - inget bindestreck efter â€controlâ€\n" #~ msgid "Invalid sequence - Control-nothing?\n" #~ msgstr "Ogiltig sekvens - Kontroll-ingenting?\n" #~ msgid "Invalid sequence - no dash after meta\n" #~ msgstr "Ogiltig sekvens - inget bindestreck efter â€metaâ€\n" #~ msgid "Invalid sequence - Meta-nothing?" #~ msgstr "Ogiltig sekvens - Meta-ingenting?" #~ msgid "Invalid sequence - '%ls' expanded to zero characters" #~ msgstr "Ogiltig sekvens - â€%ls†expanderades till en tom sträng" #~ msgid "Mismatched $endif in inputrc file" #~ msgstr "$endif matchade inte i inputrc-fil" #~ msgid "Mismatched quote" #~ msgstr "Citat-tecknen matchar inte varandra" #~ msgid "Expected a ':'" #~ msgstr "Förväntade ett â€:â€" #~ msgid "I don't know what '%ls' means" #~ msgstr "Vet inte vad â€%ls†betyder" #~ msgid "Expected end of line, got '%ls'" #~ msgstr "Förväntade radslut, fick â€%lsâ€" #~ msgid "Syntax: set KEY VALUE" #~ msgstr "Syntax: set NAMN VÄRDE" #~ msgid "Unable to parse key binding" #~ msgstr "Kunde inte tolka tangentbordsgenväg" #~ msgid "I don't know what %ls means" #~ msgstr "Vet inte vad â€%ls†betyder" #~ msgid "Error while reading input information from file '%ls'" #~ msgstr "Ett fel uppstod under inläsning av filen â€%lsâ€" #~ msgid "" #~ "This is a circular dependency in the autoloading scripts, please remove " #~ "it." #~ msgstr "" #~ "Detta är ett cirkulärt beroende i de automatiskt laddade filerna, var " #~ "vänlig ta bort det." #~ msgid "Error while reading commands" #~ msgstr "Ett fel inträffade medan kommandon lästes in" #~ msgid "" #~ "%s: Warning: The directory %s has been removed from your PATH because it " #~ "does not exist\\n" #~ msgstr "" #~ "%s: Varning: Katalogen %s har tagits bort frÃ¥n din PATH eftersom den inte " #~ "existerar\\n" #~ msgid "whatis entry" #~ msgstr "â€whatisâ€-inlägg" #~ msgid "Use to build" #~ msgstr "Använd för att bygga" #~ msgid "Prefix to strip on patch" #~ msgstr "Ta bort pÃ¥ fix" #~ msgid "Use purge instead of remove" #~ msgstr "Använd rensning istället för radering" #~ msgid "Do not run update" #~ msgstr "Kör inte uppdatering" #~ msgid "Search full package name" #~ msgstr "Sök fullt paketnamn" #~ msgid "Access config file from shell" #~ msgstr "Hitta konfigurationsfil via skalet" #~ msgid "Use cdrom-mount-point" #~ msgstr "Välj cdrom-monteringsplats" #~ msgid "Use source override" #~ msgstr "Använd källkodsÃ¥sidosättning" #~ msgid "Download Only" #~ msgstr "Bara nedladdning" #~ msgid "Correct broken dependencies" #~ msgstr "Korrigera trasiga beroenden" #~ msgid "Ignore missing packages" #~ msgstr "Ignorera saknade paket" #~ msgid "Disable downloading packages" #~ msgstr "Inaktivera paketnedladdning" #~ msgid "Perform a simulation" #~ msgstr "Utför en simulering" #~ msgid "Automatic yes to prompts" #~ msgstr "Svara automatiskt ja pÃ¥ alla frÃ¥gor" #~ msgid "Show upgraded packages" #~ msgstr "Visa uppgraderade paket" #~ msgid "Show full versions for packages" #~ msgstr "Visa fulla versioner för paket" #~ msgid "Compile source packages" #~ msgstr "Kompilera källkodspaket" #~ msgid "Ignore package Holds" #~ msgstr "Ignorera paketblockar" #~ msgid "Do not upgrade packages" #~ msgstr "Upgradera inte paket" #~ msgid "Force yes" #~ msgstr "Tvinga ja" #~ msgid "Print the URIs" #~ msgstr "Visa URIer" #~ msgid "Erase obsolete files" #~ msgstr "Radera förlegade filer" #~ msgid "Control default input to the policy engine" #~ msgstr "Kontrollera standardindata till policymotorn" #~ msgid "Only perform operations that are trivial" #~ msgstr "Utför bara triviala operationer" #~ msgid "Abort if any packages are to be removed" #~ msgstr "Avbryt om paket ska tas bort" #~ msgid "Only accept source packages" #~ msgstr "Acceptera bara källkodpaket" #~ msgid "Download only diff file" #~ msgstr "Ladda bara ner difffiler" #~ msgid "Download only tar file" #~ msgstr "Ladda bara tar-fil" #~ msgid "Only process arch-dependant build-dependencies" #~ msgstr "Processa bara arkitekturberoende byggberoenden" #~ msgid "Ignore non-authenticated packages" #~ msgstr "Ignorera oautentiserande paket" #~ msgid "Specify apt config file" #~ msgstr "Välj apt-konfigurationsfil" #~ msgid "List bugs from packages" #~ msgstr "Lista buggar frÃ¥n paket" #~ msgid "List bugs in rss format" #~ msgstr "Lista information om inoder" #~ msgid "Read filenames from pipe" #~ msgstr "Läs filnamn frÃ¥n rör" #~ msgid "Select display" #~ msgstr "Välj display" #~ msgid "Generate master file" #~ msgstr "Generera huvudfil" #~ msgid "Alias for 'get'" #~ msgstr "Alias för â€getâ€" #~ msgid "Use specific conffile" #~ msgstr "Välj konfigurationsfil" #~ msgid "Comma-separated list of dependancy types to follow recursively" #~ msgstr "Komma-separarad lista av beroendetyper att följa rekursivt" #~ msgid "Comma-separated list of dependancy types to show" #~ msgstr "Komma-separarad lista av beroendetyper att visa" #~ msgid "" #~ "Comma-separated list of package installation states to follow recursively" #~ msgstr "" #~ "Komma-separarad lista av paketinstallationstillstÃ¥nd att följa rekursivt" #~ msgid "Comma-separated list of package installation states to show" #~ msgstr "Komma-separarad lista av paketinstallationstillstÃ¥nd att visa" #~ msgid "Probe a CD" #~ msgstr "Sondera en CD" #~ msgid "Run in noninteractive mode" #~ msgstr "Kör i icke-interaktivt läge" #~ msgid "Conf file" #~ msgstr "Konfigurationsfil" #~ msgid "File to grab servers" #~ msgstr "Fil att hämta servrar frÃ¥n" #~ msgid "File as input" #~ msgstr "Fil som indata" #~ msgid "Mirror-list file" #~ msgstr "Spegel-listefil" #~ msgid "Output sources.list file" #~ msgstr "Skriv en sources.list fil" #~ msgid "Write top servers to file" #~ msgstr "Skriv top-servrar till fil" #~ msgid "Run on current dir" #~ msgstr "Kör i den nuvarande katalogen" #~ msgid "Removable medium" #~ msgstr "Löstagbart medium" #~ msgid "List of packages to install" #~ msgstr "Lista av paket att installera" #~ msgid "Specify a non-mountpoint dir" #~ msgstr "Välj katalog som inte är monteringsplats" #~ msgid "Select a method" #~ msgstr "Välj metod" #~ msgid "Accept protocols" #~ msgstr "Acceptera angivna protokoll" #~ msgid "Reject protocols" #~ msgstr "Vägra använda angivna protokoll" #~ msgid "Numerical address" #~ msgstr "Numerisk adress" #~ msgid "Use hardware address" #~ msgstr "Använd hÃ¥rdvaruadress" #~ msgid "Define math library" #~ msgstr "Definera matematikbibliotek" #~ msgid "Give warnings for extensions to POSIX bc" #~ msgstr "Varna vid användning av Posix-förlängningar" #~ msgid "Process exactly POSIX bc" #~ msgstr "Använd exakt Posix bc" #~ msgid "Do not print the GNU welcome" #~ msgstr "Visa inte GNUs välkomstmeddelande" # #~ msgid "Change input mode" #~ msgstr "Ändra inmatningsläge" #~ msgid "Remove the topmost global event block" #~ msgstr "Ta bort den översta globala händelseblockeraren" #~ msgid "Print names of all existing builtins" #~ msgstr "Visa namnen pÃ¥ alla tillgängliga inbbyggda kommandon" #~ msgid "Decompress to stdout" #~ msgstr "Dekomprimera till standard ut" #~ msgid "Overwrite" #~ msgstr "Skiv över" #~ msgid "Do not overwrite" #~ msgstr "Skriv inte över" #~ msgid "Reduce memory usage" #~ msgstr "Minska minnesanvändning" #~ msgid "Print compression ratios" #~ msgstr "Skriv ut kompressionsfaktor" #~ msgid "Print license" #~ msgstr "Skriv ut licens" #~ msgid "Compress to stdout" #~ msgstr "Komprimera till standard ut" #~ msgid "Compress file" #~ msgstr "Komprimera fil" #~ msgid "Check integrity" #~ msgstr "Verifiera integritet" #~ msgid "Supress errors" #~ msgstr "Visa inte fel" #~ msgid "Small block size" #~ msgstr "Liten blockstorlek" #~ msgid "Large block size" #~ msgstr "Stor blockstorlek" #~ msgid "Escape all non-printing characters" #~ msgstr "Ersätt oskrivbara tecken med specialsekvenser" #~ msgid "Number nonblank lines" #~ msgstr "Numrera icke-tomma rader" #~ msgid "Escape non-printing characters except tab" #~ msgstr "Erätt oskrivbarta tecken utom tab med specialsekvenser" #~ msgid "Display $ at end of line" #~ msgstr "Visa $ vid radslut" #~ msgid "Never more than single blank line" #~ msgstr "Visa maximalt en tom rad i följd" #~ msgid "Escape non-printing characters except newline" #~ msgstr "Erätt oskrivbarta tecken utom radbrytning med specialsekvenser" #~ msgid "Escape tab" #~ msgstr "Ersätt tab med specialsekvens" #~ msgid "Escape non-printing except newline and tab" #~ msgstr "" #~ "Erätt oskrivbarta tecken utom tab och radbrytning med specialsekvenser" #~ msgid "Increment the level of general verbosity by one" #~ msgstr "Öka pratigheten ett steg" #~ msgid "" #~ "Increment the verbose level in respect of SCSI command transport by one" #~ msgstr "Öka pratighet om SCSI-kommandotransporten ett steg" #~ msgid "Set the misc debug value to #" #~ msgstr "Välj den allmänna debugnivÃ¥n" #~ msgid "Increment the misc debug level by one" #~ msgstr "Öka den allmänna debugnivÃ¥n ett steg" #~ msgid "Do not print out a status report for failed SCSI commands" #~ msgstr "Skriv inte ut en statusrapport för misslyckade SCSI-kommandon" #~ msgid "Force to continue on some errors" #~ msgstr "Tvinga att fortsätt vid fel" #~ msgid "Tell cdrecord to set the SCSI IMMED flag in certain commands" #~ msgstr "Instruera cdrecord att sätta SCSI IMMED-flaggan i vissa kommandon" #~ msgid "" #~ "Defines the minimum drive buffer fill ratio for the experimental ATAPI " #~ "wait mode intended to free the IDE bus to allow hard disk and CD/DVD " #~ "writer on the same IDE cable" #~ msgstr "" #~ "Definerar den minsta enhetsbufferfyllnadshastigheten för det " #~ "experimentella ATAPI-vänteläget som är menat att underlätta för IDE-" #~ "bussen att lÃ¥ta hÃ¥rddisk och CD/DVD-skrivare befinna sig pÃ¥ samma IDE-" #~ "kabel" #~ msgid "Complete CD/DVD-Recorder recording process with the laser turned off" #~ msgstr "Fullfölj CD/DVD-brännarens inspelningsprocess med lasern avstängd" #~ msgid "Tells cdrecord to handle images created by readcd -clone" #~ msgstr "Ange att cdrecord ska hantera bilder skapade av readcd -clone" #~ msgid "Set SAO (Session At Once) mode, usually called Disk At Once mode" #~ msgstr "" #~ "Välj SAO- (Session At Once) skrivläge, vanligtvis kallat Disk At Once-" #~ "skrivläge" #~ msgid "Set TAO (Track At Once) writing mode" #~ msgstr "Välj TAO- (Track At Once) skrivläge" #~ msgid "Set RAW writing mode" #~ msgstr "Välj RAW-skrivläge" #~ msgid "Select Set RAW writing, the preferred raw writing mode" #~ msgstr "Välj det bättre RAW-skrivläget" #~ msgid "Select Set RAW writing, the less preferred raw writing mode" #~ msgstr "Välj det mindre bra RAW-skrivläget" #~ msgid "" #~ "Select Set RAW writing, the preferred raw writing mode if raw96r is not " #~ "supported" #~ msgstr "Välj det RAW-skrivläget som är bäst om stöd saknas för raw96r" #~ msgid "Allow multi session CDs to be made" #~ msgstr "TillÃ¥t skapandet av multisessions-CD" #~ msgid "" #~ "Retrieve multi session info in a form suitable for mkisofs-1.10 or later" #~ msgstr "" #~ "Hämta multisessionsinfo i ett format lämpligt för mkisofs-1.10 och senare" #~ msgid "Retrieve and print out the table of content or PMA of a CD" #~ msgstr "Hämta och skriv ut innehÃ¥llsförteckningen eller PMA för en CD" #~ msgid "Retrieve and print out the ATIP (absolute Time in Pre-groove) info" #~ msgstr "Hämta och skriv ut ATIP (absolute Time in Pre-groove) info" #~ msgid "The disk will only be fixated" #~ msgstr "Fixera endast skivan" #~ msgid "Do not fixate the disk after writing the tracks" #~ msgstr "Fixera inte skivan efter stt spÃ¥ren skrivits" #~ msgid "" #~ "Wait for input to become available on standard input before trying to " #~ "open the SCSI driver" #~ msgstr "" #~ "Vänta pÃ¥ att indata ska bli tillgängligt frÃ¥n standard in innan försök " #~ "rill att öppna SCSI-enheten" #~ msgid "Load the media and exit" #~ msgstr "Ladda mediet och avsluta" #~ msgid "Load the media, lock the door and exit" #~ msgstr "Ladda mediet, lÃ¥s luckan och avsluta" #~ msgid "Eject disk after doing the work" #~ msgstr "Skicka ut skivan efter arbetets utförande" #~ msgid "Set the speed factor of the writing process to #" #~ msgstr "Sätt hastighetsfaktorn för skrivprocessen" #~ msgid "Blank a CD-RW and exit or blank a CD-RW before writing" #~ msgstr "Töm en CD-RW och avsluta eller töm en CD-RW för skrivning" #~ msgid "Format a CD-RW/DVD-RW/DVD+RW disc" #~ msgstr "Formatera en CD-RW/DVD-RW/DVD+RW-skiva" #~ msgid "Set the FIFO (ring buffer) size to #" #~ msgstr "Välj FIFO- (ringbuffert) storlek" #~ msgid "Set the maximum transfer size for a single SCSI command to #" #~ msgstr "Välj maximal överföringshastighet för ett enkilt SCSI-kommando" #~ msgid "Sets the SCSI target for the CD/DVD-Recorder" #~ msgstr "Välj SCSI-mÃ¥let för CD/DVD-brännaren" #~ msgid "Set the grace time before starting to write to ># seconds" #~ msgstr "Välj väntetiden i sekunder innan skrivning till skivan pÃ¥börjas" #~ msgid "Set the default SCSI command timeout value to # seconds" #~ msgstr "Välj standard-SCSI-timeoutvärdet i sekunder" #~ msgid "Allows the user to manually select a driver for the device" #~ msgstr "LÃ¥ter användaren manuellt välja en drivrutin för enheten" #~ msgid "Set driver specific options" #~ msgstr "Välj drivrutinsspecifika inställningar" #~ msgid "" #~ "Set the driveropts specified by driveropts=option list, the speed of the " #~ "drive and the dummy flag and exit" #~ msgstr "" #~ "Välj drivrutinsinställningar angivna av listandriveropt=inställning, " #~ "hastigheten pÃ¥ enheten och dunny-flaggan och avsluta" #~ msgid "Checks if a driver for the current drive is present and exit" #~ msgstr "" #~ "Kontrollerar om en drivrutin för den nuvarande enheten finns tillgänglig " #~ "och avsluta" #~ msgid "" #~ "Print the drive capabilities for SCSI-3/mmc compliant drives as obtained " #~ "from mode page 0x2A" #~ msgstr "" #~ "Visa enhetsförmÃ¥gor för SCSI-3/mmc-anpassade enheter hämtade frÃ¥n " #~ "lägessida 0x2A" #~ msgid "Do an inquiry for the drive, print the inquiry info and exit" #~ msgstr "" #~ "Utför en föffrÃ¥gan pÃ¥ enheten, visa förfrÃ¥gningsinformationen och avsluta" #~ msgid "" #~ "Scan all SCSI devices on all SCSI busses and print the inquiry strings" #~ msgstr "" #~ "Genomsök alla SCSI-enheter pÃ¥ alla SCSI-bussar och skriv ut " #~ "förfrÃ¥gningssträngarna" #~ msgid "Try to reset the SCSI bus where the CD recorder is located" #~ msgstr "Försök att Ã¥terställa SCSI-bussen som CD-brännaren befinner sig pÃ¥" #~ msgid "Try to send an abort sequence to the drive" #~ msgstr "Försök skicka en avbrottssekvens till enheten" #~ msgid "Allow cdrecord to write more than the official size of a medium" #~ msgstr "" #~ "TillÃ¥t cdrecord att skriva mer än den officiella storleken pÃ¥ ett medium" #~ msgid "Ignore the known size of the medium, use for debugging only" #~ msgstr "" #~ "Ignorera den kända storleken pÃ¥ ett medium, använd endast vid debuggning" #~ msgid "Use *.inf files to overwrite audio options" #~ msgstr "Använd *.inf-filer för att skriva över ljudinställningar" #~ msgid "Set the default pre-gap size for all tracks except track nr 1" #~ msgstr "Välj standard-pre-gap-storlek för alla spÃ¥r utom spÃ¥r 1" #~ msgid "Set Packet writing mode (experimental interface)" #~ msgstr "Välj paketskrivningsläge (experimentellt gränssnitt)" #~ msgid "Set the packet size to #, forces fixed packet mode (experimental)" #~ msgstr "Ange paketstorlek, tvingar fast paket-läge (experimentell)" #~ msgid "" #~ "Do not close the current track, only when in packet writing mode " #~ "(experimental)" #~ msgstr "" #~ "Avsluta inte det nuvarande spÃ¥ret, bara i paketskrivningsläge " #~ "(experimentell)" #~ msgid "Set the Media Catalog Number of the CD" #~ msgstr "Välj Mediakatalog-nummer för CD:n" #~ msgid "" #~ "Write CD-Text info based on info taken from a file that contains ascii " #~ "info for the text strings" #~ msgstr "" #~ "Skriv CD-Text-infromation baserat pÃ¥ information tagen frÃ¥n fil i ascii-" #~ "format" #~ msgid "Write CD-Text based on info found in the binary file filename" #~ msgstr "" #~ "Skriv CD-Text-infromation baserat pÃ¥ information tagen frÃ¥n fil i binärt " #~ "format" #~ msgid "" #~ "Take all recording related info from a CDRWIN compliant CUE sheet file" #~ msgstr "" #~ "Ta all inspelningrelaterad information frÃ¥n en CDRWIN-anpassad CUE-" #~ "bladsfil" #~ msgid "Set the International Standard Recording Number for the next track" #~ msgstr "Ange det internationella standardinspelningsnumret för nästa spÃ¥r" #~ msgid "Sets an index list for the next track" #~ msgstr "Ange en indexlista för nästa spÃ¥r" #~ msgid "All subsequent tracks are written in CD-DA audio format" #~ msgstr "Alla följande spÃ¥r är skrivna i CD-DA-ljudformatet" #~ msgid "Audio data is assumed to be in byte-swapped (little-endian) order" #~ msgstr "Ljuddata antas vara i omvänd byteordning" #~ msgid "" #~ "All subsequent tracks are written in CD-ROM mode 1 (Yellow Book) format" #~ msgstr "" #~ "Alla följande spÃ¥r är skrivna i CD-ROM läge 1 (Yellow book) formatet" #~ msgid "All subsequent tracks are written in CD-ROM mode 2 format" #~ msgstr "Alla följande spÃ¥r är skrivna i CD-ROM läge 2 formatet" #~ msgid "All subsequent tracks are written in CD-ROM XA mode 2 form 1 format" #~ msgstr "Alla följande spÃ¥r är skrivna i CD-ROM XA läge 2 form 1 formatet" #~ msgid "All subsequent tracks are written in CD-ROM XA mode 2 form 2 format" #~ msgstr "Alla följande spÃ¥r är skrivna i CD-ROM XA läge 2 form 2 formatet" #~ msgid "" #~ "All subsequent tracks are written in a way that allows a mix of CD-ROM XA " #~ "mode 2 form 1/2 format" #~ msgstr "" #~ "Alla följande spÃ¥r är skrivna pÃ¥ ett sätt som fillÃ¥ter en blandning av CD-" #~ "ROM XA läge 2 form 1/2 formaten" #~ msgid "The TOC type for the disk is set to CDI, with XA only" #~ msgstr "InnehÃ¥llsförteckningen är satt till CDI, med enbart XA" #~ msgid "Use the ISO-9660 file system size as the size of the next track" #~ msgstr "Använd ISO-9660-filsystemets storlek som storlek pÃ¥ nästa spÃ¥r" #~ msgid "" #~ "15 sectors of zeroed data will be added to the end of this and each " #~ "subsequent data track" #~ msgstr "" #~ "Lägg till 15 sektorer av nolldata till slutet av varje efterföljande " #~ "dataspÃ¥r" #~ msgid "Set the amount of data to be appended as padding to the next track" #~ msgstr "" #~ "Ange mängden data som skall läggas till som paddning till nästa spÃ¥r" #~ msgid "Do not pad the following tracks - the default" #~ msgstr "Lägg inte till paddning till de följande spÃ¥ren - standard" #~ msgid "Output diagnostic for changed files" #~ msgstr "Visa information om ändrade filer" #~ msgid "Dereferense symbolic links" #~ msgstr "Följ symboliska länkar" #~ msgid "Do not dereference symbolic links" #~ msgstr "Följ ej symboliska länkar" #~ msgid "Change from owner/group" #~ msgstr "Byt frÃ¥n ägare/grupp" #~ msgid "Use same owner/group as file" #~ msgstr "Använd samma ägargrupp som angiven fil" #~ msgid "Operate recursively" #~ msgstr "Rekurivt läge" #~ msgid "Output diagnostic for every file" #~ msgstr "Visa information om alla filer" #~ msgid "Add text to the end of the selected area" #~ msgstr "Lägg till text till slutet av valt omrÃ¥de" #~ msgid "Add text at cursor" #~ msgstr "Lägg till text vid markören" #~ msgid "Replace selected part" #~ msgstr "Ersätt valt omrÃ¥de" #~ msgid "Select job under cursor" #~ msgstr "Välj jobb under markören" #~ msgid "Select process under cursor" #~ msgstr "Välj process under markören" #~ msgid "Select token under cursor" #~ msgstr "Välj symbol under markören" #~ msgid "Select entire command line (default)" #~ msgstr "Välj hela kommandoraden (standard)" #~ msgid "Only return that part of the command line before the cursor" #~ msgstr "Visa bara den del av kommandoraden som är före markören" #~ msgid "Inject readline functions to reader" #~ msgstr "Skicka readline-funktion till läsaren" #~ msgid "Specify command to operate on" #~ msgstr "Ange kommando att operera pÃ¥" #~ msgid "Set/get cursor position, not buffer contents" #~ msgstr "Sätt/hämta markörposition, inte bufferinnehÃ¥ll" #~ msgid "Command to add completion to" #~ msgstr "Kommando att komplettera" #~ msgid "Path to add completion to" #~ msgstr "Sökväg att komplettera" #~ msgid "Posix-style option to complete" #~ msgstr "Posix-typ av flagga att komplettera" #~ msgid "GNU-style option to complete" #~ msgstr "GNU-typ av flagga att komplettera" #~ msgid "Old style long option to complete" #~ msgstr "Gammal typ av lÃ¥ng flagga att komplettera" #~ msgid "Do not use file completion" #~ msgstr "Använd inte fil-komplettering" #~ msgid "Require parameter" #~ msgstr "Kräv parameter" #~ msgid "Require parameter and do not use file completion" #~ msgstr "Kräv parameter, använd inte filkomplettering" #~ msgid "A list of possible arguments" #~ msgstr "Parametrar specifikt för denna flagga för flagga" #~ msgid "Description of this completions" #~ msgstr "Beskrivning av denna komplettering" #~ msgid "Option list is not complete" #~ msgstr "Detta kommando accepterar andra flaggor än de här angivna" #~ msgid "Remove completion" #~ msgstr "Ta bort komplettering" #~ msgid "Print all completions for the specified commandline" #~ msgstr "Visa alla möjliga kompletteringar för det angivna commandot" #~ msgid "" #~ "The completion should only be used if the specified command has a zero " #~ "exit status" #~ msgstr "" #~ "Completteringen skall bara användas om det angivna kommandot har " #~ "nollskild avslutningstatus" #~ msgid "Cache test results in file config.cache" #~ msgstr "Cachea test resultat i filen config.cache" #~ msgid "Do not create output files" #~ msgstr "Skapa inte utfiler" #~ msgid "Architecture-independent install directory" #~ msgstr "Arkitekturoberoende installationskatalog" #~ msgid "Architecture-dependent install directory" #~ msgstr "Arkitekturberoende installationskatalog" #~ msgid "Configure for building on BUILD" #~ msgstr "Konfiurera för att bygga pÃ¥ given mÃ¥larkitektur" #~ msgid "Cross-compile to build programs to run on HOST" #~ msgstr "Korskompilera för angiven värd" #~ msgid "Configure for building compilers for TARGET" #~ msgstr "Konfigurera för att bygga kompilator för angivet mÃ¥l" #~ msgid "Same as -dpR" #~ msgstr "Samma sak som -dpR" #~ msgid "Make backup of each existing destination file" #~ msgstr "Gör backup av varje existerande destinationsfil" #~ msgid "Copy contents of special files when recursive" #~ msgstr "Kopiera innehÃ¥ll i specialla filer i rekursivt läge" #~ msgid "Same as --no-dereference --preserve=link" #~ msgstr "Samma sak som --no-dereference --preserve=link" #~ msgid "Do not prompt before overwriting" #~ msgstr "FrÃ¥ga inte före överskrivning" #~ msgid "Prompt before overwrite" #~ msgstr "FrÃ¥ga före överskrivning" #~ msgid "Follow command-line symbolic links" #~ msgstr "Följ symboliska länkar frÃ¥n kommandoraden" #~ msgid "Link files instead of copying" #~ msgstr "Länka filer istället för att kopiera dem" #~ msgid "Remove trailing slashes from source" #~ msgstr "Ta bort snedstreck i slutet pÃ¥ källangivelser" #~ msgid "Target directory" #~ msgstr "MÃ¥lkatalog" #~ msgid "Do not overwrite newer files" #~ msgstr "Skriv inte över nyare filer" #~ msgid "Always follow symbolic links" #~ msgstr "Följ alltid symboliska länkar" #~ msgid "Never follow symbolic links" #~ msgstr "Följ aldrig symboliska länkar" #~ msgid "Use full source file name under DIRECTORY" #~ msgstr "Använd fullt källfilsnamn under KATALOG" #~ msgid "Copy directories recursively" #~ msgstr "Kopiera kataloger rekursivt" #~ msgid "" #~ "Remove each existing destination file before attempting to open it " #~ "(contrast with --force)" #~ msgstr "" #~ "Ta bort varje existerande mÃ¥lfil innan försök att öppna den (jämför med --" #~ "force)" #~ msgid "Make symbolic links instead of copying" #~ msgstr "Skapa symboliska länkar istället för att kopiera" #~ msgid "Treat DEST as a normal file" #~ msgstr "Behandla DEST som en vanlig fil" #~ msgid "Stay on this file system" #~ msgstr "Stanna pÃ¥ detta filsystem" #~ msgid "Dont split mutibyte characters" #~ msgstr "Dela inte multibytesekvenser" #~ msgid "Do not print lines without delimiter" #~ msgstr "Skriv inte ut rader utan fältavgränsare" #~ msgid "Select output delimiter" #~ msgstr "Välj utdataavgränsare" #~ msgid "Kerberos server mode" #~ msgstr "Kerberosserverläge" #~ msgid "Print out history information for files" #~ msgstr "Visa historikinformation för filer" #~ msgid "Prompt for password for authenticating server" #~ msgstr "Be om lösenord för autentisering" #~ msgid "Removes entry in .cvspass for remote repository" #~ msgstr "Ta bort inlägg i .cvspass för fjärrförrÃ¥d" #~ msgid "Password server mode" #~ msgstr "Serverlösenordsläge" #~ msgid "Show last revision where each line of module was modified" #~ msgstr "Visa senaste revision vid vilken vare rad i modul ändrades" #~ msgid "Create patch format diffs between releases" #~ msgstr "Skapa differens mellan versioner i \"patch\"-format" #~ msgid "Indicate that a Module is no longer in use" #~ msgstr "Indikera att modul inte längre används" #~ msgid "Print out history information for a module" #~ msgstr "Skriv ut historik för modul" #~ msgid "Add a symbolic tag to a module" #~ msgstr "Lägg till symbolisk tagg till modul" #~ msgid "Server mode" #~ msgstr "Serverläge" #~ msgid "Display status information on checked out files" #~ msgstr "Visa status för utcheckade files" #~ msgid "Add a symbolic tag to checked out version of files" #~ msgstr "Lägg till symbolisk tagg till utcheckad version av filer" #~ msgid "Bring work tree in sync with repository" #~ msgstr "Synkronisera arbetsträd med förrÃ¥d" #~ msgid "Set watches" #~ msgstr "Lägg till övervakning" #~ msgid "See who is watching a file" #~ msgstr "Visa övervakningar pÃ¥ fil" #~ msgid "Specify legal cvsroot directory." #~ msgstr "Välj laglig cvsroot-katalog" #~ msgid "Authenticate all net traffic" #~ msgstr "Autentisera all nätverkstrafik" #~ msgid "Do not use the ~/.cvsrc file" #~ msgstr "Ignorera ~/.cvsrc" #~ msgid "Do not change any files" #~ msgstr "Ändra inga filer" #~ msgid "Cause CVS to be really quiet" #~ msgstr "Gör CVS mycket tyst läge" #~ msgid "Read-only repository mode" #~ msgstr "Skrivskyddat förrÃ¥d-läge" #~ msgid "Cause CVS to be somewhat quiet" #~ msgstr "Gör CVS nÃ¥got tystare" #~ msgid "Make checked-out files read-only" #~ msgstr "Gör utcheckade filer skrivskyddade" #~ msgid "Show trace of program execution -- try with -n" #~ msgstr "Visa spÃ¥r av programexekvering -- använd med -n" #~ msgid "Make checked-out files read-write (default)" #~ msgstr "Gör utcheckade filer läs och skrivbara" #~ msgid "Encrypt all net traffic" #~ msgstr "Kryptera all nätverkstrafik" #~ msgid "Use the most recent revision no later than date" #~ msgstr "Använd den senaste revisionen som ej är nyare än angivet datum" #~ msgid "Retrieve files even when no match for tag/date" #~ msgstr "Hämta filer även när ingen matchning finns för tagg/datum" #~ msgid "Alter default keyword processing" #~ msgstr "Ändra standardnyckelordsprocessning" #~ msgid "Don't recurse" #~ msgstr "Rekursera inte" #~ msgid "Specify log message instead of invoking editor" #~ msgstr "Ange logmeddelande istället för att anropa editor" #~ msgid "Don't run any tag programs" #~ msgstr "Kör inga taggningsprogram" #~ msgid "Prune empty directories" #~ msgstr "Rensa bort tomma kataloger" #~ msgid "Pipe files to stdout" #~ msgstr "Skicka filer till standard ut" #~ msgid "Process directories recursively" #~ msgstr "Processa underkataloger rekursivt" #~ msgid "Use a specified tag" #~ msgstr "Använd angiven tagg" #~ msgid "Specify filenames to be filtered" #~ msgstr "Ange filnamn att filtrera" #~ msgid "Lock a revision" #~ msgstr "LÃ¥s en revision" #~ msgid "Force name/rev association" #~ msgstr "Tvinga namn/revision-association" #~ msgid "Make a name/rev association" #~ msgstr "Skapa namn/revision-association" #~ msgid "Run quietly" #~ msgstr "Tyst läge" #~ msgid "Set a state attribute for a revision" #~ msgstr "Välj ett tillstÃ¥ndsattribut för en revision" #~ msgid "Write descriptive text from a file into RCS" #~ msgstr "Skriv beskrivande text frÃ¥n en fil till RCS" #~ msgid "Write descriptive text into RCS" #~ msgstr "Skriv beskrivande text till RCS" #~ msgid "Unlock a revision" #~ msgstr "LÃ¥s upp revision" #~ msgid "Annotate binary files" #~ msgstr "Annotera binära filer" #~ msgid "Reset sticky tags/dates/k-opts" #~ msgstr "Ã…terställ fasta tagg/datum/k-opts" #~ msgid "Copy module file to stdout" #~ msgstr "Kopiera modulfil till standard ut" #~ msgid "Name directory for working files" #~ msgstr "Ange katalog för arbetsfiler" #~ msgid "For -d. Don't shorten paths" #~ msgstr "För -d. Förkorta inte sökvägar" #~ msgid "Force new revision" #~ msgstr "Tvinga ny revision" #~ msgid "Treat all files as text" #~ msgstr "Behandla alla filer som text" #~ msgid "Treat all whitespace as one space" #~ msgstr "Behandla alla blanktecken som ett mellanslag" #~ msgid "Ignore blank line only changes" #~ msgstr "Ignorera ändringar som bara bestÃ¥r av ändringar i tomma rader" #~ msgid "Binary mode" #~ msgstr "Binärt läge" #~ msgid "Report only whether files differ" #~ msgstr "Skriv bara ut huruvida filerna skiljer sig" #~ msgid "Use context format" #~ msgstr "Använd kontext-format" #~ msgid "Set context size" #~ msgstr "Välj kontextstorlek" #~ msgid "Set context format and, optionally, size" #~ msgstr "Välj kontextformat och eventuellt storlek" #~ msgid "Set line group format" #~ msgstr "Välj radgruppsformat" #~ msgid "Try to find a smaller set of changes" #~ msgstr "Försök hitta en mindre uppsättning ändringar" #~ msgid "Make output a valid ed script" #~ msgstr "Gör utdata till ett giltigt ed-skript" #~ msgid "Expand tabs to spaces" #~ msgstr "Expandera tabbar till mellanslag" #~ msgid "Output that looks like an ed script" #~ msgstr "Utdata ser ut som ett ed-skript" #~ msgid "Set regexp for context, unified formats" #~ msgstr "Välj reguljärt uttryck för kontext, unifierade format" #~ msgid "Speed handling of large files with small changes" #~ msgstr "Snabb hantering av stora filer med smÃ¥ ändringar" #~ msgid "Set horizon lines" #~ msgstr "Välj horisontlinjer" #~ msgid "Ignore changes in case" #~ msgstr "Ignorera ändringar i skiftläge" #~ msgid "Ignore changes matching regexp" #~ msgstr "Ignorera ändringar som matchar reguljärt uttryck" #~ msgid "Make ifdef from diff" #~ msgstr "Skapa ifdef frÃ¥n differens" #~ msgid "Ignore whitespace" #~ msgstr "Ignorera blanktecken" #~ msgid "Start lines with a tab" #~ msgstr "Starta rader med en tabb" #~ msgid "Use label instead of filename in output" #~ msgstr "Använd etikett istället för filnamn i utdata" #~ msgid "Print only left column" #~ msgstr "Visa bara vänster kolumn" #~ msgid "Use format to produce if-then-else output" #~ msgstr "Använd format för att producera if-then-else utdata" #~ msgid "Produce RCS-style diffs" #~ msgstr "Producera differenser i RCS-stil" #~ msgid "Treat files absent from one dir as empty" #~ msgstr "Behandla saknade filer frÃ¥n katalog som om de vore tomma" #~ msgid "Specifies line formatting" #~ msgstr "Ange radformatering" #~ msgid "Identify the C function each change is in" #~ msgstr "Identifiera vilken C-funktion varje ändring är i" #~ msgid "Report identical files" #~ msgstr "Rapportera identiska filer" #~ msgid "Use side-by-side format" #~ msgstr "Använd sida-vid-sida-format" #~ msgid "Suppress common lines in side-by-side" #~ msgstr "Undertryck vanliga rader i sida-vid-sida" #~ msgid "Use unified format" #~ msgstr "Använd unifierat format" #~ msgid "Set context size in unified" #~ msgstr "Välj kontextstorlek i unifierat format" #~ msgid "Set column width for side-by-side format" #~ msgstr "Välj kolumnbredd för sida-vis-sida-format" #~ msgid "Report on each commit" #~ msgstr "Rapport för varje tillägg" #~ msgid "Report on everything" #~ msgstr "Rapport för allt" #~ msgid "Report on a module" #~ msgstr "Rapport för modul" #~ msgid "Report on checked-out modules" #~ msgstr "Rapport för ut-checkade moduler" #~ msgid "Report on all tags" #~ msgstr "Rapport för alla taggar" #~ msgid "Show history for all users" #~ msgstr "Visa historik för alla användare" #~ msgid "Show only records for this directory" #~ msgstr "Visa bara poster för angiven katalog" #~ msgid "Multiple vendor branch" #~ msgstr "Multipel distributör-gren" #~ msgid "Files to ignore during import" #~ msgstr "Filer att ignorera vid import" #~ msgid "Print info about revision on default branch" #~ msgstr "Visa information om revision i standardgren" #~ msgid "Specify date range for query" #~ msgstr "Ange dataspann för frÃ¥ga" #~ msgid "Print only file info" #~ msgstr "Visa utförlig information" #~ msgid "Do not print tags" #~ msgstr "Skriv inte ut taggar" #~ msgid "Print only rcs filename" #~ msgstr "Skriv bara RCS-filnamn" #~ msgid "Print only given revisions" #~ msgstr "Skriv bara ut angiven revision" #~ msgid "Suppress header if no revisions found" #~ msgstr "Visa inte huvud om inga revisioner hittas" #~ msgid "Specify revision states" #~ msgstr "Ange revisionstiollstÃ¥nd" #~ msgid "Same as -h, plus descriptive text" #~ msgstr "Samma som -h, men med beskrivande text" #~ msgid "Specify users for query" #~ msgstr "Ange användare för frÃ¥ga" #~ msgid "Use context diff format" #~ msgstr "Användar kontextdifferensformat" #~ msgid "Create summary change report" #~ msgstr "Skapa översiktilig ändringsrapport" #~ msgid "diff top two revisions" #~ msgstr "Visa differens mellan tvÃ¥ senaste revisioner" #~ msgid "Use unidiff format" #~ msgstr "Använd unidiff-format" #~ msgid "Delete working copy if release succeeds" #~ msgstr "Radera arbetskopia om släppning lyckas" #~ msgid "Reset sticky tags, dates, and k-opts" #~ msgstr "Ã…terställ fasta taggar, datum och k-opts" #~ msgid "Overwrite modified files with clean copies" #~ msgstr "Skriv över ändrade filer med rena kopior" #~ msgid "Create any missing directories" #~ msgstr "Skapa saknade kataloger" #~ msgid "Specify files to ignore" #~ msgstr "Ange filer att ignorera" #~ msgid "Create new project" #~ msgstr "Skapa nytt projekt" #~ msgid "Shows brief description of command and its arguments" #~ msgstr "Visa kort beskrivning av underkommandon" #~ msgid "Disable this command" #~ msgstr "Inaktivera kommando" #~ msgid "Neither verbose nor quiet output" #~ msgstr "Varken tyst eller utförligt läge" #~ msgid "Name of patch" #~ msgstr "Namn pÃ¥ fix" #~ msgid "Give patch name and comment in file" #~ msgstr "Välj fixnamn och kommentar via fil" #~ msgid "Answer yes to all patches" #~ msgstr "Svara ja pÃ¥ alla fixar" #~ msgid "" #~ "In addition to modifications, look for files that are not boring, and " #~ "thus are potentially pending addition" #~ msgstr "" #~ "Förutom att lägga till ändringar, sök efter interessanta filer att lägga " #~ "till lagret" #~ msgid "Don't run the test script" #~ msgstr "Kör inte testskript" #~ msgid "Run the test script" #~ msgstr "Kör testskript" #~ msgid "Don't remove the test directory" #~ msgstr "Ta inte bort testkatalog" #~ msgid "Remove the test directory" #~ msgstr "Ta bort testkatalog" #~ msgid "Create compressed patches" #~ msgstr "Skapa komprimerade fixar" #~ msgid "Don't create compressed patches" #~ msgstr "Skapa inte komprimerade fixar" #~ msgid "Expect to receive input from a pipe" #~ msgstr "Förvänta indata frÃ¥n rör" #~ msgid "Prompt user interactively" #~ msgstr "FrÃ¥ga användaren interaktivt" #~ msgid "Ask for extra dependencies" #~ msgstr "FrÃ¥ga efter extra beroenden" #~ msgid "Don't ask for extra dependencies" #~ msgstr "FrÃ¥ga inte efter extra beroenden" #~ msgid "Edit the long comment by default" #~ msgstr "Redigera lÃ¥nga kommentarer som standard" #~ msgid "Don't give a long comment" #~ msgstr "Redigera inte lÃ¥ng kommentar" #~ msgid "Prompt for whether to edit the long comment" #~ msgstr "FrÃ¥ga om den lÃ¥nga kommentaren skall redigeras" #~ msgid "" #~ "Don't look for any files or directories that could be added, and don't " #~ "add them automatically" #~ msgstr "" #~ "Leta inte efter filer eller kataloger att lägga till, och lägg inte till " #~ "dem automatiskt" #~ msgid "Summarize changes" #~ msgstr "Summera ändringar" #~ msgid "Suppress informational output" #~ msgstr "Tyst läge" #~ msgid "Don't actually take the action" #~ msgstr "Gör ingenting" #~ msgid "Don't summarize changes" #~ msgstr "Summera inte ändringar" #~ msgid "Don't automatically fulfill dependencies" #~ msgstr "FrÃ¥ga efter extra beroenden" #~ msgid "Set default repository [DEFAULT]" #~ msgstr "Välj standardförrÃ¥d" #~ msgid "Don't set default repository" #~ msgstr "Välj inte standardförrÃ¥d" #~ msgid "Make scripts executable" #~ msgstr "Gör skript exekverbara" #~ msgid "Don't make scripts executable" #~ msgstr "Gör inte skript exekverbara" #~ msgid "Reply to email-based patch using FROM address" #~ msgstr "Svara pÃ¥ e-postbaserad fix frÃ¥n adress" #~ msgid "Don't verify patch signature" #~ msgstr "Verifiera inte fix-signaturer" #~ msgid "Mark conflicts" #~ msgstr "Markera konflikter" #~ msgid "Allow conflicts, but don't mark them" #~ msgstr "TillÃ¥t konflikter, men markera dem inte" #~ msgid "Fail on patches that create conflicts [DEFAULT]" #~ msgstr "Misslyckas pÃ¥ fixar som skapar konflikter [STANDARD]" #~ msgid "Forward unsigned messages without extra header" #~ msgstr "Skicka vidare osignerade meddelanden utan extra huvud" #~ msgid "Check the entire repository" #~ msgstr "Kontrollera hela lagret" #~ msgid "Check patches since latest checkpoint" #~ msgstr "Kontrollera fixar sedan senaste kontrollpunkt" #~ msgid "Don't refuse to add files differing only in case" #~ msgstr "Vägra inte lägga till filer som bara skiljer i skiftläge" #~ msgid "Output patch in a darcs-specific format similar to diff -u" #~ msgstr "Skriv fix i darcs-specifikt format som liknar diff -u" #~ msgid "Sign the patch with your gpg key" #~ msgstr "Signera fix med din gpg-nyckel" #~ msgid "Do not sign the patch" #~ msgstr "Signera inte fixen" #~ msgid "Edit the patch bundle description" #~ msgstr "Redigera fix-paketbeskrivning" #~ msgid "Use a plain pristine tree [DEFAULT]" #~ msgstr "Använd enkelt pristint träd [DEFAULT]" #~ msgid "Use no pristine tree" #~ msgstr "Använd inte pristint träd" #~ msgid "Give human readable output" #~ msgstr "Människoanpassad formatering av utdata" #~ msgid "Generate XML formatted output" #~ msgstr "Generera XML-formaterad utdata" #~ msgid "Select changes up to a tag matching REGEXP" #~ msgstr "Välj ändringar fram till tag som matchar REGEXP" #~ msgid "Give output suitable for get --context" #~ msgstr "Formatera utdata lämpligt för get --context" #~ msgid "Give human-readable output" #~ msgstr "Människoanpassad formatering av utdata" #~ msgid "Don't skip boring files" #~ msgstr "Skippa inte trÃ¥kiga filer" #~ msgid "Add contents of subdirectories" #~ msgstr "Lägg till innehÃ¥ll i underkataloger" #~ msgid "Don't add contents of subdirectories" #~ msgstr "Lägg inte till innehÃ¥ll i underkataloger" #~ msgid "Add files with date appended to avoid conflict. [EXPERIMENTAL]" #~ msgstr "" #~ "Lägg till filer med datum efter för att undvika konflikter. " #~ "[EEXPERIMENTELLT]" #~ msgid "Don't use experimental date appending trick. [DEFAULT]" #~ msgstr "Använd inte experimentellt datum-tillläggningstrick. [STANDARD]" #~ msgid "Uncompress patches" #~ msgstr "Dekomprimera fixar" #~ msgid "Rewrite all patches in current darcs format" #~ msgstr "Skriv om alla fixar till nuvarande darcs-format" #~ msgid "Specify a sibling directory" #~ msgstr "Ange en syskonkatalog" #~ msgid "Relink pristine tree (not recommended)" #~ msgstr "Linka om till det orörda trädet (inte rekommenderat)" #~ msgid "Do not run posthook command." #~ msgstr "Utför inte posthook-kommando" #~ msgid "Display date described by string" #~ msgstr "Visa datum angivet i textsträng" #~ msgid "Display date for each line in file" #~ msgstr "Visa datum för varje rad i fil" #~ msgid "Output in ISO 8601 format" #~ msgstr "Visa datum i ISO 8601-format" #~ msgid "Output RFC-2822 compliant date string" #~ msgstr "Visa datum i RFC-2822-format" #~ msgid "Display the last modification time of file" #~ msgstr "Visa senaste ändringsdatum för fil" #~ msgid "Print or set Coordinated Universal Time" #~ msgstr "Visa eller välj Koordinerad universaltid (UCT)" #~ msgid "List inode information" #~ msgstr "Lista information om inoder" #~ msgid "Use 1kB block size" #~ msgstr "Använd 1kB blockstorlek" #~ msgid "List only local filesystems" #~ msgstr "Lista bara lokala filsystem" #~ msgid "Use Posix format" #~ msgstr "Använd Posix-format" #~ msgid "Include empty filesystems" #~ msgstr "Inkludera tomma filsystem" #~ msgid "Do not sync before getting usage info" #~ msgstr "Synkronisera inte filsystem innan användningsinformation hämtas" #~ msgid "Sync before getting usage info" #~ msgstr "Synkronisera filsystem innan användningsinformation hämtas" #~ msgid "Print filesystem type" #~ msgstr "Visa filsystemtyp" #~ msgid "Excluded filesystem type" #~ msgstr "Exkludera filsystemtyp" #~ msgid "Show all filesystems" #~ msgstr "Visa alla filsystem" #~ msgid "Show sizes in gigabytes" #~ msgstr "Visa storlekar i gigabyte" #~ msgid "Show sizes in megabytes" #~ msgstr "Visa storlekar i megabyte" #~ msgid "Print out the previously obtained statistics from the file systems" #~ msgstr "Visa tidigare hämtad statistik frÃ¥n filsystemet" #~ msgid "Ignore case differences" #~ msgstr "Ignorera skiftläge" #~ msgid "Ignore case when comparing file names" #~ msgstr "Ignorera skiftläge pÃ¥ filnamn" #~ msgid "Consider case when comparing file names" #~ msgstr "Skilj pÃ¥ skiftläge pÃ¥ filnamn" #~ msgid "Ignore changes due to tab expansion" #~ msgstr "Ignorera ändringar pÃ¥ grund av tabbexpansion" #~ msgid "Ignore changes in the amount of white space" #~ msgstr "Ignorera skillnader i blanka tecken" #~ msgid "Ignore all white space" #~ msgstr "Ignorera blanka tecken" #~ msgid "Ignore changes whose lines are all blank" #~ msgstr "Ignorera ändringar vars rader enbart bestÃ¥r av blana tecken" #~ msgid "Recursively compare subdirectories" #~ msgstr "Rekursera till underkataloger" #~ msgid "Treat absent files as empty" #~ msgstr "Behandla saknade filer som om de vore tomma" #~ msgid "Output 3 lines of copied context" #~ msgstr "Skriv ut 3 rader av kopierad sammanhang" #~ msgid "Output 3 lines of unified context" #~ msgstr "Skriv ut 3 rader av unifierat sammanhang" #~ msgid "Output only whether the files differ" #~ msgstr "Skriv bara ut huruvida filerna skiljer sig" #~ msgid "Output a normal diff" #~ msgstr "Skriv ut en vanlig diff" #~ msgid "Output in two columns" #~ msgstr "Skriv ut i tvÃ¥ kolumner" #~ msgid "Pass the output through 'pr'" #~ msgstr "Skicka utdata genom â€prâ€" #~ msgid "Write size for all files" #~ msgstr "Skriv ut storlek för alla filer" #~ msgid "Print file size, not disk usage" #~ msgstr "Skriv ut filstorlek, inte använt diskutrymme" #~ msgid "Use 1B block size" #~ msgstr "Använd 1B som blockstorlek" #~ msgid "Produce grand total" #~ msgstr "Visa totalsumma" #~ msgid "Dereference file symlinks" #~ msgstr "Följ symboliska länkar till filer" #~ msgid "Count hard links multiple times" #~ msgstr "Räkna hÃ¥rda länkar alla gÃ¥nger de förekommer" #~ msgid "Dereference all symlinks" #~ msgstr "Följ alla symboliska länkar" #~ msgid "Do not include subdirectory size" #~ msgstr "Inkludera inte underkatalogers storlek" #~ msgid "Display only a total for each argument" #~ msgstr "Visa bara en totalsumma för varje argument" #~ msgid "Skip other filesystems" #~ msgstr "Skippa andra filsystem" #~ msgid "No newline" #~ msgstr "Skriv ingen radbrytning" #~ msgid "Use backslash escaped characters" #~ msgstr "Använd omvänt snedstreck-specialsekvenser" #~ msgid "Do not use backslash escaped characters" #~ msgstr "Använd inte omvänt snedstreck-specialsekvenser" #~ msgid "Do not load init files" #~ msgstr "Ladda inte initieringsfiler" #~ msgid "Load users init file" #~ msgstr "Ladda användarens initieringsfiler" #~ msgid "Use file as terminal" #~ msgstr "Användard fil som terminal" #~ msgid "Execute Lisp function" #~ msgstr "Utför lispfunktion" #~ msgid "Load Lisp code from file" #~ msgstr "Ladda lispfunktion frÃ¥n fil" #~ msgid "Do not use X interface" #~ msgstr "Använd inte X-användargränssnittet" #~ msgid "Create window on the specified display" #~ msgstr "Skapa fönster pÃ¥ angiven skärm" #~ msgid "Command" #~ msgstr "Kommando" #~ msgid "Start with an empty environment" #~ msgstr "Starta med tom miljö" #~ msgid "Remove variable from the environment" #~ msgstr "Ta bort variabel frÃ¥n variablestacken" #, fuzzy #~ msgid "Never follow symlinks" #~ msgstr "Följ aldrig symboliska länkar" #, fuzzy #~ msgid "Process subdirectories before the directory itself" #~ msgstr "Processa underkataloger rekursivt" #, fuzzy #~ msgid "Maximum recursion depth" #~ msgstr "Maximal â€resident set sizeâ€" #, fuzzy #~ msgid "Turn warnings on" #~ msgstr "Visa inte varningar" #, fuzzy #~ msgid "Turn warnings off" #~ msgstr "Visa inte varningar" #, fuzzy #~ msgid "File last accessed more recently than file was modified" #~ msgstr "Visa senaste revision vid vilken vare rad ändrades" #, fuzzy #~ msgid "Always false" #~ msgstr "Formatera alltid om" #, fuzzy #~ msgid "File is on filesystem of specified type" #~ msgstr "Visa filsystem av angiven typ" #, fuzzy #~ msgid "Numeric group id of file" #~ msgstr "Bara numerisk utdata" #, fuzzy #~ msgid "Group name of file" #~ msgstr "Visa inod för filer" #, fuzzy #~ msgid "File has specified inode number" #~ msgstr "Filtrera genom angivet program" #, fuzzy #~ msgid "File has specified number of links" #~ msgstr "Jämför bara angivet antal tecken" #, fuzzy #~ msgid "File last modified more recently than file was modified" #~ msgstr "Visa senaste revision vid vilken vare rad ändrades" #, fuzzy #~ msgid "File name matches pattern" #~ msgstr "Visa inte filer som matchar mönster" #, fuzzy #~ msgid "File path matches pattern" #~ msgstr "Exkludera filer som matchar mönster" #, fuzzy #~ msgid "Files has specified permissions set" #~ msgstr "Använd angiven kompressionsalgoritm" #, fuzzy #~ msgid "File name matches regex" #~ msgstr "Ignorera ändringar som matchar reguljärt uttryck" #, fuzzy #~ msgid "File refers to the same inode as specified file" #~ msgstr "Exklidera filer listade i angiven fil" #, fuzzy #~ msgid "Always true" #~ msgstr "Alltid" #, fuzzy #~ msgid "File is of specified type" #~ msgstr "Visa filsystem av angiven typ" #, fuzzy #~ msgid "File's owner has specified numeric user ID" #~ msgstr "Fil ägd av effektiv användar-id" #, fuzzy #~ msgid "File's owner" #~ msgstr "Fil är uttag (socket)" #, fuzzy #~ msgid "Execute specified command for each located file" #~ msgstr "Utför kommando om föregÃ¥ende kommando misslyckades" #, fuzzy #~ msgid "List file in ls -dils format, write to specified file" #~ msgstr "Skriv profileringsinformation till angiven fil" #, fuzzy #~ msgid "Print formated data into specified file" #~ msgstr "Skriv utdata till angiven fil" #, fuzzy #~ msgid "Print full file names" #~ msgstr "Visa filnamn" #, fuzzy #~ msgid "Print null separated full file names" #~ msgstr "Skriv bara RCS-filnamn" #, fuzzy #~ msgid "Print formated data" #~ msgstr "Visa informativa meddelanden" #, fuzzy #~ msgid "Exit at once" #~ msgstr "Förklara vad som utförs" #, fuzzy #~ msgid "List file in ls -dils format" #~ msgstr "Lista information om inoder" #, fuzzy #~ msgid "Negate result of action" #~ msgstr "Negera uttryck" #~ msgid "Run fish with this command" #~ msgstr "Utför detta kommando i fish" #~ msgid "Only parse input, do not execute" #~ msgstr "Verifiera bara kommandon, utför dem inte" #~ msgid "Run in interactive mode" #~ msgstr "Kör i interaktivt läge" #~ msgid "Run in login mode" #~ msgstr "Kör i loginläge" #~ msgid "Output profiling information to specified file" #~ msgstr "Skriv profileringsinformation till angiven fil" #~ msgid "Set function description" #~ msgstr "Välj funktionsbeskrivning" #~ msgid "Make the function a job exit event handler" #~ msgstr "Gör funktionen till en händelsehanterare för avslutade jobb" #~ msgid "Make the function a process exit event handler" #~ msgstr "Gör funktionen till en händelsehanterare för avslutade processer" #~ msgid "Make the function a signal event handler" #~ msgstr "Gör funktionen till en händelsehanterare för signaler" #~ msgid "Make the function a variable update event handler" #~ msgstr "Gör funktionen till en händelsehanterare för variabeluppdateringar" #~ msgid "Allow dash (-) in function name" #~ msgstr "TillÃ¥t bindestreck (-) i funktionsnamn" #~ msgid "Erase function" #~ msgstr "Radera funktion" #~ msgid "Show hidden functions" #~ msgstr "Visa dolda funktioner" #, fuzzy #~ msgid "Test if function is defined" #~ msgstr "Testa om variabeln är definerad" #~ msgid "Unmount" #~ msgstr "Avmontera" #~ msgid "Quiet" #~ msgstr "Tyst läge" #~ msgid "Lazy unmount" #~ msgstr "Lat avmontering" #~ msgid "Language" #~ msgstr "SprÃ¥k" #~ msgid "Pass program exit codes" #~ msgstr "Skicka vidare slutstatus" #~ msgid "Stop after assembler" #~ msgstr "Stanna efter assembler" #~ msgid "Stop after compile" #~ msgstr "Stanna efter kompilering" #~ msgid "Stop after preprocessor" #~ msgstr "Stanna efter förprocessor" #~ msgid "Output file" #~ msgstr "Utdatafil" #~ msgid "Print commands to stderr" #~ msgstr "Skriv kommandon till standard fel" #~ msgid "Print quoted commands to stderr, do not run" #~ msgstr "Skriv citerade kommandon till standard fel, utför dem inte" #~ msgid "Use pipes" #~ msgstr "Använd rör" #~ msgid "Use ansi mode" #~ msgstr "Använd ansiläge" #~ msgid "Write prototypes to file" #~ msgstr "Skriv prototyper till fil" #~ msgid "Do not recognize asm, inline or typeof keywords" #~ msgstr "Känn inte igen asm, inline och typeof nyckelorden" #~ msgid "Do not use builtin functions" #~ msgstr "Använd inte inbyggda funktioner" #~ msgid "Assert hosted environment" #~ msgstr "Försäkra värdmiljö" #~ msgid "Assert freestanding environment" #~ msgstr "Försäkra självständig miljö" #~ msgid "Use Microsoft extensions" #~ msgstr "Använd Microsoftförlängningar" #~ msgid "Use ANSI trigraphs" #~ msgstr "Använd ANSI-trigrafer" #~ msgid "Do not use integrated preprocessor" #~ msgstr "Använd inte inbyggd förprocessor" #~ msgid "char is unsigned" #~ msgstr "char har inte tecken" #~ msgid "char is signed" #~ msgstr "char har tecken" #~ msgid "bitfield is unsigned" #~ msgstr "bitfield har inte tecken" #~ msgid "bitfield is signed" #~ msgstr "bitfield har tecken" #~ msgid "All bitfields are signed" #~ msgstr "Alla bitfield har tecken" #~ msgid "All bitfields are unsigned" #~ msgstr "Inga bitfield har tecken" #~ msgid "String constants are not const" #~ msgstr "Strängkonstanter är inte konstanta" #~ msgid "C++ ABI version" #~ msgstr "C++ ABI-version" #~ msgid "Turn off access checking" #~ msgstr "SlÃ¥ av rättighetskontroll" #~ msgid "Check pointer returned by new" #~ msgstr "Kontrollera pekare frÃ¥n â€newâ€" #~ msgid "Put globals in the common segment" #~ msgstr "Lägg globaler i det gemensamma segmentet" #~ msgid "Accept $ in identifiers" #~ msgstr "Acceptera $ i identifierare" #~ msgid "Reject $ in identifiers" #~ msgstr "Acceptera inte $ i identifierare" #~ msgid "Do not omit unneeded temporarys" #~ msgstr "Ta into bort onödiga tillfälliga variabler" #~ msgid "Allow exception violations" #~ msgstr "TillÃ¥t brott mot undantag" #~ msgid "Do not extend for-loop scope" #~ msgstr "Utöka inte definitionsomrÃ¥de för for-loop" #~ msgid "Extend for-loop scope" #~ msgstr "Utöka definitionsomrÃ¥de för for-loop" #~ msgid "Do not recognize typeof as keyword" #~ msgstr "Känn inte igen typeof som nyckelord" #~ msgid "Do not emit code for implicit templates" #~ msgstr "Skapa inte kod for implicita mallar" #~ msgid "Do not emit code for implicit inline templates" #~ msgstr "Skapa inte kod för implicita inlinemallar" #~ msgid "Do not emit out-of-line code for inline functions" #~ msgstr "Skapa inte icke-inlinekod for inline-funktioner" #~ msgid "Disable warnings about MFC" #~ msgstr "Visa inte varningar om MFC" #~ msgid "Disable some built-in functions" #~ msgstr "Inaktivera somliga inbyggda funktioner" #~ msgid "Disable operator keywords" #~ msgstr "Inaktivera operator-nyckelord" #~ msgid "Disable optional diagnostics" #~ msgstr "Inaktivera frivillig diagnostik" #~ msgid "Downgrade some errors to warnings" #~ msgstr "Nedgradera vissa fel till varningar" #~ msgid "Enable automatic template instantiation at link time" #~ msgstr "SlÃ¥ pÃ¥ automatisk templateinstantiering vid länktillfälle" #~ msgid "Disable generation of C++ runtime type information" #~ msgstr "" #~ "Inaktivera generering av C++-typinformation under körning av program" #~ msgid "Do not emit code for thread-safe initialization of local statics" #~ msgstr "" #~ "Skapa inte kod för trÃ¥d-säker initiering av lokala statiska variabler" #~ msgid "Use __cxa_atexit for destructors" #~ msgstr "Använd __cxa_atexit för destruktorer" #~ msgid "Hides inline methods from export table" #~ msgstr "Dölj inline-metoder frÃ¥n exporttabeller" #~ msgid "Do not use weak symbol support" #~ msgstr "Stöd inte svaga symboler" #~ msgid "Make a signature" #~ msgstr "Skapa signatur" #~ msgid "Make a clear text signature" #~ msgstr "Skapa klartextsignatur" #~ msgid "Make a detached signature" #~ msgstr "Skapa bortkopplad signatur" #~ msgid "Encrypt data" #~ msgstr "Kryptera data" #~ msgid "Encrypt with a symmetric cipher using a passphrase" #~ msgstr "Kryptera med symmetriskt chiffer och passfras" #~ msgid "Store only (make a simple RFC1991 packet)" #~ msgstr "Endast lagring (skapa ett enkelt RFC1991-paket)" #~ msgid "Assume specified file or stdin is sigfile and verify it" #~ msgstr "" #~ "Antag att angiven fil eller standard in är signatur och verifiera den" #~ msgid "" #~ "Modify certain other commands to accept multiple files for processing" #~ msgstr "Ändra vissa andra kommandon so de behandlar multipla filer" #~ msgid "Identical to '--multifile --verify'" #~ msgstr "Identiskt med â€--multifile --verifyâ€" #~ msgid "Identical to '--multifile --encrypt'" #~ msgstr "Identiskt med â€--multifile --encryptâ€" #~ msgid "Identical to --multifile --decrypt" #~ msgstr "Identiskt med --multifile --decrypt" #~ msgid "" #~ "List all keys from the public keyrings, or just the ones given on the " #~ "command line" #~ msgstr "" #~ "Visa alla nycklar frÃ¥n den öppna nyckelringen, eller de angivna pÃ¥ " #~ "kommandoraden" #~ msgid "" #~ "List all keys from the secret keyrings, or just the ones given on the " #~ "command line" #~ msgstr "" #~ "Visa alla nycklar frÃ¥n den hemliga nyckelringen, eller de angivna pÃ¥ " #~ "kommandoraden" #~ msgid "Same as --list-keys, but the signatures are listed too" #~ msgstr "Samma som --list-keys, men visa även signaturer" #~ msgid "Same as --list-keys, but the signatures are listed and verified" #~ msgstr "Samma som --list-keys, men visa och verifiera även signaturer" #~ msgid "List all keys with their fingerprints" #~ msgstr "Visa alla nycklar och deras fingeravtryck" #~ msgid "Generate a new key pair" #~ msgstr "Generera ett nytt nyckelpar" #~ msgid "Present a menu which enables you to do all key related tasks" #~ msgstr "Visa en meny som lÃ¥ter dig utföra alla nyckelrelaterade aktiviteter" #~ msgid "Sign a public key with your secret key" #~ msgstr "Signera en öppen nyckel med din hemliga nyckel" #~ msgid "Sign a public key with your secret key but mark it as non exportable" #~ msgstr "" #~ "Signera en öppen nyckel med din hemliga nyckel men markera den som icke-" #~ "exporterbar" #~ msgid "Remove key from the public keyring" #~ msgstr "Ta bort en nyckel frÃ¥n den öppna nyckelringen" #~ msgid "Remove key from the secret and public keyring" #~ msgstr "Ta bort en nyckel frÃ¥n den öppna och den hemliga nyckelringen" #~ msgid "" #~ "Same as --delete-key, but if a secret key exists, it will be removed first" #~ msgstr "" #~ "Samma som --delete-key, men om en hemlig nyckel existerar, ta bort den " #~ "först" #~ msgid "Generate a revocation certificate for the complete key" #~ msgstr "Generera ett Ã¥terkallelsecertifikat för hela nyckeln" #~ msgid "Generate a designated revocation certificate for a key" #~ msgstr "Generera ett utsett Ã¥terkallelsecertifikat för en nyckel" #~ msgid "Export all or the given keys from all keyrings" #~ msgstr "Exportera alla eller alla angivna nycklar frÃ¥n alla nyckelringar" #~ msgid "Same as --export but sends the keys to a keyserver" #~ msgstr "Samma som --export, men skicka nycklar till en nyckelserver" #~ msgid "Same as --export, but exports the secret keys instead" #~ msgstr "Samma som --export, men exportera hemliga nycklar istället" #~ msgid "Import/merge keys" #~ msgstr "Importera/sammanslÃ¥ mycklar" #~ msgid "Import the keys with the given key IDs from a keyserver" #~ msgstr "Importera nycklarna med givet nyckel-id frÃ¥n nyckelserver" #~ msgid "" #~ "Request updates from a keyserver for keys that already exist on the local " #~ "keyring" #~ msgstr "" #~ "Begär uppdateringar frÃ¥n en nyckelserver för nycklar som redan existerar " #~ "i den lokala nyckelringen" #~ msgid "Search the keyserver for the given names" #~ msgstr "Sök nyckelservern efter de angivna namnen" #~ msgid "Do trust database maintenance" #~ msgstr "Utför underhÃ¥ll pÃ¥ förtroendedatabasen" #~ msgid "Do trust database maintenance without user interaction" #~ msgstr "Utför underhÃ¥ll pÃ¥ förtroendedatabasen utan användarinteraktion" #~ msgid "Send the ownertrust values to stdout" #~ msgstr "Visa ögarförtroendevärdena pÃ¥ standard ut" #~ msgid "" #~ "Update the trustdb with the ownertrust values stored in specified files " #~ "or stdin" #~ msgstr "" #~ "Uppdatera förtroendedatabasen med ägarförtroendevärdena lagrade i den " #~ "angivna filen eller standard in" #~ msgid "Create signature caches in the keyring" #~ msgstr "Skapa signarurcache i nyckelringen" #~ msgid "" #~ "Print message digest of specified algorithm for all given files or stdin" #~ msgstr "" #~ "Visa meddelandedigest med given algoritm för alla angivna filer eller " #~ "standard in" #~ msgid "Print message digest of all algorithms for all given files or stdin" #~ msgstr "" #~ "Visa meddelandedigest med given algoritm för alla angivna filer eller " #~ "standard in" #~ msgid "Emit specified number of random bytes of the given quality level" #~ msgstr "" #~ "Skapa det angivna antalet slumpmässiga bytes med den angivna kvaliteten" #~ msgid "Display version and supported algorithms, and exit" #~ msgstr "Visa version och stödda algoritmer och avsluta" #~ msgid "Display warranty and exit" #~ msgstr "Visa garanti och avsluta" #~ msgid "Create ASCII armored output" #~ msgstr "Skapa ASCII-skyddad utdata" #~ msgid "" #~ "Sets a limit on the number of bytes that will be generated when " #~ "processing a file" #~ msgstr "" #~ "Sätt gräns pÃ¥ antal bytes som kommer genereras vid behandlande av en fil" #~ msgid "Use specified key as the key to sign with" #~ msgstr "Använd angiven nyckel som nyckel för signering" #~ msgid "Use specified key as the default key to sign with" #~ msgstr "Använd angiven nyckel som standardnyckel för signering" #~ msgid "Encrypt for specified user id" #~ msgstr "Kryptera för angivet användarid" #~ msgid "Encrypt for specified user id, but hide the keyid of the key" #~ msgstr "Kryptera för angivet användarid, men dölj nyckelid hos nyckel" #~ msgid "Use specified user id as default recipient" #~ msgstr "Använd angiven användarid som standardmottagare" #~ msgid "Use the default key as default recipient" #~ msgstr "Använd standardnyckel som standardmottagare" #~ msgid "Reset --default-recipient and --default-recipient-self" #~ msgstr "Ã…terställ --default-recipient och --default-recipient-self" #~ msgid "Give more information during processing" #~ msgstr "Ge mer information under behandling" #~ msgid "Compression level" #~ msgstr "KompressionsnivÃ¥" #~ msgid "Use a different decompression method for BZIP2 compressed files" #~ msgstr "Använd alternativ dekompressionsmetod för BZIP2-komprimerade filer" #~ msgid "" #~ "Treat input files as text and store them in the OpenPGP canonical text " #~ "form with standard 'CRLF' line endings" #~ msgstr "" #~ "Behandla indatafiler som text och lagra dem i det kanoniska OpenPGP-" #~ "textformatet med standard â€CRLF†radavslut" #~ msgid "" #~ "Don't treat input files as text and store them in the OpenPGP canonical " #~ "text form with standard 'CRLF' line endings" #~ msgstr "" #~ "Behandla inte indatafiler som text och lagra dem inte i det kanoniska " #~ "OpenPGP-textformatet med standard â€CRLF†radavslut" #~ msgid "Don't make any changes (this is not completely implemented)" #~ msgstr "Gör inga ändringar (inte helt implementerat)" #~ msgid "Batch mode" #~ msgstr "Satsvis-läge" #~ msgid "Don't use batch mode" #~ msgstr "Använd inte satsvis-läge" #~ msgid "Never write output to terminal" #~ msgstr "Skriv aldrig utdata till terminalen" #~ msgid "Assume yes on most questions" #~ msgstr "Anta ja pÃ¥ de flesta frÃ¥gor" #~ msgid "Assume no on most questions" #~ msgstr "Anta nej pÃ¥ de flesta frÃ¥gor" #~ msgid "Prompt for a certification level when making a key signature" #~ msgstr "FrÃ¥ga efter certifieringsnivÃ¥ vid nyckelsignaturskapande" #~ msgid "Don't prompt for a certification level when making a key signature" #~ msgstr "FrÃ¥ga inte efter certifieringsnivÃ¥ vid nyckelsignaturskapande" #~ msgid "" #~ "The default certification level to use for the level check when signing a " #~ "key" #~ msgstr "" #~ "StandardcertifieringsnivÃ¥ att använda för nivÃ¥kontroll vid nyckelsignering" #~ msgid "" #~ "Disregard any signatures with a certification level below specified level " #~ "when building the trust database" #~ msgstr "" #~ "Ignorera alla signaturer med signaturnivÃ¥ under angiven nivÃ¥ vid " #~ "byggandet av förtroendedatabasen" #~ msgid "" #~ "Assume that the specified key is as trustworthy as one of your own secret " #~ "keys" #~ msgstr "" #~ "Anta att den angivna nyckeln är lika pÃ¥litlig som en av dina egna hemliga " #~ "nycklar" #~ msgid "Specify trust model" #~ msgstr "Ange förtroendemodell" #~ msgid "Select how to display key IDs" #~ msgstr "Välj hur nyckelid ska visas" #~ msgid "Options for the keyserver" #~ msgstr "Inställningar till nyckelservern" #~ msgid "Options for importing keys" #~ msgstr "Inställningar för att importera nycklar" #~ msgid "Options for exporting keys" #~ msgstr "Inställningar för att exportera nycklar" #~ msgid "Options for listing keys and signatures" #~ msgstr "Inställningar för visning av nycklar och signaturer" #~ msgid "Options for verifying signatures" #~ msgstr "Inställningar för verifiering av signaturer" #~ msgid "" #~ "Display the keyring name at the head of key listings to show which " #~ "keyring a given key resides on" #~ msgstr "" #~ "Visa nyckelringnamnet vid toppen av nyckellistan för att visa vilken " #~ "nyckelring en given nyckel ligger i" #~ msgid "Set the home directory" #~ msgstr "Välj hemkatalog" #~ msgid "Set the native character set" #~ msgstr "Välj den interna teckenuppsättningen" #~ msgid "Assume that following command line arguments are given in UTF8" #~ msgstr "Antag att efterföljande argument är lagrade i UTF8" #~ msgid "" #~ "Assume that following arguments are encoded in the character set " #~ "specified by --display-charset" #~ msgstr "" #~ "Antag att efterföljande argument är lagrade i teckenuppsättningen angiven " #~ "av --display-charset" #~ msgid "Shortcut for '--options /dev/null'" #~ msgstr "Genväg för â€--options /dev/nullâ€" #~ msgid "Write attribute subpackets to the specified file descriptor" #~ msgstr "Skriv attributunderpaket till angiven filidentifierare" #~ msgid "Include secret key comment packets when exporting secret keys" #~ msgstr "" #~ "Inkludera hemliga nyckel-kommentarpaket vid exportering av hemliga nycklar" #~ msgid "Don't include secret key comment packets when exporting secret keys" #~ msgstr "" #~ "Inkludera inte hemliga nyckel-kommentarpaket vid exportering av hemliga " #~ "nycklar (standard)" #~ msgid "Don't use a comment string" #~ msgstr "Använd inte en kommentarsträng" #~ msgid "Include the version string in ASCII armored output" #~ msgstr "Inkludera versionssträng i ASCII-skyddat utdata" #~ msgid "Don't include the version string in ASCII armored output" #~ msgstr "Inkludera inte versionssträng i ASCII-skyddat utdata (standard)" #~ msgid "Set the 'for your eyes only' flag in the message" #~ msgstr "Sätt â€for your eyes onlyâ€-flaggan i meddelandet" #~ msgid "Clear the 'for your eyes only' flag in the message" #~ msgstr "Töm â€for your eyes onlyâ€-flaggan i meddelandet" #~ msgid "Create file with name as given in data" #~ msgstr "Skapa fil med namn angivet i data" #~ msgid "Don't create file with name as given in data" #~ msgstr "Skapa inte fil med namn angivet i data" #~ msgid "Use specified cipher algorithm" #~ msgstr "Använd angiven chiffer-algoritm" #~ msgid "Use specified message digest algorithm" #~ msgstr "Använd angiven meddelandedigestalgoritm" #~ msgid "Use specified compression algorithm" #~ msgstr "Använd angiven kompressionsalgoritm" #~ msgid "Use specified message digest algorithm when signing a key" #~ msgstr "Använd angiven meddelandedigestalgoritm vid nyckelsignering" #~ msgid "Use specified cipher algorithm to protect secret keys" #~ msgstr "Använd angiven chifferalgoritm för att skydda hemliga nycklar" #~ msgid "Use specified digest algorithm to mangle the passphrases" #~ msgstr "Använd angiven digestalgoritm för passfrasmangling" #~ msgid "Selects how passphrases are mangled" #~ msgstr "Välj hur passfrasmangling" #~ msgid "Integrity protect secret keys by using a SHA-1 checksum" #~ msgstr "" #~ "Sködda hemliga nycklars integritet genom att använda en SHA-1-" #~ "kontrollsumma" #~ msgid "Never allow the use of specified cipher algorithm" #~ msgstr "TilÃ¥t aldrig användandet av angiven chifferalgoritm" #~ msgid "Never allow the use of specified public key algorithm" #~ msgstr "TillÃ¥t aldrig användandet av angiven öppen nyckel-algoritm" #~ msgid "Do not cache the verification status of key signatures" #~ msgstr "Cache:a inte verifieringsstatus av nyckelsignaturer" #~ msgid "Do not verify each signature right after creation" #~ msgstr "Kontrollera inte varje signatur direkt efter skapande" #~ msgid "Automatically run the --check-trustdb command internally when needed" #~ msgstr "Utför automatiskt â€--check-trustdbâ€-kommandot internt vid behov" #~ msgid "Never automatically run the --check-trustdb" #~ msgstr "Utför aldrig automatiskt â€--check-trustdbâ€-kommandot" #~ msgid "Do not put the recipient keyid into encrypted packets" #~ msgstr "Lägg inte in mottagarens nyckelid i krypterade paket" #~ msgid "Put the recipient keyid into encrypted packets" #~ msgstr "Lägg in mottagarens nyckelid i krypterade paket" #~ msgid "" #~ "Change the behavior of cleartext signatures so that they can be used for " #~ "patch files" #~ msgstr "" #~ "Ändra beteendet av klartextsignaturer sÃ¥ att de kan användas för fix-filer" #~ msgid "Mangle From-field of email headers (default)" #~ msgstr "Mangla â€Fromâ€-fält i e-posthuvuden (standard)" #~ msgid "Do not mangle From-field of email headers" #~ msgstr "Mangla inte â€Fromâ€-fält i e-posthuvuden (standard)" #~ msgid "Try to use the GnuPG-Agent" #~ msgstr "Försök använda GnuPG-Agent" #~ msgid "Do not try to use the GnuPG-Agent" #~ msgstr "Försök inte använda GnuPG-Agent" #~ msgid "Force v3 signatures for signatures on data" #~ msgstr "Tvinga v3-signaturer för signering av data" #~ msgid "Do not force v3 signatures for signatures on data" #~ msgstr "Tvinga inte v3-signaturer för signering av data" #~ msgid "Always use v4 key signatures even on v3 keys" #~ msgstr "Använd alltid v4-nyckelsignaturer även pÃ¥ v3-nycklar" #~ msgid "Don't use v4 key signatures on v3 keys" #~ msgstr "Använd inte v4-nyckelsignaturer pÃ¥ v3-nycklar" #~ msgid "Force the use of encryption with a modification detection code" #~ msgstr "Tvinga användandet av kryptering med en modifieringsdetekteringskod" #~ msgid "Disable the use of the modification detection code" #~ msgstr "Avaktivera användandet av ändringsdetekteringskod" #~ msgid "" #~ "Allow the import and use of keys with user IDs which are not self-signed" #~ msgstr "" #~ "TillÃ¥t importering och användning av nycklar med användarid som inte är " #~ "självsignerade" #~ msgid "" #~ "Do not allow the import and use of keys with user IDs which are not self-" #~ "signed" #~ msgstr "" #~ "TillÃ¥t inte importering och användning av nycklar med användarid som inte " #~ "är självsignerade" #~ msgid "" #~ "Disable all checks on the form of the user ID while generating a new one" #~ msgstr "" #~ "Avaktivera alla kontroller pÃ¥ formatet av användarid vid generering av " #~ "nya användarid" #~ msgid "Do not fail if signature is older than key" #~ msgstr "Misslyckas inte om signatur är äldre än nyckel" #~ msgid "Allow subkeys that have a timestamp from the future" #~ msgstr "TillÃ¥t undernycklar som har tidsstämpel frÃ¥n framtiden" #~ msgid "Ignore CRC errors" #~ msgstr "Ignorera CRC-fel" #~ msgid "Do not fail on MDC integrity protection failure" #~ msgstr "Misslyckas inte vid MDC-integritetsskyddsmisslyckande" #~ msgid "" #~ "Lock the databases the first time a lock is requested and do not release " #~ "the lock until the process terminates" #~ msgstr "" #~ "LÃ¥s databaser vid första läsförfrÃ¥gan och släpp inte lÃ¥set före processen " #~ "avslutar" #~ msgid "Release the locks every time a lock is no longer needed" #~ msgstr "Släpp lÃ¥s varje gÃ¥ng det inte längre behövs" #~ msgid "" #~ "Do not create an internal pool file for quicker generation of random " #~ "numbers" #~ msgstr "Skapa inte en intern pool-fil för snabbare generering av slumptal" #~ msgid "Reset verbose level to 0" #~ msgstr "Ã…terställ felrapporteringsnivÃ¥ till 0" #~ msgid "Suppress the initial copyright message" #~ msgstr "Visa inte initialt copyrightmeddelande" #~ msgid "Suppress the warning about 'using insecure memory'" #~ msgstr "Undertryck varningen om â€använder osäkert minneâ€" #~ msgid "" #~ "Suppress the warning about unsafe file and home directory (--homedir) " #~ "permissions" #~ msgstr "" #~ "Undertryck varningen om osäkra fil- och hemkatalogrättigheter (--homedir) " #~ msgid "Suppress the warning about missing MDC integrity protection" #~ msgstr "Undertryck varningen om saknat MDCintegritetsskydd" #~ msgid "Refuse to run if GnuPG cannot get secure memory" #~ msgstr "Vägra köra om GnuPG inte kan fÃ¥ säkert minne" #~ msgid "Do not refuse to run if GnuPG cannot get secure memory (default)" #~ msgstr "Vägra inte köra om GnuPG inte kan fÃ¥ säkert minne" #~ msgid "Assume the input data is not in ASCII armored format" #~ msgstr "Antag att indata inte är i ASCII-skyddat format" #~ msgid "Do not add the default keyrings to the list of keyrings" #~ msgstr "Lägg inte standardnyckelringar till listan pÃ¥ nyckelringar" #~ msgid "Skip the signature verification step" #~ msgstr "Skippa signaturverifieringssteg" #~ msgid "Print key listings delimited by colons" #~ msgstr "Visa nyckellistning separerad av kolon" #~ msgid "" #~ "Print key listings delimited by colons (like --with-colons) and print the " #~ "public key data" #~ msgstr "" #~ "Visa nyckellistning separerad av kolon (som --with-colons) och visa öppen " #~ "nyckel data" #~ msgid "" #~ "Same as the command --fingerprint but changes only the format of the " #~ "output and may be used together with another command" #~ msgstr "" #~ "Samma som kommandot --fingerprint men byter bara formatet pÃ¥ utdata och " #~ "kan användas med andra kommandon" #~ msgid "Changes the output of the list commands to work faster" #~ msgstr "Ändrar utdata av listningskommandon sÃ¥ det fungerar snabbare" #~ msgid "" #~ "Do not merge primary user ID and primary key in --with-colon listing mode " #~ "and print all timestamps as UNIX timestamps" #~ msgstr "" #~ "Sammanställ inte primära användarid i â€--with-colonâ€-listningsläge och " #~ "skriv alla tidsstämplar som UNIX-tidsstämplar" #~ msgid "" #~ "Changes the behaviour of some commands. This is like --dry-run but " #~ "different" #~ msgstr "Ändrar beteendet av vissa kommandon. Som --dry-run men annorlunda" #~ msgid "Display the session key used for one message" #~ msgstr "Visa sessionsnyckel som används för ett meddelande" #~ msgid "Prompt for an expiration time" #~ msgstr "FrÃ¥ga efter utgÃ¥ngsdatum" #~ msgid "Do not prompt for an expiration time" #~ msgstr "FrÃ¥ga inte efter utgÃ¥ngsdatum" #~ msgid "" #~ "Don't look at the key ID as stored in the message but try all secret keys " #~ "in turn to find the right decryption key" #~ msgstr "" #~ "Undersök inte nyckelid lagrat i meddelande, försök alla hemliga nycklar i " #~ "turordningför att hitta rätt dekrypteringsnyckel" #~ msgid "" #~ "Enable a mode in which filenames of the form -&n, where n is a non-" #~ "negative decimal number, refer to the file descriptor n and not to a file " #~ "with that name" #~ msgstr "" #~ "Aktivera ett läge i vilket filnamn pÃ¥ formen -&n, där n är ett positivt " #~ "heltal, refererar till filidentifierare n, och inte till filen med det " #~ "angivna namnet" #~ msgid "Remove a given entry from the --group list" #~ msgstr "Ta bort ett inlägg frÃ¥n ---group'-listan" #~ msgid "Remove all entries from the --group list" #~ msgstr "Ta bort alla inlägg frÃ¥n förrÃ¥d frÃ¥n â€--groupâ€-listan" #~ msgid "" #~ "Don't change the permissions of a secret keyring back to user read/write " #~ "only" #~ msgstr "" #~ "Ändra inte rättigheterna pÃ¥ en hemlig nyckel tillbaka till läs/skriv " #~ "endast för användaren" #~ msgid "Print annotated source" #~ msgstr "Skriv ut kommenterad källkod" #~ msgid "Do not print explanations" #~ msgstr "Skriv inte ut förklaringar" #~ msgid "Print tally" #~ msgstr "Visa sammanställning av antal funktionanrop" #~ msgid "Display summary" #~ msgstr "Visa sammanställning" #~ msgid "Search directories for source" #~ msgstr "Sök i angivna kataloger efter källkod" #~ msgid "No annotated source" #~ msgstr "Visa inte kommenterad källkod" #~ msgid "Print full path of source" #~ msgstr "Visa full sökväg till källkod" #~ msgid "Print flat profile" #~ msgstr "Visa platt profil" #~ msgid "No flat profile" #~ msgstr "Visa inte platt profil" #~ msgid "Print call graph" #~ msgstr "Visa anropsgraf" #~ msgid "No call graph" #~ msgstr "Visa inte anropsgraf" #~ msgid "Annotate to file" #~ msgstr "Skriv kommentarer till fil" #~ msgid "No tally" #~ msgstr "Visa inte sammanställning av antal funktionanrop" #~ msgid "Suggest function ordering" #~ msgstr "FöreslÃ¥ funktionsordning" #~ msgid "Suggest file ordering" #~ msgstr "FöreslÃ¥ filordning" #~ msgid "Traditional mode" #~ msgstr "Traditionellt läge" #~ msgid "Set width of output" #~ msgstr "Välj bredd pÃ¥ utdata" #~ msgid "Annotate every line" #~ msgstr "Kommentera varje rad" #~ msgid "Set demangling style" #~ msgstr "Välj avmanglingsstil" #~ msgid "Turn of demangling" #~ msgstr "SlÃ¥ av avmangling" #~ msgid "Supress static functions" #~ msgstr "Visa inte statiska funktioner" #~ msgid "Ignore symbols not known to be functions" #~ msgstr "Ignorera symboler som inte är kända funktioner" #~ msgid "Line by line profiling" #~ msgstr "Profilera radvis" #~ msgid "Only propagate times for matching symbols" #~ msgstr "Propagera bara tider för matchande symboler" #~ msgid "Do not propagate times for matching symbols" #~ msgstr "Skicka inte vidare tider för matchande symboler" #~ msgid "Mention unused functions in flat profile" #~ msgstr "Nämn oanvända funktioner i platt profil" #~ msgid "Specify debugging options" #~ msgstr "Välj debuginställningar" #~ msgid "Print summary" #~ msgstr "Visa sammanfattning" #~ msgid "Print NUM lines of trailing context" #~ msgstr "Visa NUM rader av följande sammanhang" #~ msgid "Process binary file as text" #~ msgstr "Processa binär fil som text" #~ msgid "Print NUM lines of leading context" #~ msgstr "Visa NUM rader av inledande sammanhang" #~ msgid "Print NUM lines of context" #~ msgstr "Visa NUM rader av sammanhang" #~ msgid "Assume data type for binary files" #~ msgstr "Antag följande datatyp för binära filer" #~ msgid "Pattern is extended regexp" #~ msgstr "Mönster är ett förlängt reguljärt uttryck" #~ msgid "Pattern is a regexp" #~ msgstr "Mönster är ett reguljärt uttryck" #~ msgid "Pattern is a fixed string" #~ msgstr "Mönster är en fixsträng" #~ msgid "Pattern is basic regex" #~ msgstr "Mönster är ett grundläggande reguljärt uttryck" #~ msgid "Print filename" #~ msgstr "Visa filnamn" #~ msgid "Supress printing filename" #~ msgstr "Visa inte filnamn" #~ msgid "Skip binary files" #~ msgstr "Skippa binära filer" #~ msgid "Ignore case" #~ msgstr "Ignorera skiftläge" #~ msgid "Print first non-matching file" #~ msgstr "Visa första icke-matchande fil" #~ msgid "Print first matching file" #~ msgstr "Visa första matchande fil" #~ msgid "Stop reading after NUM matches" #~ msgstr "Sluta läsa efter NUM matchningar" #~ msgid "Use the mmap system call to read input" #~ msgstr "Använd systemanroppet mmap för inläsning" #~ msgid "Print linenumber" #~ msgstr "Visa radnummer" #~ msgid "Show only matching part" #~ msgstr "Visa bara matchande del" #~ msgid "Rename stdin" #~ msgstr "Byt namn pÃ¥ standard in" #~ msgid "Use line buffering" #~ msgstr "Använd radbuffring" #~ msgid "Do not write anything" #~ msgstr "Skriv ingenting" #~ msgid "Read files under each directory" #~ msgstr "Läs filer i varje katalog" #~ msgid "Recurse, search file matching PATTERN" #~ msgstr "Rekursera, sök i filer som matchar mönster" #~ msgid "Recurse, skip file matching PATTERN" #~ msgstr "Rekursera, skippa filer som matchar mönster" #~ msgid "Suppress error messages" #~ msgstr "Visa inte felmeddelanden" #~ msgid "Treat files as binary" #~ msgstr "Behandla filer som om de vore binära" #~ msgid "Report Unix-style byte offsets" #~ msgstr "Visa Unix-typ av byteavstÃ¥nd" #~ msgid "Invert the sense of matching" #~ msgstr "Invertera matchning" #~ msgid "Only whole matching words" #~ msgstr "Matcha bara hela ord" #~ msgid "Only whole matching lines" #~ msgstr "Matcha bara hela rader" #~ msgid "Synonym for -i" #~ msgstr "Synonym för -i" #~ msgid "Output a zero byte after filename" #~ msgstr "Skriv en nollad byte efter filnamn" #~ msgid "List compression information" #~ msgstr "Visa kompressionsinformation" #~ msgid "Do not save/restore filename" #~ msgstr "Spara/Ã¥terställ inte filnamn" #~ msgid "Save/restore filename" #~ msgstr "Spara/Ã¥terställ filnamn" #~ msgid "Supress warnings" #~ msgstr "Visa inte varningar" #~ msgid "Recurse directories" #~ msgstr "Rekursera till underkataloger" #~ msgid "Display compression ratios" #~ msgstr "Visa kompressionsgrad" #~ msgid "Use fast setting" #~ msgstr "Använd inställningar för hög fart" #~ msgid "Use high compression setting" #~ msgstr "Använd inställningar för hög kompressionsnivÃ¥" #, fuzzy #~ msgid "Convert from specified encoding" #~ msgstr "Flytta filen angiven pÃ¥ kommandoraden" #, fuzzy #~ msgid "Convert to specified encoding" #~ msgstr "Flytta filen angiven pÃ¥ kommandoraden" #, fuzzy #~ msgid "List known coded character sets" #~ msgstr "Välj den interna teckenuppsättningen" #, fuzzy #~ msgid "Print progress information" #~ msgstr "Visa all information" #~ msgid "Print effective group id" #~ msgstr "Visa effektivt grupp-id" #~ msgid "Print all group ids" #~ msgstr "Visa alla grupp-id" #~ msgid "Print name, not number" #~ msgstr "Visa namn, inte nummer" #~ msgid "Print real ID, not effective" #~ msgstr "Visa verkligt id, inte effektivt" #~ msgid "Print effective user ID" #~ msgstr "Visa effektivt användar-id" #~ msgid "Show the process id of each process in the job" #~ msgstr "Visa process-id för varje process i jobbet" #~ msgid "Show group id of job" #~ msgstr "Visa grupp-id för jobb" #~ msgid "Show commandname of each job" #~ msgstr "Visa kommandonamn för varje jobb" #~ msgid "Only show status for last job to be started" #~ msgstr "Visa bara status för det senast startade jobbet" #, fuzzy #~ msgid "List codes and names of available signals" #~ msgstr "Visa namnen pÃ¥ alla tillgängliga signaler" #~ msgid "List names of available signals" #~ msgstr "Visa namnen pÃ¥ alla tillgängliga signaler" #~ msgid "Search after end of screen" #~ msgstr "Sök förbi slut pÃ¥ skärmen" #~ msgid "Disable automtic buffer allocation" #~ msgstr "Inaktivera automatisk buffert-allokering" #~ msgid "Repaint from top" #~ msgstr "Rita om frÃ¥n toppen" #~ msgid "Clear and repaint from top" #~ msgstr "Töm och rita om frÃ¥n toppen" #~ msgid "Supress error for lacking terminal capability" #~ msgstr "Visa inte felmeddelanden för saknade terminalförmÃ¥gor" #~ msgid "Exit on second EOF" #~ msgstr "Avsluta andra gÃ¥ngen filslut pÃ¥träffas" #~ msgid "Exit on EOF" #~ msgstr "Avsluta vid filslut" #~ msgid "Open non-regular files" #~ msgstr "Öppna icke-reguljär fil" #~ msgid "Quit if file shorter than one screen" #~ msgstr "Avsluta om filen är kortare än en skärmfull" #~ msgid "Hilight one search target" #~ msgstr "Markera ett sökmÃ¥l" #~ msgid "No search highlighting" #~ msgstr "Markera inte sökmÃ¥l" #~ msgid "Maximum backward scroll" #~ msgstr "MAximal bakÃ¥trullning" #~ msgid "Search ignores lowercase case" #~ msgstr "Sökning ignorerar gemener" #~ msgid "Search ignores all case" #~ msgstr "Sökning ignorerar skiftläge" #~ msgid "Target line" #~ msgstr "MÃ¥lrad" #~ msgid "Display status column" #~ msgstr "Visa statuskolumn" #~ msgid "Specify key bindings file" #~ msgstr "Välj fil med tangentbordsgenvägar" #~ msgid "Verbose prompt" #~ msgstr "Utförlig prompt" #~ msgid "Display line number" #~ msgstr "Visa radnummer" #~ msgid "Display line number for each line" #~ msgstr "Visa radnummer för varje rad" #~ msgid "Log input to file" #~ msgstr "Logga indata till fil" #~ msgid "Log to file, overwrite" #~ msgstr "Logga til fil, skriv över tidigare information" #~ msgid "Start at first occurrence of pattern" #~ msgstr "Starta vid första matchningen av angivet mönster" #~ msgid "Prompt string" #~ msgstr "Promptsträng" #~ msgid "Silent mode" #~ msgstr "Tyst läge" #~ msgid "Completly silent mode" #~ msgstr "Fullständigt tyst läge" #~ msgid "Display control chars" #~ msgstr "Visa kontrolltecken" #~ msgid "Display control chars, guess screen appearance" #~ msgstr "Visa kontrolltecken, försök gissa skärmutseende" #~ msgid "Multiple blank lines sqeezed" #~ msgstr "SlÃ¥ ihop multipla tomma rader" #~ msgid "Do not fold long lines" #~ msgstr "Radbryt inte lÃ¥nga rader" #~ msgid "Edit tag" #~ msgstr "Redigera markering" #~ msgid "Set tag file" #~ msgstr "Välj markeringsfil" #~ msgid "Allow backspace and carriage return" #~ msgstr "TillÃ¥t backsteg och vagnretur" #~ msgid "Allow backspace, tab and carriage return" #~ msgstr "TillÃ¥t backsteg, tabb och vagnretur" #~ msgid "Highlight first unread line on new page" #~ msgstr "Markera den första olästa raden pÃ¥ ny sida" #~ msgid "Highlight first unread line on any movement" #~ msgstr "Markera den första olästa radenvid alla rörelser" #~ msgid "Set tab stops" #~ msgstr "Välj tabbstorlek" #~ msgid "No termcap init" #~ msgstr "Initiera inte med termcap" #~ msgid "No keypad init" #~ msgstr "Initiera inte numeriskt tangentbord" #~ msgid "Maximum forward scroll" #~ msgstr "Maximal framrullning" #~ msgid "Max scroll window" #~ msgstr "Maximalt rullningsfönster" #~ msgid "Set quote char" #~ msgstr "Välj citat-tecken" #~ msgid "Lines after EOF are blank" #~ msgstr "Gör rader efter filslut tomma" #~ msgid "Characters to scroll on left/right arrows" #~ msgstr "Tecken att rulla pÃ¥ vänster/högerpil" #, fuzzy #~ msgid "Match only the base name against the specified patterns" #~ msgstr "Installera inte filer vars namn börjar med angiven sökväg" #, fuzzy #~ msgid "Ignore case distinctions when matching patterns" #~ msgstr "Ignorera skiftläge pÃ¥ filnamn" #, fuzzy #~ msgid "Ignored" #~ msgstr "Ignorera skiftläge" #, fuzzy #~ msgid "Write no messages about errors encountered" #~ msgstr "Visa meddelanden om vad programmet gör" #, fuzzy #~ msgid "Interpret all patterns as extended regexps" #~ msgstr "Mönster är ett förlängt reguljärt uttryck" #, fuzzy #~ msgid "Match only the whole path name against the specified patterns" #~ msgstr "Installera inte filer vars namn börjar med angiven sökväg" #~ msgid "Append dependencies to makefile" #~ msgstr "Lägg till beroenden till makefil" #~ msgid "Warn about multiple inclusion" #~ msgstr "Varna vid upprapad inkudering" #~ msgid "Environment before makefile" #~ msgstr "Använd värden frÃ¥n miljövariabler före värden frÃ¥n make-fil" #~ msgid "Ignore errors" #~ msgstr "Ignorera fel" #~ msgid "Continue after an error" #~ msgstr "Fortsätt vid fel" #~ msgid "Start when load drops" #~ msgstr "Starta när belastningen minstar" #~ msgid "Do not execute commands" #~ msgstr "Utför inte kommandon" #~ msgid "Print database" #~ msgstr "Visa databas" #~ msgid "Question mode" #~ msgstr "FrÃ¥geläge" #~ msgid "Eliminate implicit rules" #~ msgstr "Ta bort implicita regler" #~ msgid "Don't continue after an error" #~ msgstr "Fortsätt inte vid fel" #~ msgid "Touch files, don't run commands" #~ msgstr "Ändra ändringstid pÃ¥ filer, utför inte kommandon" #~ msgid "Program section" #~ msgstr "Programsektion" #~ msgid "Syscall section" #~ msgstr "Systemanroppssektion" #~ msgid "Library section" #~ msgstr "Bibliotekssektion" #~ msgid "Device section" #~ msgstr "Enhetssektion" #~ msgid "File format section" #~ msgstr "Filformatssektion" #~ msgid "Games section" #~ msgstr "Spelsektion" #~ msgid "Misc section" #~ msgstr "Övrig sektion" #~ msgid "Admin section" #~ msgstr "Administartionssektion" #~ msgid "Kernel section" #~ msgstr "Kärnsektion" #~ msgid "Tcl section" #~ msgstr "Tclsektion" #~ msgid "New section" #~ msgstr "Ny sektion" #~ msgid "Local section" #~ msgstr "Lokal sektion" #~ msgid "Old section" #~ msgstr "Gammal sektion" #~ msgid "Manpath" #~ msgstr "Manualsökväg" #~ msgid "Pager" #~ msgstr "Visare" #~ msgid "Manual sections" #~ msgstr "Manualsektion" #~ msgid "Display all matches" #~ msgstr "Visa alla matchningar" #~ msgid "Always reformat" #~ msgstr "Formatera alltid om" #~ msgid "Debug" #~ msgstr "Debug-läge" #~ msgid "Debug and run" #~ msgstr "Debugga och kör" #~ msgid "Show whatis information" #~ msgstr "Visa whatis-information" #~ msgid "Format only" #~ msgstr "Formatera bara, visa inte" #~ msgid "Show apropos information" #~ msgstr "Visa apropos-information" #~ msgid "Search in all man pages" #~ msgstr "Sök i alla manualsidor" #~ msgid "Set system" #~ msgstr "Välj system" #~ msgid "Preprocessors" #~ msgstr "Förprocessorer" #~ msgid "Format for printing" #~ msgstr "Formatera för utskrift" #~ msgid "Only print locations" #~ msgstr "Visa bara platser" #~ msgid "Input is a file, use name and contents to determine mimetype" #~ msgstr "" #~ "Indata är en fil, använd namn och innehÃ¥ll för att bestämma mime-typ" #~ msgid "Input is a file, use name to determine mimetype" #~ msgstr "Indata är en fil, använd namn för att bestämma mime-typ" #~ msgid "Input is a mimetype" #~ msgstr "Indata är en mime-typ" #~ msgid "Output mimetype" #~ msgstr "Utdata är mimetyp" #~ msgid "Output description of mimetype" #~ msgstr "Utdata är beskrivning av mimetyp" #~ msgid "Output default action for mimetype" #~ msgstr "Utdata är standardkommando för filtyp" #~ msgid "Launch default action for each file" #~ msgstr "Utför standardkommando för varje fil" #~ msgid "Print messages about what the program is doing" #~ msgstr "Visa meddelanden om vad programmet gör" #~ msgid "Dump configuration file" #~ msgstr "Dumpa konfigurationsfil" #~ msgid "Do not actually insert/remove module" #~ msgstr "Utför inte insättning/borttagning av modul" #~ msgid "Ignore install and remove commands in configuration file" #~ msgstr "" #~ "Ignorera installations- och borttagningskommandon i konfigurationsfil" #~ msgid "Ignore bogus module names" #~ msgstr "Ignorera felaktiga modulnamn" #~ msgid "Remove modules" #~ msgstr "Ta bort moduler" #~ msgid "Ignore all version information" #~ msgstr "Ignorera all versionsinformation" #~ msgid "Ignore module interface version" #~ msgstr "Ignorera modulinterfaceversion" #~ msgid "List all modules matching the given wildcard" #~ msgstr "Lista alla moduler som matchar parameter med jokertecken" #~ msgid "Insert modules matching the given wildcard" #~ msgstr "Ligg till alla moduler som matchar parameter med jokertecken" #~ msgid "Restrict wildcards to specified directory" #~ msgstr "Begränsa jokertecken till den angivna katalogen" #~ msgid "Send error messages through syslog" #~ msgstr "Skicka felmeddelanden genom syslog" #~ msgid "Specify kernel version" #~ msgstr "Välj kärnversion" #~ msgid "List dependencies of module" #~ msgstr "Visa beroenden för modul" #~ msgid "Rename module" #~ msgstr "Byt namn pÃ¥ modul" #~ msgid "Fail if inserting already loaded module" #~ msgstr "Misslyckas vid insättning av redan laddad modul" #~ msgid "Mount filesystems in fstab" #~ msgstr "Montera filsystemen i fstab" #~ msgid "Fork process for each mount" #~ msgstr "Starta underprocess för varje montering" #~ msgid "Fake mounting" #~ msgstr "Falsk montering" #~ msgid "Add label to output" #~ msgstr "Lägg till etikett till utdata" #~ msgid "Do not write mtab" #~ msgstr "Skriv inte till mtab" #~ msgid "Tolerate sloppy mount options" #~ msgstr "Tolerera slarviga monteringsflaggor" #~ msgid "Read/Write mode" #~ msgstr "Läs ock skrivbart läge" #~ msgid "Dynamically change postprocessing" #~ msgstr "Ändra efterbehyandling dynamiskt" #~ msgid "Skip frames to maintain A/V sync" #~ msgstr "Hoppa över bilder för att behÃ¥lla ljud/bild synkronisering" #~ msgid "Play in random order" #~ msgstr "Spela i slumpmässig ordning" #~ msgid "Full screen" #~ msgstr "Fullskärmsläge" #~ msgid "Set playlist" #~ msgstr "Välj spellista" #~ msgid "Audio language" #~ msgstr "LjudsprÃ¥k" #~ msgid "Play audio from file" #~ msgstr "Spela ljud frÃ¥n fil" #~ msgid "Set default CD-ROM drive" #~ msgstr "Välj normal CD-ROM-enhet" #~ msgid "Set number of audio channels" #~ msgstr "Välj antal ljudkanaler" #~ msgid "Set start chapter" #~ msgstr "Välj startkapitel" #~ msgid "Set default DVD-ROM drive" #~ msgstr "Välj normal DVD-ROM-enhet" #~ msgid "Set dvd viewing angle" #~ msgstr "Välj dvd-betraktningsvinkel" #~ msgid "Force rebuilding index" #~ msgstr "Tvinga ombyggning av index" #~ msgid "Override framerate" #~ msgstr "Ã…sidosätt bildfrekvens" #~ msgid "Build index if unavailable" #~ msgstr "Bygg index om inte tillgängligt" #~ msgid "Load index from file" #~ msgstr "Ladda index frÃ¥n fil" #~ msgid "Force non-interleaved AVI parser" #~ msgstr "Tvinga icke-sammanflätat AVI-tolk" #~ msgid "Rebuild index and save to file" #~ msgstr "Bygg om index och spara till fil" #~ msgid "Seek to given time position" #~ msgstr "Sök till angiven tidsposition" #~ msgid "TV capture mode" #~ msgstr "TV-inspelningsläge" #~ msgid "Subtitle language" #~ msgstr "TextningssprÃ¥k" #~ msgid "Subtitle file" #~ msgstr "Textningsfil" #~ msgid "Handle subtitlefile as unicode" #~ msgstr "Hantera textningsfil som unicode" #~ msgid "Handle subtitlefile as utf8" #~ msgstr "Hantera textningsfil som utf8" #~ msgid "Also print directory history" #~ msgstr "Skriv även ut kataloghistorik" #~ msgid "" #~ "Make backup files, when patching a file, rename or copy the original " #~ "instead of removing it" #~ msgstr "" #~ "Skapa backupfiler, vid fixning av fil, byt namn eller kopiera orginalet " #~ "istället för att ta bort det" #~ msgid "Back up a file if the patch does not match the file exactly" #~ msgstr "Skapa backup av fil om fix inte matchar filen exakt" #~ msgid "Do not back up a file if the patch does not match the file exactly" #~ msgstr "Skapa inte backup av fil om fix inte matchar filen exakt" #~ msgid "Interpret the patch file as an ed script" #~ msgstr "Tolka fixfil som ett ed-skript" #~ msgid "Set the maximum fuzz factor" #~ msgstr "Sätt maximal fuzzfaktor" #~ msgid "Use style word to quote output names" #~ msgstr "Använd angiven stil vid citering av utdatanamn" #~ msgid "Put rejects into rejectfile instead of the default .rej file" #~ msgstr "" #~ "Lägg till misslyckade fixar till angiven fil istället för standard-.rej-" #~ "fil" #~ msgid "" #~ "Assume that this patch was created with the old and new files swapped" #~ msgstr "Antag att denna fix skapades med ombytta gamla och nya filer" #~ msgid "Work silently, unless an error occurs" #~ msgstr "Arbeta tyst, om inte ett fel uppstÃ¥r" #~ msgid "Interpret the patch file as a unified context diff" #~ msgstr "Tolka fixfil som unifierad kontextdiff" #~ msgid "Specify record separator" #~ msgstr "Ange postavdelare" #~ msgid "Turn on autosplit mode" #~ msgstr "SlÃ¥ pÃ¥ autosplitläge" #~ msgid "Check syntax" #~ msgstr "Kontrollera syntax" #~ msgid "Debugger" #~ msgstr "Debugger" #~ msgid "Set regexp used to split input" #~ msgstr "Välj reguljärt uttryck för att avdela indata" #~ msgid "Edit files in-place" #~ msgstr "Redigera filer pÃ¥ plats" #~ msgid "Include path" #~ msgstr "Inkluderingssökväg" #~ msgid "Automatic line ending processing" #~ msgstr "Automatisk radslutprocessning" #~ msgid "Loop script" #~ msgstr "Upprepa skript" #~ msgid "Loop script, print $_" #~ msgstr "Upprepa skript, skriv $_" #~ msgid "Invoke CPP" #~ msgstr "Kör C-förprocessorn" #~ msgid "Define custom switches" #~ msgstr "Definera egna flaggor" #~ msgid "Search $PATH for script" #~ msgstr "Genomsök $PATH efter skript" #~ msgid "Taint checking" #~ msgstr "â€taintâ€-verifiering" #~ msgid "Unsafe mode" #~ msgstr "Osäkert läge" #~ msgid "Extract script" #~ msgstr "Extrahera skript" #~ msgid "Open folder" #~ msgstr "Öppna katalog" #~ msgid "Open file" #~ msgstr "Öppna fil" #~ msgid "Initial set of keystrokes" #~ msgstr "Initiala tangenttryckningar" #~ msgid "Use function keys for commands" #~ msgstr "Använd funktionstangenter för kommandon" #~ msgid "Expand collections in FOLDER LIST display" #~ msgstr "Expandera samlingar i sidan â€FOLDER LISTâ€" #~ msgid "Start with specified current message number" #~ msgstr "Starta vid angivet meddelandenummer" #~ msgid "Open folder read-only" #~ msgstr "Öppna folder i skrivskyddat läge" #~ msgid "Set configuration file" #~ msgstr "Välj konfigurationsfil" #~ msgid "Set global configuration file" #~ msgstr "Välj global konfigurationsfil" #~ msgid "Enable suspension support" #~ msgstr "Aktivera stöd för programpausning (^Z)" #~ msgid "Produce a sample global configuration file" #~ msgstr "Skapa global exempelkonfigurationsfil" #~ msgid "Produce sample configuration file" #~ msgstr "Skapa exempelkonfigurationsfil" #~ msgid "Set mail sort order" #~ msgstr "Välj brevsorteringsordning" #~ msgid "Config option" #~ msgstr "Konfigurationsinställning" #~ msgid "Audible ping" #~ msgstr "Hörbart ping" #~ msgid "Adaptive ping" #~ msgstr "Adaptiv ping" #~ msgid "Allow pinging a broadcast address" #~ msgstr "TillÃ¥t pingning till broadcast-adress" #~ msgid "Do not allow ping to change source address of probes" #~ msgstr "TillÃ¥t inte ping att ändra källadress pÃ¥ sonder" #~ msgid "Stop after specified number of ECHO_REQUEST packets" #~ msgstr "Stoppa efter angivet antal ECHO_REQUEST-paket" #~ msgid "Set the SO_DEBUG option on the socket being used" #~ msgstr "Sätt SO_DEBUG-flaggan pÃ¥ uttaget (socket) som används" #~ msgid "Allocate and set 20 bit flow label on ECHO_REQUEST packets" #~ msgstr "Allokera och sätt 20 bitars flödesetikett pÃ¥ ECHO_REQUEST-paket" #~ msgid "Flood ping" #~ msgstr "Översvämmningsping" #~ msgid "Wait specified interval of seconds between sending each packet" #~ msgstr "Vänta angivet antal sekunder mellan skickande av paket" #~ msgid "Set source address to specified interface address" #~ msgstr "Välj källadress till angiven gränssnittsadress" #~ msgid "Send the specified number of packets without waiting for reply" #~ msgstr "Skicka angivet antal paket utan att vänta pÃ¥ svar" #~ msgid "Suppress loopback of multicast packets" #~ msgstr "Undertryck vändslinga (loopback) för multicastpaket" #~ msgid "Numeric output only" #~ msgstr "Bara numerisk utdata" #~ msgid "Pad packet with empty bytes" #~ msgstr "Lägg till tomma bytes till paket" #~ msgid "Set Quality of Service -related bits in ICMP datagrams" #~ msgstr "Sätt Tjänstekvalitets-relaterade bitar i ICMP-datagram" #~ msgid "Record route" #~ msgstr "Spela in rutt" #~ msgid "" #~ "Bypass the normal routing tables and send directly to a host on an " #~ "attached interface" #~ msgstr "" #~ "GÃ¥ förbi de vanliga rutt-tabellerna och skicka direkt till en värd pÃ¥ ett " #~ "inkopplat gränssnitt" #~ msgid "Specifies the number of data bytes to be sent" #~ msgstr "Ange antalet bytes av data att sicka" #~ msgid "Set socket buffer size" #~ msgstr "Välj uttags (socket) buffertstorlek" #~ msgid "Set the IP Time to Live" #~ msgstr "Välj paketlivstid pÃ¥ IP-protokollnivÃ¥" #~ msgid "Set special IP timestamp options" #~ msgstr "Välj särskilda inställningar för IP-protokoll-tidsstämpel" #~ msgid "Select Path MTU Discovery strategy" #~ msgstr "Välj MTU-väghittarstrategi" #~ msgid "Print full user-to-user latency" #~ msgstr "Visa full användare-tilöl-användare-latens" #~ msgid "" #~ "Specify a timeout, in seconds, before ping exits regardless of how many " #~ "packets have been sent or received" #~ msgstr "" #~ "Ange en timeout, i sekunder, innan ping avslutar oavsett hur mÃ¥nga paket " #~ "som skickats eller tagits emot" #~ msgid "Time to wait for a response, in seconds" #~ msgstr "Tid att vänta pÃ¥ ett svar, i sekunder" #~ msgid "Select all" #~ msgstr "Välj alla" #~ msgid "Invert selection" #~ msgstr "Invertera val" #~ msgid "Select all processes except session leaders and terminal-less" #~ msgstr "Välj alla processer utom sessionsledare och terminal-lösa" #~ msgid "Select all processes except session leaders" #~ msgstr "Välj alla processer utom sessionsledare" #~ msgid "Deselect all processes that do not fulfill conditions" #~ msgstr "Avmarkera alla processer som inte uppfyller villkor" #~ msgid "Select by command" #~ msgstr "Välj via kommando" #~ msgid "Select by group" #~ msgstr "Välj via grupp" #~ msgid "Select by user" #~ msgstr "Välj via användare" #~ msgid "Select by group/session" #~ msgstr "Väljvia användare/session" #~ msgid "Select by PID" #~ msgstr "Välj via process-id" #~ msgid "Select by parent PID" #~ msgstr "Välj via förälders process-id" #~ msgid "Select by session ID" #~ msgstr "Välj via sessions-id" #~ msgid "Select by tty" #~ msgstr "Välj via tty" #~ msgid "Extra full format" #~ msgstr "Extra utförligt format" #~ msgid "User defined format" #~ msgstr "Användardefinerat format" #~ msgid "Add column for security data" #~ msgstr "Lägg till kolumn med säkerhetsinformation" #~ msgid "Full format" #~ msgstr "Fullt format" #~ msgid "Jobs format" #~ msgstr "Jobbformat" #~ msgid "Do not show flags" #~ msgstr "Visa inte flaggor" #~ msgid "Show hierarchy" #~ msgstr "Visa hierarki" #~ msgid "Set namelist file" #~ msgstr "Visa namnlistfil" #~ msgid "Wide output" #~ msgstr "Bred utdata" #~ msgid "Show threads" #~ msgstr "Visa trÃ¥dar" #~ msgid "Debug on" #~ msgstr "Debugläge pÃ¥" #~ msgid "Ignore environment variables" #~ msgstr "Ignorera miljövariabler" #~ msgid "Interactive mode after executing commands" #~ msgstr "Interaktivt läge efter att komandon utförts" #~ msgid "Enable optimizations" #~ msgstr "SlÃ¥ pÃ¥ optimeringar" #~ msgid "Disable import of site module" #~ msgstr "SlÃ¥ av importering av platsmodul" #~ msgid "Warn on mixed tabs and spaces" #~ msgstr "Varna vid blandad användning av tabbar och mellanslag" #~ msgid "Unbuffered input and output" #~ msgstr "Buffra inte indata och utdata" #~ msgid "Ignore first line of input" #~ msgstr "Ignorera första raden indata" #~ msgid "Set prompt command" #~ msgstr "Välj promptkommando" #~ msgid "Export variable to subprocess" #~ msgstr "Exportera variabel till underprocess" #~ msgid "Make variable scope global" #~ msgstr "Globalt definitionsomrÃ¥de" #~ msgid "Make variable scope local" #~ msgstr "Lokalt defintionsomrÃ¥de" #~ msgid "" #~ "Make variable scope universal, i.e. share variable with all the users " #~ "fish processes on this computer" #~ msgstr "" #~ "Gör variabelns definitionsomrÃ¥de universellt, dvs. dela variabel med alla " #~ "användarens fish-processer pÃ¥ denna dator" #~ msgid "Do not export variable to subprocess" #~ msgstr "Exportera inte variabel till barnprocesser" #~ msgid "Force following parameters to be process ID's (The default)" #~ msgstr "" #~ "Tvinga efterföljande parametrar att tolkas som process-id (standard)" #~ msgid "Force following parameters to be interpreted as process group ID's" #~ msgstr "Tvinga efterföljande parametrar att tolkas som grupp-id" #~ msgid "Force following parameters to be interpreted as user names" #~ msgstr "Tvinga efterföljande parametrar att tolkas som användarnamn" #~ msgid "Ignore errors from non-empty directories" #~ msgstr "Ignorera fel frÃ¥n icke-tomma kataloger" #~ msgid "Remove each component of path" #~ msgstr "Ta bort alla sökvägskomponenter" #~ msgid "Unlink directory (Only by superuser)" #~ msgstr "Avlänka katalog (Kan bara utföras av administratör)" #~ msgid "Never prompt before removal" #~ msgstr "FrÃ¥ga inte före borttagning" #~ msgid "Prompt before removal" #~ msgstr "FrÃ¥ga före borttagning" #~ msgid "Recursively remove subdirectories" #~ msgstr "Ta bort underkataloger rekursivt" #~ msgid "Explain what is done" #~ msgstr "Förklara vad som utförs" #~ msgid "List of rpm configuration files" #~ msgstr "Visa rpmkonfigurationsfiler" #~ msgid "Pipe output through specified command" #~ msgstr "Filtrera utdata genom angivet kommando" #~ msgid "Specify directory for rpm database" #~ msgstr "Välj katalog för rpm-databas" #~ msgid "Specify root directory for rpm operations" #~ msgstr "Välj rot-katalog för rpm-operationer" #~ msgid "" #~ "Translate all paths that start with first half of following parameter to " #~ "second half of following parameter" #~ msgstr "" #~ "Översätt alla sökvägar som börjar med första halvan av följande parameter " #~ "till sista halvan av följande parameter" #~ msgid "Kanji code-set" #~ msgstr "Använd Kanji-tecken" #~ msgid "Verbose mode without message" #~ msgstr "Utförligt läge utan meddelande" #~ msgid "Compiler debug mode" #~ msgstr "Kompliatordebugläge" #~ msgid "" #~ "Preserves modification times, access times, and modes from the original " #~ "file" #~ msgstr "Bevara ändringstid, Ã¥tkomsttid och rättigheter frÃ¥n orginalfil" #~ msgid "Recursively copy" #~ msgstr "Rekursiv kopiering" #~ msgid "Encyption program" #~ msgstr "Krypteringsprogram" #~ msgid "Disable all GNU extensions" #~ msgstr "Inaktivera alla GNU-förlängningar" #~ msgid "Use extended regexp" #~ msgstr "Använd utökade reguljära uttryck" #~ msgid "Consider files as separate" #~ msgstr "Betrakta filer separat" #~ msgid "Use minimal IO buffers" #~ msgstr "Minimera användning av IO-buffrar" #~ msgid "" #~ "Delay opening files until a command containing the related 'w' function " #~ "is applied" #~ msgstr "" #~ "Fördröj filöppnande till ett kommando inehÃ¥llande den relaterade â€w†" #~ "functionen appliceras" #~ msgid "Make font bold" #~ msgstr "Använd fetstil" #~ msgid "Erase variable" #~ msgstr "Radera variabel" #~ msgid "Test if variable is defined" #~ msgstr "Testa om variabeln är definerad" #, fuzzy #~ msgid "List the names of the variables, but not their value" #~ msgstr "Visa namnen pÃ¥ alla tillgängliga signaler" #~ msgid "Ignore leading blanks" #~ msgstr "Ignorera inledande mellanslag" #~ msgid "Consider only blanks and alphanumerics" #~ msgstr "Ta endast hänsyn till mellanslag och alfanumeriska tecken" #~ msgid "Compare general numeric value" #~ msgstr "Jämför generellt numeriskt värde" #~ msgid "Consider only printable" #~ msgstr "Ta endast hänsyn till skrivbara tecken" #~ msgid "Compare month names" #~ msgstr "Jämför mÃ¥nadsnamn" #~ msgid "Compare string numerical value" #~ msgstr "Jämför strängars numeriska värde" #~ msgid "Reverse results" #~ msgstr "Omvända resultat" #~ msgid "Only check if sorted" #~ msgstr "Verifiera bara sortering" #~ msgid "Define key" #~ msgstr "Definera nyckel" #~ msgid "Merge sorted files" #~ msgstr "SammanslÃ¥ sorterade filer" #~ msgid "Stabilize sort" #~ msgstr "Stabilisera sortering" #~ msgid "Field separator" #~ msgstr "Fältavdelare" #~ msgid "Output only first of equal lines" #~ msgstr "Visa bara först raden vid dubletter" #~ msgid "Lines end with 0 byte" #~ msgstr "Rader slutar ned nolltecken" #~ msgid "Disables forwarding of the authentication agent" #~ msgstr "Inaktivera vidareskickning av autentiseringsagent" #~ msgid "Enables forwarding of the authentication agent" #~ msgstr "Aktivera vidareskickning av autentiseringsagent" #~ msgid "Go to background" #~ msgstr "GÃ¥ till bakgrunden" #~ msgid "Allow remote host to connect to local forwarded ports" #~ msgstr "TillÃ¥t fjärrvärd att koppla in sig pÃ¥ lokala vidareskickade portar" #~ msgid "Smartcard device" #~ msgstr "Smartcardenhet" #~ msgid "Disable forwarding of Kerberos tickets" #~ msgstr "Inaktivera vidareskickning av Kerberosbiljetter" #~ msgid "MAC algorithm" #~ msgstr "MAC-algoritm" #~ msgid "Prevent reading from stdin" #~ msgstr "Förhindra läsning frÃ¥n standard in" #~ msgid "Do not execute remote command" #~ msgstr "Utför inte fjärrkommando" #~ msgid "Subsystem" #~ msgstr "Subsystem" #~ msgid "Force pseudo-tty allocation" #~ msgstr "Tvinga pseudo-tty-allokering" #~ msgid "Disable pseudo-tty allocation" #~ msgstr "Inaktivera pseudo-tty-allokering" #~ msgid "Disable X11 forwarding" #~ msgstr "Inaktivera X11-vidareskickning" #~ msgid "Enable X11 forwarding" #~ msgstr "Aktivera X11-vidareskickning" #~ msgid "Locally forwarded ports" #~ msgstr "Lokalt vidareskickade portar" #~ msgid "Remotely forwarded ports" #~ msgstr "Vidareskickade portar pÃ¥ fjärrdatorn" #~ msgid "Dynamic port forwarding" #~ msgstr "Dynamisk portvidareskickning" #~ msgid "Compression" #~ msgstr "Kompression" #~ msgid "Enable debug" #~ msgstr "SlÃ¥ pÃ¥ debugning" #~ msgid "Foreground operation" #~ msgstr "Förgrundsoperation" #~ msgid "Disable multi-threaded operation" #~ msgstr "Inaktivera flertrÃ¥dat läge" #~ msgid "Test if a command substitution is currently evaluated" #~ msgstr "Testa om en kommandosubstitution utförs för tillfället" #~ msgid "Test if a code block is currently evaluated" #~ msgstr "Testa om ett kodblock utförs för tillfället" #~ msgid "Test if this is an interactive shell" #~ msgstr "Testa om detta är ett interaktivt skal" #~ msgid "Test if this is a login shell" #~ msgstr "Testa om detta är ett login-skal" #~ msgid "Test if all new jobs are put under job control" #~ msgstr "Testa om alla nya job ställs unde jobbkontroll" #~ msgid "Test if only interactive new jobs are put under job control" #~ msgstr "Testa om bara interaktiva nya job ställs unde jobbkontroll" #~ msgid "Test if new jobs are never put under job control" #~ msgstr "Testa om inga nya job ställs unde jobbkontroll" #~ msgid "Set which jobs are out under job control" #~ msgstr "Välj vilka jobb som ställs under jobbkontroll" #~ msgid "" #~ "Print a list of all function calls leading up to running the current " #~ "command" #~ msgstr "" #~ "Visa en lista av alla funktionsanropp som lett fram till anropet pÃ¥ det " #~ "nu körande kommandot" #~ msgid "Command to run" #~ msgstr "Kommando att utföra" #~ msgid "Validate" #~ msgstr "Verifiera" #~ msgid "Make login shell" #~ msgstr "Skapa login-skal" #~ msgid "Pass -f to the shell" #~ msgstr "Skicka -f till skalet" #~ msgid "Preserve environment" #~ msgstr "Bevara miljövariabler" #~ msgid "Place files or directories under version control" #~ msgstr "Placera filer och kataloger under versionskontroll" #~ msgid "Recursively clean up the working copy" #~ msgstr "Rensa arbetskopian rekursivt" #~ msgid "Specify revision" #~ msgstr "Ange revision" #~ msgid "Pass contents of file as additional args" #~ msgstr "Skicka filinnehÃ¥ll som extra argument" #~ msgid "Print as little as possible" #~ msgstr "Skriv ut sÃ¥ lite som möjligt" #~ msgid "Force operation to run" #~ msgstr "Tvinga operationen att utföras" #~ msgid "Enable automatic properties" #~ msgstr "Aktivera automatiska egenskaper" #~ msgid "Disable automatic properties" #~ msgstr "Inaktivera automatiska egenskaper" #~ msgid "Print extra info" #~ msgstr "Visa utförlig information" #~ msgid "Don't cache auth tokens" #~ msgstr "Cacha inte autentiseringssymboler" #~ msgid "Do no interactive prompting" #~ msgstr "Ställ inga interaktiva frÃ¥gor" #~ msgid "Don't unlock targets" #~ msgstr "LÃ¥s inte upp mÃ¥l" #~ msgid "Read commit message from file" #~ msgstr "Läs meddelande för tillägg frÃ¥n fil" #~ msgid "Force log message source validity" #~ msgstr "Tvinga validitet av loggmeddelandes källa" #~ msgid "Descend recursively" #~ msgstr "Rekurivt läge" #~ msgid "Give output suitable for concatenation" #~ msgstr "Formatera utdata lämpligt för sammanslagning" #~ msgid "Output in XML" #~ msgstr "Utadata i XML-format" #~ msgid "Operate on revision property" #~ msgstr "Utför pÃ¥ revisionsegenskap" #~ msgid "Use strict semantics" #~ msgstr "Använd strikt semantik" #~ msgid "Ignore externals definitions" #~ msgstr "Ignorera definitioner av externals" #~ msgid "Do not cross copies" #~ msgstr "Korsa inte kopior" #~ msgid "Make no changes" #~ msgstr "Gör inga förändringar" #~ msgid "Ignore ancestry when calculating merge" #~ msgstr "Ignorera ursprung vid beräknandet av sammanslagning" #~ msgid "Display update information" #~ msgstr "Visa uppdateringsinformation" #~ msgid "Disregard ignores" #~ msgstr "Strunta i ignores" #~ msgid "Relocate VIA URL-rewriting" #~ msgstr "Relokera via URL-omskrivning" #~ msgid "Print client version info" #~ msgstr "Visa klientversion" #, fuzzy #~ msgid "force operation to run" #~ msgstr "Tvinga operationen att utföras" #, fuzzy #~ msgid "print as little as possible" #~ msgstr "Skriv ut sÃ¥ lite som möjligt" #~ msgid "Append archive to archive" #~ msgstr "Lägg till arkiv till annat arkiv" #~ msgid "Create archive" #~ msgstr "Skapa arkiv" #~ msgid "Compare archive and filesystem" #~ msgstr "Jämför arkiv med filsystem" #~ msgid "Delete from archive" #~ msgstr "Radera frÃ¥n arkiv" #~ msgid "Append files to archive" #~ msgstr "Lägg till filer till arkiv" #~ msgid "Append new files" #~ msgstr "Lägg till nya filer" #~ msgid "Extract from archive" #~ msgstr "Hämta frÃ¥n arkiv" #~ msgid "Keep access time" #~ msgstr "BehÃ¥ll Ã¥tkomsttid" #~ msgid "Reblock while reading" #~ msgstr "Gör om block-indelning under inläsning" #~ msgid "Print directory names" #~ msgstr "Visa katalognamn" #~ msgid "Archive is local" #~ msgstr "Arkiv är lokalt" #~ msgid "Run script at end of tape" #~ msgstr "Utför skript vid slut pÃ¥ band" #~ msgid "Use old incremental GNU format" #~ msgstr "Använd gammalt inkrementellt GNU-format" #~ msgid "Use new incremental GNU format" #~ msgstr "Använd nytt inkrementellt GNU-format" #~ msgid "Dereference symlinks" #~ msgstr "Följ symboliska länkar" #~ msgid "Ignore zero block in archive" #~ msgstr "Ignorera nollblock i arkiv" #~ msgid "Filter through bzip2" #~ msgstr "Filtrera genom bzip2" #~ msgid "Don't exit on unreadable files" #~ msgstr "Avsluta inte vid oläsbara filer" #~ msgid "Don't overwrite" #~ msgstr "Skriv inte över" #~ msgid "Stay in local filesystem" #~ msgstr "Stanna pÃ¥ lokala filsystem" #~ msgid "Don't extract modification time" #~ msgstr "Hämta inte ändringstider" #~ msgid "Multi volume archive" #~ msgstr "Flervolymsarkiv" #~ msgid "Use V7 format" #~ msgstr "Använd V7-format" #~ msgid "Extract to stdout" #~ msgstr "Hämta till standard ut" #~ msgid "Extract all permissions" #~ msgstr "Hämta alla rättigheter" #~ msgid "Don't strip leading /" #~ msgstr "Ta inte bort inledande /" #~ msgid "Preserve all permissions and do not sort file arguments" #~ msgstr "Bevara alla rättigheter, och sortera inte filargument" #~ msgid "Show record number" #~ msgstr "Visa paketnummer" #~ msgid "Remove files after adding to archive" #~ msgstr "Ta bort filer efter att de lagts till arkivet" #~ msgid "Preserve file ownership" #~ msgstr "Bevara filägare" #~ msgid "Handle sparse files" #~ msgstr "Hantera glesa filer" #~ msgid "-T has null-terminated names" #~ msgstr "-T har noll-terminerade namn" #~ msgid "Print total bytes written" #~ msgstr "Visa totalt anta skrivna bytes" #~ msgid "Ask for confirmation" #~ msgstr "Be om bekräftelse" #~ msgid "Verify archive" #~ msgstr "Verifiera arkiv" #~ msgid "Filter through compress" #~ msgstr "Filtrera genom compress" #~ msgid "Filter through gzip" #~ msgstr "Filtrera genom gzip" #~ msgid "Negate expression" #~ msgstr "Negera uttryck" #~ msgid "Logical and" #~ msgstr "Logisk â€ochâ€" #~ msgid "Logical or" #~ msgstr "Logisk â€ellerâ€" #~ msgid "String length is non-zero" #~ msgstr "Strängens längd är nollskild" #~ msgid "String length is zero" #~ msgstr "Strängens längd är noll" #~ msgid "Strings are equal" #~ msgstr "Strängar är identiska" #~ msgid "Strings are not equal" #~ msgstr "Strängar skiljer sig" #~ msgid "Integers are equal" #~ msgstr "Heltal är identiska" #~ msgid "Left integer larger than or equal to right integer" #~ msgstr "Vänster tal är större än eller lika med höger tal" #~ msgid "Left integer larger than right integer" #~ msgstr "Vänster tal är större än höger tal" #~ msgid "Left integer less than or equal to right integer" #~ msgstr "Vänster tal är mindre än eller lika med höger tal" #~ msgid "Left integer less than right integer" #~ msgstr "Vänster tal är mindre än höger tal" #~ msgid "Left integer not equal to right integer" #~ msgstr "Vänster tal skilt frÃ¥n höger tal" #~ msgid "Left file equal to right file" #~ msgstr "Vänster fil identisk med höger fil" #~ msgid "Left file newer than right file" #~ msgstr "Vänster fil nyare än höger fil" #~ msgid "Left file older than right file" #~ msgstr "Vänster fil är äldre än höger fil" #~ msgid "File is block device" #~ msgstr "Fil är blockenhet" #~ msgid "File is character device" #~ msgstr "Fil är teckenenhet" #~ msgid "File is directory" #~ msgstr "Fil är katalog" #~ msgid "File exists" #~ msgstr "Fil existerar" #~ msgid "File is regular" #~ msgstr "Fil är vanlig fil" #~ msgid "File is set-group-ID" #~ msgstr "Fil har kör-som-grupp-bit satt" #~ msgid "File is symlink" #~ msgstr "Fil är symbolisk länk" #~ msgid "File owned by effective group ID" #~ msgstr "Fil ägs av effektiv grupp-id" #~ msgid "File has sticky bit set" #~ msgstr "Fils fastbit är satt" #~ msgid "File owned by effective user ID" #~ msgstr "Fil ägd av effektiv användar-id" #~ msgid "File is named pipe" #~ msgstr "Fil är namngivet rör" #~ msgid "File is readable" #~ msgstr "Fil är läsbar" #~ msgid "File size is non-zero" #~ msgstr "Filstorlek är nollskild" #~ msgid "File is socket" #~ msgstr "Fil är uttag (socket)" #~ msgid "FD is terminal" #~ msgstr "Filidentifierare är terminal" #~ msgid "File set-user-ID bit is set" #~ msgstr "Fil har hör-som-användare-bit satt" #~ msgid "File is writable" #~ msgstr "Fil är skrivbar" #~ msgid "File is executable" #~ msgstr "Fil är program" #~ msgid "Specify output format" #~ msgstr "Välj utdataformat" #~ msgid "Use the portable output format" #~ msgstr "Använd portabelt utdataformat" #~ msgid "Do not send the results to stderr, but overwrite the specified file" #~ msgstr "" #~ "Skicka inte utdata till standard fel, skriv istället över angiven fil" #~ msgid "(Used together with -o) Do not overwrite but append" #~ msgstr "(Används tillsamans med -o) Skriv inte över utan lägg till" #~ msgid "Toggle command line/program name" #~ msgstr "Växla visning av kommandorad/programnamn" #~ msgid "Update interval" #~ msgstr "Uppdateringsintervall" #~ msgid "Toggle idle processes" #~ msgstr "Växla visning av overksamma processer" #~ msgid "Maximium iterations" #~ msgstr "Maximalt antal step" #~ msgid "Monitor effective UID" #~ msgstr "Bevaka effektivt användarid" #~ msgid "Monitor user" #~ msgstr "Bevaka användare" #~ msgid "Monitor PID" #~ msgstr "Bevaka process-id" #~ msgid "Secure mode" #~ msgstr "Säkert läge" #~ msgid "Cumulative mode" #~ msgstr "Ackumulerande läge" #~ msgid "Change access time" #~ msgstr "Visa Ã¥tkomsttid" #~ msgid "Do not create file" #~ msgstr "Skapa inte fil" #~ msgid "Change modification time" #~ msgstr "Ändra ändringstid" #~ msgid "Use this files times" #~ msgstr "Använd denna fils tider" #~ msgid "Display names of all signals" #~ msgstr "Visa namn pÃ¥ alla signaler" #~ msgid "Display all currently defined trap handlers" #~ msgstr "Visa all för tillfället definerade trap-hanterare" #~ msgid "Print all possible definitions of the specified name" #~ msgstr "Visa alla möjliga definitioner av det angivna namnet" #~ msgid "Supress function and builtin lookup" #~ msgstr "Undertryck kontroll av funktioner och inbyggda kommandon" #~ msgid "Print command type" #~ msgstr "Skriv ut kommandotyp" #~ msgid "Print path to command, or nothing if name is not a command" #~ msgstr "" #~ "Visa sökväg till kommando, eller ingenting om namn inte är ett kommando" #~ msgid "Print path to command" #~ msgstr "Visa sökväg till kommando" #~ msgid "Set or get all current limits" #~ msgstr "Visa eller redigera alla resursanvändningsgränser" #~ msgid "Maximum size of core files created" #~ msgstr "Maximal storlek pÃ¥ skapade corefiler" #~ msgid "Maximum size of a process's data segment" #~ msgstr "Maximal storlek pÃ¥ pÃ¥ en process datasegment" #~ msgid "Maximum size of files created by the shell" #~ msgstr "Maximal storlek pÃ¥ filer skapade av skalet" #~ msgid "Maximum size that may be locked into memory" #~ msgstr "Maximal storlek som kan lÃ¥sas i minnet" #~ msgid "Maximum resident set size" #~ msgstr "Maximal â€resident set sizeâ€" #~ msgid "Maximum number of open file descriptors" #~ msgstr "Maximalt antal öppna filidentifierare" #~ msgid "Maximum stack size" #~ msgstr "Maximal stackstorlek" #~ msgid "Maximum amount of cpu time in seconds" #~ msgstr "Maximal cpu-tid i sekunder" #~ msgid "Maximum number of processes available to a single user" #~ msgstr "Maximalt antal processer tillgängliga för en enskild användare" #~ msgid "Maximum amount of virtual memory available to the shell" #~ msgstr "Maximal mängd virtuellt minne tillgängligt för skalet" #~ msgid "Unmount without writing in /etc/mtab" #~ msgstr "Avmontera utan stt skriva till /etc/mtab" #~ msgid "In case unmounting fails, try to remount read-only" #~ msgstr "Om avmontering misslyckas, försök att ommontera i skrivskyddat läge" #~ msgid "" #~ "In case the unmounted device was a loop device, also free this loop device" #~ msgstr "" #~ "Om den avmonterade enheten var en vändslinga, Ã¥terlämna ocksÃ¥ denna enhet" #~ msgid "Don't call the /sbin/umount. helper even if it exists" #~ msgstr "" #~ "Anropa inte /sbin/umount.-hjälparen, även om den existerar" #~ msgid "Unmount all of the file systems described in /etc/mtab" #~ msgstr "Avmontera all a filsystem i /etc/mtab" #~ msgid "Actions should only be taken on file systems of the specified type" #~ msgstr "Utför bara handlingar pÃ¥ filsystem av angiven typ" #~ msgid "" #~ "Actions should only be taken on file systems with the specified options " #~ "in /etc/fstab" #~ msgstr "" #~ "Utför bara handlingar pÃ¥ filsystem med de angivna flaggorna i /etc/fstab" #~ msgid "Force unmount (in case of an unreachable NFS system)" #~ msgstr "Tvinga avmontering (vid onÃ¥bart NFS-filsystem)" #~ msgid "" #~ "Detach the filesystem from the filesystem hierarchy now, and cleanup all " #~ "references to the filesystem as soon as it is not busy" #~ msgstr "" #~ "Koppla bort filsystemet frÃ¥n hierarkin nu, och rensa upp alla referenser " #~ "till filsystemet sÃ¥ fort som det inte är upptaget" #~ msgid "Print kernel name" #~ msgstr "Visa kärnnamn" #~ msgid "Print network node hostname" #~ msgstr "Visa värdnamn pÃ¥ nätverksnod" #~ msgid "Print kernel release" #~ msgstr "Visa kärnrelese" #~ msgid "Print kernel version" #~ msgstr "Visa kärnversion" #~ msgid "Print machine name" #~ msgstr "Visa maskinnamn" #~ msgid "Print processor" #~ msgstr "Visa processor" #~ msgid "Print hardware platform" #~ msgstr "Visa hÃ¥rdvaruplattoform" #~ msgid "Print operating system" #~ msgstr "Visa operativsystem" #~ msgid "Print number of occurences" #~ msgstr "Visa antal händelser" #~ msgid "Only print duplicates" #~ msgstr "Visa bara dubletter" #~ msgid "Remove non-duplicate lines" #~ msgstr "Ta bort rader som saknar dubletter" #~ msgid "Avoid comparing first N fields" #~ msgstr "Jämför inte första N fält" #~ msgid "Case insensitive" #~ msgstr "Ignorera skiftläge" #~ msgid "Avoid comparing first N characters" #~ msgstr "Jämför inte de första N tecken" #~ msgid "Only print unique lines" #~ msgstr "Visa bara unika rader" #~ msgid "Compare only specified number of characters" #~ msgstr "Jämför bara angivet antal tecken" #~ msgid "Display help and debug options" #~ msgstr "Visa hjälp och debug-val" #~ msgid "Valgrind-ise children" #~ msgstr "Kör barnprocesser i valgrind" #~ msgid "Log to file descriptor" #~ msgstr "Logga fill filidentifierare" #~ msgid "Log to socket" #~ msgstr "Logga till uttag (socket)" #~ msgid "Callers in stack trace" #~ msgstr "Antal visade anrop i stack-spÃ¥r" #~ msgid "Stop showing errors if too many" #~ msgstr "Sluta visa fel om för mÃ¥nga" #~ msgid "Continue trace below main()" #~ msgstr "Fortsätt spÃ¥ra under main()-anroppet" #~ msgid "Supress errors from file" #~ msgstr "Undertryck fel frÃ¥n fil" #~ msgid "Print suppressions for detected errors" #~ msgstr "Visa undertryckningar för detekterade fel" #~ msgid "Start debugger on error" #~ msgstr "Starta debugger vid fel" #~ msgid "Debugger command" #~ msgstr "Debuggerkommando" #~ msgid "File descriptor for input" #~ msgstr "Filidentifierare för indata" #~ msgid "Check for memory leaks" #~ msgstr "Kontrollera förekomst av minnesläckor" #~ msgid "Show reachable leaked memory" #~ msgstr "Visa nÃ¥bart läckt minne" #~ msgid "" #~ "Determines how willing Memcheck is to consider different backtraces to be " #~ "the same" #~ msgstr "" #~ "Bestämmer hur villig Memcheck är att betrakta olika stack-spÃ¥r som lika" #~ msgid "Set size of freed memory pool" #~ msgstr "Välj storlek pÃ¥ pool av Ã¥terlämnat minne" #~ msgid "" #~ "Determines how willing Addrcheck is to consider different backtraces to " #~ "be the same" #~ msgstr "" #~ "Bestämmer hur villig Addrcheck är att betrakta olika stack-spÃ¥r som lika" #~ msgid "Type of L1 instruction cache" #~ msgstr "Typ av L1-instruktionscache" #~ msgid "Type of L1 data cache" #~ msgstr "Typ av L1-datacache" #~ msgid "Type of L2 cache" #~ msgstr "Typ av L2-cache" #~ msgid "Specify a function that allocates memory" #~ msgstr "Ange en minnesallokeringsfunktion" #~ msgid "Print byte counts" #~ msgstr "Visa antal bytes" #~ msgid "Print character counts" #~ msgstr "Visa antal tecken" #~ msgid "Print newline counts" #~ msgstr "Visa antal radbrytningar" #~ msgid "Print length of longest line" #~ msgstr "Visa längd av längsta rad" #~ msgid "Print word counts" #~ msgstr "Visa antal ord" #~ msgid "Dont print header" #~ msgstr "Visa inte huvud" #~ msgid "Ignore username for time calculations" #~ msgstr "Ignorera användarnamn vid tidsberäkningar" #~ msgid "Short format" #~ msgstr "Kort format" #~ msgid "Toggle printing of remote hostname" #~ msgstr "Växla utskrift av värdnamn för andra datorer" #~ msgid "Go to background immediately after startup" #~ msgstr "GÃ¥ till bakgrunden omedelbart efter uppstart" #~ msgid "Execute command as if part of .wgetrc" #~ msgstr "Utför kommando som om get vore en del av .wgetrc" #~ msgid "Log all messages to logfile" #~ msgstr "Logga alla meddelanden till loggfil" #~ msgid "Append all messages to logfile" #~ msgstr "Lägg till alla meddelanden till loggfil" #~ msgid "Turn on debug output" #~ msgstr "SlÃ¥ pÃ¥ visning av debuginformation" #~ msgid "Turn off verbose without being completely quiet" #~ msgstr "SlÃ¥ av utförligt läge utan att vara helt tyst" #~ msgid "Read URLs from file" #~ msgstr "Läs URLer frÃ¥n fil" #~ msgid "Force input to be treated as HTML" #~ msgstr "Tvinga indata att behandlas som HTML" #~ msgid "Prepend string to relative links" #~ msgstr "Lägg till sträng före relativa länkar" #~ msgid "Bind address on local machine" #~ msgstr "Bind till adress pÃ¥ lokal maskin" #~ msgid "Set number of retries to number" #~ msgstr "Välj antal gÃ¥nger att försöka igen" #~ msgid "Concatenate output to file" #~ msgstr "Sammanlägg utdata till fil" #~ msgid "Never overwrite files with same name" #~ msgstr "Skriv aldrig över filer med samma namn" #~ msgid "Continue getting a partially-downloaded file" #~ msgstr "Fortsätt hämta partiellt nedladdad fil" #~ msgid "Select progress meter type" #~ msgstr "Välj förloppsindikatortyp" #~ msgid "Turn on time-stamping" #~ msgstr "SlÃ¥ pÃ¥ tidsstämpling" #~ msgid "Print the headers/responses sent by servers" #~ msgstr "Visa huvuden/svar skickade frÃ¥n servrar" #~ msgid "Do not download the pages, just check that they are there" #~ msgstr "Ladda inte ner sidorna, kontrollera bara att de är där" #~ msgid "Set the network timeout" #~ msgstr "Välj nätverkstimeout" #~ msgid "Set the DNS lookup timeout" #~ msgstr "Välj DNS-lookuptimeout" #~ msgid "Set the connect timeout" #~ msgstr "Välj uppkopplingstimeout" #~ msgid "Set the read (and write) timeout" #~ msgstr "Välj läs (och skriv) timeout" #~ msgid "Limit the download speed" #~ msgstr "Begränsa nedladdningshastigheten" #~ msgid "Wait the specified number of seconds between the retrievals" #~ msgstr "Vänta det angivna antalet sekunder mellan hämtningar" #~ msgid "Wait time between retries" #~ msgstr "Vänta tid mellan nytt hämtförsök" #~ msgid "Wait random amount of time between retrievals" #~ msgstr "Vänta en slumpvald tid mellan hämtningar" #~ msgid "Toggle proxy support" #~ msgstr "SlÃ¥ pÃ¥ proxystöd" #~ msgid "Specify download quota for automatic retrievals" #~ msgstr "Ange nedladdningskvot för automatiska hämtningar" #~ msgid "Turn off caching of DNS lookups" #~ msgstr "SlÃ¥ av cachning av DNS-frÃ¥gor" #~ msgid "" #~ "Change which characters found in remote URLs may show up in local file " #~ "names" #~ msgstr "Ändra vilka tecken i fjärr-URL som fÃ¥r förekomma i lokala filnamn" #~ msgid "Do not create a hierarchy of directories" #~ msgstr "Skapa inte en kataloghierarki" #~ msgid "Force creation of a hierarchy of directories" #~ msgstr "Tvinga skapande av kataloghierarki" #~ msgid "Disable generation of host-prefixed directories" #~ msgstr "Inaktivera generering av värd-prefixkatalogkomponenter" #~ msgid "Use the protocol name as a directory component" #~ msgstr "Använd protokollnamn som katalogkomponent" #~ msgid "Ignore specified number of directory components" #~ msgstr "Ignorera angivet antal katalogkomponenter" #~ msgid "Set directory prefix" #~ msgstr "Välj katalogprefix" #~ msgid "Force html files to have html extension" #~ msgstr "Tvinga html-filer att fÃ¥ html-suffix" #~ msgid "Specify the http username" #~ msgstr "Välj httpanvändarnamn" #~ msgid "Specify the http password" #~ msgstr "Välj httplösenord" #~ msgid "Disable server-side cache" #~ msgstr "Inaktivera cache pÃ¥ serversidan" #~ msgid "Disable the use of cookies" #~ msgstr "Inaktivera användandet av kakor" #~ msgid "Load cookies from file" #~ msgstr "Ladda kakor frÃ¥n fil" #~ msgid "Save cookies to file" #~ msgstr "Spara kakor till fil" #~ msgid "Save session cookies" #~ msgstr "Spara sessionskakor" #~ msgid "Ignore 'Content-Length' header" #~ msgstr "Ignorera â€Content-Length†huvud" #~ msgid "Define an additional-header to be passed to the HTTP servers" #~ msgstr "Definera ett extra huvud att skicka till HTTP-servern" #~ msgid "Specify the proxy username" #~ msgstr "Välj proxyanvändarnamn" #~ msgid "Specify the proxy password" #~ msgstr "Välj proxylösenord" #~ msgid "Set referer URL" #~ msgstr "Välj referens-URL" #~ msgid "Save the headers sent by the HTTP server" #~ msgstr "Spara headers skickade av HTTP-servern" #~ msgid "Identify as agent-string" #~ msgstr "Identifiera som följande agent" #~ msgid "" #~ "Use POST as the method for all HTTP requests and send the specified data " #~ "in the request body" #~ msgstr "" #~ "Använd POST som metod för atta HTTP-anropp och skicka den angivna datan i " #~ "anroppskroppen" #~ msgid "Turn off keep-alive for http downloads" #~ msgstr "SlÃ¥ av keep-alive för http-nedladdningar" #~ msgid "Don't remove the temporary .listing files generated" #~ msgstr "Radera inte de tillfälliga .listing filerna som genererats" #~ msgid "Turn off FTP globbing" #~ msgstr "Använd inte filmatchning i FTP" #~ msgid "Use the passive FTP retrieval scheme" #~ msgstr "Använd passiv FTP" #~ msgid "Traverse symlinks and retrieve pointed-to files" #~ msgstr "Följ symboliska länkar och hämta pekade filer" #~ msgid "Turn on recursive retrieving" #~ msgstr "Använd rekursiv hämtning" #~ msgid "Specify recursion maximum depth" #~ msgstr "Maximalt rekursionsdjup" #~ msgid "Delete every single file downloaded" #~ msgstr "Radera alla nedladdade filer" #~ msgid "" #~ "Convert the links in the document to make them suitable for local viewing" #~ msgstr "" #~ "Konvertera länkarna i dokumentet sÃ¥ att de passar för att titta pÃ¥ lokalt" #~ msgid "Back up the original version" #~ msgstr "Backa upp orginalversionen" #~ msgid "Turn on options suitable for mirroring" #~ msgstr "SlÃ¥ pÃ¥ passande flaggor för spegling" #~ msgid "" #~ "Download all the files that are necessary to properly display a given " #~ "HTML page" #~ msgstr "" #~ "Ladda ner alla filer som behövs för att visa en given HTML-sida korrekt" #~ msgid "Turn on strict parsing of HTML comments" #~ msgstr "SlÃ¥ pÃ¥ strikt tolkning av HTML-kommentarer" #~ msgid "Comma-separated lists of file name suffixes or patterns to accept" #~ msgstr "Kommaseparerad lista av filnamns-suffix eller mönster att ladda ner" #~ msgid "Comma-separated lists of file name suffixes or patterns to reject" #~ msgstr "" #~ "Kommaseparerad lista av filnamns-suffix eller mönster att inte ladda ner" #~ msgid "Set domains to be followed" #~ msgstr "Välj domäner att följa" #~ msgid "Specify the domains that are not to be followed" #~ msgstr "Välj domäner som inte skall följas" #~ msgid "Follow FTP links from HTML documents" #~ msgstr "Följ FTP-länkar frÃ¥n HTML-dokument" #~ msgid "HTML tags to follow" #~ msgstr "Följ angivna HTML-taggar" #~ msgid "HTML tags to ignore" #~ msgstr "Ignorera angivna HTML-taggar" #~ msgid "Enable spanning across hosts" #~ msgstr "Följ länkar mellan olika värdar" #~ msgid "Follow relative links only" #~ msgstr "Följ bara relativa länkar" #~ msgid "Specify a comma-separated list of directories you wish to follow" #~ msgstr "Välj en kommaseparerad lista av kataloger som skall följas" #~ msgid "Specify a comma-separated list of directories you wish to exclude" #~ msgstr "Välj en kommaseparerad lista av kataloger som skall exkluderas" #~ msgid "Print all matching executables in PATH, not just the first" #~ msgstr "Visa alla matchande program i PATH, inte bara den första" #~ msgid "Read aliases from stdin, reporting matching ones on stdout" #~ msgstr "Läs alias frÃ¥n standard in, raportera matchningar pÃ¥ standard ut" #~ msgid "Ignore option '--read-alias'" #~ msgstr "Ignorera flaggan â€--read-aliasâ€" #~ msgid "" #~ "Read shell function definitions from stdin, reporting matching ones on " #~ "stdout" #~ msgstr "" #~ "Läs funktionsdefinitioner frÃ¥n standard in, raportera matchningar pÃ¥ " #~ "standard ut" #~ msgid "Ignore option '--read-functions'" #~ msgstr "Ignorera flaggan â€--read-functionsâ€" #~ msgid "Skip directories in PATH that start with a dot" #~ msgstr "Hoppa över kataloger i PATH som börjar med en punkt" #~ msgid "" #~ "Skip directories in PATH that start with a tilde and executables which " #~ "reside in the HOME directory" #~ msgstr "" #~ "Hoppa över kataloger i PATH som börjar med ett tilde och program som " #~ "ligger i HOME-katalogen" #~ msgid "" #~ "If a directory in PATH starts with a dot and a matching executable was " #~ "found for that path, then print './programname'" #~ msgstr "" #~ "Om en katalog i PATH börjar med en punkt och ett matchande program hittas " #~ "i den katalogen, skriv ut â€./programnamnâ€" #~ msgid "Output a tilde when a directory matches the HOME directory" #~ msgstr "Skriv ut ett tilde när en katalog matcher HOME-katalogen" #~ msgid "Stop processing options on the right if not on tty" #~ msgstr "Sluta processa flaggor till höger om inte pÃ¥ en tty" #~ msgid "Same as -b -d --login -p -r -t -T -u" #~ msgstr "Synonymt med -b -d --login -p -r -t -T -u" #~ msgid "Print time of last boot" #~ msgstr "Visa tidpunkt för senaste uppstart" #~ msgid "Print dead processes" #~ msgstr "Visa döda processer" #~ msgid "Print line of headings" #~ msgstr "Skriv ut rad av överskrifter" #~ msgid "Print idle time" #~ msgstr "Visa overksam tid" #~ msgid "Print login process" #~ msgstr "Visa inloggningsprocess" #~ msgid "Canonicalize hostnames via DNS" #~ msgstr "Gör värdnamn kanoniska via DNS" #~ msgid "Print hostname and user for stdin" #~ msgstr "Visa värdnamn och användare för standard in" #~ msgid "Print active processes spawned by init" #~ msgstr "Visa aktiva processer skapade av init" #~ msgid "Print all login names and number of users logged on" #~ msgstr "Skriv ut alla inloggningsnamn och antal inloggade användare" #~ msgid "Print current runlevel" #~ msgstr "Skriv ut nuvarande körnivÃ¥" #~ msgid "Print name, line, and time" #~ msgstr "Visa namn, rad och tid" #~ msgid "Print last system clock change" #~ msgstr "Visa senaste systemklockändring" #~ msgid "Print users message status as +, - or ?" #~ msgstr "Visa användarstatus som +, - eller ?" #~ msgid "List users logged in" #~ msgstr "Visa inloggade användare" #~ msgid "" #~ "Input filenames are terminated by a null character instead of by " #~ "whitespace, and the quotes and backslash are not special" #~ msgstr "" #~ "Indatafilnamn avslutas av ett nulltecken istället för ett blanktecken, " #~ "och citationstecken samt omvänt snedstreck är inte speciella" #~ msgid "Set the end of file string to eof-str" #~ msgstr "Sätt slut-pÃ¥-fil-strängen till angiven sträng" #~ msgid "" #~ "Replace replace-str in the initial arguments with names from standard " #~ "input" #~ msgstr "" #~ "Ersätt angiven sträng i ursprungsargumenten med namn frÃ¥n standard in" #~ msgid "Use at most max-lines nonblank input lines per command line" #~ msgstr "Använd som mest angivet antal icke-tomma indatarader per kommando" #~ msgid "Use at most max-args arguments per command line" #~ msgstr "Använd som mest angivet antal argument per kommando" #~ msgid "" #~ "Prompt the user about whether to run each command line and read a line " #~ "from the terminal" #~ msgstr "" #~ "FrÃ¥ga användaren om varje kommando ska utföras och läs en rad frÃ¥n " #~ "terminalen" #~ msgid "" #~ "If the standard input does not contain any nonblanks, do not run the " #~ "command" #~ msgstr "" #~ "Om inte standard in innehÃ¥ller icke-tomma tecken, utför inte kommandot" #~ msgid "Use at most max-chars characters per command line" #~ msgstr "Använd som mest angivet antal tecken per kommandorad" #~ msgid "" #~ "Print the command line on the standard error output before executing it" #~ msgstr "Skriv ut kommandoraden pÃ¥ standard fel före exekvering" #~ msgid "Exit if the size is exceeded" #~ msgstr "Avsluta om storleken överskrids" #~ msgid "Run up to max-procs processes at a time" #~ msgstr "Kör upp till angivet antal processer i taget" #, fuzzy #~ msgid "Show summary of options" #~ msgstr "Välj en konfigurationsinställning" #, fuzzy #~ msgid "Select XMMS session (Default: 0)" #~ msgstr "Välj via sessions-id" #, fuzzy #~ msgid "Start playing current playlist" #~ msgstr "Visa eller redigera alla resursanvändningsgränser" #, fuzzy #~ msgid "Don't clear the playlist" #~ msgstr "Välj spellista" #, fuzzy #~ msgid "Set the window title" #~ msgstr "Välj nätverkstimeout" #, fuzzy #~ msgid "Set reverse video mode" #~ msgstr "Serverläge" #, fuzzy #~ msgid "Set the background of the page display" #~ msgstr "Skapa fönster pÃ¥ angiven skärm" #, fuzzy #~ msgid "Set the initial zoom factor" #~ msgstr "Sätt maximal fuzzfaktor" #, fuzzy #~ msgid "Set the default file name for PostScript output" #~ msgstr "Ange standardnyckelordssubstitution" #, fuzzy #~ msgid "Set the paper size" #~ msgstr "Välj uttags (socket) buffertstorlek" #, fuzzy #~ msgid "Generate Level 1 PostScript" #~ msgstr "Generera utdata för dired" #, fuzzy #~ msgid "Sets the encoding to use for text output" #~ msgstr "Varken tyst eller utförligt läge" #, fuzzy #~ msgid "Sets the end-of-line convention to use" #~ msgstr "Sätt slut-pÃ¥-fil-strängen till angiven sträng" #, fuzzy #~ msgid "Specify the owner password for the PDF file" #~ msgstr "Välj proxylösenord" #, fuzzy #~ msgid "Specify the user password for the PDF file" #~ msgstr "Välj proxylösenord" #, fuzzy #~ msgid "Print commands as they're executed" #~ msgstr "Skriv kommandon till standard fel" #, fuzzy #~ msgid "Don't print any messages or errors" #~ msgstr "Kör inga taggningsprogram" #, fuzzy #~ msgid "Print copyright and version information" #~ msgstr "Ignorera all versionsinformation" #, fuzzy #~ msgid "Print usage information" #~ msgstr "Visa all information" #~ msgid "Display grammar and exit" #~ msgstr "Visa grammatik och avsluta" #~ msgid "Select window by name" #~ msgstr "Välj fönster via namn" #~ msgid "Select root window" #~ msgstr "Välj rotfönster" #~ msgid "Specify X server" #~ msgstr "Välj X-server" #~ msgid "Do not show property type" #~ msgstr "Visa inte egenskapstyp" #~ msgid "Select a window by clicking on its frame" #~ msgstr "Välj ett fönster genom att klicka pÃ¥ dess ram" #~ msgid "Remove property" #~ msgstr "Ta bort egenskap" #~ msgid "Set property" #~ msgstr "Sätt egenskap" #~ msgid "Examine property updates forever" #~ msgstr "Lyssna efter uppdateringar för alltid" #~ msgid "Set format" #~ msgstr "Välj format" #~ msgid "Append input to selection" #~ msgstr "Lägg till indata till slutet at urval" #~ msgid "Append to selection as input grows" #~ msgstr "Lägg till till urval när indata växer" #~ msgid "Read into selection" #~ msgstr "Läs in i urval" #~ msgid "Write selection" #~ msgstr "Visa urval" #~ msgid "Clear selection" #~ msgstr "Töm urval" #~ msgid "Delete selection" #~ msgstr "Radera urval" #~ msgid "Use primary selection" #~ msgstr "Använd primärt urval" #~ msgid "Use secondary selection" #~ msgstr "Använd sekundärt urval" #~ msgid "Use clipboard selection" #~ msgstr "Använd urklipp (clipboard) istället för urval" #~ msgid "Make current selections persistent after program exit" #~ msgstr "Gör sÃ¥ nuvarande urval finns kvar efter programavslut" #~ msgid "Exchange primary and secondary selections" #~ msgstr "Växla primärt och sekundärt urval" #~ msgid "Timeout for retrieving selection" #~ msgstr "Timeout under hämtning" #~ msgid "Do not detach from the controlling terminal" #~ msgstr "Frikoppla inte frÃ¥n terminalen" #~ msgid "Print informative messages" #~ msgstr "Visa informativa meddelanden" #~ msgid "Set debug level" #~ msgstr "Välj debugnivÃ¥" #~ msgid "Set error level" #~ msgstr "Välj felrapporteringsnivÃ¥" #~ msgid "Be tolerant of errors in commandline" #~ msgstr "Tolerera fel i kommandoraden" #~ msgid "Set maximum delay between commands" #~ msgstr "Välj maximal fördröjning mellan kommandon" #~ msgid "Run commands from cache" #~ msgstr "Kör ett kommando frÃ¥n cache" #~ msgid "Specify installroot" #~ msgstr "Välj installationsrot" #~ msgid "Enable repository" #~ msgstr "Aktivera förrÃ¥d" #~ msgid "Enables obsolets processing logic" #~ msgstr "SlÃ¥ pÃ¥ hantering av obsoleta paket" #~ msgid "Output rss-data to file" #~ msgstr "Skriv rss-data till fil" #~ msgid "Exclude specified package from updates" #~ msgstr "Exkludera angivna paket frÃ¥n uppdateringar" #~ msgid "Freshen: only changed files" #~ msgstr "Uppdatera: Lägg till ändrade filer" #~ msgid "Delete entries in zipfile" #~ msgstr "Radera filer frÃ¥n zipfil" #~ msgid "Update: only changed or newer files" #~ msgstr "Uppdatera: Lägg bara till ändrade och nya filer" #~ msgid "Move into zipfile (delete files)" #~ msgstr "Radera de filer som läggs till arkivet" #~ msgid "Do not store directory names" #~ msgstr "Lagra inte katalognamn" #~ msgid "Do not compress at all" #~ msgstr "Komprimera inte alls" #~ msgid "Convert LF to CR LF" #~ msgstr "Konvertera LF (Unixradbrytning) till CR LF (Windowsradbrytning)" #~ msgid "Convert CR LF to LF" #~ msgstr "Konvertera CR LF (Windowsradbrytning) till LF (Unixradbrytning)" #~ msgid "Compress faster" #~ msgstr "Snabb komprimering" #~ msgid "Compress better" #~ msgstr "Högre kompressionsgrad" #~ msgid "Add one-line comments" #~ msgstr "Lägg till enradskommentar" #~ msgid "Add zipfile comments" #~ msgstr "Lägg till kommentar till zipfil" #~ msgid "Read names from stdin" #~ msgstr "Läs namn frÃ¥n standard in" #~ msgid "Make zipfile as old as the latest entry" #~ msgstr "Sätt filens ändringsdatum till ändringsdatum av senaste fil" #~ msgid "Fix zipfile" #~ msgstr "Reparera zip-fil" #~ msgid "Fix zipfile (try harder)" #~ msgstr "Reparera zip-fil (försök mer)" #~ msgid "Adjust offsets to suit self-extracting exe" #~ msgstr "" #~ "Justera förskjutningar för att lämna plats för att skapa ett " #~ "självextraherande arkiv" #~ msgid "Strip prepended data" #~ msgstr "Ta bort datablock före arkivet" #~ msgid "Test zipfile integrity" #~ msgstr "Testa zipfilintegritet" #~ msgid "Exclude extra file attributes" #~ msgstr "Exkludera extra filattribut" #~ msgid "Store symbolic links as links" #~ msgstr "Lagra symboliska länkar som länkar" #~ msgid "PKZIP recursion" #~ msgstr "PKZIP-rekursion" #~ msgid "Encrypt" #~ msgstr "Kryptera" #~ msgid "Test if a key is contained in a set of values" #~ msgstr "Testa om en nyckel finns med i en uppsättning av värden" #~ msgid "%s: Unknown option '%s'\\n" #~ msgstr "%s: Okänd flagga â€%sâ€\\n" #~ msgid "Maximum uploads at once" #~ msgstr "Maximalt antal samtidiga uppladningar" #~ msgid "Number of seconds between keepalives" #~ msgstr "Sekunder mellan keepalives" #~ msgid "Bytes per request" #~ msgstr "Bytes per förfrÃ¥gan" #~ msgid "Requests per pipe" #~ msgstr "FörfrÃ¥gningar per rör" #~ msgid "Maximum length prefix encoding" #~ msgstr "Maximal längd pÃ¥ prefixkod" #~ msgid "File for server response" #~ msgstr "Fil att lagra serversvar i" #~ msgid "URL to get file from" #~ msgstr "URL att hämta fil frÃ¥n" #~ msgid "Local file target" #~ msgstr "Lokal fil att hämta till" #~ msgid "Time to close inactive socket" #~ msgstr "Fördröjning innan inaktivt uttag (socket) stängs" #~ msgid "Time between checking timeouts" #~ msgstr "Intervall mellan kontroller av timeouts" #~ msgid "Maximum outgoing slice length" #~ msgstr "Längsta slice-storlek" #~ msgid "Maximum time to guess rate" #~ msgstr "Maximalt tid att gissa kvot" #~ msgid "IP to bind to locally" #~ msgstr "Lokal IP-adress att binda till" #~ msgid "Time between screen updates" #~ msgstr "Tid mellan skärmuppdateringar" #~ msgid "Time to wait between requesting more peers" #~ msgstr "Tidsintevall mellan förfrÃ¥gningar efter nya fränder" #~ msgid "Minimum number of peers to not do requesting" #~ msgstr "Minimalt antal fränder för att inte skicka förfrÃ¥gan" #~ msgid "Number of seconds before assuming http timeout" #~ msgstr "Sekunder innan http-timeout" #~ msgid "Number of peers at which to stop initiating new connections" #~ msgstr "Antal fränder för att inte skapa nya uppkopplingar" #~ msgid "Maximum number of connections to allow" #~ msgstr "Maximalt antal tillÃ¥tna uppkopplingar" #~ msgid "Whether to check hashes on disk" #~ msgstr "Om disk-hashar skall verifieras" #~ msgid "Maximum kB/s to upload at" #~ msgstr "Maximal uppladdningstakt i kB/s" #~ msgid "Seconds to wait for data to come in before assuming choking" #~ msgstr "Antal sekunder att vänta innan antagande om strypning" #~ msgid "Whether to display diagnostic info" #~ msgstr "Visa debuginfo" #~ msgid "Number of downloads at which to switch from random to rarest first" #~ msgstr "" #~ "Antal nedladdningar för att byta frÃ¥n slumpmässig slice till ovanligaste " #~ "slice först" #~ msgid "Number of uploads to fill out to with optimistic unchokes" #~ msgstr "Antalet uppladningar att fylla med optimistisk avstrypning" #~ msgid "Whether to inform the user that hash failures occur" #~ msgstr "Om användaren skall informeras om hashfel" #~ msgid "Set block size" #~ msgstr "Välj blockstorlek" #~ msgid "List format" #~ msgstr "Listformat" #~ msgid "Skip entries matching pattern" #~ msgstr "Visa inte filer som matchar mönster" #~ msgid "Select quoting style" #~ msgstr "Välj citatstil" #~ msgid "Sort criteria" #~ msgstr "Sorteringskriterium" #~ msgid "Show time type" #~ msgstr "Visa tidtyp" #~ msgid "Select time style" #~ msgstr "Välj tidformat" #~ msgid "Assume tab stops at each COLS" #~ msgstr "Antag tabbavstÃ¥nd" #~ msgid "Assume screen width" #~ msgstr "Antag skärmbredd" #~ msgid "%s: Unknown argument '%s'\\n" #~ msgstr "%s: Okänt argument â€%sâ€\\n" #~ msgid "" #~ "Current function definitions are:\n" #~ "\n" #~ msgstr "" #~ "Nuvarande funktionsdefinitioner är:\n" #~ "\n" #~ msgid "" #~ "Sent null command to subshell. This is a fish bug. If it can be " #~ "reproduced, please send a bug report to %s." #~ msgstr "" #~ "Skickade noll-kommando till subskal. Detta är en fish-bug. Om den kan " #~ "reproduceras, skicka en rapport till %s." #~ msgid "Parenthesis mismatch" #~ msgstr "Paranteser matchar inte varandra" #~ msgid "Invalid input" #~ msgstr "Ogiltig indata" #~ msgid "" #~ "Tests if emerge command should have package as potential completion for " #~ "removal" #~ msgstr "" #~ "Testa om emergekommando borde ha paket som potentiell komplettering för " #~ "borttagning" #~ msgid "Cleans the system by removing outdated packages" #~ msgstr "Rensa systemet genom att ta bort inaktuella paket" #~ msgid "" #~ "Cleans the system by removing packages that are not associated with " #~ "explicitly merged packages" #~ msgstr "" #~ "Rensa systemet genom att ta bort paket som int är associerade med " #~ "explicit installerade paket" #~ msgid "" #~ "Displays important portage variables that will be exported to ebuild.sh " #~ "when performing merges" #~ msgstr "" #~ "Visa viktiga portage-variabler som kommer esporteras till ebuild.sh vid " #~ "installationer" #~ msgid "" #~ "Causes portage to process all the metacache files as is normally done on " #~ "the tail end of an rsync update using emerge --sync" #~ msgstr "" #~ "FÃ¥r portage att behandla alla metacache-filer som vanligtvis görs vid " #~ "slutet av en rsync-uppdatering vid användande av emerge --sync" #~ msgid "" #~ "Removes all but the most recently installed version of a package from " #~ "your system" #~ msgstr "" #~ "Tar bort alla utom den senast installerade versionen av ett paket frÃ¥n " #~ "ditt system" #~ msgid "" #~ "Causes portage to check and update the dependency cache of all ebuilds in " #~ "the portage tree" #~ msgstr "" #~ "FÃ¥r portage att kontrollera och uppdatera beroendecachen av alla abuilds " #~ "i partageträdet" #~ msgid "" #~ "Searches for matches of the supplied string in the current local portage " #~ "tree" #~ msgstr "" #~ "Söker efter matchar till den angivna strängen i det nuvarande lokala " #~ "portageträdet" #~ msgid "Removes all matching packages completely from your system" #~ msgstr "Ta bort alla matchande paket helt frÃ¥n ditt system" #~ msgid "" #~ "Before performing the merge, display what ebuilds and tbz2s will be " #~ "installed, in the same format as when using --pretend" #~ msgstr "" #~ "Före installationen utförs, visa vilka ebuilds och tbz2:or som kommer " #~ "installeras, i samma format som vid --pretend" #~ msgid "" #~ "Tell emerge to build binary packages for all ebuilds processed in " #~ "addition to actually merging the packages" #~ msgstr "" #~ "Bygg binära paket för alla ebuilds som behandlats förutom att installera " #~ "paketen" #~ msgid "Creates a binary package, but does not merge it to the system" #~ msgstr "Skapa ett binärt paket, men installera dem inte" #~ msgid "" #~ "When pretending, also display the ChangeLog entries for packages that " #~ "will be upgraded" #~ msgstr "" #~ "Vid lÃ¥tsasinstallation, visa ocksÃ¥ ChangeLog-filen för paketet som kommer " #~ "uppgraderas" #~ msgid "Tell emerge to run the ebuild command in --debug mode" #~ msgstr "Utför ebuild-kmmandot i â€--debugâ€-läge" #~ msgid "" #~ "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" #~ msgstr "" #~ "Vid användning med --update tvingar denna flagga emerge att betrakta hela " #~ "beroendeträdet av paket, istället för att bara kontrollera omedelbara " #~ "beroenden" #~ msgid "Virtually tweaks the tree of installed packages to contain nothing" #~ msgstr "Ändrar virtuellt trädet av installerade paket till att vara tomt" #~ msgid "" #~ "Instead of doing any package building, just perform fetches for all " #~ "packages (main package as well as all dependencies)" #~ msgstr "" #~ "Istället för att bygga paket, utför bara hämtning för alla paket " #~ "(huvudpaket och alla beroenden)" #~ msgid "" #~ "Same as --fetchonly except that all package files, including those not " #~ "required to build the package, will be processed" #~ msgstr "" #~ "Samma som --fetchonly utom att alla paketfiler, inklusive de som inte " #~ "krävs för att bygga paketet, processas" #~ msgid "" #~ "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" #~ msgstr "" #~ "Portage laddar ner informationen frÃ¥n varje binär fil frÃ¥n servern och " #~ "platsen angivna i PORTAGE_BINHOST, och använder den informationen vid " #~ "konstruktionen av beroendeträdet" #~ msgid "" #~ "This option is identical to -g, except it will not use ANY information " #~ "from the local machine" #~ msgstr "" #~ "Samma sak som -g, utom at det kommer inte använda NÃ…GON information frÃ¥n " #~ "den lokala maskinen" #~ msgid "" #~ "Tells emerge to include installed packages where USE flags have changed " #~ "since installation" #~ msgstr "" #~ "Instruera emerge att inkludera installerade paket där USE-flaggor har " #~ "ändrats sedan senaste installation" #~ msgid "" #~ "Merge files in CONFIG_PROTECT to the live fs instead of silently dropping " #~ "them" #~ msgstr "" #~ "Installera filer i CONFIG_PROTECT till filsystemet istället för att tyst " #~ "ignorera dem" #~ msgid "Merge specified packages, but don't merge any dependencies" #~ msgstr "Installera angivna paket, men installera inga beroenden" #~ msgid "" #~ "Skip the packages specified on the command-line that have already been " #~ "installed" #~ msgstr "Skippa angivna paket som redan har installerats" #~ msgid "Disables the spinner regardless of terminal type" #~ msgstr "Avaktivera statusuppdateraren, oavsett terminaltyp" #~ msgid "Emerge as normal, but don't add packages to the world profile" #~ msgstr "" #~ "Kör emerge som vanligt, men lägg inte till paket till världsprofilen" #~ msgid "" #~ "Only merge (or pretend to merge) the dependencies of the specified " #~ "packages, not the packages themselves" #~ msgstr "" #~ "Installera (eller lÃ¥tsas installera) bara beroendena till de angivna " #~ "paketen, inte själva paketen" #~ msgid "" #~ "Do not merge, display what ebuilds and tbz2s would have been installed" #~ msgstr "" #~ "Installera inte, visa vilka ebuilds och tbz2:or som skulle ha installerats" #~ msgid "Reduced output from portage's displays" #~ msgstr "Reducerad utdata frÃ¥n portage" #~ msgid "Resumes the last merge operation" #~ msgstr "Ã…terupta senaste installationsoperation" #~ msgid "" #~ "Matches the search string against the description field as well the " #~ "package's name" #~ msgstr "Matchar söksträngen mot beskrivningsfältet samt paketets namn" #~ msgid "" #~ "Remove the first package in the resume list so that a merge may continue " #~ "in the presence of an uncorrectable or inconsequential error" #~ msgstr "" #~ "Ta bort det första paketet i resume-listan sÃ¥ att en installation kan " #~ "fortsätta vid irreparabelt eller oviktigt fel" #~ msgid "Shows the dependency tree using indentation for dependencies" #~ msgstr "Visa beroendeträdet med indentering för beroenden" #~ msgid "" #~ "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" #~ msgstr "" #~ "Som --usepkg, men tillÃ¥ter bara binära paket, och avbryter installationen " #~ "om paketet inte finns tillgängligt vid beroendeberäkningarna" #~ msgid "Increased or expanded display of content in portage's displays" #~ msgstr "Utökat utdata frÃ¥n portage" #~ msgid "" #~ "Displays the currently installed version of portage along with other " #~ "information useful for quick reference on a system" #~ msgstr "" #~ "Visar den för tillfället installerade versionen av portage och annan " #~ "information som är användbar som en snabbreferens för systemet" #~ msgid "Help for the specified builtin" #~ msgstr "Hjälp för det angivna inbyggda kommandot" #~ msgid "A short summary of all builtin commands" #~ msgstr "En kort sammanfattning om alla inbyggda kommandon" #~ msgid "Increment priority by specified number first" #~ msgstr "Öka prioritet med angivet nummer först" #~ msgid "Pipe or short circuit command requires additional command" #~ msgstr "Pipa eller kortslutningkommando kräver ett efterföljande kommandon" #, fuzzy #~ msgid "%ls: Argument must be a number: %ls\n" #~ msgstr "%ls: Argumentet â€%ls†mÃ¥ste vara ett heltal\n" #~ msgid "Could not set exit function" #~ msgstr "Kunde inte sätta avslutningsfunktionen" #~ msgid "No history item at index %d\n" #~ msgstr "Ingen historieinformation vid index %d\n" #~ msgid "%ls: Expected at least two arguments\n" #~ msgstr "%ls: Förväntade minst tvÃ¥ argument\n" fish/postfork.cpp000066400000000000000000000454331214535744100144010ustar00rootroot00000000000000/** \file postfork.cpp Functions that we may safely call after fork(). */ #include #include "signal.h" #include "postfork.h" #include "iothread.h" #include "exec.h" #ifndef JOIN_THREADS_BEFORE_FORK #define JOIN_THREADS_BEFORE_FORK 0 #endif /** The number of times to try to call fork() before giving up */ #define FORK_LAPS 5 /** The number of nanoseconds to sleep between attempts to call fork() */ #define FORK_SLEEP_TIME 1000000 /** Base open mode to pass to calls to open */ #define OPEN_MASK 0666 /** fork error message */ #define FORK_ERROR "Could not create child process - exiting" /** file redirection clobbering error message */ #define NOCLOB_ERROR "The file '%s' already exists" /** file redirection error message */ #define FILE_ERROR "An error occurred while redirecting file '%s'" /** file descriptor redirection error message */ #define FD_ERROR "An error occurred while redirecting file descriptor %s" /** pipe error */ #define LOCAL_PIPE_ERROR "An error occurred while setting up pipe" /* Cover for debug_safe that can take an int. The format string should expect a %s */ static void debug_safe_int(int level, const char *format, int val) { char buff[128]; format_long_safe(buff, val); debug_safe(level, format, buff); } // PCA These calls to debug are rather sketchy because they may allocate memory. Fortunately they only occur if an error occurs. int set_child_group(job_t *j, process_t *p, int print_errors) { int res = 0; if (job_get_flag(j, JOB_CONTROL)) { if (!j->pgid) { j->pgid = p->pid; } if (setpgid(p->pid, j->pgid)) { if (getpgid(p->pid) != j->pgid && print_errors) { char pid_buff[128]; char job_id_buff[128]; char getpgid_buff[128]; char job_pgid_buff[128]; format_long_safe(pid_buff, p->pid); format_long_safe(job_id_buff, j->job_id); format_long_safe(getpgid_buff, getpgid(p->pid)); format_long_safe(job_pgid_buff, j->pgid); debug_safe(1, "Could not send process %s, '%s' in job %s, '%s' from group %s to group %s", pid_buff, p->argv0_cstr(), job_id_buff, j->command_cstr(), getpgid_buff, job_pgid_buff); safe_perror("setpgid"); res = -1; } } } else { j->pgid = getpid(); } if (job_get_flag(j, JOB_TERMINAL) && job_get_flag(j, JOB_FOREGROUND)) { if (tcsetpgrp(0, j->pgid) && print_errors) { char job_id_buff[128]; format_long_safe(job_id_buff, j->job_id); debug_safe(1, "Could not send job %s ('%s') to foreground", job_id_buff, j->command_cstr()); safe_perror("tcsetpgrp"); res = -1; } } return res; } /** Make sure the fd used by each redirection is not used by a pipe. */ static void free_redirected_fds_from_pipes(io_chain_t &io_chain) { size_t max = io_chain.size(); for (size_t i = 0; i < max; i++) { int fd_to_free = io_chain.at(i)->fd; /* We only have to worry about fds beyond the three standard ones */ if (fd_to_free <= 2) continue; /* Make sure the fd is not used by a pipe */ for (size_t j = 0; j < max; j++) { /* We're only interested in pipes */ io_data_t *io = io_chain.at(j).get(); if (io->io_mode != IO_PIPE && io->io_mode != IO_BUFFER) continue; CAST_INIT(io_pipe_t *, possible_conflict, io); /* If the pipe is a conflict, dup it to some other value */ for (int k=0; k<2; k++) { /* If it's not a conflict, we don't care */ if (possible_conflict->pipe_fd[k] != fd_to_free) continue; /* Repeat until we have a replacement fd */ int replacement_fd = -1; while (replacement_fd < 0) { replacement_fd = dup(fd_to_free); if (replacement_fd == -1 && errno != EINTR) { debug_safe_int(1, FD_ERROR, fd_to_free); safe_perror("dup"); FATAL_EXIT(); } } possible_conflict->pipe_fd[k] = replacement_fd; } } } } /** Set up a childs io redirections. Should only be called by setup_child_process(). Does the following: First it closes any open file descriptors not related to the child by calling close_unused_internal_pipes() and closing the universal variable server file descriptor. It then goes on to perform all the redirections described by \c io. \param io the list of IO redirections for the child \return 0 on sucess, -1 on failiure */ static int handle_child_io(io_chain_t &io_chain) { close_unused_internal_pipes(io_chain); free_redirected_fds_from_pipes(io_chain); for (size_t idx = 0; idx < io_chain.size(); idx++) { io_data_t *io = io_chain.at(idx).get(); int tmp; if (io->io_mode == IO_FD && io->fd == static_cast(io)->old_fd) { continue; } switch (io->io_mode) { case IO_CLOSE: { if (close(io->fd)) { debug_safe_int(0, "Failed to close file descriptor %s", io->fd); safe_perror("close"); } break; } case IO_FILE: { // Here we definitely do not want to set CLO_EXEC because our child needs access CAST_INIT(io_file_t *, io_file, io); if ((tmp=open(io_file->filename_cstr, io_file->flags, OPEN_MASK))==-1) { if ((io_file->flags & O_EXCL) && (errno ==EEXIST)) { debug_safe(1, NOCLOB_ERROR, io_file->filename_cstr); } else { debug_safe(1, FILE_ERROR, io_file->filename_cstr); safe_perror("open"); } return -1; } else if (tmp != io->fd) { /* This call will sometimes fail, but that is ok, this is just a precausion. */ close(io->fd); if (dup2(tmp, io->fd) == -1) { debug_safe_int(1, FD_ERROR, io->fd); safe_perror("dup2"); return -1; } exec_close(tmp); } break; } case IO_FD: { /* This call will sometimes fail, but that is ok, this is just a precausion. */ close(io->fd); if (dup2(static_cast(io)->old_fd, io->fd) == -1) { debug_safe_int(1, FD_ERROR, io->fd); safe_perror("dup2"); return -1; } break; } case IO_BUFFER: case IO_PIPE: { CAST_INIT(io_pipe_t *, io_pipe, io); /* If write_pipe_idx is 0, it means we're connecting to the read end (first pipe fd). If it's 1, we're connecting to the write end (second pipe fd). */ unsigned int write_pipe_idx = (io_pipe->is_input ? 0 : 1); /* debug( 0, L"%ls %ls on fd %d (%d %d)", write_pipe?L"write":L"read", (io->io_mode == IO_BUFFER)?L"buffer":L"pipe", io->fd, io->pipe_fd[0], io->pipe_fd[1]); */ if (dup2(io_pipe->pipe_fd[write_pipe_idx], io->fd) != io->fd) { debug_safe(1, LOCAL_PIPE_ERROR); safe_perror("dup2"); return -1; } if (io_pipe->pipe_fd[0] >= 0) exec_close(io_pipe->pipe_fd[0]); if (io_pipe->pipe_fd[1] >= 0) exec_close(io_pipe->pipe_fd[1]); break; } } } return 0; } int setup_child_process(job_t *j, process_t *p) { bool ok=true; if (p) { ok = (0 == set_child_group(j, p, 1)); } if (ok) { ok = (0 == handle_child_io(j->io)); if (p != 0 && ! ok) { exit_without_destructors(1); } } /* Set the handling for job control signals back to the default. */ if (ok) { signal_reset_handlers(); } /* Remove all signal blocks */ signal_unblock(); return ok ? 0 : -1; } int g_fork_count = 0; /** This function is a wrapper around fork. If the fork calls fails with EAGAIN, it is retried FORK_LAPS times, with a very slight delay between each lap. If fork fails even then, the process will exit with an error message. */ pid_t execute_fork(bool wait_for_threads_to_die) { ASSERT_IS_MAIN_THREAD(); if (wait_for_threads_to_die || JOIN_THREADS_BEFORE_FORK) { /* Make sure we have no outstanding threads before we fork. This is a pretty sketchy thing to do here, both because exec.cpp shouldn't have to know about iothreads, and because the completion handlers may do unexpected things. */ iothread_drain_all(); } pid_t pid; struct timespec pollint; int i; g_fork_count++; for (i=0; i= 0) { return pid; } if (errno != EAGAIN) { break; } pollint.tv_sec = 0; pollint.tv_nsec = FORK_SLEEP_TIME; /* Don't sleep on the final lap - sleeping might change the value of errno, which will break the error reporting below. */ if (i != FORK_LAPS-1) { nanosleep(&pollint, NULL); } } debug_safe(0, FORK_ERROR); safe_perror("fork"); FATAL_EXIT(); return 0; } #if FISH_USE_POSIX_SPAWN bool fork_actions_make_spawn_properties(posix_spawnattr_t *attr, posix_spawn_file_actions_t *actions, job_t *j, process_t *p) { /* Initialize the output */ if (posix_spawnattr_init(attr) != 0) { return false; } if (posix_spawn_file_actions_init(actions) != 0) { posix_spawnattr_destroy(attr); return false; } bool should_set_parent_group_id = false; int desired_parent_group_id = 0; if (job_get_flag(j, JOB_CONTROL)) { should_set_parent_group_id = true; // PCA: I'm quite fuzzy on process groups, // but I believe that the default value of 0 // means that the process becomes its own // group leader, which is what set_child_group did // in this case. So we want this to be 0 if j->pgid is 0. desired_parent_group_id = j->pgid; } /* Set the handling for job control signals back to the default. */ bool reset_signal_handlers = true; /* Remove all signal blocks */ bool reset_sigmask = true; /* Set our flags */ short flags = 0; if (reset_signal_handlers) flags |= POSIX_SPAWN_SETSIGDEF; if (reset_sigmask) flags |= POSIX_SPAWN_SETSIGMASK; if (should_set_parent_group_id) flags |= POSIX_SPAWN_SETPGROUP; int err = 0; if (! err) err = posix_spawnattr_setflags(attr, flags); if (! err && should_set_parent_group_id) err = posix_spawnattr_setpgroup(attr, desired_parent_group_id); /* Everybody gets default handlers */ if (! err && reset_signal_handlers) { sigset_t sigdefault; get_signals_with_handlers(&sigdefault); err = posix_spawnattr_setsigdefault(attr, &sigdefault); } /* No signals blocked */ sigset_t sigmask; sigemptyset(&sigmask); if (! err && reset_sigmask) err = posix_spawnattr_setsigmask(attr, &sigmask); /* Make sure that our pipes don't use an fd that the redirection itself wants to use */ free_redirected_fds_from_pipes(j->io); /* Close unused internal pipes */ std::vector files_to_close; get_unused_internal_pipes(files_to_close, j->io); for (size_t i = 0; ! err && i < files_to_close.size(); i++) { err = posix_spawn_file_actions_addclose(actions, files_to_close.at(i)); } for (size_t idx = 0; idx < j->io.size(); idx++) { shared_ptr io = j->io.at(idx); if (io->io_mode == IO_FD) { CAST_INIT(const io_fd_t *, io_fd, io.get()); if (io->fd == io_fd->old_fd) continue; } if (io->fd > 2) { /* Make sure the fd used by this redirection is not used by e.g. a pipe. */ // free_fd(io_chain, io->fd ); // PCA I don't think we need to worry about this. fd redirection is pretty uncommon anyways. } switch (io->io_mode) { case IO_CLOSE: { if (! err) err = posix_spawn_file_actions_addclose(actions, io->fd); break; } case IO_FILE: { CAST_INIT(const io_file_t *, io_file, io.get()); if (! err) err = posix_spawn_file_actions_addopen(actions, io->fd, io_file->filename_cstr, io_file->flags /* mode */, OPEN_MASK); break; } case IO_FD: { CAST_INIT(const io_fd_t *, io_fd, io.get()); if (! err) err = posix_spawn_file_actions_adddup2(actions, io_fd->old_fd /* from */, io->fd /* to */); break; } case IO_BUFFER: case IO_PIPE: { CAST_INIT(const io_pipe_t *, io_pipe, io.get()); unsigned int write_pipe_idx = (io_pipe->is_input ? 0 : 1); int from_fd = io_pipe->pipe_fd[write_pipe_idx]; int to_fd = io->fd; if (! err) err = posix_spawn_file_actions_adddup2(actions, from_fd, to_fd); if (write_pipe_idx > 0) { if (! err) err = posix_spawn_file_actions_addclose(actions, io_pipe->pipe_fd[0]); if (! err) err = posix_spawn_file_actions_addclose(actions, io_pipe->pipe_fd[1]); } else { if (! err) err = posix_spawn_file_actions_addclose(actions, io_pipe->pipe_fd[0]); } break; } } } /* Clean up on error */ if (err) { posix_spawnattr_destroy(attr); posix_spawn_file_actions_destroy(actions); } return ! err; } #endif //FISH_USE_POSIX_SPAWN void safe_report_exec_error(int err, const char *actual_cmd, const char * const *argv, const char *const *envv) { debug_safe(0, "Failed to execute process '%s'. Reason:", actual_cmd); switch (err) { case E2BIG: { char sz1[128], sz2[128]; long arg_max = -1; size_t sz = 0; const char * const *p; for (p=argv; *p; p++) { sz += strlen(*p)+1; } for (p=envv; *p; p++) { sz += strlen(*p)+1; } format_size_safe(sz1, sz); arg_max = sysconf(_SC_ARG_MAX); if (arg_max > 0) { format_size_safe(sz2, sz); debug_safe(0, "The total size of the argument and environment lists %s exceeds the operating system limit of %s.", sz1, sz2); } else { debug_safe(0, "The total size of the argument and environment lists (%s) exceeds the operating system limit.", sz1); } debug_safe(0, "Try running the command again with fewer arguments."); break; } case ENOEXEC: { const char *err = safe_strerror(errno); debug_safe(0, "exec: %s", err); debug_safe(0, "The file '%s' is marked as an executable but could not be run by the operating system.", actual_cmd); break; } case ENOENT: { /* ENOENT is returned by exec() when the path fails, but also returned by posix_spawn if an open file action fails. These cases appear to be impossible to distinguish. We address this by not using posix_spawn for file redirections, so all the ENOENTs we find must be errors from exec(). */ char interpreter_buff[128] = {}, *interpreter; interpreter = get_interpreter(actual_cmd, interpreter_buff, sizeof interpreter_buff); if (interpreter && 0 != access(interpreter, X_OK)) { debug_safe(0, "The file '%s' specified the interpreter '%s', which is not an executable command.", actual_cmd, interpreter); } else { debug_safe(0, "The file '%s' does not exist or could not be executed.", actual_cmd); } break; } case ENOMEM: { debug_safe(0, "Out of memory"); break; } default: { const char *err = safe_strerror(errno); debug_safe(0, "exec: %s", err); // debug(0, L"The file '%ls' is marked as an executable but could not be run by the operating system.", p->actual_cmd); break; } } } /** Perform output from builtins. May be called from a forked child, so don't do anything that may allocate memory, etc.. */ bool do_builtin_io(const char *out, size_t outlen, const char *err, size_t errlen) { bool success = true; if (out && outlen) { if (write_loop(STDOUT_FILENO, out, outlen) < 0) { debug_safe(0, "Error while writing to stdout"); safe_perror("write_loop"); success = false; } } if (err && errlen) { if (write_loop(STDERR_FILENO, err, errlen) < 0) { success = false; } } return success; } fish/postfork.h000066400000000000000000000056521214535744100140450ustar00rootroot00000000000000/** \file postfork.h Functions that we may safely call after fork(), of which there are very few. In particular we cannot allocate memory, since we're insane enough to call fork from a multithreaded process. */ #ifndef FISH_POSTFORK_H #define FISH_POSTFORK_H #include #include #include #include #include #include "config.h" #include "common.h" #include "util.h" #include "proc.h" #include "wutil.h" #include "io.h" #if HAVE_SPAWN_H #include #endif #ifndef FISH_USE_POSIX_SPAWN #define FISH_USE_POSIX_SPAWN HAVE_SPAWN_H #endif /** 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. */ int set_child_group(job_t *j, process_t *p, int print_errors); /** Initialize a new child process. This should be called right away after forking in the child process. If job control is enabled for this job, the process is put in the process group of the job, all signal handlers are reset, signals are unblocked (this function may only be called inside the exec function, which blocks all signals), and all IO redirections and other file descriptor actions are performed. \param j the job to set up the IO for \param p the child process to set up \param io_chain the IO chain to use (ignores the job's iochain) \return 0 on sucess, -1 on failiure. When this function returns, signals are always unblocked. On failiure, signal handlers, io redirections and process group of the process is undefined. */ int setup_child_process(job_t *j, process_t *p); /* Call fork(), optionally waiting until we are no longer multithreaded. If the forked child doesn't do anything that could allocate memory, take a lock, etc. (like call exec), then it's not necessary to wait for threads to die. If the forked child may do those things, it should wait for threads to die. */ pid_t execute_fork(bool wait_for_threads_to_die); /* Perform output from builtins. Returns true on success. */ bool do_builtin_io(const char *out, size_t outlen, const char *err, size_t errlen); /** Report an error from failing to exec or posix_spawn a command */ void safe_report_exec_error(int err, const char *actual_cmd, const char * const *argv, const char * const *envv); #if FISH_USE_POSIX_SPAWN /* Initializes and fills in a posix_spawnattr_t; on success, the caller should destroy it via posix_spawnattr_destroy */ bool fork_actions_make_spawn_properties(posix_spawnattr_t *attr, posix_spawn_file_actions_t *actions, job_t *j, process_t *p); #endif #endif fish/print_help.cpp000066400000000000000000000011611214535744100146640ustar00rootroot00000000000000 /** \file print_help.c Print help message for the specified command */ #include #include #include #include "print_help.h" #define CMD_LEN 1024 #define HELP_ERR "Could not show help message\n" /* defined in common.h */ ssize_t write_loop(int fd, const char *buff, size_t count); void print_help(const char *c, int fd) { char cmd[ CMD_LEN]; int printed = snprintf(cmd, CMD_LEN, "fish -c '__fish_print_help %s >&%d'", c, fd); if (printed < CMD_LEN) { if ((system(cmd) == -1)) { write_loop(2, HELP_ERR, strlen(HELP_ERR)); } } } fish/print_help.h000066400000000000000000000003511214535744100143310ustar00rootroot00000000000000 /** \file print_help.h Print help message for the specified command */ #ifndef FISH_PRINT_HELP_H #define FISH_PRINT_HELP_H /** Print help message for the specified command */ void print_help(const char *cmd, int fd); #endif fish/proc.cpp000066400000000000000000000776701214535744100135050ustar00rootroot00000000000000/** \file proc.c Utilities for keeping track of jobs, processes and subshells, as well as signal handling functions for tracking children. These functions do not themselves launch new processes, the exec library will call proc to create representations of the running jobs as needed. Some of the code in this file is based on code from the Glibc manual. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #ifdef HAVE_SIGINFO_H #include #endif #ifdef HAVE_SYS_SELECT_H #include #endif #include "fallback.h" #include "util.h" #include "wutil.h" #include "proc.h" #include "common.h" #include "reader.h" #include "sanity.h" #include "env.h" #include "parser.h" #include "signal.h" #include "event.h" #include "output.h" /** Size of message buffer */ #define MESS_SIZE 256 /** Size of buffer for reading buffered output */ #define BUFFER_SIZE 4096 /** Status of last process to exit */ static int last_status=0; /** Signal flag */ static sig_atomic_t got_signal=0; bool job_list_is_empty(void) { ASSERT_IS_MAIN_THREAD(); return parser_t::principal_parser().job_list().empty(); } void job_iterator_t::reset() { this->current = job_list->begin(); this->end = job_list->end(); } job_iterator_t::job_iterator_t(job_list_t &jobs) : job_list(&jobs) { this->reset(); } job_iterator_t::job_iterator_t() : job_list(&parser_t::principal_parser().job_list()) { this->reset(); } void print_jobs(void) { job_iterator_t jobs; job_t *j; while ((j = jobs.next())) { printf("%p -> %ls -> (foreground %d, complete %d, stopped %d, constructed %d)\n", j, j->command_wcstr(), job_get_flag(j, JOB_FOREGROUND), job_is_completed(j), job_is_stopped(j), job_get_flag(j, JOB_CONSTRUCTED)); } } int is_interactive_session=0; int is_subshell=0; int is_block=0; int is_login=0; int is_event=0; pid_t proc_last_bg_pid = 0; int job_control_mode = JOB_CONTROL_INTERACTIVE; int no_exec=0; static int is_interactive = -1; static bool proc_had_barrier = false; int get_is_interactive(void) { ASSERT_IS_MAIN_THREAD(); return is_interactive; } bool get_proc_had_barrier() { ASSERT_IS_MAIN_THREAD(); return proc_had_barrier; } void set_proc_had_barrier(bool flag) { ASSERT_IS_MAIN_THREAD(); proc_had_barrier = flag; } /** The event variable used to send all process event */ static event_t event(0); /** A stack containing the values of is_interactive. Used by proc_push_interactive and proc_pop_interactive. */ static std::vector interactive_stack; void proc_init() { proc_push_interactive(0); } /** Remove job from list of jobs */ static int job_remove(job_t *j) { ASSERT_IS_MAIN_THREAD(); return parser_t::principal_parser().job_remove(j); } void job_promote(job_t *job) { ASSERT_IS_MAIN_THREAD(); parser_t::principal_parser().job_promote(job); } /* Remove job from the job list and free all memory associated with it. */ void job_free(job_t * j) { job_remove(j); delete j; } void proc_destroy() { job_list_t &jobs = parser_t::principal_parser().job_list(); while (! jobs.empty()) { job_t *job = jobs.front(); debug(2, L"freeing leaked job %ls", job->command_wcstr()); job_free(job); } } void proc_set_last_status(int s) { ASSERT_IS_MAIN_THREAD(); last_status = s; } int proc_get_last_status() { return last_status; } /* Basic thread safe job IDs. The vector consumed_job_ids has a true value wherever the job ID corresponding to that slot is in use. The job ID corresponding to slot 0 is 1. */ static pthread_mutex_t job_id_lock = PTHREAD_MUTEX_INITIALIZER; static std::vector consumed_job_ids; job_id_t acquire_job_id(void) { scoped_lock lock(job_id_lock); /* Find the index of the first 0 slot */ std::vector::iterator slot = std::find(consumed_job_ids.begin(), consumed_job_ids.end(), false); if (slot != consumed_job_ids.end()) { /* We found a slot. Note that slot 0 corresponds to job ID 1. */ *slot = true; return (job_id_t)(slot - consumed_job_ids.begin() + 1); } else { /* We did not find a slot; create a new slot. The size of the vector is now the job ID (since it is one larger than the slot). */ consumed_job_ids.push_back(true); return (job_id_t)consumed_job_ids.size(); } } void release_job_id(job_id_t jid) { assert(jid > 0); scoped_lock lock(job_id_lock); size_t slot = (size_t)(jid - 1), count = consumed_job_ids.size(); /* Make sure this slot is within our vector and is currently set to consumed */ assert(slot < count); assert(consumed_job_ids.at(slot) == true); /* Clear it and then resize the vector to eliminate unused trailing job IDs */ consumed_job_ids.at(slot) = false; while (count--) { if (consumed_job_ids.at(count)) break; } consumed_job_ids.resize(count + 1); } job_t *job_get(job_id_t id) { ASSERT_IS_MAIN_THREAD(); return parser_t::principal_parser().job_get(id); } job_t *job_get_from_pid(int pid) { ASSERT_IS_MAIN_THREAD(); return parser_t::principal_parser().job_get_from_pid(pid); } /* Return true if all processes in the job have stopped or completed. \param j the job to test */ int job_is_stopped(const job_t *j) { process_t *p; for (p = j->first_process; p; p = p->next) { if (!p->completed && !p->stopped) { return 0; } } return 1; } /* Return true if the last processes in the job has completed. \param j the job to test */ int job_is_completed(const job_t *j) { process_t *p; assert(j->first_process != NULL); for (p = j->first_process; p->next; p = p->next) ; return p->completed; } void job_set_flag(job_t *j, unsigned int flag, int set) { if (set) { j->flags |= flag; } else { j->flags &= ~flag; } } int job_get_flag(const job_t *j, unsigned int flag) { return !!(j->flags & flag); } int job_signal(job_t *j, int signal) { pid_t my_pid = getpid(); int res = 0; if (j->pgid != my_pid) { res = killpg(j->pgid, SIGHUP); } else { process_t *p; for (p = j->first_process; p; p=p->next) { if (! p->completed) { if (p->pid) { if (kill(p->pid, SIGHUP)) { res = -1; break; } } } } } return res; } /** Store the status of the process pid that was returned by waitpid. Return 0 if all went well, nonzero otherwise. This is called from a signal handler. */ static void mark_process_status(const job_t *j, process_t *p, int status) { // debug( 0, L"Process %ls %ls", p->argv[0], WIFSTOPPED (status)?L"stopped":(WIFEXITED( status )?L"exited":(WIFSIGNALED( status )?L"signaled to exit":L"BLARGH")) ); p->status = status; if (WIFSTOPPED(status)) { p->stopped = 1; } else if (WIFSIGNALED(status) || WIFEXITED(status)) { p->completed = 1; } else { ssize_t ignore; /* This should never be reached */ p->completed = 1; char mess[MESS_SIZE]; snprintf(mess, MESS_SIZE, "Process %ld exited abnormally\n", (long) p->pid); /* If write fails, do nothing. We're in a signal handlers error handler. If things aren't working properly, it's safer to give up. */ ignore = write(2, mess, strlen(mess)); } } void job_mark_process_as_failed(const job_t *job, process_t *p) { /* The given process failed to even lift off (e.g. posix_spawn failed) and so doesn't have a valid pid. Mark it as dead. */ for (process_t *cursor = p; cursor != NULL; cursor = cursor->next) { cursor->completed = 1; } } /** Handle status update for child \c pid. This function is called by the signal handler, so it mustn't use malloc or any such hitech nonsense. \param pid the pid of the process whose status changes \param status the status as returned by wait */ static void handle_child_status(pid_t pid, int status) { bool found_proc = false; const job_t *j = NULL; process_t *p = NULL; // char mess[MESS_SIZE]; /* snprintf( mess, MESS_SIZE, "Process %d\n", (int) pid ); write( 2, mess, strlen(mess )); */ job_iterator_t jobs; while (! found_proc && (j = jobs.next())) { process_t *prev=0; for (p=j->first_process; p; p=p->next) { if (pid == p->pid) { /* snprintf( mess, MESS_SIZE, "Process %d is %ls from job %ls\n", (int) pid, p->actual_cmd, j->command ); write( 2, mess, strlen(mess )); */ mark_process_status(j, p, status); if (p->completed && prev != 0) { if (!prev->completed && prev->pid) { /* snprintf( mess, MESS_SIZE, "Kill previously uncompleted process %ls (%d)\n", prev->actual_cmd, prev->pid ); write( 2, mess, strlen(mess )); */ kill(prev->pid,SIGPIPE); } } found_proc = true; break; } prev = p; } } if (WIFSIGNALED(status) && (WTERMSIG(status)==SIGINT || WTERMSIG(status)==SIGQUIT)) { if (!is_interactive_session) { struct sigaction act; sigemptyset(& act.sa_mask); act.sa_flags=0; act.sa_handler=SIG_DFL; sigaction(SIGINT, &act, 0); sigaction(SIGQUIT, &act, 0); kill(getpid(), WTERMSIG(status)); } else { /* In an interactive session, tell the principal parser to skip all blocks we're executing so control-C returns control to the user. */ if (p && found_proc) { parser_t::skip_all_blocks(); } } } if (!found_proc) { /* A child we lost track of? There have been bugs in both subshell handling and in builtin handling that have caused this previously... */ /* snprintf( mess, MESS_SIZE, "Process %d not found by %d\n", (int) pid, (int)getpid() ); write( 2, mess, strlen(mess )); */ } return; } process_t::process_t() : argv_array(), argv0_narrow(), type(0), actual_cmd(), pid(0), pipe_write_fd(0), pipe_read_fd(0), completed(0), stopped(0), status(0), count_help_magic(0), next(NULL) #ifdef HAVE__PROC_SELF_STAT ,last_time(), last_jiffies(0) #endif { } process_t::~process_t() { if (this->next != NULL) delete this->next; } job_t::job_t(job_id_t jobid) : command_str(), command_narrow(), first_process(NULL), pgid(0), tmodes(), job_id(jobid), io(), flags(0) { } job_t::~job_t() { if (first_process != NULL) delete first_process; release_job_id(job_id); } /* This is called from a signal handler */ void job_handle_signal(int signal, siginfo_t *info, void *con) { int status; pid_t pid; int errno_old = errno; got_signal = 1; // write( 2, "got signal\n", 11 ); while (1) { switch (pid=waitpid(-1,&status,WUNTRACED|WNOHANG)) { case 0: case -1: { errno=errno_old; return; } default: handle_child_status(pid, status); break; } } kill(0, SIGIO); errno=errno_old; } /** Format information about job status for the user to look at. \param j the job to test \param status a string description of the job exit type */ static void format_job_info(const job_t *j, const wchar_t *status) { fwprintf(stdout, L"\r"); fwprintf(stdout, _(L"Job %d, \'%ls\' has %ls"), j->job_id, j->command_wcstr(), status); fflush(stdout); tputs(clr_eol,1,&writeb); fwprintf(stdout, L"\n"); } void proc_fire_event(const wchar_t *msg, int type, pid_t pid, int status) { event.type=type; event.param1.pid = pid; event.arguments.push_back(msg); event.arguments.push_back(to_string(pid)); event.arguments.push_back(to_string(status)); event_fire(&event); event.arguments.resize(0); } int job_reap(bool interactive) { ASSERT_IS_MAIN_THREAD(); job_t *jnext; int found=0; static int locked = 0; locked++; /* job_read may fire an event handler, we do not want to call ourselves recursively (to avoid infinite recursion). */ if (locked>1) return 0; job_iterator_t jobs; jnext = jobs.next(); while (jnext) { job_t *j = jnext; jnext = jobs.next(); /* If we are reaping only jobs who do not need status messages sent to the console, do not consider reaping jobs that need status messages */ if ((!job_get_flag(j, JOB_SKIP_NOTIFICATION)) && (!interactive) && (!job_get_flag(j, JOB_FOREGROUND))) { continue; } for (process_t *p = j->first_process; p; p=p->next) { int s; if (!p->completed) continue; if (!p->pid) continue; s = p->status; proc_fire_event(L"PROCESS_EXIT", EVENT_EXIT, p->pid, (WIFSIGNALED(s)?-1:WEXITSTATUS(s))); if (WIFSIGNALED(s)) { /* Ignore signal SIGPIPE.We issue it ourselves to the pipe writer when the pipe reader dies. */ if (WTERMSIG(s) != SIGPIPE) { int proc_is_job = ((p==j->first_process) && (p->next == 0)); if (proc_is_job) job_set_flag(j, JOB_NOTIFIED, 1); if (!job_get_flag(j, JOB_SKIP_NOTIFICATION)) { if (proc_is_job) fwprintf(stdout, _(L"%ls: Job %d, \'%ls\' terminated by signal %ls (%ls)"), program_name, j->job_id, j->command_wcstr(), sig2wcs(WTERMSIG(p->status)), signal_get_desc(WTERMSIG(p->status))); else fwprintf(stdout, _(L"%ls: Process %d, \'%ls\' from job %d, \'%ls\' terminated by signal %ls (%ls)"), program_name, p->pid, p->argv0(), j->job_id, j->command_wcstr(), sig2wcs(WTERMSIG(p->status)), signal_get_desc(WTERMSIG(p->status))); tputs(clr_eol,1,&writeb); fwprintf(stdout, L"\n"); found=1; } /* Clear status so it is not reported more than once */ p->status = 0; } } } /* If all processes have completed, tell the user the job has completed and delete it from the active job list. */ if (job_is_completed(j)) { if (!job_get_flag(j, JOB_FOREGROUND) && !job_get_flag(j, JOB_NOTIFIED) && !job_get_flag(j, JOB_SKIP_NOTIFICATION)) { format_job_info(j, _(L"ended")); found=1; } proc_fire_event(L"JOB_EXIT", EVENT_EXIT, -j->pgid, 0); proc_fire_event(L"JOB_EXIT", EVENT_JOB_ID, j->job_id, 0); job_free(j); } else if (job_is_stopped(j) && !job_get_flag(j, JOB_NOTIFIED)) { /* Notify the user about newly stopped jobs. */ if (!job_get_flag(j, JOB_SKIP_NOTIFICATION)) { format_job_info(j, _(L"stopped")); found=1; } job_set_flag(j, JOB_NOTIFIED, 1); } } if (found) fflush(stdout); locked = 0; return found; } #ifdef HAVE__PROC_SELF_STAT /** Maximum length of a /proc/[PID]/stat filename */ #define FN_SIZE 256 /** Get the CPU time for the specified process */ unsigned long proc_get_jiffies(process_t *p) { wchar_t fn[FN_SIZE]; char state; int pid, ppid, pgrp, session, tty_nr, tpgid, exit_signal, processor; long int cutime, cstime, priority, nice, placeholder, itrealvalue, rss; unsigned long int flags, minflt, cminflt, majflt, cmajflt, utime, stime, starttime, vsize, rlim, startcode, endcode, startstack, kstkesp, kstkeip, signal, blocked, sigignore, sigcatch, wchan, nswap, cnswap; char comm[1024]; if (p->pid <= 0) return 0; swprintf(fn, FN_SIZE, L"/proc/%d/stat", p->pid); FILE *f = wfopen(fn, "r"); if (!f) return 0; int count = fscanf(f, "%d %s %c " "%d %d %d " "%d %d %lu " "%lu %lu %lu " "%lu %lu %lu " "%ld %ld %ld " "%ld %ld %ld " "%lu %lu %ld " "%lu %lu %lu " "%lu %lu %lu " "%lu %lu %lu " "%lu %lu %lu " "%lu %d %d ", &pid, comm, &state, &ppid, &pgrp, &session, &tty_nr, &tpgid, &flags, &minflt, &cminflt, &majflt, &cmajflt, &utime, &stime, &cutime, &cstime, &priority, &nice, &placeholder, &itrealvalue, &starttime, &vsize, &rss, &rlim, &startcode, &endcode, &startstack, &kstkesp, &kstkeip, &signal, &blocked, &sigignore, &sigcatch, &wchan, &nswap, &cnswap, &exit_signal, &processor ); if (count < 17) { return 0; } /* Don't need to check exit status of fclose on read-only streams */ fclose(f); return utime+stime+cutime+cstime; } /** Update the CPU time for all jobs */ void proc_update_jiffies() { job_t* job; process_t *p; job_iterator_t j; for (job = j.next(); job; job = j.next()) { for (p=job->first_process; p; p=p->next) { gettimeofday(&p->last_time, 0); p->last_jiffies = proc_get_jiffies(p); } } } #endif /** Check if there are buffers associated with the job, and select on them for a while if available. \param j the job to test \return 1 if buffers were available, zero otherwise */ static int select_try(job_t *j) { fd_set fds; int maxfd=-1; FD_ZERO(&fds); for (size_t idx = 0; idx < j->io.size(); idx++) { const io_data_t *io = j->io.at(idx).get(); if (io->io_mode == IO_BUFFER) { CAST_INIT(const io_pipe_t *, io_pipe, io); int fd = io_pipe->pipe_fd[0]; // fwprintf( stderr, L"fd %d on job %ls\n", fd, j->command ); FD_SET(fd, &fds); maxfd = maxi(maxfd, fd); debug(3, L"select_try on %d\n", fd); } } if (maxfd >= 0) { int retval; struct timeval tv; tv.tv_sec=0; tv.tv_usec=10000; retval =select(maxfd+1, &fds, 0, 0, &tv); return retval > 0; } return -1; } /** Read from descriptors until they are empty. \param j the job to test */ static void read_try(job_t *j) { io_buffer_t *buff = NULL; /* Find the last buffer, which is the one we want to read from */ for (size_t idx = 0; idx < j->io.size(); idx++) { io_data_t *d = j->io.at(idx).get(); if (d->io_mode == IO_BUFFER) { buff = static_cast(d); } } if (buff) { debug(3, L"proc::read_try('%ls')\n", j->command_wcstr()); while (1) { char b[BUFFER_SIZE]; long l; l=read_blocked(buff->pipe_fd[0], b, BUFFER_SIZE); if (l==0) { break; } else if (l<0) { if (errno != EAGAIN) { debug(1, _(L"An error occured while reading output from code block")); wperror(L"read_try"); } break; } else { buff->out_buffer_append(b, l); } } } } /** Give ownership of the terminal to the specified job. \param j The job to give the terminal to. \param cont If this variable is set, we are giving back control to a job that has previously been stopped. In that case, we need to set the terminal attributes to those saved in the job. */ static bool terminal_give_to_job(job_t *j, int cont) { if (tcsetpgrp(0, j->pgid)) { debug(1, _(L"Could not send job %d ('%ls') to foreground"), j->job_id, j->command_wcstr()); wperror(L"tcsetpgrp"); return false; } if (cont) { if (tcsetattr(0, TCSADRAIN, &j->tmodes)) { debug(1, _(L"Could not send job %d ('%ls') to foreground"), j->job_id, j->command_wcstr()); wperror(L"tcsetattr"); return false; } } return true; } /** Returns control of the terminal to the shell, and saves the terminal attribute state to the job, so that we can restore the terminal ownership to the job at a later time . */ static int terminal_return_from_job(job_t *j) { if (tcsetpgrp(0, getpgrp())) { debug(1, _(L"Could not return shell to foreground")); wperror(L"tcsetpgrp"); return 0; } /* Save jobs terminal modes. */ if (tcgetattr(0, &j->tmodes)) { debug(1, _(L"Could not return shell to foreground")); wperror(L"tcgetattr"); return 0; } /* Disabling this per https://github.com/adityagodbole/fish-shell/commit/9d229cd18c3e5c25a8bd37e9ddd3b67ddc2d1b72 On Linux, 'cd . ; ftp' prevents you from typing into the ftp prompt See https://github.com/fish-shell/fish-shell/issues/121 */ #if 0 /* Restore the shell's terminal modes. */ if (tcsetattr(0, TCSADRAIN, &shell_modes)) { debug(1, _(L"Could not return shell to foreground")); wperror(L"tcsetattr"); return 0; } #endif return 1; } void job_continue(job_t *j, bool cont) { /* Put job first in the job list */ job_promote(j); job_set_flag(j, JOB_NOTIFIED, 0); CHECK_BLOCK(); debug(4, L"Continue job %d, gid %d (%ls), %ls, %ls", j->job_id, j->pgid, j->command_wcstr(), job_is_completed(j)?L"COMPLETED":L"UNCOMPLETED", is_interactive?L"INTERACTIVE":L"NON-INTERACTIVE"); if (!job_is_completed(j)) { if (job_get_flag(j, JOB_TERMINAL) && job_get_flag(j, JOB_FOREGROUND)) { /* Put the job into the foreground. Hack: ensure that stdin is marked as blocking first (#176). */ make_fd_blocking(STDIN_FILENO); signal_block(); bool ok = terminal_give_to_job(j, cont); signal_unblock(); if (!ok) return; } /* Send the job a continue signal, if necessary. */ if (cont) { process_t *p; for (p=j->first_process; p; p=p->next) p->stopped=0; if (job_get_flag(j, JOB_CONTROL)) { if (killpg(j->pgid, SIGCONT)) { wperror(L"killpg (SIGCONT)"); return; } } else { for (p=j->first_process; p; p=p->next) { if (kill(p->pid, SIGCONT) < 0) { wperror(L"kill (SIGCONT)"); return; } } } } if (job_get_flag(j, JOB_FOREGROUND)) { int quit = 0; /* Wait for job to report. Looks a bit ugly because it has to handle the possibility that a signal is dispatched while running job_is_stopped(). */ while (!quit) { do { got_signal = 0; quit = job_is_stopped(j) || job_is_completed(j); } while (got_signal && !quit); if (!quit) { // debug( 1, L"select_try()" ); switch (select_try(j)) { case 1: { read_try(j); break; } case -1: { /* If there is no funky IO magic, we can use waitpid instead of handling child deaths through signals. This gives a rather large speed boost (A factor 3 startup time improvement on my 300 MHz machine) on short-lived jobs. */ int status; pid_t pid = waitpid(-1, &status, WUNTRACED); if (pid > 0) { handle_child_status(pid, status); } else { /* This probably means we got a signal. A signal might mean that the terminal emulator sent us a hup signal to tell is to close. If so, we should exit. */ if (reader_exit_forced()) { quit = 1; } } break; } } } } } } if (job_get_flag(j, JOB_FOREGROUND)) { if (job_is_completed(j)) { // It's possible that the job will produce output and exit before we've even read from it. // We'll eventually read the output, but it may be after we've executed subsequent calls // This is why my prompt colors kept getting screwed up - the builtin echo calls // were sometimes having their output combined with the set_color calls in the wrong order! read_try(j); process_t *p = j->first_process; while (p->next) p = p->next; if (WIFEXITED(p->status) || WIFSIGNALED(p->status)) { /* Mark process status only if we are in the foreground and the last process in a pipe, and it is not a short circuited builtin */ if (p->pid) { int status = proc_format_status(p->status); //wprintf(L"setting status %d for %ls\n", job_get_flag( j, JOB_NEGATE )?!status:status, j->command); proc_set_last_status(job_get_flag(j, JOB_NEGATE)?!status:status); } } } /* Put the shell back in the foreground. */ if (job_get_flag(j, JOB_TERMINAL) && job_get_flag(j, JOB_FOREGROUND)) { int ok; signal_block(); ok = terminal_return_from_job(j); signal_unblock(); if (!ok) return; } } } int proc_format_status(int status) { if (WIFSIGNALED(status)) { return 128+WTERMSIG(status); } else if (WIFEXITED(status)) { return WEXITSTATUS(status); } return status; } void proc_sanity_check() { job_t *j; job_t *fg_job=0; job_iterator_t jobs; while ((j = jobs.next())) { process_t *p; if (!job_get_flag(j, JOB_CONSTRUCTED)) continue; validate_pointer(j->first_process, _(L"Process list pointer"), 0); /* More than one foreground job? */ if (job_get_flag(j, JOB_FOREGROUND) && !(job_is_stopped(j) || job_is_completed(j))) { if (fg_job != 0) { debug(0, _(L"More than one job in foreground: job 1: '%ls' job 2: '%ls'"), fg_job->command_wcstr(), j->command_wcstr()); sanity_lose(); } fg_job = j; } p = j->first_process; while (p) { validate_pointer(p->get_argv(), _(L"Process argument list"), 0); validate_pointer(p->argv0(), _(L"Process name"), 0); validate_pointer(p->next, _(L"Process list pointer"), 1); if ((p->stopped & (~0x00000001)) != 0) { debug(0, _(L"Job '%ls', process '%ls' has inconsistent state \'stopped\'=%d"), j->command_wcstr(), p->argv0(), p->stopped); sanity_lose(); } if ((p->completed & (~0x00000001)) != 0) { debug(0, _(L"Job '%ls', process '%ls' has inconsistent state \'completed\'=%d"), j->command_wcstr(), p->argv0(), p->completed); sanity_lose(); } p=p->next; } } } void proc_push_interactive(int value) { ASSERT_IS_MAIN_THREAD(); int old = is_interactive; interactive_stack.push_back(is_interactive); is_interactive = value; if (old != value) signal_set_handlers(); } void proc_pop_interactive() { ASSERT_IS_MAIN_THREAD(); int old = is_interactive; is_interactive= interactive_stack.back(); interactive_stack.pop_back(); if (is_interactive != old) signal_set_handlers(); } fish/proc.h000066400000000000000000000344361214535744100131430ustar00rootroot00000000000000/** \file proc.h Prototypes for utilities for keeping track of jobs, processes and subshells, as well as signal handling functions for tracking children. These functions do not themselves launch new processes, the exec library will call proc to create representations of the running jobs as needed. */ #ifndef FISH_PROC_H #define FISH_PROC_H #include #include #include #include #include #include "util.h" #include "io.h" #include "common.h" /** The status code use when a command was not found */ #define STATUS_UNKNOWN_COMMAND 127 /** The status code use when an unknown error occured during execution of a command */ #define STATUS_NOT_EXECUTABLE 126 /** The status code use when an unknown error occured during execution of a command */ #define STATUS_EXEC_FAIL 125 /** The status code use when a wildcard had no matches */ #define STATUS_UNMATCHED_WILDCARD 124 /** The status code used for normal exit in a builtin */ #define STATUS_BUILTIN_OK 0 /** The status code used for erroneous argument combinations in a builtin */ #define STATUS_BUILTIN_ERROR 1 /** Types of processes */ enum { /** A regular external command */ EXTERNAL, /** A builtin command */ INTERNAL_BUILTIN, /** A shellscript function */ INTERNAL_FUNCTION, /** A block of commands */ INTERNAL_BLOCK, /** The exec builtin */ INTERNAL_EXEC, /** A buffer */ INTERNAL_BUFFER, } ; enum { JOB_CONTROL_ALL, JOB_CONTROL_INTERACTIVE, JOB_CONTROL_NONE, } ; /** A structure representing a single fish process. Contains variables for tracking process state and the process argument list. Actually, a fish process can be either a regular external process, an internal builtin which may or may not spawn a fake IO process during execution, a shellscript function or a block of commands to be evaluated by calling eval. Lastly, this process can be the result of an exec command. The role of this process_t is determined by the type field, which can be one of EXTERNAL, INTERNAL_BUILTIN, INTERNAL_FUNCTION, INTERNAL_BLOCK, INTERNAL_EXEC, and INTERNAL_BUFFER. The process_t contains information on how the process should be started, such as command name and arguments, as well as runtime information on the status of the actual physical process which represents it. Shellscript functions, builtins and blocks of code may all need to spawn an external process that handles the piping and redirecting of IO for them. If the process is of type EXTERNAL or INTERNAL_EXEC, argv is the argument array and actual_cmd is the absolute path of the command to execute. If the process is of type INTERNAL_BUILTIN, argv is the argument vector, and argv[0] is the name of the builtin command. If the process is of type INTERNAL_FUNCTION, argv is the argument vector, and argv[0] is the name of the shellscript function. If the process is of type INTERNAL_BLOCK, argv has exactly one element, which is the block of commands to execute. */ class process_t { private: null_terminated_array_t argv_array; /* narrow copy of argv0 so we don't have to convert after fork */ narrow_string_rep_t argv0_narrow; /* No copying */ process_t(const process_t &rhs); void operator=(const process_t &rhs); public: process_t(); ~process_t(); /** Type of process. Can be one of \c EXTERNAL, \c INTERNAL_BUILTIN, \c INTERNAL_FUNCTION, \c INTERNAL_BLOCK, INTERNAL_EXEC, or INTERNAL_BUFFER */ int type; /** Sets argv */ void set_argv(const wcstring_list_t &argv) { argv_array.set(argv); argv0_narrow.set(argv.empty() ? L"" : argv[0]); } /** Returns argv */ const wchar_t * const *get_argv(void) const { return argv_array.get(); } const null_terminated_array_t &get_argv_array(void) const { return argv_array; } /** Returns argv[idx] */ const wchar_t *argv(size_t idx) const { const wchar_t * const *argv = argv_array.get(); assert(argv != NULL); return argv[idx]; } /** Returns argv[0], or NULL */ const wchar_t *argv0(void) const { const wchar_t * const *argv = argv_array.get(); return argv ? argv[0] : NULL; } /** Returns argv[0] as a char * */ const char *argv0_cstr(void) const { return argv0_narrow.get(); } /** actual command to pass to exec in case of EXTERNAL or INTERNAL_EXEC. */ wcstring actual_cmd; /** process ID */ pid_t pid; /** File descriptor that pipe output should bind to */ int pipe_write_fd; /** File descriptor that the _next_ process pipe input should bind to */ int pipe_read_fd; /** true if process has completed */ volatile int completed; /** true if process has stopped */ volatile int stopped; /** reported status value */ volatile int status; /** Special flag to tell the evaluation function for count to print the help information */ int count_help_magic; /** Next process in pipeline. We own this and we are responsible for deleting it. */ process_t *next; #ifdef HAVE__PROC_SELF_STAT /** Last time of cpu time check */ struct timeval last_time; /** Number of jiffies spent in process at last cpu time check */ unsigned long last_jiffies; #endif }; /** Constants for the flag variable in the job struct */ enum { /** Whether the user has been told about stopped job */ JOB_NOTIFIED = 1 << 0, /** Whether this job is in the foreground */ JOB_FOREGROUND = 1 << 1, /** Whether the specified job is completely constructed, i.e. completely parsed, and every process in the job has been forked, etc. */ JOB_CONSTRUCTED = 1 << 2, /** Whether the specified job is a part of a subshell, event handler or some other form of special job that should not be reported */ JOB_SKIP_NOTIFICATION = 1 << 3, /** Whether the exit status should be negated. This flag can only be set by the not builtin. */ JOB_NEGATE = 1 << 4, /** Whether the exit status should be used to re-evaluate the condition in an if block? This is only used by elseif and is a big hack. */ JOB_ELSEIF = 1 << 5, /** This flag is set to one on wildcard expansion errors. It means that the current command should not be executed */ JOB_WILDCARD_ERROR = 1 << 6, /** Whether to skip executing this job. This flag is set by the short-circuit builtins, i.e. and and or */ JOB_SKIP = 1 << 7, /** Whether the job is under job control */ JOB_CONTROL = 1 << 8, /** Whether the job wants to own the terminal when in the foreground */ JOB_TERMINAL = 1 << 9 }; typedef int job_id_t; job_id_t acquire_job_id(void); void release_job_id(job_id_t jobid); /** A struct represeting a job. A job is basically a pipeline of one or more processes and a couple of flags. */ class job_t { /** The original command which led to the creation of this job. It is used for displaying messages about job status on the terminal. */ wcstring command_str; /* narrow copy so we don't have to convert after fork */ narrow_string_rep_t command_narrow; /* No copying */ job_t(const job_t &rhs); void operator=(const job_t &); public: job_t(job_id_t jobid); ~job_t(); /** Returns whether the command is empty. */ bool command_is_empty() const { return command_str.empty(); } /** Returns the command as a wchar_t *. */ const wchar_t *command_wcstr() const { return command_str.c_str(); } /** Returns the command */ const wcstring &command() const { return command_str; } /** Returns the command as a char *. */ const char *command_cstr() const { return command_narrow.get(); } /** Sets the command */ void set_command(const wcstring &cmd) { command_str = cmd; command_narrow.set(cmd); } /** A linked list of all the processes in this job. We are responsible for deleting this when we are deallocated. */ process_t *first_process; /** process group ID for the process group that this job is running in. */ pid_t pgid; /** The saved terminal modes of this job. This needs to be saved so that we can restore the terminal to the same state after temporarily taking control over the terminal when a job stops. */ struct termios tmodes; /** The job id of the job. This is a small integer that is a unique identifier of the job within this shell, and is used e.g. in process expansion. */ const job_id_t job_id; /** List of all IO redirections for this job. */ io_chain_t io; /** Bitset containing information about the job. A combination of the JOB_* constants. */ unsigned int flags; }; /** Whether we are running a subshell command */ extern int is_subshell; /** Whether we are running a block of commands */ extern int is_block; /** Whether we are reading from the keyboard right now */ int get_is_interactive(void); /** Whether this shell is attached to the keyboard at all */ extern int is_interactive_session; /** Whether we are a login shell */ extern int is_login; /** Whether we are running an event handler */ extern int is_event; typedef std::list job_list_t; bool job_list_is_empty(void); /** A class to aid iteration over jobs list. Note this is used from a signal handler, so it must be careful to not allocate memory. */ class job_iterator_t { job_list_t * const job_list; job_list_t::iterator current, end; public: void reset(void); job_t *next() { job_t *job = NULL; if (current != end) { job = *current; ++current; } return job; } job_iterator_t(job_list_t &jobs); job_iterator_t(); }; /** Whether a universal variable barrier roundtrip has already been made for the currently executing command. Such a roundtrip only needs to be done once on a given command, unless a universal variable value is changed. Once this has been done, this variable is set to 1, so that no more roundtrips need to be done. Both setting it to one when it should be zero and the opposite may cause concurrency bugs. */ bool get_proc_had_barrier(); void set_proc_had_barrier(bool flag); /** Pid of last process started in the background */ extern pid_t proc_last_bg_pid; /** The current job control mode. Must be one of JOB_CONTROL_ALL, JOB_CONTROL_INTERACTIVE and JOB_CONTROL_NONE */ extern int job_control_mode; /** If this flag is set, fish will never fork or run execve. It is used to put fish into a syntax verifier mode where fish tries to validate the syntax of a file but doesn't actually do anything. */ extern int no_exec; /** Add the specified flag to the bitset of flags for the specified job */ void job_set_flag(job_t *j, unsigned int flag, int set); /** Returns one if the specified flag is set in the specified job, 0 otherwise. */ int job_get_flag(const job_t *j, unsigned int flag); /** Sets the status of the last process to exit */ void proc_set_last_status(int s); /** Returns the status of the last process to exit */ int proc_get_last_status(); /** Remove the specified job */ void job_free(job_t* j); /** Promotes a job to the front of the job list. */ void job_promote(job_t *job); /** Create a new job. */ job_t *job_create(); /** Return the job with the specified job id. If id is 0 or less, return the last job used. */ job_t *job_get(job_id_t id); /** Return the job with the specified pid. */ job_t *job_get_from_pid(int pid); /** Tests if the job is stopped */ int job_is_stopped(const job_t *j); /** Tests if the job has completed, i.e. if the last process of the pipeline has ended. */ int job_is_completed(const job_t *j); /** Reassume a (possibly) stopped job. Put job j in the foreground. If cont is true, restore the saved terminal modes and send the process group a SIGCONT signal to wake it up before we block. \param j The job \param cont Whether the function should wait for the job to complete before returning */ void job_continue(job_t *j, bool cont); /** Notify the user about stopped or terminated jobs. Delete terminated jobs from the job list. \param interactive whether interactive jobs should be reaped as well */ int job_reap(bool interactive); /** Signal handler for SIGCHLD. Mark any processes with relevant information. */ void job_handle_signal(int signal, siginfo_t *info, void *con); /** Send the specified signal to all processes in the specified job. */ int job_signal(job_t *j, int signal); /** Mark a process as failed to execute (and therefore completed) */ void job_mark_process_as_failed(const job_t *job, process_t *p); #ifdef HAVE__PROC_SELF_STAT /** Use the procfs filesystem to look up how many jiffies of cpu time was used by this process. This function is only available on systems with the procfs file entry 'stat', i.e. Linux. */ unsigned long proc_get_jiffies(process_t *p); /** Update process time usage for all processes by calling the proc_get_jiffies function for every process of every job. */ void proc_update_jiffies(); #endif /** Perform a set of simple sanity checks on the job list. This includes making sure that only one job is in the foreground, that every process is in a valid state, etc. */ void proc_sanity_check(); /** Send a process/job exit event notification. This function is a convenience wrapper around event_fire(). */ void proc_fire_event(const wchar_t *msg, int type, pid_t pid, int status); /** Initializations */ void proc_init(); /** Clean up before exiting */ void proc_destroy(); /** Set new value for is_interactive flag, saving previous value. If needed, update signal handlers. */ void proc_push_interactive(int value); /** Set is_interactive flag to the previous value. If needed, update signal handlers. */ void proc_pop_interactive(); /** Format an exit status code as returned by e.g. wait into a fish exit code number as accepted by proc_set_last_status. */ int proc_format_status(int status); #endif fish/reader.cpp000066400000000000000000003226371214535744100140000ustar00rootroot00000000000000/** \file reader.c Functions for reading data from stdin and passing to the parser. If stdin is a keyboard, it supplies a killring, history, syntax highlighting, tab-completion and various other interactive features. Internally the interactive mode functions rely in the functions of the input library to read individual characters of input. Token search is handled incrementally. Actual searches are only done on when searching backwards, since the previous results are saved. The last search position is remembered and a new search continues from the last search position. All search results are saved in the list 'search_prev'. When the user searches forward, i.e. presses Alt-down, the list is consulted for previous search result, and subsequent backwards searches are also handled by consulting the list up until the end of the list is reached, at which point regular searching will commence. */ #include "config.h" #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #include #include #include #include #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #ifdef HAVE_SIGINFO_H #include #endif #ifdef HAVE_SYS_SELECT_H #include #endif #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "highlight.h" #include "reader.h" #include "proc.h" #include "parser.h" #include "complete.h" #include "history.h" #include "common.h" #include "sanity.h" #include "env.h" #include "exec.h" #include "expand.h" #include "tokenizer.h" #include "kill.h" #include "input_common.h" #include "input.h" #include "function.h" #include "output.h" #include "signal.h" #include "screen.h" #include "iothread.h" #include "intern.h" #include "path.h" #include "parse_util.h" /** Maximum length of prefix string when printing completion list. Longer prefixes will be ellipsized. */ #define PREFIX_MAX_LEN 9 /** A simple prompt for reading shell commands that does not rely on fish specific commands, meaning it will work even if fish is not installed. This is used by read_i. */ #define DEFAULT_PROMPT L"echo -n \"$USER@\"(hostname|cut -d . -f 1)' '(pwd)'> '" /** The name of the function that prints the fish prompt */ #define LEFT_PROMPT_FUNCTION_NAME L"fish_prompt" /** The name of the function that prints the fish right prompt (RPROMPT) */ #define RIGHT_PROMPT_FUNCTION_NAME L"fish_right_prompt" /** The default title for the reader. This is used by reader_readline. */ #define DEFAULT_TITLE L"echo $_ \" \"; pwd" /** The maximum number of characters to read from the keyboard without repainting. Note that this readahead will only occur if new characters are available for reading, fish will never block for more input without repainting. */ #define READAHEAD_MAX 256 /** A mode for calling the reader_kill function. In this mode, the new string is appended to the current contents of the kill buffer. */ #define KILL_APPEND 0 /** A mode for calling the reader_kill function. In this mode, the new string is prepended to the current contents of the kill buffer. */ #define KILL_PREPEND 1 /** History search mode. This value means that no search is currently performed. */ #define NO_SEARCH 0 /** History search mode. This value means that we are performing a line history search. */ #define LINE_SEARCH 1 /** History search mode. This value means that we are performing a token history search. */ #define TOKEN_SEARCH 2 /** History search mode. This value means we are searching backwards. */ #define SEARCH_BACKWARD 0 /** History search mode. This value means we are searching forwards. */ #define SEARCH_FORWARD 1 /* Any time the contents of a buffer changes, we update the generation count. This allows for our background highlighting thread to notice it and skip doing work that it would otherwise have to do. This variable should really be of some kind of interlocked or atomic type that guarantees we're not reading stale cache values. With C++11 we should use atomics, but until then volatile should work as well, at least on x86.*/ static volatile unsigned int s_generation_count; /* This pthreads generation count is set when an autosuggestion background thread starts up, so it can easily check if the work it is doing is no longer useful. */ static pthread_key_t generation_count_key; /* A color is an int */ typedef int color_t; /** A struct describing the state of the interactive reader. These states can be stacked, in case reader_readline() calls are nested. This happens when the 'read' builtin is used. */ class reader_data_t { public: /** String containing the whole current commandline */ wcstring command_line; /** String containing the autosuggestion */ wcstring autosuggestion; /** Whether autosuggesting is allowed at all */ bool allow_autosuggestion; /** When backspacing, we temporarily suppress autosuggestions */ bool suppress_autosuggestion; /** The representation of the current screen contents */ screen_t screen; /** The history */ history_t *history; /** String containing the current search item */ wcstring search_buff; /* History search */ history_search_t history_search; /** Saved position used by token history search */ int token_history_pos; /** Saved search string for token history search. Not handled by command_line_changed. */ wcstring token_history_buff; /** List for storing previous search results. Used to avoid duplicates. */ wcstring_list_t search_prev; /** The current position in search_prev */ size_t search_pos; /** Length of the command */ size_t command_length() const { return command_line.size(); } /** Do what we need to do whenever our command line changes */ void command_line_changed(void); /** The current position of the cursor in buff. */ size_t buff_pos; /** Name of the current application */ wcstring app_name; /** The prompt commands */ wcstring left_prompt; wcstring right_prompt; /** The output of the last evaluation of the prompt command */ wcstring left_prompt_buff; /** The output of the last evaluation of the right prompt command */ wcstring right_prompt_buff; /** Color is the syntax highlighting for buff. The format is that color[i] is the classification (according to the enum in highlight.h) of buff[i]. */ std::vector colors; /** An array defining the block level at each character. */ std::vector indents; /** Function for tab completion */ complete_function_t complete_func; /** Function for syntax highlighting */ highlight_function_t highlight_function; /** Function for testing if the string can be returned */ int (*test_func)(const wchar_t *); /** When this is true, the reader will exit */ bool end_loop; /** If this is true, exit reader even if there are running jobs. This happens if we press e.g. ^D twice. */ bool prev_end_loop; /** The current contents of the top item in the kill ring. */ wcstring kill_item; /** Pointer to previous reader_data */ reader_data_t *next; /** This variable keeps state on if we are in search mode, and if yes, what mode */ int search_mode; /** Keep track of whether any internal code has done something which is known to require a repaint. */ bool repaint_needed; /** Whether a screen reset is needed after a repaint. */ bool screen_reset_needed; /** Whether the reader should exit on ^C. */ bool exit_on_interrupt; /** Constructor */ reader_data_t() : allow_autosuggestion(0), suppress_autosuggestion(0), history(0), token_history_pos(0), search_pos(0), buff_pos(0), complete_func(0), highlight_function(0), test_func(0), end_loop(0), prev_end_loop(0), next(0), search_mode(0), repaint_needed(0), screen_reset_needed(0), exit_on_interrupt(0) { } }; /** The current interactive reading context */ static reader_data_t *data=0; /** This flag is set to true when fish is interactively reading from stdin. It changes how a ^C is handled by the fish interrupt handler. */ static int is_interactive_read; /** Flag for ending non-interactive shell */ static int end_loop = 0; /** The stack containing names of files that are being parsed */ static std::stack > current_filename; /** Store the pid of the parent process, so the exit function knows whether it should reset the terminal or not. */ static pid_t original_pid; /** This variable is set to true by the signal handler when ^C is pressed */ static volatile int interrupted=0; /* Prototypes for a bunch of functions defined later on. */ static bool is_backslashed(const wcstring &str, size_t pos); static wchar_t unescaped_quote(const wcstring &str, size_t pos); /** Stores the previous termios mode so we can reset the modes when we execute programs and when the shell exits. */ static struct termios saved_modes; static void reader_super_highlight_me_plenty(size_t pos); /** Variable to keep track of forced exits - see \c reader_exit_forced(); */ static int exit_forced; /** Give up control of terminal */ static void term_donate() { set_color(rgb_color_t::normal(), rgb_color_t::normal()); while (1) { if (tcsetattr(0,TCSANOW,&saved_modes)) { if (errno != EINTR) { debug(1, _(L"Could not set terminal mode for new job")); wperror(L"tcsetattr"); break; } } else break; } } /** Grab control of terminal */ static void term_steal() { while (1) { if (tcsetattr(0,TCSANOW,&shell_modes)) { if (errno != EINTR) { debug(1, _(L"Could not set terminal mode for shell")); wperror(L"tcsetattr"); break; } } else break; } common_handle_winch(0); } int reader_exit_forced() { return exit_forced; } /* Given a command line and an autosuggestion, return the string that gets shown to the user */ wcstring combine_command_and_autosuggestion(const wcstring &cmdline, const wcstring &autosuggestion) { // We want to compute the full line, containing the command line and the autosuggestion // They may disagree on whether characters are uppercase or lowercase // Here we do something funny: if the last token of the command line contains any uppercase characters, we use its case // Otherwise we use the case of the autosuggestion // This is an idea from https://github.com/fish-shell/fish-shell/issues/335 wcstring full_line; if (autosuggestion.size() <= cmdline.size() || cmdline.empty()) { // No or useless autosuggestion, or no command line full_line = cmdline; } else if (string_prefixes_string(cmdline, autosuggestion)) { // No case disagreements, or no extra characters in the autosuggestion full_line = autosuggestion; } else { // We have an autosuggestion which is not a prefix of the command line, i.e. a case disagreement // Decide whose case we want to use const wchar_t *begin = NULL, *cmd = cmdline.c_str(); parse_util_token_extent(cmd, cmdline.size() - 1, &begin, NULL, NULL, NULL); bool last_token_contains_uppercase = false; if (begin) { const wchar_t *end = begin + wcslen(begin); last_token_contains_uppercase = (std::find_if(begin, end, iswupper) != end); } if (! last_token_contains_uppercase) { // Use the autosuggestion's case full_line = autosuggestion; } else { // Use the command line case for its characters, then append the remaining characters in the autosuggestion // Note that we know that autosuggestion.size() > cmdline.size() due to the first test above full_line = cmdline; full_line.append(autosuggestion, cmdline.size(), autosuggestion.size() - cmdline.size()); } } return full_line; } /** Repaint the entire commandline. This means reset and clear the commandline, write the prompt, perform syntax highlighting, write the commandline and move the cursor. */ static void reader_repaint() { // Update the indentation parser_t::principal_parser().test(data->command_line.c_str(), &data->indents[0]); // Combine the command and autosuggestion into one string wcstring full_line = combine_command_and_autosuggestion(data->command_line, data->autosuggestion); size_t len = full_line.size(); if (len < 1) len = 1; std::vector colors = data->colors; colors.resize(len, HIGHLIGHT_AUTOSUGGESTION); std::vector indents = data->indents; indents.resize(len); s_write(&data->screen, data->left_prompt_buff, data->right_prompt_buff, full_line, data->command_length(), &colors[0], &indents[0], data->buff_pos); data->repaint_needed = false; } static void reader_repaint_without_autosuggestion() { // Swap in an empty autosuggestion, repaint, then swap it out wcstring saved_autosuggestion; data->autosuggestion.swap(saved_autosuggestion); reader_repaint(); data->autosuggestion.swap(saved_autosuggestion); } /** Internal helper function for handling killing parts of text. */ static void reader_kill(size_t begin_idx, size_t length, int mode, int newv) { const wchar_t *begin = data->command_line.c_str() + begin_idx; if (newv) { data->kill_item = wcstring(begin, length); kill_add(data->kill_item); } else { wcstring old = data->kill_item; if (mode == KILL_APPEND) { data->kill_item.append(begin, length); } else { data->kill_item = wcstring(begin, length); data->kill_item.append(old); } kill_replace(old, data->kill_item); } if (data->buff_pos > begin_idx) { /* Move the buff position back by the number of characters we deleted, but don't go past buff_pos */ size_t backtrack = mini(data->buff_pos - begin_idx, length); data->buff_pos -= backtrack; } data->command_line.erase(begin_idx, length); data->command_line_changed(); reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); } /* This is called from a signal handler! */ void reader_handle_int(int sig) { if (!is_interactive_read) { parser_t::skip_all_blocks(); } interrupted = 1; } const wchar_t *reader_current_filename() { ASSERT_IS_MAIN_THREAD(); return current_filename.empty() ? NULL : current_filename.top(); } void reader_push_current_filename(const wchar_t *fn) { ASSERT_IS_MAIN_THREAD(); current_filename.push(intern(fn)); } void reader_pop_current_filename() { ASSERT_IS_MAIN_THREAD(); current_filename.pop(); } /** Make sure buffers are large enough to hold the current string length */ void reader_data_t::command_line_changed() { ASSERT_IS_MAIN_THREAD(); size_t len = command_length(); /* When we grow colors, propagate the last color (if any), under the assumption that usually it will be correct. If it is, it avoids a repaint. */ color_t last_color = colors.empty() ? color_t() : colors.back(); colors.resize(len, last_color); indents.resize(len); /* Update the gen count */ s_generation_count++; } /** Sorts and remove any duplicate completions in the list. */ static void sort_and_make_unique(std::vector &l) { sort(l.begin(), l.end()); l.erase(std::unique(l.begin(), l.end()), l.end()); } void reader_reset_interrupted() { interrupted = 0; } int reader_interrupted() { int res = interrupted; if (res) { interrupted=0; } return res; } int reader_reading_interrupted() { int res = reader_interrupted(); if (res && data && data->exit_on_interrupt) { reader_exit(1, 0); parser_t::skip_all_blocks(); // We handled the interrupt ourselves, our caller doesn't need to // handle it. return 0; } return res; } bool reader_thread_job_is_stale() { ASSERT_IS_BACKGROUND_THREAD(); return (void*)(uintptr_t) s_generation_count != pthread_getspecific(generation_count_key); } void reader_write_title() { const wchar_t *title; const env_var_t term_str = env_get_string(L"TERM"); /* This is a pretty lame heuristic for detecting terminals that do not support setting the title. If we recognise the terminal name as that of a virtual terminal, we assume it supports setting the title. If we recognise it as that of a console, we assume it does not support setting the title. Otherwise we check the ttyname and see if we believe it is a virtual terminal. One situation in which this breaks down is with screen, since screen supports setting the terminal title if the underlying terminal does so, but will print garbage on terminals that don't. Since we can't see the underlying terminal below screen there is no way to fix this. */ if (term_str.missing()) return; const wchar_t *term = term_str.c_str(); bool recognized = false; recognized = recognized || contains(term, L"xterm", L"screen", L"nxterm", L"rxvt"); recognized = recognized || ! wcsncmp(term, L"xterm-", wcslen(L"xterm-")); recognized = recognized || ! wcsncmp(term, L"screen-", wcslen(L"screen-")); if (! recognized) { char *n = ttyname(STDIN_FILENO); if (contains(term, L"linux")) { return; } if (strstr(n, "tty") || strstr(n, "/vc/")) return; } title = function_exists(L"fish_title")?L"fish_title":DEFAULT_TITLE; if (wcslen(title) ==0) return; wcstring_list_t lst; proc_push_interactive(0); if (exec_subshell(title, lst, false /* do not apply exit status */) != -1) { if (! lst.empty()) { writestr(L"\x1b]0;"); for (size_t i=0; iprompt_buff. */ static void exec_prompt() { /* Clear existing prompts */ data->left_prompt_buff.clear(); data->right_prompt_buff.clear(); /* Do not allow the exit status of the prompts to leak through */ const bool apply_exit_status = false; /* If we have any prompts, they must be run non-interactively */ if (data->left_prompt.size() || data->right_prompt.size()) { proc_push_interactive(0); if (! data->left_prompt.empty()) { wcstring_list_t prompt_list; // ignore return status exec_subshell(data->left_prompt, prompt_list, apply_exit_status); for (size_t i = 0; i < prompt_list.size(); i++) { if (i > 0) data->left_prompt_buff += L'\n'; data->left_prompt_buff += prompt_list.at(i); } } if (! data->right_prompt.empty()) { wcstring_list_t prompt_list; // status is ignored exec_subshell(data->right_prompt, prompt_list, apply_exit_status); for (size_t i = 0; i < prompt_list.size(); i++) { // Right prompt does not support multiple lines, so just concatenate all of them data->right_prompt_buff += prompt_list.at(i); } } proc_pop_interactive(); } /* Write the screen title */ reader_write_title(); } void reader_init() { VOMIT_ON_FAILURE(pthread_key_create(&generation_count_key, NULL)); tcgetattr(0,&shell_modes); /* get the current terminal modes */ memcpy(&saved_modes, &shell_modes, sizeof(saved_modes)); /* save a copy so we can reset the terminal later */ shell_modes.c_lflag &= ~ICANON; /* turn off canonical mode */ shell_modes.c_lflag &= ~ECHO; /* turn off echo mode */ shell_modes.c_cc[VMIN]=1; shell_modes.c_cc[VTIME]=0; // PCA disable VDSUSP (typically control-Y), which is a funny job control // function available only on OS X and BSD systems // This lets us use control-Y for yank instead #ifdef VDSUSP shell_modes.c_cc[VDSUSP] = _POSIX_VDISABLE; #endif } void reader_destroy() { tcsetattr(0, TCSANOW, &saved_modes); pthread_key_delete(generation_count_key); } void reader_exit(int do_exit, int forced) { if (data) data->end_loop=do_exit; end_loop=do_exit; if (forced) exit_forced = 1; } void reader_repaint_needed() { if (data) { data->repaint_needed = true; } } void reader_repaint_if_needed() { if (data == NULL) return; bool needs_reset = data->screen_reset_needed; bool needs_repaint = needs_reset || data->repaint_needed; if (needs_reset) { exec_prompt(); s_reset(&data->screen, screen_reset_current_line_and_prompt); data->screen_reset_needed = false; } if (needs_repaint) { reader_repaint(); /* reader_repaint clears repaint_needed */ } } static void reader_repaint_if_needed_one_arg(void * unused) { reader_repaint_if_needed(); } void reader_react_to_color_change() { if (! data) return; if (! data->repaint_needed || ! data->screen_reset_needed) { data->repaint_needed = true; data->screen_reset_needed = true; input_common_add_callback(reader_repaint_if_needed_one_arg, NULL); } } /** Remove the previous character in the character buffer and on the screen using syntax highlighting, etc. */ static void remove_backward() { if (data->buff_pos <= 0) return; /* Fake composed character sequences by continuing to delete until we delete a character of width at least 1. */ int width; do { data->buff_pos -= 1; width = fish_wcwidth(data->command_line.at(data->buff_pos)); data->command_line.erase(data->buff_pos, 1); } while (width == 0 && data->buff_pos > 0); data->command_line_changed(); data->suppress_autosuggestion = true; reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); } /** Insert the characters of the string into the command line buffer and print them to the screen using syntax highlighting, etc. */ static int insert_string(const wcstring &str) { size_t len = str.size(); if (len == 0) return 0; data->command_line.insert(data->buff_pos, str); data->buff_pos += len; data->command_line_changed(); data->suppress_autosuggestion = false; /* Syntax highlight. Note we must have that buff_pos > 0 because we just added something nonzero to its length */ assert(data->buff_pos > 0); reader_super_highlight_me_plenty(data->buff_pos-1); reader_repaint(); return 1; } /** Insert the character into the command line buffer and print it to the screen using syntax highlighting, etc. */ static int insert_char(wchar_t c) { return insert_string(wcstring(&c, 1)); } /** Calculate the length of the common prefix substring of two strings. */ static size_t comp_len(const wchar_t *a, const wchar_t *b) { size_t i; for (i=0; a[i] != L'\0' && b[i] != L'\0' && a[i]==b[i]; i++) ; return i; } /** Calculate the case insensitive length of the common prefix substring of two strings. */ static size_t comp_ilen(const wchar_t *a, const wchar_t *b) { size_t i; for (i=0; a[i] != L'\0' && b[i] != L'\0' && towlower(a[i])==towlower(b[i]); i++) ; return i; } /** Insert the string in the given command line at the given cursor position. The function checks if the string is quoted or not and correctly escapes the string. \param val the string to insert \param flags A union of all flags describing the completion to insert. See the completion_t struct for more information on possible values. \param command_line The command line into which we will insert \param inout_cursor_pos On input, the location of the cursor within the command line. On output, the new desired position. \param append_only Whether we can only append to the command line, or also modify previous characters. This is used to determine whether we go inside a trailing quote. \return The completed string */ wcstring completion_apply_to_command_line(const wcstring &val_str, complete_flags_t flags, const wcstring &command_line, size_t *inout_cursor_pos, bool append_only) { const wchar_t *val = val_str.c_str(); bool add_space = !(flags & COMPLETE_NO_SPACE); bool do_replace = !!(flags & COMPLETE_REPLACES_TOKEN); bool do_escape = !(flags & COMPLETE_DONT_ESCAPE); const size_t cursor_pos = *inout_cursor_pos; bool back_into_trailing_quote = false; if (do_replace) { size_t move_cursor; const wchar_t *begin, *end; wchar_t *escaped; const wchar_t *buff = command_line.c_str(); parse_util_token_extent(buff, cursor_pos, &begin, 0, 0, 0); end = buff + cursor_pos; wcstring sb(buff, begin - buff); if (do_escape) { /* Respect COMPLETE_DONT_ESCAPE_TILDES */ bool no_tilde = !!(flags & COMPLETE_DONT_ESCAPE_TILDES); escaped = escape(val, ESCAPE_ALL | ESCAPE_NO_QUOTED | (no_tilde ? ESCAPE_NO_TILDE : 0)); sb.append(escaped); move_cursor = wcslen(escaped); free(escaped); } else { sb.append(val); move_cursor = wcslen(val); } if (add_space) { sb.append(L" "); move_cursor += 1; } sb.append(end); size_t new_cursor_pos = (begin - buff) + move_cursor; *inout_cursor_pos = new_cursor_pos; return sb; } else { wchar_t quote = L'\0'; wcstring replaced; if (do_escape) { /* Note that we ignore COMPLETE_DONT_ESCAPE_TILDES here. We get away with this because unexpand_tildes only operates on completions that have COMPLETE_REPLACES_TOKEN set, but we ought to respect them */ parse_util_get_parameter_info(command_line, cursor_pos, "e, NULL, NULL); /* If the token is reported as unquoted, but ends with a (unescaped) quote, and we can modify the command line, then delete the trailing quote so that we can insert within the quotes instead of after them. See https://github.com/fish-shell/fish-shell/issues/552 */ if (quote == L'\0' && ! append_only && cursor_pos > 0) { /* The entire token is reported as unquoted...see if the last character is an unescaped quote */ wchar_t trailing_quote = unescaped_quote(command_line, cursor_pos - 1); if (trailing_quote != L'\0') { quote = trailing_quote; back_into_trailing_quote = true; } } replaced = parse_util_escape_string_with_quote(val_str, quote); } else { replaced = val; } size_t insertion_point = cursor_pos; if (back_into_trailing_quote) { /* Move the character back one so we enter the terminal quote */ assert(insertion_point > 0); insertion_point--; } /* Perform the insertion and compute the new location */ wcstring result = command_line; result.insert(insertion_point, replaced); size_t new_cursor_pos = insertion_point + replaced.size() + (back_into_trailing_quote ? 1 : 0); if (add_space) { if (quote != L'\0' && unescaped_quote(command_line, insertion_point) != quote) { /* This is a quoted parameter, first print a quote */ result.insert(new_cursor_pos++, wcstring("e, 1)); } result.insert(new_cursor_pos++, L" "); } *inout_cursor_pos = new_cursor_pos; return result; } } /** Insert the string at the current cursor position. The function checks if the string is quoted or not and correctly escapes the string. \param val the string to insert \param flags A union of all flags describing the completion to insert. See the completion_t struct for more information on possible values. */ static void completion_insert(const wchar_t *val, complete_flags_t flags) { size_t cursor = data->buff_pos; wcstring new_command_line = completion_apply_to_command_line(val, flags, data->command_line, &cursor, false /* not append only */); reader_set_buffer(new_command_line, cursor); /* Since we just inserted a completion, don't immediately do a new autosuggestion */ data->suppress_autosuggestion = true; } /* Return an escaped path to fish_pager */ static wcstring escaped_fish_pager_path(void) { wcstring result; const env_var_t bin_dir = env_get_string(L"__fish_bin_dir"); if (bin_dir.missing_or_empty()) { /* This isn't good, hope our normal command stuff can find it */ result = L"fish_pager"; } else { result = escape_string(bin_dir + L"/fish_pager", ESCAPE_ALL); } return result; } /** Run the fish_pager command to display the completion list. If the fish_pager outputs any text, it is inserted into the input backbuffer. \param prefix the string to display before every completion. \param is_quoted should be set if the argument is quoted. This will change the display style. \param comp the list of completions to display */ static void run_pager(const wcstring &prefix, int is_quoted, const std::vector &comp) { wcstring msg; wcstring prefix_esc; char *foo; shared_ptr in(io_buffer_t::create(true, 3)); shared_ptr out(io_buffer_t::create(false, 4)); // The above may fail e.g. if we have too many open fds if (in.get() == NULL || out.get() == NULL) return; wchar_t *escaped_separator; if (prefix.empty()) { prefix_esc = L"\"\""; } else { prefix_esc = escape_string(prefix, 1); } const wcstring pager_path = escaped_fish_pager_path(); const wcstring cmd = format_string(L"%ls -c 3 -r 4 %ls -p %ls", // L"valgrind --track-fds=yes --log-file=pager.txt --leak-check=full ./%ls %d %ls", pager_path.c_str(), is_quoted?L"-q":L"", prefix_esc.c_str()); escaped_separator = escape(COMPLETE_SEP_STR, 1); bool has_case_sensitive = false; for (size_t i=0; i< comp.size(); i++) { const completion_t &el = comp.at(i); if (!(el.flags & COMPLETE_CASE_INSENSITIVE)) { has_case_sensitive = true; break; } } for (size_t i=0; i< comp.size(); i++) { long base_len=-1; const completion_t &el = comp.at(i); wcstring completion_text; wcstring description_text; if (has_case_sensitive && (el.flags & COMPLETE_CASE_INSENSITIVE)) { continue; } // Note that an empty completion is perfectly sensible here, e.g. tab-completing 'foo' with a file called 'foo' and another called 'foobar' if (el.flags & COMPLETE_REPLACES_TOKEN) { if (base_len == -1) { const wchar_t *begin, *buff = data->command_line.c_str(); parse_util_token_extent(buff, data->buff_pos, &begin, 0, 0, 0); base_len = data->buff_pos - (begin-buff); } completion_text = escape_string(el.completion.c_str() + base_len, ESCAPE_ALL | ESCAPE_NO_QUOTED); } else { completion_text = escape_string(el.completion, ESCAPE_ALL | ESCAPE_NO_QUOTED); } if (! el.description.empty()) { description_text = escape_string(el.description, true); } /* It's possible (even common) to have an empty completion with no description. An example would be completing 'foo' with extant files 'foo' and 'foobar'. But fish_pager ignores blank lines. So if our completion text is empty, always include a description, even if it's empty. */ msg.reserve(msg.size() + completion_text.size() + description_text.size() + 2); msg.append(completion_text); if (! description_text.empty() || completion_text.empty()) { msg.append(escaped_separator); msg.append(description_text); } msg.push_back(L'\n'); } free(escaped_separator); foo = wcs2str(msg.c_str()); in->out_buffer_append(foo, strlen(foo)); free(foo); term_donate(); parser_t &parser = parser_t::principal_parser(); io_chain_t io_chain; io_chain.push_back(out); io_chain.push_back(in); parser.eval(cmd, io_chain, TOP); term_steal(); out->read(); int nil=0; out->out_buffer_append((char *)&nil, 1); const char *outbuff = out->out_buffer_ptr(); if (outbuff) { const wcstring str = str2wcstring(outbuff); size_t idx = str.size(); while (idx--) { input_unreadch(str.at(idx)); } } } struct autosuggestion_context_t { wcstring search_string; wcstring autosuggestion; size_t cursor_pos; history_search_t searcher; file_detection_context_t detector; const wcstring working_directory; const env_vars_snapshot_t vars; wcstring_list_t commands_to_load; const unsigned int generation_count; // don't reload more than once bool has_tried_reloading; autosuggestion_context_t(history_t *history, const wcstring &term, size_t pos) : search_string(term), cursor_pos(pos), searcher(*history, term, HISTORY_SEARCH_TYPE_PREFIX), detector(history, term), working_directory(env_get_pwd_slash()), vars(env_vars_snapshot_t::highlighting_keys), generation_count(s_generation_count), has_tried_reloading(false) { } /* The function run in the background thread to determine an autosuggestion */ int threaded_autosuggest(void) { ASSERT_IS_BACKGROUND_THREAD(); /* If the main thread has moved on, skip all the work */ if (generation_count != s_generation_count) { return 0; } VOMIT_ON_FAILURE(pthread_setspecific(generation_count_key, (void*)(uintptr_t) generation_count)); /* Let's make sure we aren't using the empty string */ if (search_string.empty()) { return 0; } while (! reader_thread_job_is_stale() && searcher.go_backwards()) { history_item_t item = searcher.current_item(); /* Skip items with newlines because they make terrible autosuggestions */ if (item.str().find('\n') != wcstring::npos) continue; if (autosuggest_validate_from_history(item, detector, working_directory, vars)) { /* The command autosuggestion was handled specially, so we're done */ this->autosuggestion = searcher.current_string(); return 1; } } /* Maybe cancel here */ if (reader_thread_job_is_stale()) return 0; /* Try handling a special command like cd */ wcstring special_suggestion; if (autosuggest_suggest_special(search_string, working_directory, special_suggestion)) { this->autosuggestion = special_suggestion; return 1; } /* Maybe cancel here */ if (reader_thread_job_is_stale()) return 0; // Here we do something a little funny // If the line ends with a space, and the cursor is not at the end, // don't use completion autosuggestions. It ends up being pretty weird seeing stuff get spammed on the right // while you go back to edit a line const wchar_t last_char = search_string.at(search_string.size() - 1); const bool cursor_at_end = (this->cursor_pos == search_string.size()); if (! cursor_at_end && iswspace(last_char)) return 0; /* On the other hand, if the line ends with a quote, don't go dumping stuff after the quote */ if (wcschr(L"'\"", last_char) && cursor_at_end) return 0; /* Try normal completions */ std::vector completions; complete(search_string, completions, COMPLETION_REQUEST_AUTOSUGGESTION, &this->commands_to_load); if (! completions.empty()) { const completion_t &comp = completions.at(0); size_t cursor = this->cursor_pos; this->autosuggestion = completion_apply_to_command_line(comp.completion.c_str(), comp.flags, this->search_string, &cursor, true /* append only */); return 1; } return 0; } }; static int threaded_autosuggest(autosuggestion_context_t *ctx) { return ctx->threaded_autosuggest(); } static bool can_autosuggest(void) { /* We autosuggest if suppress_autosuggestion is not set, if we're not doing a history search, and our command line contains a non-whitespace character. */ const wchar_t *whitespace = L" \t\r\n\v"; return ! data->suppress_autosuggestion && data->history_search.is_at_end() && data->command_line.find_first_not_of(whitespace) != wcstring::npos; } static void autosuggest_completed(autosuggestion_context_t *ctx, int result) { /* Extract the commands to load */ wcstring_list_t commands_to_load; ctx->commands_to_load.swap(commands_to_load); /* If we have autosuggestions to load, load them and try again */ if (! result && ! commands_to_load.empty() && ! ctx->has_tried_reloading) { ctx->has_tried_reloading = true; for (wcstring_list_t::const_iterator iter = commands_to_load.begin(); iter != commands_to_load.end(); ++iter) { complete_load(*iter, false); } iothread_perform(threaded_autosuggest, autosuggest_completed, ctx); return; } if (result && can_autosuggest() && ctx->search_string == data->command_line && string_prefixes_string_case_insensitive(ctx->search_string, ctx->autosuggestion)) { /* Autosuggestion is active and the search term has not changed, so we're good to go */ data->autosuggestion = ctx->autosuggestion; sanity_check(); reader_repaint(); } delete ctx; } static void update_autosuggestion(void) { /* Updates autosuggestion. We look for an autosuggestion if the command line is non-empty and if we're not doing a history search. */ data->autosuggestion.clear(); if (data->allow_autosuggestion && ! data->suppress_autosuggestion && ! data->command_line.empty() && data->history_search.is_at_end()) { autosuggestion_context_t *ctx = new autosuggestion_context_t(data->history, data->command_line, data->buff_pos); iothread_perform(threaded_autosuggest, autosuggest_completed, ctx); } } /* Accept any autosuggestion by replacing the command line with it. If full is true, take the whole thing; if it's false, then take only the first "word" */ static void accept_autosuggestion(bool full) { if (! data->autosuggestion.empty()) { /* Accept the autosuggestion */ if (full) { /* Just take the whole thing */ data->command_line = data->autosuggestion; } else { /* Accept characters up to a word separator */ move_word_state_machine_t state(move_word_style_punctuation); for (size_t idx = data->command_line.size(); idx < data->autosuggestion.size(); idx++) { wchar_t wc = data->autosuggestion.at(idx); if (! state.consume_char(wc)) break; data->command_line.push_back(wc); } } data->buff_pos = data->command_line.size(); data->command_line_changed(); reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); } } /** Flash the screen. This function only changed the color of the current line, since the flash_screen sequnce is rather painful to look at in most terminal emulators. */ static void reader_flash() { struct timespec pollint; for (size_t i=0; ibuff_pos; i++) { data->colors.at(i) = HIGHLIGHT_SEARCH_MATCH<<16; } reader_repaint(); pollint.tv_sec = 0; pollint.tv_nsec = 100 * 1000000; nanosleep(&pollint, NULL); reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); } /** Characters that may not be part of a token that is to be replaced by a case insensitive completion. */ #define REPLACE_UNCLEAN L"$*?({})" /** Check if the specified string can be replaced by a case insensitive completion with the specified flags. Advanced tokens like those containing {}-style expansion can not at the moment be replaced, other than if the new token is already an exact replacement, e.g. if the COMPLETE_DONT_ESCAPE flag is set. */ static bool reader_can_replace(const wcstring &in, int flags) { const wchar_t * str = in.c_str(); if (flags & COMPLETE_DONT_ESCAPE) { return true; } /* Test characters that have a special meaning in any character position */ while (*str) { if (wcschr(REPLACE_UNCLEAN, *str)) return false; str++; } return true; } /* Compare two completions, except make the case insensitive comes larger than everyone (so they come last) */ bool case_sensitive_completion_compare(const completion_t &a, const completion_t &b) { if (a.is_case_insensitive() != b.is_case_insensitive()) { /* Case insensitive ones come last. Exactly one of a, b is case insensitive. If it's a, return false, i.e. not less than, to make it appear at the end. */ return ! a.is_case_insensitive(); } /* Compare using file comparison */ return wcsfilecmp(a.completion.c_str(), b.completion.c_str()) < 0; } /* Order completions such that case insensitive completions come first. */ static void prioritize_completions(std::vector &comp) { sort(comp.begin(), comp.end(), case_sensitive_completion_compare); } /* Given a list of completions, get the completion at an index past *inout_idx, and then increment it. inout_idx should be initialized to (size_t)(-1) for the first call. */ static const completion_t *cycle_competions(const std::vector &comp, const wcstring &command_line, size_t *inout_idx) { const size_t size = comp.size(); if (size == 0) return NULL; const size_t start_idx = *inout_idx; size_t idx = start_idx; const completion_t *result = NULL; for (;;) { /* Bump the index */ idx = (idx + 1) % size; /* Bail if we've looped */ if (idx == start_idx) break; /* Get the completion */ const completion_t &c = comp.at(idx); /* Try this completion */ if (! c.is_case_insensitive() || reader_can_replace(command_line, c.flags)) { /* Success */ result = &c; break; } } *inout_idx = idx; return result; } /** Handle the list of completions. This means the following: - If the list is empty, flash the terminal. - If the list contains one element, write the whole element, and if the element does not end on a '/', '@', ':', or a '=', also write a trailing space. - If the list contains multiple elements with a common prefix, write the prefix. - If the list contains multiple elements without a common prefix, call run_pager to display a list of completions. Depending on terminal size and the length of the list, run_pager may either show less than a screenfull and exit or use an interactive pager to allow the user to scroll through the completions. \param comp the list of completion strings Return true if we inserted text into the command line, false if we did not. */ static bool handle_completions(const std::vector &comp) { wchar_t *base = NULL; size_t len = 0; bool done = false; bool success = false; int count = 0; int flags=0; const wchar_t *begin, *end, *buff = data->command_line.c_str(); parse_util_token_extent(buff, data->buff_pos, &begin, 0, 0, 0); end = buff+data->buff_pos; const wcstring tok(begin, end - begin); /* Check trivial cases */ switch (comp.size()) { /* No suitable completions found, flash screen and return */ case 0: { reader_flash(); done = true; success = false; break; } /* Exactly one suitable completion found - insert it */ case 1: { const completion_t &c = comp.at(0); /* If this is a replacement completion, check that we know how to replace it, e.g. that the token doesn't contain evil operators like {} */ if (! c.is_case_insensitive() || reader_can_replace(tok, c.flags)) { completion_insert(c.completion.c_str(), c.flags); } done = true; success = true; break; } } if (!done) { /* Try to find something to insert with the correct case */ for (size_t i=0; i< comp.size() ; i++) { const completion_t &c = comp.at(i); /* Ignore case insensitive completions for now */ if (c.is_case_insensitive()) continue; count++; if (base) { size_t new_len = comp_len(base, c.completion.c_str()); len = mini(new_len, len); } else { base = wcsdup(c.completion.c_str()); len = wcslen(base); flags = c.flags; } } /* If we found something to insert, do it. */ if (len > 0) { if (count > 1) flags = flags | COMPLETE_NO_SPACE; base[len]=L'\0'; completion_insert(base, flags); done = true; success = true; } } if (!done && base == NULL) { /* Try to find something to insert ignoring case */ if (begin) { size_t offset = tok.size(); count = 0; for (size_t i=0; i< comp.size(); i++) { const completion_t &c = comp.at(i); if (! c.is_case_insensitive()) continue; if (!reader_can_replace(tok, c.flags)) { len=0; break; } count++; if (base) { size_t new_len = offset + comp_ilen(base+offset, c.completion.c_str()+offset); len = new_len < len ? new_len: len; } else { base = wcsdup(c.completion.c_str()); len = wcslen(base); flags = c.flags; } } if (len > offset) { if (count > 1) flags = flags | COMPLETE_NO_SPACE; base[len]=L'\0'; completion_insert(base, flags); done = 1; success = true; } } } free(base); if (!done) { /* There is no common prefix in the completions, and show_list is true, so we print the list */ size_t len, prefix_start = 0; wcstring prefix; parse_util_get_parameter_info(data->command_line, data->buff_pos, NULL, &prefix_start, NULL); assert(data->buff_pos >= prefix_start); len = data->buff_pos - prefix_start; if (len <= PREFIX_MAX_LEN) { prefix.append(data->command_line, prefix_start, len); } else { // append just the end of the string prefix = wcstring(&ellipsis_char, 1); prefix.append(data->command_line, prefix_start + len - PREFIX_MAX_LEN, PREFIX_MAX_LEN); } { int is_quoted; wchar_t quote; parse_util_get_parameter_info(data->command_line, data->buff_pos, "e, NULL, NULL); is_quoted = (quote != L'\0'); /* Clear the autosuggestion from the old commandline before abandoning it (see #561) */ if (! data->autosuggestion.empty()) reader_repaint_without_autosuggestion(); write_loop(1, "\n", 1); run_pager(prefix, is_quoted, comp); } s_reset(&data->screen, screen_reset_abandon_line); reader_repaint(); success = false; } return success; } /* Return true if we believe ourselves to be orphaned. loop_count is how many times we've tried to stop ourselves via SIGGTIN */ static bool check_for_orphaned_process(unsigned long loop_count, pid_t shell_pgid) { bool we_think_we_are_orphaned = false; /* Try kill-0'ing the process whose pid corresponds to our process group ID. It's possible this will fail because we don't have permission to signal it. But more likely it will fail because it no longer exists, and we are orphaned. */ if (loop_count % 64 == 0) { if (kill(shell_pgid, 0) < 0 && errno == ESRCH) { we_think_we_are_orphaned = true; } } if (! we_think_we_are_orphaned && loop_count % 128 == 0) { /* Try reading from the tty; if we get EIO we are orphaned. This is sort of bad because it may block. */ char *tty = ctermid(NULL); if (! tty) { wperror(L"ctermid"); exit_without_destructors(1); } /* Open the tty. Presumably this is stdin, but maybe not? */ int tty_fd = open(tty, O_RDONLY | O_NONBLOCK); if (tty_fd < 0) { wperror(L"open"); exit_without_destructors(1); } char tmp; if (read(tty_fd, &tmp, 1) < 0 && errno == EIO) { we_think_we_are_orphaned = true; } close(tty_fd); } /* Just give up if we've done it a lot times */ if (loop_count > 4096) { we_think_we_are_orphaned = true; } return we_think_we_are_orphaned; } /** Initialize data for interactive use */ static void reader_interactive_init() { /* See if we are running interactively. */ pid_t shell_pgid; input_init(); kill_init(); shell_pgid = getpgrp(); /* This should enable job control on fish, even if our parent process did not enable it for us. */ /* Check if we are in control of the terminal, so that we don't do semi-expensive things like reset signal handlers unless we really have to, which we often don't. */ if (tcgetpgrp(STDIN_FILENO) != shell_pgid) { int block_count = 0; int i; /* Bummer, we are not in control of the terminal. Stop until parent has given us control of it. Stopping in fish is a bit of a challange, what with all the signal fidgeting, we need to reset a bunch of signal state, making this coda a but unobvious. In theory, reseting signal handlers could cause us to miss signal deliveries. In practice, this code should only be run suring startup, when we're not waiting for any signals. */ while (signal_is_blocked()) { signal_unblock(); block_count++; } signal_reset_handlers(); /* Ok, signal handlers are taken out of the picture. Stop ourself in a loop until we are in control of the terminal. However, the call to signal(SIGTTIN) may silently not do anything if we are orphaned. As far as I can tell there's no really good way to detect that we are orphaned. One way is to just detect if the group leader exited, via kill(shell_pgid, 0). Another possibility is that read() from the tty fails with EIO - this is more reliable but it's harder, because it may succeed or block. So we loop for a while, trying those strategies. Eventually we just give up and assume we're orphaend. */ for (unsigned long loop_count = 0;; loop_count++) { pid_t owner = tcgetpgrp(STDIN_FILENO); shell_pgid = getpgrp(); if (owner < 0 && errno == ENOTTY) { // No TTY, cannot be interactive? debug(1, _(L"No TTY for interactive shell (tcgetpgrp failed)")); wperror(L"setpgid"); exit_without_destructors(1); } if (owner == shell_pgid) { /* Success */ break; } else { if (check_for_orphaned_process(loop_count, shell_pgid)) { /* We're orphaned, so we just die. Another sad statistic. */ debug(1, _(L"I appear to be an orphaned process, so I am quitting politely. My pid is %d."), (int)getpid()); exit_without_destructors(1); } /* Try stopping us */ int ret = killpg(shell_pgid, SIGTTIN); if (ret < 0) { wperror(L"killpg"); exit_without_destructors(1); } } } signal_set_handlers(); for (i=0; ibuff_pos <= data->command_length())) sanity_lose(); if (data->colors.size() != data->command_length()) sanity_lose(); if (data->indents.size() != data->command_length()) sanity_lose(); } } /** Set the specified string from the history as the current buffer. Do not modify prefix_width. */ static void set_command_line_and_position(const wcstring &new_str, size_t pos) { data->command_line = new_str; data->command_line_changed(); data->buff_pos = pos; reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); } void reader_replace_current_token(const wchar_t *new_token) { const wchar_t *begin, *end; size_t new_pos; /* Find current token */ const wchar_t *buff = data->command_line.c_str(); parse_util_token_extent((wchar_t *)buff, data->buff_pos, &begin, &end, 0, 0); if (!begin || !end) return; /* Make new string */ wcstring new_buff(buff, begin - buff); new_buff.append(new_token); new_buff.append(end); new_pos = (begin-buff) + wcslen(new_token); set_command_line_and_position(new_buff, new_pos); } /** Reset the data structures associated with the token search */ static void reset_token_history() { const wchar_t *begin, *end; const wchar_t *buff = data->command_line.c_str(); parse_util_token_extent((wchar_t *)buff, data->buff_pos, &begin, &end, 0, 0); data->search_buff.clear(); if (begin) { data->search_buff.append(begin, end - begin); } data->token_history_pos = -1; data->search_pos=0; data->search_prev.clear(); data->search_prev.push_back(data->search_buff); data->history_search = history_search_t(*data->history, data->search_buff, HISTORY_SEARCH_TYPE_CONTAINS); } /** Handles a token search command. \param forward if the search should be forward or reverse \param reset whether the current token should be made the new search token */ static void handle_token_history(int forward, int reset) { /* Paranoia */ if (! data) return; const wchar_t *str=0; long current_pos; if (reset) { /* Start a new token search using the current token */ reset_token_history(); } current_pos = data->token_history_pos; if (forward || data->search_pos + 1 < data->search_prev.size()) { if (forward) { if (data->search_pos > 0) { data->search_pos--; } str = data->search_prev.at(data->search_pos).c_str(); } else { data->search_pos++; str = data->search_prev.at(data->search_pos).c_str(); } reader_replace_current_token(str); reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); } else { if (current_pos == -1) { data->token_history_buff.clear(); /* Search for previous item that contains this substring */ if (data->history_search.go_backwards()) { wcstring item = data->history_search.current_string(); data->token_history_buff = data->history_search.current_string(); } current_pos = data->token_history_buff.size(); } if (data->token_history_buff.empty()) { /* We have reached the end of the history - check if the history already contains the search string itself, if so return, otherwise add it. */ const wcstring &last = data->search_prev.back(); if (data->search_buff != last) { str = wcsdup(data->search_buff.c_str()); } else { return; } } else { //debug( 3, L"new '%ls'", data->token_history_buff.c_str() ); tokenizer_t tok(data->token_history_buff.c_str(), TOK_ACCEPT_UNFINISHED); for (; tok_has_next(&tok); tok_next(&tok)) { switch (tok_last_type(&tok)) { case TOK_STRING: { if (wcsstr(tok_last(&tok), data->search_buff.c_str())) { //debug( 3, L"Found token at pos %d\n", tok_get_pos( &tok ) ); if (tok_get_pos(&tok) >= current_pos) { break; } //debug( 3, L"ok pos" ); const wcstring last_tok = tok_last(&tok); if (find(data->search_prev.begin(), data->search_prev.end(), last_tok) == data->search_prev.end()) { data->token_history_pos = tok_get_pos(&tok); str = wcsdup(tok_last(&tok)); } } } } } } if (str) { reader_replace_current_token(str); reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); data->search_pos = data->search_prev.size(); data->search_prev.push_back(str); } else if (! reader_interrupted()) { data->token_history_pos=-1; handle_token_history(0, 0); } } } /** Move buffer position one word or erase one word. This function updates both the internal buffer and the screen. It is used by M-left, M-right and ^W to do block movement or block erase. \param dir Direction to move/erase. 0 means move left, 1 means move right. \param erase Whether to erase the characters along the way or only move past them. \param new if the new kill item should be appended to the previous kill item or not. */ enum move_word_dir_t { MOVE_DIR_LEFT, MOVE_DIR_RIGHT }; static void move_word(bool move_right, bool erase, enum move_word_style_t style, bool newv) { /* Return if we are already at the edge */ const size_t boundary = move_right ? data->command_length() : 0; if (data->buff_pos == boundary) return; /* When moving left, a value of 1 means the character at index 0. */ move_word_state_machine_t state(style); const wchar_t * const command_line = data->command_line.c_str(); const size_t start_buff_pos = data->buff_pos; size_t buff_pos = data->buff_pos; while (buff_pos != boundary) { size_t idx = (move_right ? buff_pos : buff_pos - 1); wchar_t c = command_line[idx]; if (! state.consume_char(c)) break; buff_pos = (move_right ? buff_pos + 1 : buff_pos - 1); } /* Always consume at least one character */ if (buff_pos == start_buff_pos) buff_pos = (move_right ? buff_pos + 1 : buff_pos - 1); /* If we are moving left, buff_pos-1 is the index of the first character we do not delete (possibly -1). If we are moving right, then buff_pos is that index - possibly data->command_length(). */ if (erase) { /* Don't autosuggest after a kill */ data->suppress_autosuggestion = true; if (move_right) { reader_kill(start_buff_pos, buff_pos - start_buff_pos, KILL_APPEND, newv); } else { reader_kill(buff_pos, start_buff_pos - buff_pos, KILL_PREPEND, newv); } } else { data->buff_pos = buff_pos; reader_repaint(); } } const wchar_t *reader_get_buffer(void) { ASSERT_IS_MAIN_THREAD(); return data?data->command_line.c_str():NULL; } history_t *reader_get_history(void) { ASSERT_IS_MAIN_THREAD(); return data ? data->history : NULL; } void reader_set_buffer(const wcstring &b, size_t pos) { if (!data) return; /* Callers like to pass us pointers into ourselves, so be careful! I don't know if we can use operator= with a pointer to our interior, so use an intermediate. */ size_t command_line_len = b.size(); data->command_line = b; data->command_line_changed(); /* Don't set a position past the command line length */ if (pos > command_line_len) pos = command_line_len; data->buff_pos = pos; data->search_mode = NO_SEARCH; data->search_buff.clear(); data->history_search.go_to_end(); reader_super_highlight_me_plenty(data->buff_pos); reader_repaint_needed(); } size_t reader_get_cursor_pos() { if (!data) return (size_t)(-1); return data->buff_pos; } #define ENV_CMD_DURATION L"CMD_DURATION" void set_env_cmd_duration(struct timeval *after, struct timeval *before) { time_t secs = after->tv_sec - before->tv_sec; suseconds_t usecs = after->tv_usec - before->tv_usec; wchar_t buf[16]; if (after->tv_usec < before->tv_usec) { usecs += 1000000; secs -= 1; } if (secs < 1) { env_remove(ENV_CMD_DURATION, 0); } else { if (secs < 10) // 10 secs { swprintf(buf, 16, L"%lu.%02us", secs, usecs / 10000); } else if (secs < 60) // 1 min { swprintf(buf, 16, L"%lu.%01us", secs, usecs / 100000); } else if (secs < 600) // 10 mins { swprintf(buf, 16, L"%lum %lu.%01us", secs / 60, secs % 60, usecs / 100000); } else if (secs < 5400) // 1.5 hours { swprintf(buf, 16, L"%lum %lus", secs / 60, secs % 60); } else { swprintf(buf, 16, L"%.1fh", secs / 3600.0); } env_set(ENV_CMD_DURATION, buf, ENV_EXPORT); } } void reader_run_command(parser_t &parser, const wcstring &cmd) { struct timeval time_before, time_after; wcstring ft = tok_first(cmd.c_str()); if (! ft.empty()) env_set(L"_", ft.c_str(), ENV_GLOBAL); reader_write_title(); term_donate(); gettimeofday(&time_before, NULL); parser.eval(cmd, io_chain_t(), TOP); job_reap(1); gettimeofday(&time_after, NULL); set_env_cmd_duration(&time_after, &time_before); term_steal(); env_set(L"_", program_name, ENV_GLOBAL); #ifdef HAVE__PROC_SELF_STAT proc_update_jiffies(); #endif } int reader_shell_test(const wchar_t *b) { int res = parser_t::principal_parser().test(b); if (res & PARSER_TEST_ERROR) { wcstring sb; const int tmp[1] = {0}; const int tmp2[1] = {0}; const wcstring empty; s_write(&data->screen, empty, empty, empty, 0, tmp, tmp2, 0); parser_t::principal_parser().test(b, NULL, &sb, L"fish"); fwprintf(stderr, L"%ls", sb.c_str()); } return res; } /** Test if the given string contains error. Since this is the error detection for general purpose, there are no invalid strings, so this function always returns false. */ static int default_test(const wchar_t *b) { return 0; } void reader_push(const wchar_t *name) { reader_data_t *n = new reader_data_t(); n->history = & history_t::history_with_name(name); n->app_name = name; n->next = data; data=n; data->command_line_changed(); if (data->next == 0) { reader_interactive_init(); } exec_prompt(); reader_set_highlight_function(&highlight_universal); reader_set_test_function(&default_test); reader_set_left_prompt(L""); } void reader_pop() { reader_data_t *n = data; if (data == 0) { debug(0, _(L"Pop null reader block")); sanity_lose(); return; } data=data->next; /* Invoke the destructor to balance our new */ delete n; if (data == 0) { reader_interactive_destroy(); } else { end_loop = 0; //history_set_mode( data->app_name.c_str() ); s_reset(&data->screen, screen_reset_abandon_line); } } void reader_set_left_prompt(const wcstring &new_prompt) { data->left_prompt = new_prompt; } void reader_set_right_prompt(const wcstring &new_prompt) { data->right_prompt = new_prompt; } void reader_set_allow_autosuggesting(bool flag) { data->allow_autosuggestion = flag; } void reader_set_complete_function(complete_function_t f) { data->complete_func = f; } void reader_set_highlight_function(highlight_function_t func) { data->highlight_function = func; } void reader_set_test_function(int (*f)(const wchar_t *)) { data->test_func = f; } void reader_set_exit_on_interrupt(bool i) { data->exit_on_interrupt = i; } void reader_import_history_if_necessary(void) { /* Import history from bash, etc. if our current history is empty */ if (data->history && data->history->is_empty()) { /* Try opening a bash file. We make an effort to respect $HISTFILE; this isn't very complete (AFAIK it doesn't have to be exported), and to really get this right we ought to ask bash itself. But this is better than nothing. */ const env_var_t var = env_get_string(L"HISTFILE"); wcstring path = (var.missing() ? L"~/.bash_history" : var); expand_tilde(path); FILE *f = wfopen(path, "r"); if (f) { data->history->populate_from_bash(f); fclose(f); } } } /** A class as the context pointer for a background (threaded) highlight operation. */ class background_highlight_context_t { public: /** The string to highlight */ const wcstring string_to_highlight; /** Color buffer */ std::vector colors; /** The position to use for bracket matching */ const size_t match_highlight_pos; /** Function for syntax highlighting */ const highlight_function_t highlight_function; /** Environment variables */ const env_vars_snapshot_t vars; /** When the request was made */ const double when; /** Gen count at the time the request was made */ const unsigned int generation_count; background_highlight_context_t(const wcstring &pbuff, size_t phighlight_pos, highlight_function_t phighlight_func) : string_to_highlight(pbuff), colors(pbuff.size(), 0), match_highlight_pos(phighlight_pos), highlight_function(phighlight_func), vars(env_vars_snapshot_t::highlighting_keys), when(timef()), generation_count(s_generation_count) { } int threaded_highlight() { if (generation_count != s_generation_count) { // The gen count has changed, so don't do anything return 0; } if (! string_to_highlight.empty()) { highlight_function(string_to_highlight, colors, match_highlight_pos, NULL /* error */, vars); } return 0; } }; /* Called to set the highlight flag for search results */ static void highlight_search(void) { if (! data->search_buff.empty() && ! data->history_search.is_at_end()) { const wcstring &needle = data->search_buff; size_t match_pos = data->command_line.find(needle); if (match_pos != wcstring::npos) { size_t end = match_pos + needle.size(); for (size_t i=match_pos; i < end; i++) { data->colors.at(i) |= (HIGHLIGHT_SEARCH_MATCH<<16); } } } } static void highlight_complete(background_highlight_context_t *ctx, int result) { ASSERT_IS_MAIN_THREAD(); if (ctx->string_to_highlight == data->command_line) { /* The data hasn't changed, so swap in our colors. The colors may not have changed, so do nothing if they have not. */ assert(ctx->colors.size() == data->command_length()); if (data->colors != ctx->colors) { data->colors.swap(ctx->colors); sanity_check(); highlight_search(); reader_repaint(); } } /* Free our context */ delete ctx; } static int threaded_highlight(background_highlight_context_t *ctx) { return ctx->threaded_highlight(); } /** Call specified external highlighting function and then do search highlighting. Lastly, clear the background color under the cursor to avoid repaint issues on terminals where e.g. syntax highlighting maykes characters under the sursor unreadable. \param match_highlight_pos the position to use for bracket matching. This need not be the same as the surrent cursor position \param error if non-null, any possible errors in the buffer are further descibed by the strings inserted into the specified arraylist */ static void reader_super_highlight_me_plenty(size_t match_highlight_pos) { reader_sanity_check(); background_highlight_context_t *ctx = new background_highlight_context_t(data->command_line, match_highlight_pos, data->highlight_function); iothread_perform(threaded_highlight, highlight_complete, ctx); highlight_search(); /* Here's a hack. Check to see if our autosuggestion still applies; if so, don't recompute it. Since the autosuggestion computation is asynchronous, this avoids "flashing" as you type into the autosuggestion. */ const wcstring &cmd = data->command_line, &suggest = data->autosuggestion; if (can_autosuggest() && ! suggest.empty() && string_prefixes_string_case_insensitive(cmd, suggest)) { /* The autosuggestion is still reasonable, so do nothing */ } else { update_autosuggestion(); } } int exit_status() { if (get_is_interactive()) return job_list_is_empty() && data->end_loop; else return end_loop; } /** This function is called when the main loop notices that end_loop has been set while in interactive mode. It checks if it is ok to exit. */ static void handle_end_loop() { job_t *j; int job_count=0; int is_breakpoint=0; block_t *b; parser_t &parser = parser_t::principal_parser(); for (b = parser.current_block; b; b = b->outer) { if (b->type() == BREAKPOINT) { is_breakpoint = 1; break; } } job_iterator_t jobs; while ((j = jobs.next())) { if (!job_is_completed(j)) { job_count++; break; } } if (!reader_exit_forced() && !data->prev_end_loop && job_count && !is_breakpoint) { writestr(_(L"There are stopped jobs. A second attempt to exit will enforce their termination.\n")); reader_exit(0, 0); data->prev_end_loop=1; } else { /* PCA: we used to only hangup jobs if stdin was closed. This prevented child processes from exiting. It's unclear to my why it matters if stdin is closed, but it seems to me if we're forcing an exit, we definitely want to hang up our processes. See https://github.com/fish-shell/fish-shell/issues/138 */ if (reader_exit_forced() || !isatty(0)) { /* We already know that stdin is a tty since we're in interactive mode. If isatty returns false, it means stdin must have been closed. */ job_iterator_t jobs; while ((j = jobs.next())) { if (! job_is_completed(j)) { job_signal(j, SIGHUP); } } } } } /** Read interactively. Read input from stdin while providing editing facilities. */ static int read_i(void) { reader_push(L"fish"); reader_set_complete_function(&complete); reader_set_highlight_function(&highlight_shell); reader_set_test_function(&reader_shell_test); reader_set_allow_autosuggesting(true); reader_import_history_if_necessary(); parser_t &parser = parser_t::principal_parser(); data->prev_end_loop=0; while ((!data->end_loop) && (!sanity_check())) { event_fire_generic(L"fish_prompt"); if (function_exists(LEFT_PROMPT_FUNCTION_NAME)) reader_set_left_prompt(LEFT_PROMPT_FUNCTION_NAME); else reader_set_left_prompt(DEFAULT_PROMPT); if (function_exists(RIGHT_PROMPT_FUNCTION_NAME)) reader_set_right_prompt(RIGHT_PROMPT_FUNCTION_NAME); else reader_set_right_prompt(L""); /* Put buff in temporary string and clear buff, so that we can handle a call to reader_set_buffer during evaluation. */ const wchar_t *tmp = reader_readline(); if (data->end_loop) { handle_end_loop(); } else if (tmp) { wcstring command = tmp; data->buff_pos=0; data->command_line.clear(); data->command_line_changed(); reader_run_command(parser, command); if (data->end_loop) { handle_end_loop(); } else { data->prev_end_loop=0; } } } reader_pop(); return 0; } /** Test if there are bytes available for reading on the specified file descriptor */ static int can_read(int fd) { struct timeval can_read_timeout = { 0, 0 }; fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); return select(fd + 1, &fds, 0, 0, &can_read_timeout) == 1; } /** Test if the specified character is in the private use area that fish uses to store internal characters */ static int wchar_private(wchar_t c) { return ((c >= 0xe000) && (c <= 0xf8ff)); } /** Test if the specified character in the specified string is backslashed. pos may be at the end of the string, which indicates if there is a trailing backslash. */ static bool is_backslashed(const wcstring &str, size_t pos) { /* note pos == str.size() is OK */ if (pos > str.size()) return false; size_t count = 0, idx = pos; while (idx--) { if (str.at(idx) != L'\\') break; count++; } return (count % 2) == 1; } static wchar_t unescaped_quote(const wcstring &str, size_t pos) { wchar_t result = L'\0'; if (pos < str.size()) { wchar_t c = str.at(pos); if ((c == L'\'' || c == L'"') && ! is_backslashed(str, pos)) { result = c; } } return result; } const wchar_t *reader_readline(void) { wint_t c; int last_char=0; size_t yank_len=0; const wchar_t *yank_str; bool comp_empty = true; std::vector comp; int finished=0; struct termios old_modes; /* Coalesce redundant repaints. When we get a repaint, we set this to true, and skip repaints until we get something else. */ bool coalescing_repaints = false; /* The cycle index in our completion list */ size_t completion_cycle_idx = (size_t)(-1); /* The command line before completion */ wcstring cycle_command_line; size_t cycle_cursor_pos; data->search_buff.clear(); data->search_mode = NO_SEARCH; exec_prompt(); reader_super_highlight_me_plenty(data->buff_pos); s_reset(&data->screen, screen_reset_abandon_line); reader_repaint(); /* get the current terminal modes. These will be restored when the function returns. */ tcgetattr(0,&old_modes); /* set the new modes */ if (tcsetattr(0,TCSANOW,&shell_modes)) { wperror(L"tcsetattr"); } while (!finished && !data->end_loop) { /* Sometimes strange input sequences seem to generate a zero byte. I believe these simply mean a character was pressed but it should be ignored. (Example: Trying to add a tilde (~) to digit) */ while (1) { int was_interactive_read = is_interactive_read; is_interactive_read = 1; c=input_readch(); is_interactive_read = was_interactive_read; if (((!wchar_private(c))) && (c>31) && (c != 127)) { if (can_read(0)) { wchar_t arr[READAHEAD_MAX+1]; int i; memset(arr, 0, sizeof(arr)); arr[0] = c; for (i=1; i31) && (c != 127)) { arr[i]=c; c=0; } else break; } insert_string(arr); } } if (c != 0) break; } /* If we get something other than a repaint, then stop coalescing them */ if (c != R_REPAINT) coalescing_repaints = false; if (last_char != R_YANK && last_char != R_YANK_POP) yank_len=0; const wchar_t *buff = data->command_line.c_str(); switch (c) { /* go to beginning of line*/ case R_BEGINNING_OF_LINE: { while ((data->buff_pos>0) && (buff[data->buff_pos-1] != L'\n')) { data->buff_pos--; } reader_repaint(); break; } case R_END_OF_LINE: { while (buff[data->buff_pos] && buff[data->buff_pos] != L'\n') { data->buff_pos++; } reader_repaint(); break; } case R_BEGINNING_OF_BUFFER: { data->buff_pos = 0; reader_repaint(); break; } /* go to EOL*/ case R_END_OF_BUFFER: { data->buff_pos = data->command_length(); reader_repaint(); break; } case R_NULL: { reader_repaint_if_needed(); break; } case R_REPAINT: { if (! coalescing_repaints) { coalescing_repaints = true; exec_prompt(); s_reset(&data->screen, screen_reset_current_line_and_prompt); data->screen_reset_needed = false; reader_repaint(); } break; } case R_EOF: { exit_forced = 1; data->end_loop=1; break; } /* complete */ case R_COMPLETE: { if (!data->complete_func) break; if (! comp_empty && last_char == R_COMPLETE) { /* The user typed R_COMPLETE more than once in a row. Cycle through our available completions */ const completion_t *next_comp = cycle_competions(comp, cycle_command_line, &completion_cycle_idx); if (next_comp != NULL) { size_t cursor_pos = cycle_cursor_pos; const wcstring new_cmd_line = completion_apply_to_command_line(next_comp->completion, next_comp->flags, cycle_command_line, &cursor_pos, false); reader_set_buffer(new_cmd_line, cursor_pos); /* Since we just inserted a completion, don't immediately do a new autosuggestion */ data->suppress_autosuggestion = true; } } else { /* Either the user hit tab only once, or we had no visible completion list. */ const wchar_t *cmdsub_begin, *cmdsub_end; const wchar_t *token_begin, *token_end; const wchar_t * const buff = data->command_line.c_str(); /* Clear the completion list */ comp.clear(); /* Figure out the extent of the command substitution surrounding the cursor. This is because we only look at the current command substitution to form completions - stuff happening outside of it is not interesting. */ parse_util_cmdsubst_extent(buff, data->buff_pos, &cmdsub_begin, &cmdsub_end); /* Figure out the extent of the token within the command substitution. Note we pass cmdsub_begin here, not buff */ parse_util_token_extent(cmdsub_begin, data->buff_pos - (cmdsub_begin-buff), &token_begin, &token_end, 0, 0); /* Figure out how many steps to get from the current position to the end of the current token. */ size_t end_of_token_offset = token_end - buff; /* Move the cursor to the end */ if (data->buff_pos != end_of_token_offset) { data->buff_pos = end_of_token_offset; reader_repaint(); } /* Remove a trailing backslash. This may trigger an extra repaint, but this is rare. */ if (is_backslashed(data->command_line, data->buff_pos)) { remove_backward(); } /* Construct a copy of the string from the beginning of the command substitution up to the end of the token we're completing */ const wcstring buffcpy = wcstring(cmdsub_begin, token_end); //fprintf(stderr, "Complete (%ls)\n", buffcpy.c_str()); data->complete_func(buffcpy, comp, COMPLETION_REQUEST_DEFAULT | COMPLETION_REQUEST_DESCRIPTIONS, NULL); /* Munge our completions */ sort_and_make_unique(comp); prioritize_completions(comp); /* Record our cycle_command_line */ cycle_command_line = data->command_line; cycle_cursor_pos = data->buff_pos; comp_empty = handle_completions(comp); /* Start the cycle at the beginning */ completion_cycle_idx = (size_t)(-1); /* Repaint */ reader_repaint_if_needed(); } break; } /* kill */ case R_KILL_LINE: { const wchar_t *buff = data->command_line.c_str(); const wchar_t *begin = &buff[data->buff_pos]; const wchar_t *end = begin; while (*end && *end != L'\n') end++; if (end==begin && *end) end++; size_t len = end-begin; if (len) { reader_kill(begin - buff, len, KILL_APPEND, last_char!=R_KILL_LINE); } break; } case R_BACKWARD_KILL_LINE: { if (data->buff_pos > 0) { const wchar_t *buff = data->command_line.c_str(); const wchar_t *end = &buff[data->buff_pos]; const wchar_t *begin = end; /* Make sure we delete at least one character (see #580) */ begin--; /* Delete until we hit a newline, or the beginning of the string */ while (begin > buff && *begin != L'\n') begin--; /* If we landed on a newline, don't delete it */ if (*begin == L'\n') begin++; assert(end >= begin); size_t len = maxi(end-begin, 1); begin = end - len; reader_kill(begin - buff, len, KILL_PREPEND, last_char!=R_BACKWARD_KILL_LINE); } break; } case R_KILL_WHOLE_LINE: { const wchar_t *buff = data->command_line.c_str(); const wchar_t *end = &buff[data->buff_pos]; const wchar_t *begin = end; size_t len; while (begin > buff && *begin != L'\n') begin--; if (*begin == L'\n') begin++; len = maxi(end-begin, 0); begin = end - len; while (*end && *end != L'\n') end++; if (begin == end && *end) end++; len = end-begin; if (len) { reader_kill(begin - buff, len, KILL_APPEND, last_char!=R_KILL_WHOLE_LINE); } break; } /* yank*/ case R_YANK: { yank_str = kill_yank(); insert_string(yank_str); yank_len = wcslen(yank_str); break; } /* rotate killring*/ case R_YANK_POP: { if (yank_len) { for (size_t i=0; isearch_mode) { data->search_mode= NO_SEARCH; if (data->token_history_pos==-1) { //history_reset(); data->history_search.go_to_end(); reader_set_buffer(data->search_buff.c_str(), data->search_buff.size()); } else { reader_replace_current_token(data->search_buff.c_str()); } data->search_buff.clear(); reader_super_highlight_me_plenty(data->buff_pos); reader_repaint(); } break; } /* delete backward*/ case R_BACKWARD_DELETE_CHAR: { remove_backward(); break; } /* delete forward*/ case R_DELETE_CHAR: { /** Remove the current character in the character buffer and on the screen using syntax highlighting, etc. */ if (data->buff_pos < data->command_length()) { data->buff_pos++; remove_backward(); } break; } /* Evaluate. If the current command is unfinished, or if the charater is escaped using a backslash, insert a newline */ case R_EXECUTE: { /* Delete any autosuggestion */ data->autosuggestion.clear(); /* Allow backslash-escaped newlines, but only if the following character is whitespace, or we're at the end of the text (see issue #163) */ if (is_backslashed(data->command_line, data->buff_pos)) { if (data->buff_pos >= data->command_length() || iswspace(data->command_line.at(data->buff_pos))) { insert_char('\n'); break; } } switch (data->test_func(data->command_line.c_str())) { case 0: { /* Finished command, execute it. Don't add items that start with a leading space. */ if (! data->command_line.empty() && data->command_line.at(0) != L' ') { if (data->history != NULL) { data->history->add_with_file_detection(data->command_line); } } finished=1; data->buff_pos=data->command_length(); reader_repaint(); break; } /* We are incomplete, continue editing */ case PARSER_TEST_INCOMPLETE: { insert_char('\n'); break; } /* Result must be some combination including an error. The error message will already be printed, all we need to do is repaint */ default: { s_reset(&data->screen, screen_reset_abandon_line); reader_repaint(); break; } } break; } /* History functions */ case R_HISTORY_SEARCH_BACKWARD: case R_HISTORY_TOKEN_SEARCH_BACKWARD: case R_HISTORY_SEARCH_FORWARD: case R_HISTORY_TOKEN_SEARCH_FORWARD: { int reset = 0; if (data->search_mode == NO_SEARCH) { reset = 1; if ((c == R_HISTORY_SEARCH_BACKWARD) || (c == R_HISTORY_SEARCH_FORWARD)) { data->search_mode = LINE_SEARCH; } else { data->search_mode = TOKEN_SEARCH; } data->search_buff.append(data->command_line); data->history_search = history_search_t(*data->history, data->search_buff, HISTORY_SEARCH_TYPE_CONTAINS); /* Skip the autosuggestion as history */ const wcstring &suggest = data->autosuggestion; if (! suggest.empty()) { data->history_search.skip_matches(wcstring_list_t(&suggest, 1 + &suggest)); } } switch (data->search_mode) { case LINE_SEARCH: { if ((c == R_HISTORY_SEARCH_BACKWARD) || (c == R_HISTORY_TOKEN_SEARCH_BACKWARD)) { data->history_search.go_backwards(); } else { if (! data->history_search.go_forwards()) { /* If you try to go forwards past the end, we just go to the end */ data->history_search.go_to_end(); } } wcstring new_text; if (data->history_search.is_at_end()) { new_text = data->search_buff; } else { new_text = data->history_search.current_string(); } set_command_line_and_position(new_text, new_text.size()); break; } case TOKEN_SEARCH: { if ((c == R_HISTORY_SEARCH_BACKWARD) || (c == R_HISTORY_TOKEN_SEARCH_BACKWARD)) { handle_token_history(SEARCH_BACKWARD, reset); } else { handle_token_history(SEARCH_FORWARD, reset); } break; } } break; } /* Move left*/ case R_BACKWARD_CHAR: { if (data->buff_pos > 0) { data->buff_pos--; reader_repaint(); } break; } /* Move right*/ case R_FORWARD_CHAR: { if (data->buff_pos < data->command_length()) { data->buff_pos++; reader_repaint(); } else { accept_autosuggestion(true); } break; } /* kill one word left */ case R_BACKWARD_KILL_WORD: case R_BACKWARD_KILL_PATH_COMPONENT: { move_word_style_t style = (c == R_BACKWARD_KILL_PATH_COMPONENT ? move_word_style_path_components : move_word_style_punctuation); bool newv = (last_char != R_BACKWARD_KILL_WORD && last_char != R_BACKWARD_KILL_PATH_COMPONENT); move_word(MOVE_DIR_LEFT, true /* erase */, style, newv); break; } /* kill one word right */ case R_KILL_WORD: { move_word(MOVE_DIR_RIGHT, true /* erase */, move_word_style_punctuation, last_char!=R_KILL_WORD); break; } /* move one word left*/ case R_BACKWARD_WORD: { move_word(MOVE_DIR_LEFT, false /* do not erase */, move_word_style_punctuation, false); break; } /* move one word right*/ case R_FORWARD_WORD: { if (data->buff_pos < data->command_length()) { move_word(MOVE_DIR_RIGHT, false /* do not erase */, move_word_style_punctuation, false); } else { accept_autosuggestion(false /* accept only one word */); } break; } case R_BEGINNING_OF_HISTORY: { data->history_search = history_search_t(*data->history, data->command_line, HISTORY_SEARCH_TYPE_PREFIX); data->history_search.go_to_beginning(); if (! data->history_search.is_at_end()) { wcstring new_text = data->history_search.current_string(); set_command_line_and_position(new_text, new_text.size()); } break; } case R_END_OF_HISTORY: { data->history_search.go_to_end(); break; } case R_UP_LINE: case R_DOWN_LINE: { int line_old = parse_util_get_line_from_offset(data->command_line, data->buff_pos); int line_new; if (c == R_UP_LINE) line_new = line_old-1; else line_new = line_old+1; int line_count = parse_util_lineno(data->command_line.c_str(), data->command_length())-1; if (line_new >= 0 && line_new <= line_count) { size_t base_pos_new; size_t base_pos_old; int indent_old; int indent_new; size_t line_offset_old; size_t total_offset_new; base_pos_new = parse_util_get_offset_from_line(data->command_line, line_new); base_pos_old = parse_util_get_offset_from_line(data->command_line, line_old); assert(base_pos_new != (size_t)(-1) && base_pos_old != (size_t)(-1)); indent_old = data->indents.at(base_pos_old); indent_new = data->indents.at(base_pos_new); line_offset_old = data->buff_pos - parse_util_get_offset_from_line(data->command_line, line_old); total_offset_new = parse_util_get_offset(data->command_line, line_new, line_offset_old - 4*(indent_new-indent_old)); data->buff_pos = total_offset_new; reader_repaint(); } break; } case R_SUPPRESS_AUTOSUGGESTION: { data->suppress_autosuggestion = true; data->autosuggestion.clear(); reader_repaint(); break; } case R_ACCEPT_AUTOSUGGESTION: { accept_autosuggestion(true); break; } /* Other, if a normal character, we add it to the command */ default: { if ((!wchar_private(c)) && (((c>31) || (c==L'\n'))&& (c != 127))) { /* Regular character */ insert_char(c); } else { /* Low priority debug message. These can happen if the user presses an unefined control sequnece. No reason to report. */ debug(2, _(L"Unknown keybinding %d"), c); } break; } } if ((c != R_HISTORY_SEARCH_BACKWARD) && (c != R_HISTORY_SEARCH_FORWARD) && (c != R_HISTORY_TOKEN_SEARCH_BACKWARD) && (c != R_HISTORY_TOKEN_SEARCH_FORWARD) && (c != R_NULL)) { data->search_mode = NO_SEARCH; data->search_buff.clear(); data->history_search.go_to_end(); data->token_history_pos=-1; } last_char = c; } writestr(L"\n"); /* if( comp ) halloc_free( comp ); */ if (!reader_exit_forced()) { if (tcsetattr(0,TCSANOW,&old_modes)) /* return to previous mode */ { wperror(L"tcsetattr"); } set_color(rgb_color_t::reset(), rgb_color_t::reset()); } return finished ? data->command_line.c_str() : 0; } int reader_search_mode() { if (!data) { return -1; } return !!data->search_mode; } /** Read non-interactively. Read input from stdin without displaying the prompt, using syntax highlighting. This is used for reading scripts and init files. */ static int read_ni(int fd, const io_chain_t &io) { parser_t &parser = parser_t::principal_parser(); FILE *in_stream; wchar_t *buff=0; std::vector acc; int des = (fd == STDIN_FILENO ? dup(STDIN_FILENO) : fd); int res=0; if (des == -1) { wperror(L"dup"); return 1; } in_stream = fdopen(des, "r"); if (in_stream != 0) { while (!feof(in_stream)) { char buff[4096]; size_t c = fread(buff, 1, 4096, in_stream); if (ferror(in_stream)) { if (errno == EINTR) { /* We got a signal, just keep going. Be sure that we call insert() below because we may get data as well as EINTR. */ clearerr(in_stream); } else if ((errno == EAGAIN || errno == EWOULDBLOCK) && make_fd_blocking(des) == 0) { /* We succeeded in making the fd blocking, keep going */ clearerr(in_stream); } else { /* Fatal error */ debug(1, _(L"Error while reading from file descriptor")); /* Reset buffer on error. We won't evaluate incomplete files. */ acc.clear(); break; } } acc.insert(acc.end(), buff, buff + c); } const wcstring str = acc.empty() ? wcstring() : str2wcstring(&acc.at(0), acc.size()); acc.clear(); if (fclose(in_stream)) { debug(1, _(L"Error while closing input stream")); wperror(L"fclose"); res = 1; } wcstring sb; if (! parser.test(str.c_str(), 0, &sb, L"fish")) { parser.eval(str, io, TOP); } else { fwprintf(stderr, L"%ls", sb.c_str()); res = 1; } } else { debug(1, _(L"Error while opening input stream")); wperror(L"fdopen"); free(buff); res=1; } return res; } int reader_read(int fd, const io_chain_t &io) { int res; /* If reader_read is called recursively through the '.' builtin, we need to preserve is_interactive. This, and signal handler setup is handled by proc_push_interactive/proc_pop_interactive. */ int inter = ((fd == STDIN_FILENO) && isatty(STDIN_FILENO)); proc_push_interactive(inter); res= get_is_interactive() ? read_i():read_ni(fd, io); /* If the exit command was called in a script, only exit the script, not the program. */ if (data) data->end_loop = 0; end_loop = 0; proc_pop_interactive(); return res; } fish/reader.h000066400000000000000000000154311214535744100134340ustar00rootroot00000000000000/** \file reader.h Prototypes for functions for reading data from stdin and passing to the parser. If stdin is a keyboard, it supplies a killring, history, syntax highlighting, tab-completion and various other features. */ #ifndef FISH_READER_H #define FISH_READER_H #include #include #include "util.h" #include "io.h" #include "common.h" #include "complete.h" class parser_t; class completion_t; class history_t; /** Read commands from \c fd until encountering EOF */ int reader_read(int fd, const io_chain_t &io); /** Tell the shell that it should exit after the currently running command finishes. */ void reader_exit(int do_exit, int force); /** Check that the reader is in a sane state */ void reader_sanity_check(); /** Initialize the reader */ void reader_init(); /** Destroy and free resources used by the reader */ void reader_destroy(); /** Returns the filename of the file currently read */ const wchar_t *reader_current_filename(); /** Push a new filename on the stack of read files \param fn The fileanme to push */ void reader_push_current_filename(const wchar_t *fn); /** Pop the current filename from the stack of read files */ void reader_pop_current_filename(); /** Write the title to the titlebar. This function is called just before a new application starts executing and just after it finishes. */ void reader_write_title(); /** Call this function to tell the reader that a repaint is needed, and should be performed when possible. */ void reader_repaint_needed(); /** Call this function to tell the reader that some color has changed. */ void reader_react_to_color_change(); /* Repaint immediately if needed. */ void reader_repaint_if_needed(); /** Run the specified command with the correct terminal modes, and while taking care to perform job notification, set the title, etc. */ void reader_run_command(const wcstring &buff); /** Get the string of character currently entered into the command buffer, or 0 if interactive mode is uninitialized. */ const wchar_t *reader_get_buffer(); /** Returns the current reader's history */ history_t *reader_get_history(void); /** Set the string of characters in the command buffer, as well as the cursor position. \param b the new buffer value \param p the cursor position. If \c p is larger than the length of the command line, the cursor is placed on the last character. */ void reader_set_buffer(const wcstring &b, size_t p); /** Get the current cursor position in the command line. If interactive mode is uninitialized, return (size_t)(-1). */ size_t reader_get_cursor_pos(); /** Return the value of the interrupted flag, which is set by the sigint handler, and clear it if it was set. */ int reader_interrupted(); /** Clear the interrupted flag unconditionally without handling anything. The flag could have been set e.g. when an interrupt arrived just as we were ending an earlier \c reader_readline invocation but before the \c is_interactive_read flag was cleared. */ void reader_reset_interrupted(); /** Return the value of the interrupted flag, which is set by the sigint handler, and clear it if it was set. If the current reader is interruptible, call \c reader_exit(). */ int reader_reading_interrupted(); /** Returns true if the current reader generation count does not equal the generation count the current thread was started with. Note 1: currently only valid for autocompletion threads! Other threads don't set the threadlocal generation count when they start up. */ bool reader_thread_job_is_stale(); /** Read one line of input. Before calling this function, reader_push() must have been called in order to set up a valid reader environment. */ const wchar_t *reader_readline(); /** Push a new reader environment. */ void reader_push(const wchar_t *name); /** Return to previous reader environment */ void reader_pop(); /** Specify function to use for finding possible tab completions. The function must take these arguments: - The command to be completed as a null terminated array of wchar_t - An array_list_t in which completions will be inserted. */ typedef void (*complete_function_t)(const wcstring &, std::vector &, completion_request_flags_t, wcstring_list_t * lst); void reader_set_complete_function(complete_function_t); /** The type of a highlight function. */ class env_vars_snapshot_t; typedef void (*highlight_function_t)(const wcstring &, std::vector &, size_t, wcstring_list_t *, const env_vars_snapshot_t &vars); /** Specify function for syntax highlighting. The function must take these arguments: - The command to be highlighted as a null terminated array of wchar_t - The color code of each character as an array of ints - The cursor position - An array_list_t used for storing error messages */ void reader_set_highlight_function(highlight_function_t); /** Specify function for testing if the command buffer contains syntax errors that must be corrected before returning. */ void reader_set_test_function(int (*f)(const wchar_t *)); /** Specify string of shell commands to be run in order to generate the prompt. */ void reader_set_left_prompt(const wcstring &prompt); /** Specify string of shell commands to be run in order to generate the right prompt. */ void reader_set_right_prompt(const wcstring &prompt); /** Sets whether autosuggesting is allowed. */ void reader_set_allow_autosuggesting(bool flag); /** Sets whether the reader should exit on ^C. */ void reader_set_exit_on_interrupt(bool flag); /** Returns true if the shell is exiting, 0 otherwise. */ int exit_status(); /** Replace the current token with the specified string */ void reader_replace_current_token(const wchar_t *new_token); /** The readers interrupt signal handler. Cancels all currently running blocks. */ void reader_handle_int(int signal); /** This function returns true if fish is exiting by force, i.e. because stdin died */ int reader_exit_forced(); /** Test if the given shell command contains errors. Uses parser_test for testing. Suitable for reader_set_test_function(). */ int reader_shell_test(const wchar_t *b); /** Test whether the interactive reader is in search mode. \return o if not in search mode, 1 if in search mode and -1 if not in interactive mode */ int reader_search_mode(); /* Given a command line and an autosuggestion, return the string that gets shown to the user. Exposed for testing purposes only. */ wcstring combine_command_and_autosuggestion(const wcstring &cmdline, const wcstring &autosuggestion); /* Apply a completion string. Exposed for testing only. */ wcstring completion_apply_to_command_line(const wcstring &val_str, complete_flags_t flags, const wcstring &command_line, size_t *inout_cursor_pos, bool append_only); #endif fish/release_notes.html000066400000000000000000000422161214535744100155400ustar00rootroot00000000000000 fishfish shell release notes

Release Notes for fish 2.0.0

Significant Changes

  • Command substitutions now modify $status #547.

    Previously the exit status of command substitutions (like (pwd)) was ignored; however now it modifies $status. Furthermore, the set command now only sets $status on failure; it is untouched on success. This allows for the following pattern:

    if set python_path (which python)
       ...
    end
    
    Because set does not modify $status on success, the if branch effectively tests whether which succeeded, and if so, whether the set also succeeded.

  • Improvements to $PATH handling.

    • There is a new variable, $fish_user_paths, which can be set universally, and whose contents are appended to $PATH #527
    • /etc/paths and /etc/paths.d are now respected on OS X
    • fish no longer modifies $PATH to find its own binaries
  • Long lines no longer use ellipsis for line breaks, and copy and paste should no longer include a newline even if the line was broken #300
  • New syntax for index ranges (sometimes known as "slices") #212
  • fish now supports an else if statement #134
  • Process and pid completion now works on OS X #129
  • fish is now relocatable, and no longer depends on compiled-in paths #125
  • fish now supports a right prompt (RPROMPT) through the fish_right_prompt function #80
  • fish now uses posix_spawn instead of fork when possible, which is much faster on BSD and OS X #11

Other Notable Fixes

  • Updated VCS completions (darcs, cvs, svn, etc.)
  • Avoid calling getcwd on the main thread, as it can hang #696
  • Control-D (forward delete) no longer stops at a period #667
  • Completions for many new commands
  • fish now respects rxvt's unique keybindings #657
  • xsel is no longer built as part of fish. It will still be invoked if installed separately #633
  • __fish_filter_mime no longer spews #628
  • The --no-execute option to fish no longer falls over when reaching the end of a block #624
  • fish_config knows how to find fish even if it's not in the $PATH #621
  • A leading space now prevents writing to history, as is done in bash and zsh #615
  • Hitting enter after a backslash only goes to a new line if it is followed by whitespace or the end of the line #613
  • printf is now a builtin #611
  • Event handlers should no longer fire if signals are blocked #608
  • set_color is now a builtin #578
  • man page completions are now located in a new generated_completions directory, instead of your completions directory #576
  • tab now clears autosuggestions #561
  • tab completion from within a pair of quotes now attempts to "appropriate" the closing quote #552
  • $EDITOR can now be a list: for example, set EDITOR gvim -f) #541
  • case bodies are now indented #530
  • The profile switch -p no longer crashes #517
  • You can now control-C out of read #516
  • umask is now functional on OS X #515
  • Avoid calling getpwnam on the main thread, as it can hang #512
  • Alt-F or Alt-right-arrow (Option-F or option-right-arrow) now accepts one word of an autosuggestion #435
  • Setting fish as your login shell no longer kills OpenSUSE #367
  • Backslashes now join lines, instead of creating multiple commands #347
  • echo now implements the -e flag to interpret escapes #337
  • When the last token in the user's input contains capital letters, use its case in preference to that of the autosuggestion #335
  • Descriptions now have their own muted color #279
  • Wildcards beginning with a . (for example, ls .*) no longer match . and .. #270
  • Recursive wildcards now handle symlink loops #268
  • You can now delete history items from the fish_config web interface #250
  • The OS X build now weak links wcsdup and wcscasecmp #240
  • fish now saves and restores the process group, which prevents certain processes from being erroneously reported as stopped #197
  • funced now takes an editor option #187
  • Alternating row colors are available in fish pager through fish_pager_color_secondary #186
  • Universal variable values are now stored based on your MAC address, not your hostname #183
  • The caret ^ now only does a stderr redirection if it is the first character of a token, making git users happy #168
  • Autosuggestions will no longer cause line wrapping #167
  • Better handling of Unicode combining characters #155
  • fish SIGHUPs processes more often #138
  • fish no longer causes sudo to ask for a password every time
  • fish behaves better under Midnight Commander #121
  • set -e no longer crashes #100
  • fish now will automatically import history from bash, if there is no fish history #66
  • Backslashed-newlines inside quoted strings now behave more intuitively #52
  • Tab titles should be shown correctly in iTerm2 #47
  • scp remote path completion now sometimes works #42
  • The read builtin no longer shows autosuggestions #29
  • Custom key bindings can now be set via the fish_user_key_bindings function #21
  • All Python scripts now run correctly under both Python 2 and Python 3 #14
  • The "accept autosuggestion" key can now be configured #19
  • Autosuggestions will no longer suggest invalid commands #6

Release Notes for fishfish Beta r2

Bug Fixes

  • Implicit cd is back, for paths that start with one or two dots, a slash, or a tilde.
  • Overrides of default functions should be fixed. The "internalized scripts" feature is disabled for now.
  • Disabled delayed suspend. This is a strange job-control feature of BSD systems, including OS X. Disabling it frees up Control Y for other purposes; in particular, for yank, which now works on OS X.
  • fish_indent is fixed. In particular, the funced and funcsave functions work again.
  • A SIGTERM now ends the whole execution stack again (resolving this issue).
  • Bumped the __fish_config_interactive version number so the default fish_color_autosuggestion kicks in.
  • fish_config better handles combined term256 and classic colors like "555 yellow".

New Features

  • A history builtin, and associated interactive function that enables deleting history items. Example usage:
    • Print all history items beginning with echo: history --prefix echo
    • Print all history items containing foo: history --contains foo
    • Interactively delete some items containing foo: history --delete --contains foo

    Credit to Siteshwar for implementation. Thanks Siteshwar!

Release Notes for fishfish Beta r1

Scripting

  • No changes! All existing fish scripts, config files, completions, etc. from trunk should continue to work.

New Features

  • Autosuggestions. Think URL fields in browsers. When you type a command, fish will suggest the rest of the command after the cursor, in a muted gray when possible. You can accept the suggestion with the right arrow key or Ctrl-F. Suggestions come from command history, completions, and some custom code for cd; there's a lot of potential for improvement here. The suggestions are computed on a background pthread, so they never slow down your typing. The autosuggestion feature is incredible. I miss it dearly every time I use anything else.
  • term256 support where available, specifically modern xterms and OS X Lion. You can specify colors the old way ('set_color cyan') or by specifying RGB hex values ('set_color FF3333'); fish will pick the closest supported color. Some xterms do not advertise term256 support either in the $TERM or terminfo max_colors field, but nevertheless support it. For that reason, fish will default into using it on any xterm (but it can be disabled with an environment variable).
  • Web-based configuration page. There is a new function 'fish_config'. This spins up a simple Python web server and opens a browser window to it. From this web page, you can set your shell colors and view your functions, variables, and history; all changes apply immediately to all running shells. Eventually all configuration ought to be supported via this mechanism (but in addition to, not instead of, command line mechanisms).
  • Man page completions. There is a new function 'fish_update_completions'. This function reads all the man1 files from your manpath, removes the roff formatting, parses them to find the commands and options, and outputs fish completions into ~/.config/fish/completions. It won't overwrite existing completion files (except ones that it generated itself).

Programmatic Changes

  • fish is now entirely in C++. I have no particular love for C++, but it provides a ready memory-model to replace halloc. We've made an effort to keep it to a sane and portable subset (no C++11, no boost, no going crazy with templates or smart pointers), but we do use the STL and a little tr1.
  • halloc is entirely gone, replaced by normal C++ ownership semantics. If you don't know what halloc is, well, now you have two reasons to be happy.
  • All the crufty C data structures are entirely gone. array_list_t, priority_queue_t, hash_table_t, string_buffer_t have been removed and replaced by STL equivalents like std::vector, std::map, and std::wstring. A lot of the string handling now uses std::wstring instead of wchar_t *
  • fish now spawns pthreads for tasks like syntax highlighting that require blocking I/O.
  • History has been completely rewritten. History files now use an extensible YAML-style syntax. History "merging" (multiple shells writing to the same history file) now works better. There is now a maximum history length of about 250k items (256 * 1024).
  • The parser has been "instanced," so you can now create more than one.
  • Total #LoC has shrunk slightly even with the new features.

Performance

  • fish now runs syntax highlighting in a background thread, so typing commands is always responsive even on slow filesystems.
  • echo, test, and pwd are now builtins, which eliminates many forks.
  • The files in share/functions and share/completions now get 'internalized' into C strings that get compiled in with fish. This substantially reduces the number of files touched at startup. A consequence is that you cannot change these functions without recompiling, but often other functions depend on these "standard" functions, so changing them is perhaps not a good idea anyways.

Here are some system call counts for launching and then exiting fish with the default configuration, on OS X. The first column is fish trunk, the next column is with our changes, and the last column is bash for comparison. This data was collected via dtrace.

           before   after    bash    
  open          9       4       5
  fork         28      14       0
  stat        131      85      11
 lstat        670       0       0
  read        332      80       4
 write        172     149       0

The large number of forks relative to bash are due to fish's insanely expensive default prompt, which is unchanged in my version. If we switch to a prompt comparable to bash's (lame) default, the forks drop to 16 with trunk, 4 after our changes.

The large reduction in lstat() numbers is due to fish no longer needing to call ttyname() on OS X.

We've got some work to do to be as lean as bash, but we're on the right track. fish/sanity.cpp000066400000000000000000000025261214535744100140350ustar00rootroot00000000000000/** \file sanity.c Functions for performing sanity checks on the program state */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "common.h" #include "sanity.h" #include "proc.h" #include "history.h" #include "reader.h" #include "kill.h" #include "wutil.h" /** Status from earlier sanity checks */ static int insane; void sanity_lose() { debug(0, _(L"Errors detected, shutting down. Break on sanity_lose() to debug.")); insane = 1; } int sanity_check() { if (!insane) if (get_is_interactive()) history_sanity_check(); if (!insane) reader_sanity_check(); if (!insane) kill_sanity_check(); if (!insane) proc_sanity_check(); return insane; } void validate_pointer(const void *ptr, const wchar_t *err, int null_ok) { /* Test if the pointer data crosses a segment boundary. */ if ((0x00000003l & (intptr_t)ptr) != 0) { debug(0, _(L"The pointer '%ls' is invalid"), err); sanity_lose(); } if ((!null_ok) && (ptr==0)) { debug(0, _(L"The pointer '%ls' is null"), err); sanity_lose(); } } fish/sanity.h000066400000000000000000000013021214535744100134710ustar00rootroot00000000000000/** \file sanity.h Prototypes for functions for performing sanity checks on the program state */ #ifndef FISH_SANITY_H #define FISH_SANITY_H #include /** Call this function to tell the program it is not in a sane state. */ void sanity_lose(); /** Perform sanity checks, return 1 if program is in a sane state 0 otherwise. */ int sanity_check(); /** Try and determine if ptr is a valid pointer. If not, loose sanity. \param ptr The pointer to validate \param err A description of what the pointer refers to, for use in error messages \param null_ok Wheter the pointer is allowed to point to 0 */ void validate_pointer(const void *ptr, const wchar_t *err, int null_ok); #endif fish/screen.cpp000066400000000000000000001307611214535744100140100ustar00rootroot00000000000000/** \file screen.c High level library for handling the terminal screen The screen library allows the interactive reader to write its output to screen efficiently by keeping an internal representation of the current screen contents and trying to find the most efficient way for transforming that to the desired screen content. */ #include "config.h" #include #include #include #include #include #include #include #include #if HAVE_NCURSES_H #include #else #include #endif #if HAVE_TERM_H #include #elif HAVE_NCURSES_TERM_H #include #endif #include #include #include #include #include "fallback.h" #include "common.h" #include "util.h" #include "wutil.h" #include "output.h" #include "highlight.h" #include "screen.h" #include "env.h" /** The number of characters to indent new blocks */ #define INDENT_STEP 4 /** The initial screen width */ #define SCREEN_WIDTH_UNINITIALIZED -1 /** A helper value for an invalid location */ #define INVALID_LOCATION (screen_data_t::cursor_t(-1, -1)) static void invalidate_soft_wrap(screen_t *scr); /** Ugly kludge. The internal buffer used to store output of tputs. Since tputs external function can only take an integer and not a pointer as parameter we need a static storage buffer. */ typedef std::vector data_buffer_t; static data_buffer_t *s_writeb_buffer=0; static int s_writeb(char c); /* Class to temporarily set s_writeb_buffer and the writer function in a scoped way */ class scoped_buffer_t { data_buffer_t * const old_buff; int (* const old_writer)(char); public: scoped_buffer_t(data_buffer_t *buff) : old_buff(s_writeb_buffer), old_writer(output_get_writer()) { s_writeb_buffer = buff; output_set_writer(s_writeb); } ~scoped_buffer_t() { s_writeb_buffer = old_buff; output_set_writer(old_writer); } }; /** Tests if the specified narrow character sequence is present at the specified position of the specified wide character string. All of \c seq must match, but str may be longer than seq. */ static int try_sequence(const char *seq, const wchar_t *str) { int i; for (i=0;; i++) { if (!seq[i]) return i; if (seq[i] != str[i]) return 0; } return 0; } /** Returns the number of columns left until the next tab stop, given the current cursor postion. */ static size_t next_tab_stop(size_t in) { /* Assume tab stops every 8 characters if undefined */ size_t tab_width = (init_tabs > 0 ? (size_t)init_tabs : 8); return ((in/tab_width)+1)*tab_width; } // PCA for term256 support, let's just detect the escape codes directly static int is_term256_escape(const wchar_t *str) { // An escape code looks like this: \x1b[38;5;m // or like this: \x1b[48;5;m // parse out the required prefix int len = try_sequence("\x1b[38;5;", str); if (! len) len = try_sequence("\x1b[48;5;", str); if (! len) return 0; // now try parsing out a string of digits // we need at least one if (! iswdigit(str[len])) return 0; while (iswdigit(str[len])) len++; // look for the terminating m if (str[len++] != L'm') return 0; // success return len; } /* Like fish_wcwidth, but returns 0 for control characters instead of -1 */ static int fish_wcwidth_min_0(wchar_t wc) { return maxi(0, fish_wcwidth(wc)); } /* Whether we permit soft wrapping. If so, in some cases we don't explicitly move to the second physical line on a wrapped logical line; instead we just output it. */ static bool allow_soft_wrap(void) { // Should we be looking at eat_newline_glitch as well? return !! auto_right_margin; } /* Information about a prompt layout */ struct prompt_layout_t { /* How many lines the prompt consumes */ size_t line_count; /* Width of the longest line */ size_t max_line_width; /* Width of the last line */ size_t last_line_width; }; /** Calculate layout information for the given prompt. Does some clever magic to detect common escape sequences that may be embeded in a prompt, such as color codes. */ static prompt_layout_t calc_prompt_layout(const wchar_t *prompt) { size_t current_line_width = 0; size_t j, k; prompt_layout_t prompt_layout = {}; prompt_layout.line_count = 1; for (j=0; prompt[j]; j++) { if (prompt[j] == L'\x1b') { /* This is the start of an escape code. Try to guess its width. */ size_t p; int len=0; bool found = false; /* Detect these terminfo color escapes with parameter value 0..7, all of which don't move the cursor */ char * const esc[] = { set_a_foreground, set_a_background, set_foreground, set_background, } ; /* Detect these semi-common terminfo escapes without any parameter values, all of which don't move the cursor */ char * const esc2[] = { enter_bold_mode, exit_attribute_mode, enter_underline_mode, exit_underline_mode, enter_standout_mode, exit_standout_mode, flash_screen, enter_subscript_mode, exit_subscript_mode, enter_superscript_mode, exit_superscript_mode, enter_blink_mode, enter_italics_mode, exit_italics_mode, enter_reverse_mode, enter_shadow_mode, exit_shadow_mode, enter_standout_mode, exit_standout_mode, enter_secure_mode } ; for (p=0; p < sizeof esc / sizeof *esc && !found; p++) { if (!esc[p]) continue; for (k=0; k<8; k++) { len = try_sequence(tparm(esc[p],k), &prompt[j]); if (len) { j += (len-1); found = true; break; } } } /* PCA for term256 support, let's just detect the escape codes directly */ if (! found) { len = is_term256_escape(&prompt[j]); if (len) { j += (len - 1); found = true; } } for (p=0; p < (sizeof(esc2)/sizeof(char *)) && !found; p++) { if (!esc2[p]) continue; /* Test both padded and unpadded version, just to be safe. Most versions of tparm don't actually seem to do anything these days. */ len = maxi(try_sequence(tparm(esc2[p]), &prompt[j]), try_sequence(esc2[p], &prompt[j])); if (len) { j += (len-1); found = true; } } if (!found) { if (prompt[j+1] == L'k') { const env_var_t term_name = env_get_string(L"TERM"); if (!term_name.missing() && wcsstr(term_name.c_str(), L"screen") == term_name) { const wchar_t *end; j+=2; found = true; end = wcsstr(&prompt[j], L"\x1b\\"); if (end) { /* You'd thing this should be '(end-prompt)+2', in order to move j past the end of the string, but there is a 'j++' at the end of each lap, so j should always point to the last menged character, e.g. +1. */ j = (end-prompt)+1; } else { break; } } } } } else if (prompt[j] == L'\t') { current_line_width = next_tab_stop(current_line_width); } else if (prompt[j] == L'\n' || prompt[j] == L'\f') { /* PCA: At least one prompt uses \f\r as a newline. It's unclear to me what this is meant to do, but terminals seem to treat it as a newline so we do the same. */ current_line_width = 0; prompt_layout.line_count += 1; } else if (prompt[j] == L'\r') { current_line_width = 0; } else { /* Ordinary decent character. Just add width. This returns -1 for a control character - don't add that. */ current_line_width += fish_wcwidth_min_0(prompt[j]); prompt_layout.max_line_width = maxi(prompt_layout.max_line_width, current_line_width); } } prompt_layout.last_line_width = current_line_width; return prompt_layout; } static size_t calc_prompt_lines(const wcstring &prompt) { // Hack for the common case where there's no newline at all // I don't know if a newline can appear in an escape sequence, // so if we detect a newline we have to defer to calc_prompt_width_and_lines size_t result = 1; if (prompt.find(L'\n') != wcstring::npos || prompt.find(L'\f') != wcstring::npos) { result = calc_prompt_layout(prompt.c_str()).line_count; } return result; } /** Test if there is space between the time fields of struct stat to use for sub second information. If so, we assume this space contains the desired information. */ static int room_for_usec(struct stat *st) { int res = ((&(st->st_atime) + 2) == &(st->st_mtime) && (&(st->st_atime) + 4) == &(st->st_ctime)); return res; } /** Stat stdout and stderr and save result. This should be done before calling a function that may cause output. */ static void s_save_status(screen_t *s) { // PCA Let's not do this futimes stuff, because sudo dumbly uses the // tty's ctime as part of its tty_tickets feature // Disabling this should fix https://github.com/fish-shell/fish-shell/issues/122 #if 0 /* This futimes call tries to trick the system into using st_mtime as a tampering flag. This of course only works on systems where futimes is defined, but it should make the status saving stuff failsafe. */ struct timeval t[]= { { time(0)-1, 0 } , { time(0)-1, 0 } } ; /* Don't check return value on these. We don't care if they fail, really. This is all just to make the prompt look ok, which is impossible to do 100% reliably. We try, at least. */ futimes(1, t); futimes(2, t); #endif fstat(1, &s->prev_buff_1); fstat(2, &s->prev_buff_2); } /** Stat stdout and stderr and compare result to previous result in reader_save_status. Repaint if modification time has changed. Unfortunately, for some reason this call seems to give a lot of false positives, at least under Linux. */ static void s_check_status(screen_t *s) { fflush(stdout); fflush(stderr); fstat(1, &s->post_buff_1); fstat(2, &s->post_buff_2); int changed = (s->prev_buff_1.st_mtime != s->post_buff_1.st_mtime) || (s->prev_buff_2.st_mtime != s->post_buff_2.st_mtime); if (room_for_usec(&s->post_buff_1)) { changed = changed || ((&s->prev_buff_1.st_mtime)[1] != (&s->post_buff_1.st_mtime)[1]) || ((&s->prev_buff_2.st_mtime)[1] != (&s->post_buff_2.st_mtime)[1]); } if (changed) { /* Ok, someone has been messing with our screen. We will want to repaint. However, we do not know where the cursor is. It is our best bet that we are still on the same line, so we move to the beginning of the line, reset the modelled screen contents, and then set the modeled cursor y-pos to its earlier value. */ int prev_line = s->actual.cursor.y; write_loop(STDOUT_FILENO, "\r", 1); s_reset(s, screen_reset_current_line_and_prompt); s->actual.cursor.y = prev_line; } } /** Appends a character to the end of the line that the output cursor is on. This function automatically handles linebreaks and lines longer than the screen width. */ static void s_desired_append_char(screen_t *s, wchar_t b, int c, int indent, size_t prompt_width) { int line_no = s->desired.cursor.y; switch (b) { case L'\n': { int i; /* Current line is definitely hard wrapped */ s->desired.create_line(s->desired.line_count()); s->desired.line(s->desired.cursor.y).is_soft_wrapped = false; s->desired.cursor.y++; s->desired.cursor.x=0; for (i=0; i < prompt_width+indent*INDENT_STEP; i++) { s_desired_append_char(s, L' ', 0, indent, prompt_width); } break; } case L'\r': { line_t ¤t = s->desired.line(line_no); current.clear(); s->desired.cursor.x = 0; break; } default: { int screen_width = common_get_width(); int cw = fish_wcwidth_min_0(b); s->desired.create_line(line_no); /* Check if we are at the end of the line. If so, continue on the next line. */ if ((s->desired.cursor.x + cw) > screen_width) { /* Current line is soft wrapped (assuming we support it) */ s->desired.line(s->desired.cursor.y).is_soft_wrapped = true; //fprintf(stderr, "\n\n1 Soft wrapping %d\n\n", s->desired.cursor.y); line_no = (int)s->desired.line_count(); s->desired.add_line(); s->desired.cursor.y++; s->desired.cursor.x=0; for (size_t i=0; i < prompt_width; i++) { s_desired_append_char(s, L' ', 0, indent, prompt_width); } } line_t &line = s->desired.line(line_no); line.append(b, c); s->desired.cursor.x+= cw; /* Maybe wrap the cursor to the next line, even if the line itself did not wrap. This avoids wonkiness in the last column. */ if (s->desired.cursor.x >= screen_width) { line.is_soft_wrapped = true; s->desired.cursor.x = 0; s->desired.cursor.y++; } break; } } } /** The writeb function offered to tputs. */ static int s_writeb(char c) { s_writeb_buffer->push_back(c); return 0; } /** Write the bytes needed to move screen cursor to the specified position to the specified buffer. The actual_cursor field of the specified screen_t will be updated. \param s the screen to operate on \param b the buffer to send the output escape codes to \param new_x the new x position \param new_y the new y position */ static void s_move(screen_t *s, data_buffer_t *b, int new_x, int new_y) { if (s->actual.cursor.x == new_x && s->actual.cursor.y == new_y) return; // If we are at the end of our window, then either the cursor stuck to the edge or it didn't. We don't know! We can fix it up though. if (s->actual.cursor.x == common_get_width()) { // Either issue a cr to go back to the beginning of this line, or a nl to go to the beginning of the next one, depending on what we think is more efficient if (new_y <= s->actual.cursor.y) { b->push_back('\r'); } else { b->push_back('\n'); s->actual.cursor.y++; } // Either way we're not in the first column s->actual.cursor.x = 0; } int i; int x_steps, y_steps; char *str; /* debug( 0, L"move from %d %d to %d %d", s->screen_cursor[0], s->screen_cursor[1], new_x, new_y ); */ scoped_buffer_t scoped_buffer(b); y_steps = new_y - s->actual.cursor.y; if (y_steps > 0 && (strcmp(cursor_down, "\n")==0)) { /* This is very strange - it seems some (all?) consoles use a simple newline as the cursor down escape. This will of course move the cursor to the beginning of the line as well as moving it down one step. The cursor_up does not have this behaviour... */ s->actual.cursor.x=0; } if (y_steps < 0) { str = cursor_up; } else { str = cursor_down; } for (i=0; iactual.cursor.x; if (x_steps && new_x == 0) { b->push_back('\r'); x_steps = 0; } if (x_steps < 0) { str = cursor_left; } else { str = cursor_right; } for (i=0; iactual.cursor.x = new_x; s->actual.cursor.y = new_y; } /** Set the pen color for the terminal */ static void s_set_color(screen_t *s, data_buffer_t *b, int c) { scoped_buffer_t scoped_buffer(b); unsigned int uc = (unsigned int)c; set_color(highlight_get_color(uc & 0xffff, false), highlight_get_color((uc>>16)&0xffff, true)); } /** Convert a wide character to a multibyte string and append it to the buffer. */ static void s_write_char(screen_t *s, data_buffer_t *b, wchar_t c) { scoped_buffer_t scoped_buffer(b); s->actual.cursor.x += fish_wcwidth_min_0(c); writech(c); if (s->actual.cursor.x == s->actual_width && allow_soft_wrap()) { s->soft_wrap_location.x = 0; s->soft_wrap_location.y = s->actual.cursor.y + 1; /* Note that our cursor position may be a lie: Apple Terminal makes the right cursor stick to the margin, while Ubuntu makes it "go off the end" (but still doesn't wrap). We rely on s_move to fix this up. */ } else { invalidate_soft_wrap(s); } } /** Send the specified string through tputs and append the output to the specified buffer. */ static void s_write_mbs(data_buffer_t *b, char *s) { scoped_buffer_t scoped_buffer(b); writembs(s); } /** Convert a wide string to a multibyte string and append it to the buffer. */ static void s_write_str(data_buffer_t *b, const wchar_t *s) { scoped_buffer_t scoped_buffer(b); writestr(s); } /** Returns the length of the "shared prefix" of the two lines, which is the run of matching text and colors. If the prefix ends on a combining character, do not include the previous character in the prefix. */ static size_t line_shared_prefix(const line_t &a, const line_t &b) { size_t idx, max = std::min(a.size(), b.size()); for (idx=0; idx < max; idx++) { wchar_t ac = a.char_at(idx), bc = b.char_at(idx); if (fish_wcwidth(ac) < 1 || fish_wcwidth(bc) < 1) { /* Possible combining mark, return one index prior */ if (idx > 0) idx--; break; } /* We're done if the text or colors are different */ if (ac != bc || a.color_at(idx) != b.color_at(idx)) break; } return idx; } /* We are about to output one or more characters onto the screen at the given x, y. If we are at the end of previous line, and the previous line is marked as soft wrapping, then tweak the screen so we believe we are already in the target position. This lets the terminal take care of wrapping, which means that if you copy and paste the text, it won't have an embedded newline. */ static bool perform_any_impending_soft_wrap(screen_t *scr, int x, int y) { if (x == scr->soft_wrap_location.x && y == scr->soft_wrap_location.y) { /* We can soft wrap; but do we want to? */ if (scr->desired.line(y - 1).is_soft_wrapped && allow_soft_wrap()) { /* Yes. Just update the actual cursor; that will cause us to elide emitting the commands to move here, so we will just output on "one big line" (which the terminal soft wraps */ scr->actual.cursor = scr->soft_wrap_location; } } return false; } /* Make sure we don't soft wrap */ static void invalidate_soft_wrap(screen_t *scr) { scr->soft_wrap_location = INVALID_LOCATION; } /* Various code for testing term behavior */ #if 0 static bool test_stuff(screen_t *scr) { data_buffer_t output; scoped_buffer_t scoped_buffer(&output); s_move(scr, &output, 0, 0); int screen_width = common_get_width(); const wchar_t *left = L"left"; const wchar_t *right = L"right"; for (size_t idx = 0; idx < 80; idx++) { output.push_back('A'); } if (! output.empty()) { write_loop(STDOUT_FILENO, &output.at(0), output.size()); output.clear(); } sleep(5); for (size_t i=0; i < 1; i++) { writembs(cursor_left); } if (! output.empty()) { write_loop(1, &output.at(0), output.size()); output.clear(); } while (1) { int c = getchar(); if (c != EOF) break; } while (1) { int c = getchar(); if (c != EOF) break; } puts("Bye"); exit(0); while (1) sleep(10000); return true; } #endif /** Update the screen to match the desired output. */ static void s_update(screen_t *scr, const wchar_t *left_prompt, const wchar_t *right_prompt) { //if (test_stuff(scr)) return; const size_t left_prompt_width = calc_prompt_layout(left_prompt).last_line_width; const size_t right_prompt_width = calc_prompt_layout(right_prompt).last_line_width; int screen_width = common_get_width(); /* Figure out how many following lines we need to clear (probably 0) */ size_t actual_lines_before_reset = scr->actual_lines_before_reset; scr->actual_lines_before_reset = 0; data_buffer_t output; bool need_clear_lines = scr->need_clear_lines; bool need_clear_screen = scr->need_clear_screen; bool has_cleared_screen = false; if (scr->actual_width != screen_width) { /* Ensure we don't issue a clear screen for the very first output, to avoid https://github.com/fish-shell/fish-shell/issues/402 */ if (scr->actual_width != SCREEN_WIDTH_UNINITIALIZED) { need_clear_screen = true; s_move(scr, &output, 0, 0); s_reset(scr, screen_reset_current_line_contents); need_clear_lines = need_clear_lines || scr->need_clear_lines; need_clear_screen = need_clear_screen || scr->need_clear_screen; } scr->actual_width = screen_width; } scr->need_clear_lines = false; scr->need_clear_screen = false; /* Determine how many lines have stuff on them; we need to clear lines with stuff that we don't want */ const size_t lines_with_stuff = maxi(actual_lines_before_reset, scr->actual.line_count()); if (lines_with_stuff > scr->desired.line_count()) { /* There are lines that we output to previously that will need to be cleared */ //need_clear_lines = true; } if (wcscmp(left_prompt, scr->actual_left_prompt.c_str())) { s_move(scr, &output, 0, 0); s_write_str(&output, left_prompt); scr->actual_left_prompt = left_prompt; scr->actual.cursor.x = (int)left_prompt_width; } for (size_t i=0; i < scr->desired.line_count(); i++) { const line_t &o_line = scr->desired.line(i); line_t &s_line = scr->actual.create_line(i); size_t start_pos = (i==0 ? left_prompt_width : 0); int current_width = 0; /* If this is the last line, maybe we should clear the screen */ const bool should_clear_screen_this_line = (need_clear_screen && i + 1 == scr->desired.line_count() && clr_eos != NULL); /* Note that skip_remaining is a width, not a character count */ size_t skip_remaining = start_pos; if (! should_clear_screen_this_line) { /* Compute how much we should skip. At a minimum we skip over the prompt. But also skip over the shared prefix of what we want to output now, and what we output before, to avoid repeatedly outputting it. */ const size_t shared_prefix = line_shared_prefix(o_line, s_line); if (shared_prefix > 0) { int prefix_width = fish_wcswidth(&o_line.text.at(0), shared_prefix); if (prefix_width > skip_remaining) skip_remaining = prefix_width; } /* If we're soft wrapped, and if we're going to change the first character of the next line, don't skip over the last two characters so that we maintain soft-wrapping */ if (o_line.is_soft_wrapped && i + 1 < scr->desired.line_count()) { bool first_character_of_next_line_will_change = true; if (i + 1 < scr->actual.line_count()) { if (line_shared_prefix(scr->desired.line(i+1), scr->actual.line(i+1)) > 0) { first_character_of_next_line_will_change = false; } } if (first_character_of_next_line_will_change) { skip_remaining = mini(skip_remaining, (size_t)(scr->actual_width - 2)); } } } /* Skip over skip_remaining width worth of characters */ size_t j = 0; for (; j < o_line.size(); j++) { int width = fish_wcwidth_min_0(o_line.char_at(j)); if (skip_remaining < width) break; skip_remaining -= width; current_width += width; } /* Skip over zero-width characters (e.g. combining marks at the end of the prompt) */ for (; j < o_line.size(); j++) { int width = fish_wcwidth_min_0(o_line.char_at(j)); if (width > 0) break; } /* Now actually output stuff */ for (; j < o_line.size(); j++) { /* If we are about to output into the last column, clear the screen first. If we clear the screen after we output into the last column, it can erase the last character due to the sticky right cursor. If we clear the screen too early, we can defeat soft wrapping. */ if (j + 1 == screen_width && should_clear_screen_this_line && ! has_cleared_screen) { s_move(scr, &output, current_width, (int)i); s_write_mbs(&output, clr_eos); has_cleared_screen = true; } perform_any_impending_soft_wrap(scr, current_width, (int)i); s_move(scr, &output, current_width, (int)i); s_set_color(scr, &output, o_line.color_at(j)); s_write_char(scr, &output, o_line.char_at(j)); current_width += fish_wcwidth_min_0(o_line.char_at(j)); } /* Clear the screen if we have not done so yet. */ if (should_clear_screen_this_line && ! has_cleared_screen) { s_move(scr, &output, current_width, (int)i); s_write_mbs(&output, clr_eos); has_cleared_screen = true; } bool clear_remainder = false; /* Clear the remainder of the line if we need to clear and if we didn't write to the end of the line. If we did write to the end of the line, the "sticky right edge" (as part of auto_right_margin) means that we'll be clearing the last character we wrote! */ if (has_cleared_screen) { /* Already cleared everything */ clear_remainder = false; } else if (need_clear_lines && current_width < screen_width) { clear_remainder = true; } else if (right_prompt_width < scr->last_right_prompt_width) { clear_remainder = true; } else { int prev_width = (s_line.text.empty() ? 0 : fish_wcswidth(&s_line.text.at(0), s_line.text.size())); clear_remainder = prev_width > current_width; } if (clear_remainder) { s_set_color(scr, &output, 0xffffffff); s_move(scr, &output, current_width, (int)i); s_write_mbs(&output, clr_eol); } /* Output any rprompt if this is the first line. */ if (i == 0 && right_prompt_width > 0) { s_move(scr, &output, (int)(screen_width - right_prompt_width), (int)i); s_set_color(scr, &output, 0xffffffff); s_write_str(&output, right_prompt); scr->actual.cursor.x += right_prompt_width; /* We output in the last column. Some terms (Linux) push the cursor further right, past the window. Others make it "stick." Since we don't really know which is which, issue a cr so it goes back to the left. However, if the user is resizing the window smaller, then it's possible the cursor wrapped. If so, then a cr will go to the beginning of the following line! So instead issue a bunch of "move left" commands to get back onto the line, and then jump to the front of it (!) */ s_move(scr, &output, scr->actual.cursor.x - (int)right_prompt_width, scr->actual.cursor.y); s_write_str(&output, L"\r"); scr->actual.cursor.x = 0; } } /* Clear remaining lines (if any) if we haven't cleared the screen. */ if (! has_cleared_screen && scr->desired.line_count() < lines_with_stuff) { s_set_color(scr, &output, 0xffffffff); for (size_t i=scr->desired.line_count(); i < lines_with_stuff; i++) { s_move(scr, &output, 0, (int)i); s_write_mbs(&output, clr_eol); } } s_move(scr, &output, scr->desired.cursor.x, scr->desired.cursor.y); s_set_color(scr, &output, 0xffffffff); if (! output.empty()) { write_loop(1, &output.at(0), output.size()); } /* We have now synced our actual screen against our desired screen. Note that this is a big assignment! */ scr->actual = scr->desired; scr->last_right_prompt_width = right_prompt_width; } /** Returns true if we are using a dumb terminal. */ static bool is_dumb(void) { return (!cursor_up || !cursor_down || !cursor_left || !cursor_right); } struct screen_layout_t { /* The left prompt that we're going to use */ wcstring left_prompt; /* How much space to leave for it */ size_t left_prompt_space; /* The right prompt */ wcstring right_prompt; /* The autosuggestion */ wcstring autosuggestion; /* Whether the prompts get their own line or not */ bool prompts_get_own_line; }; /* Given a vector whose indexes are offsets and whose values are the widths of the string if truncated at that offset, return the offset that fits in the given width. Returns width_by_offset.size() - 1 if they all fit. The first value in width_by_offset is assumed to be 0. */ static size_t truncation_offset_for_width(const std::vector &width_by_offset, size_t max_width) { assert(! width_by_offset.empty() && width_by_offset.at(0) == 0); size_t i; for (i=1; i < width_by_offset.size(); i++) { if (width_by_offset.at(i) > max_width) break; } /* i is the first index that did not fit; i-1 is therefore the last that did */ return i - 1; } static screen_layout_t compute_layout(screen_t *s, size_t screen_width, const wcstring &left_prompt_str, const wcstring &right_prompt_str, const wcstring &commandline, const wcstring &autosuggestion_str, const int *indent) { screen_layout_t result = {}; /* Start by ensuring that the prompts themselves can fit */ const wchar_t *left_prompt = left_prompt_str.c_str(); const wchar_t *right_prompt = right_prompt_str.c_str(); const wchar_t *autosuggestion = autosuggestion_str.c_str(); prompt_layout_t left_prompt_layout = calc_prompt_layout(left_prompt); prompt_layout_t right_prompt_layout = calc_prompt_layout(right_prompt); size_t left_prompt_width = left_prompt_layout.last_line_width; size_t right_prompt_width = right_prompt_layout.last_line_width; if (left_prompt_layout.max_line_width >= screen_width) { /* If we have a multi-line prompt, see if the longest line fits; if not neuter the whole left prompt */ left_prompt = L"> "; left_prompt_width = 2; } if (left_prompt_width + right_prompt_width >= screen_width) { /* Nix right_prompt */ right_prompt = L""; right_prompt_width = 0; } if (left_prompt_width + right_prompt_width >= screen_width) { /* Still doesn't fit, neuter left_prompt */ left_prompt = L"> "; left_prompt_width = 2; } /* Now we should definitely fit */ assert(left_prompt_width + right_prompt_width < screen_width); /* Convert commandline to a list of lines and their widths */ wcstring_list_t command_lines(1); std::vector line_widths(1); for (size_t i=0; i < commandline.size(); i++) { wchar_t c = commandline.at(i); if (c == L'\n') { /* Make a new line */ command_lines.push_back(wcstring()); line_widths.push_back(indent[i]*INDENT_STEP); } else { command_lines.back() += c; line_widths.back() += fish_wcwidth_min_0(c); } } const size_t first_command_line_width = line_widths.at(0); /* If we have more than one line, ensure we have no autosuggestion */ if (command_lines.size() > 1) { autosuggestion = L""; } /* Compute the width of the autosuggestion at all possible truncation offsets */ std::vector autosuggestion_truncated_widths; autosuggestion_truncated_widths.reserve(1 + wcslen(autosuggestion)); size_t autosuggestion_total_width = 0; for (size_t i=0; autosuggestion[i] != L'\0'; i++) { autosuggestion_truncated_widths.push_back(autosuggestion_total_width); autosuggestion_total_width += fish_wcwidth_min_0(autosuggestion[i]); } /* Here are the layouts we try in turn: 1. Left prompt visible, right prompt visible, command line visible, autosuggestion visible 2. Left prompt visible, right prompt visible, command line visible, autosuggestion truncated (possibly to zero) 3. Left prompt visible, right prompt hidden, command line visible, autosuggestion hidden 4. Newline separator (left prompt visible, right prompt hidden, command line visible, autosuggestion visible) A remark about layout #4: if we've pushed the command line to a new line, why can't we draw the right prompt? The issue is resizing: if you resize the window smaller, then the right prompt will wrap to the next line. This means that we can't go back to the line that we were on, and things turn to chaos very quickly. */ bool done = false; /* Case 1 */ if (! done && left_prompt_width + right_prompt_width + first_command_line_width + autosuggestion_total_width < screen_width) { result.left_prompt = left_prompt; result.left_prompt_space = left_prompt_width; result.right_prompt = right_prompt; result.autosuggestion = autosuggestion; done = true; } /* Case 2. Note that we require strict inequality so that there's always at least one space between the left edge and the rprompt */ if (! done && left_prompt_width + right_prompt_width + first_command_line_width < screen_width) { result.left_prompt = left_prompt; result.left_prompt_space = left_prompt_width; result.right_prompt = right_prompt; /* Need at least two characters to show an autosuggestion */ size_t available_autosuggestion_space = screen_width - (left_prompt_width + right_prompt_width + first_command_line_width); if (autosuggestion_total_width > 0 && available_autosuggestion_space > 2) { size_t truncation_offset = truncation_offset_for_width(autosuggestion_truncated_widths, available_autosuggestion_space - 2); result.autosuggestion = wcstring(autosuggestion, truncation_offset); result.autosuggestion.push_back(ellipsis_char); } done = true; } /* Case 3 */ if (! done && left_prompt_width + first_command_line_width < screen_width) { result.left_prompt = left_prompt; result.left_prompt_space = left_prompt_width; done = true; } /* Case 4 */ if (! done) { result.left_prompt = left_prompt; result.left_prompt_space = left_prompt_width; // See remark about for why we can't use the right prompt here //result.right_prompt = right_prompt; result.prompts_get_own_line = true; done = true; } assert(done); return result; } void s_write(screen_t *s, const wcstring &left_prompt, const wcstring &right_prompt, const wcstring &commandline, size_t explicit_len, const int *colors, const int *indent, size_t cursor_pos) { screen_data_t::cursor_t cursor_arr; CHECK(s,); CHECK(indent,); /* Turn the command line into the explicit portion and the autosuggestion */ const wcstring explicit_command_line = commandline.substr(0, explicit_len); const wcstring autosuggestion = commandline.substr(explicit_len); /* If we are using a dumb terminal, don't try any fancy stuff, just print out the text. right_prompt not supported. */ if (is_dumb()) { const std::string prompt_narrow = wcs2string(left_prompt); const std::string command_line_narrow = wcs2string(explicit_command_line); write_loop(STDOUT_FILENO, "\r", 1); write_loop(STDOUT_FILENO, prompt_narrow.c_str(), prompt_narrow.size()); write_loop(STDOUT_FILENO, command_line_narrow.c_str(), command_line_narrow.size()); return; } s_check_status(s); const size_t screen_width = common_get_width(); /* Completely ignore impossibly small screens */ if (screen_width < 4) { return; } /* Compute a layout */ const screen_layout_t layout = compute_layout(s, screen_width, left_prompt, right_prompt, explicit_command_line, autosuggestion, indent); /* Clear the desired screen */ s->desired.resize(0); s->desired.cursor.x = s->desired.cursor.y = 0; /* Append spaces for the left prompt */ for (size_t i=0; i < layout.left_prompt_space; i++) { s_desired_append_char(s, L' ', 0, 0, layout.left_prompt_space); } /* If overflowing, give the prompt its own line to improve the situation. */ size_t first_line_prompt_space = layout.left_prompt_space; if (layout.prompts_get_own_line) { s_desired_append_char(s, L'\n', 0, 0, 0); first_line_prompt_space = 0; } /* Reconstruct the command line */ wcstring effective_commandline = explicit_command_line + layout.autosuggestion; /* Output the command line */ size_t i; for (i=0; i < effective_commandline.size(); i++) { int color = colors[i]; if (i == cursor_pos) { color = 0; } if (i == cursor_pos) { cursor_arr = s->desired.cursor; } s_desired_append_char(s, effective_commandline.at(i), color, indent[i], first_line_prompt_space); } if (i == cursor_pos) { cursor_arr = s->desired.cursor; } s->desired.cursor = cursor_arr; s_update(s, layout.left_prompt.c_str(), layout.right_prompt.c_str()); s_save_status(s); } void s_reset(screen_t *s, screen_reset_mode_t mode) { CHECK(s,); bool abandon_line = false, repaint_prompt = false, clear_to_eos = false; switch (mode) { case screen_reset_current_line_contents: break; case screen_reset_current_line_and_prompt: repaint_prompt = true; break; case screen_reset_abandon_line: abandon_line = true; repaint_prompt = true; break; case screen_reset_abandon_line_and_clear_to_end_of_screen: abandon_line = true; repaint_prompt = true; clear_to_eos = true; break; } /* If we're abandoning the line, we must also be repainting the prompt */ assert(! abandon_line || repaint_prompt); /* If we are not abandoning the line, we need to remember how many lines we had output to, so we can clear the remaining lines in the next call to s_update. This prevents leaving junk underneath the cursor when resizing a window wider such that it reduces our desired line count. */ if (! abandon_line) { s->actual_lines_before_reset = maxi(s->actual_lines_before_reset, s->actual.line_count()); } if (repaint_prompt && ! abandon_line) { /* If the prompt is multi-line, we need to move up to the prompt's initial line. We do this by lying to ourselves and claiming that we're really below what we consider "line 0" (which is the last line of the prompt). This will cause us to move up to try to get back to line 0, but really we're getting back to the initial line of the prompt. */ const size_t prompt_line_count = calc_prompt_lines(s->actual_left_prompt); assert(prompt_line_count >= 1); s->actual.cursor.y += (prompt_line_count - 1); } else if (abandon_line) { s->actual.cursor.y = 0; } if (repaint_prompt) s->actual_left_prompt.clear(); s->actual.resize(0); s->need_clear_lines = true; s->need_clear_screen = s->need_clear_screen || clear_to_eos; if (abandon_line) { /* Do the PROMPT_SP hack */ int screen_width = common_get_width(); wcstring abandon_line_string; abandon_line_string.reserve(screen_width + 32); //should be enough int non_space_width = wcwidth(omitted_newline_char); if (screen_width >= non_space_width) { if (output_get_supports_term256()) { // draw the string in term256 gray abandon_line_string.append(L"\x1b[38;5;245m"); } else { // draw in "bright black" (gray) abandon_line_string.append(L"\x1b[0m" //bright L"\x1b[30;1m"); //black } abandon_line_string.push_back(omitted_newline_char); abandon_line_string.append(L"\x1b[0m"); //normal text ANSI escape sequence abandon_line_string.append(screen_width - non_space_width, L' '); } abandon_line_string.push_back(L'\r'); // now we are certainly on a new line. But we may have dropped the omitted newline char on it. So append enough spaces to overwrite the omitted newline char, and then abandon_line_string.append(non_space_width, L' '); abandon_line_string.push_back(L'\r'); const std::string narrow_abandon_line_string = wcs2string(abandon_line_string); write_loop(STDOUT_FILENO, narrow_abandon_line_string.c_str(), narrow_abandon_line_string.size()); s->actual.cursor.x = 0; } if (! abandon_line) { /* This should prevent resetting the cursor position during the next repaint. */ write_loop(STDOUT_FILENO, "\r", 1); s->actual.cursor.x = 0; } fstat(1, &s->prev_buff_1); fstat(2, &s->prev_buff_2); } screen_t::screen_t() : desired(), actual(), actual_left_prompt(), last_right_prompt_width(), actual_width(SCREEN_WIDTH_UNINITIALIZED), soft_wrap_location(INVALID_LOCATION), need_clear_lines(false), need_clear_screen(false), actual_lines_before_reset(0), prev_buff_1(), prev_buff_2(), post_buff_1(), post_buff_2() { } fish/screen.h000066400000000000000000000144211214535744100134470ustar00rootroot00000000000000/** \file screen.h High level library for handling the terminal screen The screen library allows the interactive reader to write its output to screen efficiently by keeping an internal representation of the current screen contents and trying to find a reasonably efficient way for transforming that to the desired screen content. The current implementation is less smart than ncurses allows and can not for example move blocks of text around to handle text insertion. */ #ifndef FISH_SCREEN_H #define FISH_SCREEN_H #include /** A class representing a single line of a screen. */ struct line_t { std::vector text; std::vector colors; bool is_soft_wrapped; line_t() : text(), colors(), is_soft_wrapped(false) { } void clear(void) { text.clear(); colors.clear(); } void append(wchar_t txt, int color) { text.push_back(txt); colors.push_back(color); } size_t size(void) const { return text.size(); } wchar_t char_at(size_t idx) const { return text.at(idx); } int color_at(size_t idx) const { return colors.at(idx); } }; /** A class representing screen contents. */ class screen_data_t { std::vector line_datas; public: struct cursor_t { int x; int y; cursor_t() : x(0), y(0) { } cursor_t(int a, int b) : x(a), y(b) { } } cursor; line_t &add_line(void) { line_datas.resize(line_datas.size() + 1); return line_datas.back(); } void resize(size_t size) { line_datas.resize(size); } line_t &create_line(size_t idx) { if (idx >= line_datas.size()) { line_datas.resize(idx + 1); } return line_datas.at(idx); } line_t &line(size_t idx) { return line_datas.at(idx); } size_t line_count(void) { return line_datas.size(); } }; /** The class representing the current and desired screen contents. */ class screen_t { public: /** Constructor */ screen_t(); /** The internal representation of the desired screen contents. */ screen_data_t desired; /** The internal representation of the actual screen contents. */ screen_data_t actual; /** A string containing the prompt which was last printed to the screen. */ wcstring actual_left_prompt; /** Last right prompt width */ size_t last_right_prompt_width; /** The actual width of the screen at the time of the last screen write. */ int actual_width; /** If we support soft wrapping, we can output to this location without any cursor motion. */ screen_data_t::cursor_t soft_wrap_location; /** This flag is set to true when there is reason to suspect that the parts of the screen lines where the actual content is not filled in may be non-empty. This means that a clr_eol command has to be sent to the terminal at the end of each line, including actual_lines_before_reset. */ bool need_clear_lines; /** Whether there may be yet more content after the lines, and we issue a clr_eos if possible. */ bool need_clear_screen; /** If we need to clear, this is how many lines the actual screen had, before we reset it. This is used when resizing the window larger: if the cursor jumps to the line above, we need to remember to clear the subsequent lines. */ size_t actual_lines_before_reset; /** These status buffers are used to check if any output has occurred other than from fish's main loop, in which case we need to redraw. */ struct stat prev_buff_1, prev_buff_2, post_buff_1, post_buff_2; }; /** This is the main function for the screen putput library. It is used to define the desired contents of the screen. The screen command will use it's knowlege of the current contents of the screen in order to render the desired output using as few terminal commands as possible. \param s the screen on which to write \param left_prompt the prompt to prepend to the command line \param right_prompt the right prompt, or NULL if none \param commandline the command line \param explicit_len the number of characters of the "explicit" (non-autosuggestion) portion of the command line \param colors the colors to use for the comand line \param indent the indent to use for the command line \param cursor_pos where the cursor is */ void s_write(screen_t *s, const wcstring &left_prompt, const wcstring &right_prompt, const wcstring &commandline, size_t explicit_len, const int *colors, const int *indent, size_t cursor_pos); /** This function resets the screen buffers internal knowledge about the contents of the screen. Use this function when some other function than s_write has written to the screen. \param s the screen to reset \param reset_cursor whether the line on which the cursor has changed should be assumed to have changed. If \c reset_cursor is false, the library will attempt to make sure that the screen area does not seem to move up or down on repaint. \param reset_prompt whether to reset the prompt as well. If reset_cursor is incorrectly set to false, this may result in screen contents being erased. If it is incorrectly set to true, it may result in one or more lines of garbage on screen on the next repaint. If this happens during a loop, such as an interactive resizing, there will be one line of garbage for every repaint, which will quickly fill the screen. */ void s_reset(screen_t *s, bool reset_cursor, bool reset_prompt = true); enum screen_reset_mode_t { /* Do not make a new line, do not repaint the prompt. */ screen_reset_current_line_contents, /* Do not make a new line, do repaint the prompt. */ screen_reset_current_line_and_prompt, /* Abandon the current line, go to the next one, repaint the prompt */ screen_reset_abandon_line, /* Abandon the current line, go to the next one, clear the rest of the screen */ screen_reset_abandon_line_and_clear_to_end_of_screen }; void s_reset(screen_t *s, screen_reset_mode_t mode); #endif fish/share/000077500000000000000000000000001214535744100131175ustar00rootroot00000000000000fish/share/completions/000077500000000000000000000000001214535744100154535ustar00rootroot00000000000000fish/share/completions/..fish000066400000000000000000000000651214535744100164640ustar00rootroot00000000000000complete -c . -x -a "(__fish_complete_suffix .fish)" fish/share/completions/abook.fish000066400000000000000000000020071214535744100174200ustar00rootroot00000000000000 complete -c abook -s h -d 'Show usage' complete -c abook -s C -l config -d 'Use an alternative configuration file' -r complete -c abook -l datafile -d 'Use an alternative addressbook file' -r complete -c abook -l mutt-query -d 'Make a query for mutt' -x complete -c abook -l add-email -d 'Read email message from stdin and add the sender' complete -c abook -l add-email-quiet -d 'Same as --add-email. Without confirmation' complete -c abook -l convert -d 'Convert address book files' set -l convert 'contains -- --convert (commandline -po)' complete -c abook -l informat -d 'Input file format' -xa '(__fish_complete_abook_formats in)' -n $convert complete -c abook -l outformat -d 'Output file format' -xa '(__fish_complete_abook_formats out)' -n $convert complete -c abook -l infile -d 'Input file (default: stdin)' -r -n $convert complete -c abook -l outfile -d 'Output file (default: stdout)' -r -n $convert complete -c abook -l formats -d 'Print available formats' fish/share/completions/acat.fish000066400000000000000000000000331214535744100172320ustar00rootroot00000000000000__fish_complete_atool acat fish/share/completions/accept.fish000066400000000000000000000001121214535744100175570ustar00rootroot00000000000000__fish_complete_lpr accept complete -c accept -s r -d 'Accept reason' -x fish/share/completions/ack.fish000066400000000000000000000122771214535744100170750ustar00rootroot00000000000000# Searching complete -c ack -s i -l ignore-case -d 'Ignore case' complete -c ack -l smart-case -d 'Ignore case when pattern contains no uppercase' complete -c ack -l nosmart-case -l no-smart-case -d 'Don\'t ignore case' complete -c ack -s v -l invert-match -d 'Invert match' complete -c ack -s w -l word-regexp -d 'Match only whole words' complete -c ack -s Q -l literal -d 'Quote all metacharacters' # Search output complete -c ack -l lines -d 'Only print line(s) NUM of each file' complete -c ack -s l -l files-with-matches -d 'Only print filenames containing matches' complete -c ack -s L -l files-without-matches -d 'Only print filenames with no matches' complete -c ack -l output -d 'Output the evaluation of Perl expression for each line' complete -c ack -s o -d 'Output the part of line matching pattern' complete -c ack -l passthru -d 'Print all lines' complete -c ack -l match -d 'Specify pattern explicitly' complete -c ack -s m -l max-count -d 'Stop searching in each file after NUM matches' complete -c ack -s 1 -d 'Stop searching after first match' complete -c ack -s H -l with-filename -d 'Print the filename for each match' complete -c ack -s h -l no-filename -d 'Suppress the prefixing filename on output' complete -c ack -s c -l count -d 'Show number of lines matching per file' complete -c ack -l column -d 'Show column number of first match' complete -c ack -l nocolumn -l no-column -d 'Don\'t show column number of first match' complete -c ack -x -s A -l after-context -d 'Print NUM lines of trailing context' complete -c ack -x -s B -l before-context -d 'Print NUM lines of leading context' complete -c ack -x -s C -l context -d 'Print NUM lines of context' complete -c ack -l print0 -d 'Print null byte as separator between filenames' complete -c ack -s s -d 'Suppress error messages about file errors' # File presentation complete -c ack -l pager -d 'Pipes all ack output through command' complete -c ack -l nopager -l no-pager -d 'Do not send output through a pager' complete -c ack -l heading -d 'Prints a filename heading above file\'s results' complete -c ack -l noheading -l no-heading -d 'Don\'t print a filename heading above file\'s results' complete -c ack -l break -d 'Print a break between results' complete -c ack -l nobreak -l no-break -d 'Don\'t print a break between results' complete -c ack -l group -d 'Filename heading and line break between results' complete -c ack -l nogroup -l no-group -d 'No filename heading and no line breaks between results' complete -c ack -l color -d 'Highlight the matching text' complete -c ack -l nocolor -l no-color -l nocolour -l no-colour -d 'Don\'t highlight the matching text' complete -c ack -l color-filename -d 'Set the color for filenames' complete -c ack -l color-match -d 'Set the color for matches' complete -c ack -l color-lineno -d 'Set the color for line numbers' complete -c ack -l flush -d 'Flush output immediately' # File finding complete -c ack -s f -d 'Only print the files selected' complete -c ack -s g -d 'Only select files matching pattern' complete -c ack -l sort-files -d 'Sort the found files lexically' complete -c ack -l show-types -d 'Show which types each file has' complete -c ack -l files-from -d 'Read the list of files to search from file' complete -c ack -s x -d 'Read the list of files to search from STDIN' # File inclusion/exclusion complete -c ack -l ignore-dir -l ignore-directory -d 'Ignore directory' complete -c ack -l noignore-dir -l no-ignore-dir -l noignore-directory -l no-ignore-directory -d 'Don\'t ignore directory' complete -c ack -l ignore-file -d 'Add filter for ignoring files' complete -c ack -s r -s R -l recurse -d 'Recurse into subdirectories' complete -c ack -s n -l no-recurse -d 'No descending into subdirectories' complete -c ack -l follow -d 'Follow symlinks' complete -c ack -l nofollow -l no-follow -d 'Don\'t follow symlinks' complete -c ack -s k -l known-types -d 'Include only recognized files' complete -c ack -l type -d 'Include only X files' # File type specification complete -c ack -l type-set -d 'Replaces definition of type' complete -c ack -l type-add -d 'Specify definition of type' complete -c ack -l type-del -d 'Removes all filters associated with type' # Miscellaneous complete -c ack -l noenv -l no-env -d 'Ignores environment variables and ackrc files' complete -c ack -l ackrc -d 'Specifies location of ackrc file' complete -c ack -l ignore-ack-defaults -d 'Ignore default definitions ack includes' complete -c ack -l create-ackrc -d 'Outputs default ackrc' complete -c ack -s ? -l help -d 'Shows help' complete -c ack -l help-types -d 'Shows all known types' complete -c ack -l dump -d 'Dump information on which options are loaded' complete -c ack -l filter -d 'Forces ack to treat input as a pipe' complete -c ack -l nofilter -l no-filter -d 'Forces ack to treat input as tty' complete -c ack -l man -d 'Shows man page' complete -c ack -l version -d 'Displays version and copyright' complete -c ack -l thpppt -d 'Bill the Cat' complete -c ack -l bar -d 'The warning admiral' # File types if type ack > /dev/null for type in (ack --dump ^/dev/null | perl -lne 'print $1 if /^\s+--type-add=([^:]+)/' | uniq) complete -c ack -l $type -d "Allow $type file type" complete -c ack -l no$type -l no-$type -d "Don't allow $type file type" end end fish/share/completions/acpi.fish000066400000000000000000000026461214535744100172520ustar00rootroot00000000000000# # Command specific completions for the acpi command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c acpi -s b -l battery --description 'Show battery information' complete -c acpi -s B -l without-battery --description 'Suppress battery information' complete -c acpi -s t -l thermal --description 'Show thermal information' complete -c acpi -s T -l without-thermal --description 'Suppress thermal information' complete -c acpi -s a -l ac-adapter --description 'Show ac adapter information' complete -c acpi -s A -l without-ac-adapter --description 'Suppress ac-adapter information' complete -c acpi -s V -l everything --description 'Show every device, overrides above options' complete -c acpi -s s -l show-empty --description 'Show non-operational devices' complete -c acpi -s S -l hide-empty --description 'Hide non-operational devices' complete -c acpi -s c -l celcius --description 'Use celcius as the temperature unit' complete -c acpi -s f -l fahrenheit --description 'Use fahrenheit as the temperature unit' complete -c acpi -s k -l kelvin --description 'Use kelvin as the temperature unit' complete -c acpi -s d -l directory --description '

path to ACPI info (/proc/acpi)' complete -c acpi -s h -l help --description 'Display help and exit' complete -c acpi -s v -l version --description 'Output version information and exit' fish/share/completions/adduser.fish000066400000000000000000000053621214535744100177630ustar00rootroot00000000000000# # Command specific completions for the adduser command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -x -c adduser -a "(__fish_complete_users; __fish_complete_groups)" complete -c adduser -l conf --description 'Specify config file' -r complete -c adduser -l disabled-login --description 'Do not run passwd to set the password' complete -c adduser -l disabled-password --description 'Like --disabled-login, but logins are still possible (for example using SSH RSA keys) but not using password authentication' complete -c adduser -l force-badname --description 'By default, user and group names are checked against the configurable regular expression NAME_REGEX (or NAME_REGEX if --system is specified) specified in the configuration file' complete -c adduser -l gecos --description 'Set the gecos field for the new entry generated' -r complete -c adduser -l gid --description 'When creating a group, this option forces the new groupid to be the given number' -r complete -c adduser -l group --description 'When combined with --system, a group with the same name and ID as the system user is created' complete -c adduser -l help --description 'Display brief instructions' complete -c adduser -l home --description 'Use specified directory as the user\'s home directory' -x -a '(__fish_complete_directories)' complete -c adduser -l shell --description 'Use shell as the user\'s login shell, rather than the default specified by the configuration file' -x -a '(cat /etc/shells)' complete -c adduser -l ingroup --description 'Add the new user to GROUP instead of a usergroup or the default group defined by USERS_GID in the configuration file' -x -a '(cat /etc/group|cut -d : -f 1)' complete -c adduser -l no-create-home --description 'Do not create the home directory, even if it doesni\'t exist' complete -c adduser -l quiet --description 'Suppress informational messages, only show warnings and errors' complete -c adduser -l debug --description 'Be verbose, most useful if you want to nail down a problem with adduser' complete -c adduser -l system --description 'Create a system user or group' complete -c adduser -l uid --description 'Force the new userid to be the given number' -r complete -c adduser -l firstuid --description 'Override the first uid in the range that the uid is chosen from (overrides FIRST_UID specified in the configuration file)' -r complete -c adduser -l lastuid --description 'ID Override the last uid in the range that the uid is chosen from ( LAST_UID )' -r complete -c adduser -l add_extra_groups --description 'Add new user to extra groups defined in the configuration file' complete -c adduser -l version --description 'Display version and copyright information' fish/share/completions/adiff.fish000066400000000000000000000000341214535744100173740ustar00rootroot00000000000000__fish_complete_atool adiff fish/share/completions/als.fish000066400000000000000000000000321214535744100171000ustar00rootroot00000000000000__fish_complete_atool als fish/share/completions/amixer.fish000066400000000000000000000017331214535744100176170ustar00rootroot00000000000000set -l cmds 'scontrols scontents controls contents sget sset cset cget set get' complete -c amixer -xa "$cmds" -n "not __fish_seen_subcommand_from $cmds" complete -c amixer -n '__fish_seen_subcommand_from sset sget get set' -xa "(amixer scontrols | cut --delimiter \' --fields 2)" complete -c amixer -s h -l help -d 'this help' complete -c amixer -s c -l card -r -d 'select the card' complete -c amixer -s D -l device -r -d 'select the device, default \'default\'' complete -c amixer -s d -l debug -d 'debug mode' complete -c amixer -s n -l nocheck -d 'do not perform range checking' complete -c amixer -s v -l version -d 'print version of this program' complete -c amixer -s q -l quiet -d 'be quiet' complete -c amixer -s i -l inactive -d 'show also inactive controls' complete -c amixer -s a -l abstract -d 'select abstraction level' -xa 'none basic' complete -c amixer -s s -l stdin -d 'Read and execute commands from stdin sequentially' fish/share/completions/anamnesis.fish000066400000000000000000000017151214535744100203100ustar00rootroot00000000000000# Completions for anamnesis # Author: SanskritFritz (gmail) complete -c anamnesis -l version -d "Show program's version number and exit" complete -c anamnesis -s h -l help -d "Show a help message and exit" complete -c anamnesis -l start -d "Starts anamnesis daemon" complete -c anamnesis -l stop -d "Stops anamnesis daemon" complete -c anamnesis -l restart -d "Restarts anamnesis daemon" complete -c anamnesis -s b -l browser -d "Opens anamnesis browser with clipboard history" complete -c anamnesis -l cleanup -d "Performs a cleanup on the clipboard database" complete -c anamnesis -s l -l list -d "Prints the clipboard history last N values" complete -c anamnesis -l filter -d "Use keywords to filter the clips to be listed" complete -c anamnesis -s a -l add -d "Adds a value to the clipboard" complete -c anamnesis -l remove -d "Removes the clipboard element with the given id" complete -c anamnesis -l brief -d "Print only a brief version of long clipboard elements" fish/share/completions/and.fish000066400000000000000000000001711214535744100170670ustar00rootroot00000000000000complete -c and -s h -l help --description 'Display help and exit' complete -c and -xa '( __fish_complete_subcommand )' fish/share/completions/animate.fish000066400000000000000000000154431214535744100177530ustar00rootroot00000000000000complete -c animate -o alpha -d 'On, activate, off, deactivate, set, opaque, copy transparent, extract, background, or shape [option]' -xa '(animate -list alpha)' complete -c animate -o authenticate -d 'Decipher image with this password [password]' complete -c animate -o backdrop -d 'Display image centered on a backdrop' complete -c animate -o channel -d 'Apply option to select image channels [type]' -xa '(animate -list channel)' complete -c animate -o colormap -d 'Shared or Private [type]' -x complete -c animate -o colorspace -d 'Alternate image colorspace [type]' -xa '(animate -list colorspace)' complete -c animate -o decipher -d 'Convert cipher pixels to plain pixels [filename]' -r complete -c animate -o define -d 'Define one or more image format options [format:option]' complete -c animate -o delay -d 'Display the next image after pausing [value]' complete -c animate -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c animate -o depth -d 'Image depth [value]' complete -c animate -o display -d 'Display image to this X server [server]' complete -c animate -o dispose -d 'Layer disposal method [method]' -xa '(animate -list dispose)' complete -c animate -o dither -d 'Apply error diffusion to image [method]' -xa '(animate -list dither)' complete -c animate -o filter -d 'Use this filter when resizing an image [type]' -xa '(animate -list filter)' complete -c animate -o format -d 'Output formatted image characteristics ["string"]' complete -c animate -o gamma -d 'Level of gamma correction [value]' complete -c animate -o geometry -d 'Preferred size and location of the Image window [geometry]' complete -c animate -o gravity -d 'Horizontal and vertical backdrop placement [type]' -xa '(animate -list gravity)' complete -c animate -o identify -d 'Identify the format and characteristics of the image' complete -c animate -o immutable -d 'Displayed image cannot be modified' complete -c animate -o interlace -d 'Type of image interlacing scheme [type]' -xa '(animate -list interlace)' complete -c animate -o interpolate -d 'Pixel color interpolation method [method]' -xa '(animate -list interpolate)' complete -c animate -o limit -d 'Pixel cache resource limit [type value]' -x complete -c animate -o loop -d 'Loop images then exit [iterations]' complete -c animate -o map -d 'Display image using this Standard Colormap [type]' -x complete -c animate -o monitor -d 'Monitor progress ' complete -c animate -o pause -d 'Seconds to pause before reanimating' complete -c animate -o page -d 'Size and location of an image canvas (setting) [geometry]' complete -c animate -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(animate -list colorspace)' complete -c animate -o quiet -d 'Suppress all warning messages' complete -c animate -o regard-warnings -d 'Pay attention to warning messages' complete -c animate -o remote -d 'Command execute a command in an remote display process' complete -c animate -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c animate -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c animate -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c animate -o set -d 'Attribute set an image attribute [ value]' complete -c animate -o size -d 'Width and height of image [geometry]' complete -c animate -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c animate -o treedepth -d 'Color tree depth [value]' complete -c animate -o verbose -d 'Print detailed information about the image' complete -c animate -o visual -d 'Display image using this visual type [type]' -x complete -c animate -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(animate -list virtual-pixel)' complete -c animate -o window -d 'Display image to background of this window [id]' -xa 'root (__fish_print_xwindows)' complete -c animate -o colors -d 'Preferred number of colors in the image [value]' complete -c animate -o crop -d 'Preferred size and location of the cropped image [geometry]' complete -c animate -o extract -d 'Extract area from image [geometry]' complete -c animate -o monochrome -d 'Transform image to black and white' complete -c animate -o repage -d 'Size and location of an image canvas (operator) [geometry]' complete -c animate -o resample -d 'Change the resolution of an image [geometry]' complete -c animate -o resize -d 'Resize the image [geometry]' complete -c animate -o rotate -d 'Apply Paeth rotation to the image [degrees]' complete -c animate -o strip -d 'Strip image of all profiles and comments' complete -c animate -o thumbnail -d 'Create a thumbnail of the image [geometry]' complete -c animate -o trim -d 'Trim image edges' complete -c animate -o coalesce -d 'Merge a sequence of images' complete -c animate -o flatten -d 'Flatten a sequence of images' complete -c animate -o debug -d 'Display copious debugging information [events]' -xa '(animate -list debug)' complete -c animate -o help -d 'Print program options' complete -c animate -o list -d 'Print a list of supported option arguments [type]' -xa '(animate -list list)' complete -c animate -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c animate -o version -d 'Print version information Press any button to map or unmap the Command widget' complete -c animate -o matte -d 'Store matte channel if the image has one' complete -c animate -o scenes -d 'Range image scene range' complete -c animate -o support -d 'Resize support: > 1.0 is blurry, < 1.0 is sharp [factor]' fish/share/completions/ant.fish000066400000000000000000000000701214535744100171050ustar00rootroot00000000000000 complete -x -c ant -a "(__fish_complete_ant_targets)" fish/share/completions/apack.fish000066400000000000000000000000341214535744100174020ustar00rootroot00000000000000__fish_complete_atool apack fish/share/completions/apm.fish000066400000000000000000000010051214535744100170770ustar00rootroot00000000000000#apm complete -f -c apm -s V -l version --description "Display version and exit" complete -f -c apm -s v -l verbose --description "Print APM info" complete -f -c apm -s m -l minutes --description "Print time remaining" complete -f -c apm -s M -l monitor --description "Monitor status info" complete -f -c apm -s S -l standby --description "Request APM standby mode" complete -f -c apm -s s -l suspend --description "Request APM suspend mode" complete -f -c apm -s d -l debug --description "APM status debugging info" fish/share/completions/apropos.fish000066400000000000000000000020001214535744100200010ustar00rootroot00000000000000 function __fish_complete_apropos if test (commandline -ct) set str (commandline -ct) apropos $str|sed -e "s/^\(.*$str\([^ ]*\).*\)\$/$str\2"\t"\1/" end end complete -xc apropos -a '(__fish_complete_apropos)' --description "whatis entry" complete -c apropos -s h -l help --description "Display help and exit" complete -f -c apropos -s d -l debug --description "Print debugging info" complete -f -c apropos -s v -l verbose --description "Verbose mode" complete -f -c apropos -s r -l regex --description "Keyword as regex" complete -f -c apropos -s w -l wildcard --description "Keyword as wildcards" complete -f -c apropos -s e -l exact --description "Keyword as exactly match" complete -x -c apropos -s m -l system --description "Search for other system" complete -x -c apropos -s M -l manpath -a '(echo $MANPATH)' --description "Specify man path" complete -x -c apropos -s C -l config-file --description "Specify a configuration file" complete -f -c apropos -s V -l version --description "Display version and exit" fish/share/completions/apt-build.fish000066400000000000000000000040601214535744100202070ustar00rootroot00000000000000 #apt-build complete -c apt-build -l help --description "Display help and exit" complete -f -c apt-build -a update --description "Update list of packages" complete -f -c apt-build -a upgrade --description "Upgrade packages" complete -f -c apt-bulid -a world --description "Rebuild your system" complete -x -c apt-build -a install --description "Build and install a new package" complete -x -c apt-build -a source --description "Download and extract a source" complete -x -c apt-build -a info --description "Info on a package" complete -x -c apt-build -a remove --description "Remove packages" complete -x -c apt-build -a clean-build --description "Erase built packages" complete -x -c apt-build -a build-source --description "Build source without install" complete -x -c apt-build -a clean-sources --description "Clean source directories" complete -x -c apt-build -a update-source --description "Update source and rebuild" complete -x -c apt-build -a update-repository --description "Update the repository" complete -f -c apt-build -l nowrapper --description "Do not use gcc wrapper" complete -f -c apt-build -l remove-builddep --description "Remove build-dep" complete -f -c apt-build -l no-source --description "Do not download source" complete -f -c apt-build -l build-dir --description "Specify build-dir" complete -f -c apt-build -l rebuild --description "Rebuild a package" complete -f -c apt-build -l reinstall --description "Rebuild and install an installed package" complete -r -f -c apt-build -l build-command --description "Use to build" complete -r -c apt-build -l patch --description "Apply patch" complete -c apt-build -s p -l patch-strip --description "Prefix to strip on patch" complete -c apt-build -s y -l yes --description "Assume yes to all questions" complete -c apt-build -l purge --description "Use purge instead of remove" complete -c apt-build -l noupdate --description "Do not run update" complete -r -c apt-build -l source-list --description "Specify sources.list file" complete -f -c apt-build -s v -l version --description "Display version and exit" fish/share/completions/apt-cache.fish000066400000000000000000000051621214535744100201570ustar00rootroot00000000000000#apt-cache complete -c apt-cache -s h -l help --description "Display help and exit" complete -f -c apt-cache -a gencaches --description "Build apt cache" complete -x -c apt-cache -a showpkg --description "Show package info" complete -f -c apt-cache -a stats --description "Show cache statistics" complete -x -c apt-cache -a showsrc --description "Show source package" complete -f -c apt-cache -a dump --description "Show packages in cache" complete -f -c apt-cache -a dumpavail --description "Print available list" complete -f -c apt-cache -a unmet --description "List unmet dependencies in cache" complete -x -c apt-cache -a show --description "Display package record" complete -x -c apt-cache -a search --description "Search packagename by REGEX" complete -c apt-cache -l full -a search --description "Search full package name" complete -x -c apt-cache -l names-only -a search --description "Search packagename only" complete -x -c apt-cache -a depends --description "List dependencies for the package" complete -x -c apt-cache -a rdepends --description "List reverse dependencies for the package" complete -x -c apt-cache -a pkgnames --description "Print package name by prefix" complete -x -c apt-cache -a dotty --description "Generate dotty output for packages" complete -x -c apt-cache -a policy --description "Debug preferences file" complete -r -c apt-cache -s p -l pkg-cache --description "Select file to store package cache" complete -r -c apt-cache -s s -l src-cache --description "Select file to store source cache" complete -f -c apt-cache -s q -l quiet --description "Quiet mode" complete -f -c apt-cache -s i -l important --description "Print important dependencies" complete -f -c apt-cache -s a -l all-versions --description "Print full records" complete -f -c apt-cache -s g -l generate --description "Auto-gen package cache" complete -f -c apt-cache -l all-names --description "Print all names" complete -f -c apt-cache -l recurse --description "Dep and rdep recursive" complete -f -c apt-cache -l installed --description "Limit to installed" complete -f -c apt-cache -s v -l version --description "Display version and exit" complete -r -c apt-cache -s c -l config-file --description "Specify config file" complete -x -c apt-cache -s o -l option --description "Specify options" function __fish_apt-cache_use_package --description 'Test if apt command should have packages as potential completion' for i in (commandline -opc) if contains -- $i contains show showpkg showsrc depends rdepends dotty policy return 0 end end return 1 end complete -c apt-cache -n '__fish_apt-cache_use_package' -a '(__fish_print_packages)' --description 'Package' fish/share/completions/apt-cdrom.fish000066400000000000000000000015671214535744100202250ustar00rootroot00000000000000#apt-cdrom complete -c apt-cdrom -s h -l help --description "Display help and exit" complete -r -c apt-cdrom -a add --description "Add new disc to source list" complete -x -c apt-cdrom -a ident --description "Report identity of disc" complete -r -c apt-cdrom -s d -l cdrom --description "Mount point" complete -f -c apt-cdrom -s r -l rename --description "Rename a disc" complete -f -c apt-cdrom -s m -l no-mount --description "No mounting" complete -f -c apt-cdrom -s f -l fast --description "Fast copy" complete -f -c apt-cdrom -s a -l thorough --description "Thorough package scan" complete -f -c apt-cdrom -s n -l no-act --description "No changes" complete -f -c apt-cdrom -s v -l version --description "Display version and exit" complete -r -c apt-cdrom -s c -l config-file --description "Specify config file" complete -x -c apt-cdrom -s o -l option --description "Specify options" fish/share/completions/apt-config.fish000066400000000000000000000007411214535744100203570ustar00rootroot00000000000000#apt-config complete -c apt-config -s h -l help --description "Display help and exit" complete -c apt-config -a shell --description "Access config file from shell" complete -f -c apt-config -a dump --description "Dump contents of config file" complete -f -c apt-config -s v -l version --description "Display version and exit" complete -r -c apt-config -s c -l config-file --description "Specify config file" complete -x -c apt-config -s o -l option --description "Specify options" fish/share/completions/apt-extracttemplates.fish000066400000000000000000000005111214535744100224760ustar00rootroot00000000000000 #apt-extracttemplates complete -c apt-extracttemplates -s h -l help --description "Display help and exit" complete -r -c apt-extracttemplates -s t --description "Set temp dir" complete -r -c apt-extracttemplates -s c --description "Specifiy config file" complete -r -c apt-extracttemplates -s o --description "Specify options" fish/share/completions/apt-file.fish000066400000000000000000000024121214535744100200260ustar00rootroot00000000000000#apt-file complete -c apt-file -s h -l help --description "Display help and exit" complete -x -c apt-file -a update --description "Resync package contents from source" complete -r -c apt-file -a search --description "Search package containing pattern" complete -r -c apt-file -a list --description "List contents of a package matching pattern" complete -x -c apt-file -a purge --description "Remove all gz files from cache" complete -r -c apt-file -s c -l cache --description "Set cache dir" complete -f -c apt-file -s v -l verbose --description "Verbose mode" complete -c apt-file -s d -l cdrom-mount --description "Use cdrom-mount-point" complete -f -c apt-file -s i -l ignore-case --description "Do not expand pattern" complete -f -c apt-file -s x -l regexp --description "Pattern is regexp" complete -f -c apt-file -s V -l version --description "Display version and exit" complete -f -c apt-file -s a -l architecture --description "Set arch" complete -r -c apt-file -s s -l sources-list -a "(ls /etc/apt)" --description "Set sources.list file" complete -f -c apt-file -s l -l package-only --description "Only display package name" complete -f -c apt-file -s F -l fixed-string --description "Do not expand pattern" complete -f -c apt-file -s y -l dummy --description "Run in dummy mode" fish/share/completions/apt-ftparchive.fish000066400000000000000000000024111214535744100212410ustar00rootroot00000000000000#apt-ftparchive complete -c apt-ftparchive -s h -l help --description "Display help and exit" complete -f -c apt-ftparchive -a packages --description "Generate package from source" complete -f -c apt-ftparchive -a sources --description "Generate source index file" complete -f -c apt-ftparchive -a contents --description "Generate contents file" complete -f -c apt-ftparchive -a release --description "Generate release file" complete -f -c apt-ftparchive -a clean --description "Remove records" complete -f -c apt-ftparchive -l md5 --description "Generate MD5 sums" complete -f -c apt-ftparchive -s d -l db --description "Use a binary db" complete -f -c apt-ftparchive -s q -l quiet --description "Quiet mode" complete -f -c apt-ftparchive -l delink --description "Perform delinking" complete -f -c apt-ftparchive -l contents --description "Perform contents generation" complete -c apt-ftparchive -s s -l source-override --description "Use source override" complete -f -c apt-ftparchive -l readonly --description "Make caching db readonly" complete -f -c apt-ftparchive -s v -l version --description "Display version and exit" complete -r -c apt-ftparchive -s c -l config-file --description "Use config file" complete -r -c apt-ftparchive -s o -l option --description "Set config options" fish/share/completions/apt-get.fish000066400000000000000000000110461214535744100176710ustar00rootroot00000000000000#completion for apt-get function __fish_apt_no_subcommand --description 'Test if apt has yet to be given the subcommand' for i in (commandline -opc) if contains -- $i update upgrade dselect-upgrade dist-upgrade install remove source build-dep check clean autoclean return 1 end end return 0 end function __fish_apt_use_package --description 'Test if apt command should have packages as potential completion' for i in (commandline -opc) if contains -- $i contains install remove build-dep return 0 end end return 1 end complete -c apt-get -n '__fish_apt_use_package' -a '(__fish_print_packages)' --description 'Package' complete -c apt-get -s h -l help --description 'Display help and exit' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'update' --description 'Update sources' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'upgrade' --description 'Upgrade or install newest packages' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'dselect-upgrade' --description 'Use with dselect front-end' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'dist-upgrade' --description 'Distro upgrade' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'install' --description 'Install one or more packages' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'purge' --description 'Remove and purge one or more packages' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'remove' --description 'Remove one or more packages' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'source' --description 'Fetch source packages' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'build-dep' --description 'Install/remove packages for dependencies' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'check' --description 'Update cache and check dependencies' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'clean' --description 'Clean local caches and packages' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'autoclean' --description 'Clean packages no longer be downloaded' complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'autoremove' --description 'Remove automatically installed packages' complete -c apt-get -l no-install-recommends --description 'Do not install recommended packages' complete -c apt-get -s d -l download-only --description 'Download Only' complete -c apt-get -s f -l fix-broken --description 'Correct broken dependencies' complete -c apt-get -s m -l fix-missing --description 'Ignore missing packages' complete -c apt-get -l no-download --description 'Disable downloading packages' complete -c apt-get -s q -l quiet --description 'Quiet mode' complete -c apt-get -s s -l simulate -l just-print -l dry-run -l recon -l no-act --description 'Perform a simulation' complete -c apt-get -s y -l yes -l assume-yes --description 'Automatic yes to prompts' complete -c apt-get -s u -l show-upgraded --description 'Show upgraded packages' complete -c apt-get -s V -l verbose-versions --description 'Show full versions for packages' complete -c apt-get -s b -l compile -l build --description 'Compile source packages' complete -c apt-get -l install-recommends --description 'Install recommended packages' complete -c apt-get -l ignore-hold --description 'Ignore package Holds' complete -c apt-get -l no-upgrade --description "Do not upgrade packages" complete -c apt-get -l force-yes --description 'Force yes' complete -c apt-get -l print-uris --description 'Print the URIs' complete -c apt-get -l purge --description 'Use purge instead of remove' complete -c apt-get -l reinstall --description 'Reinstall packages' complete -c apt-get -l list-cleanup --description 'Erase obsolete files' complete -c apt-get -s t -l target-release -l default-release --description 'Control default input to the policy engine' complete -c apt-get -l trivial-only --description 'Only perform operations that are trivial' complete -c apt-get -l no-remove --description 'Abort if any packages are to be removed' complete -c apt-get -l only-source --description 'Only accept source packages' complete -c apt-get -l diff-only --description 'Download only diff file' complete -c apt-get -l tar-only --description 'Download only tar file' complete -c apt-get -l arch-only --description 'Only process arch-dependant build-dependencies' complete -c apt-get -l allow-unauthenticated --description 'Ignore non-authenticated packages' complete -c apt-get -s v -l version --description 'Display version and exit' complete -r -c apt-get -s c -l config-file --description 'Specify a config file' complete -r -c apt-get -s o -l option --description 'Set a config option' fish/share/completions/apt-key.fish000066400000000000000000000003021214535744100176730ustar00rootroot00000000000000#apt-key complete -r -c apt-key -a add --description "Add a new key" complete -f -c apt-key -a del --description "Remove a key" complete -f -c apt-key -a list --description "List trusted keys" fish/share/completions/apt-listbugs.fish000066400000000000000000000040401214535744100207420ustar00rootroot00000000000000#apt-listbugs complete -c apt-listbugs -s h -l help --description "Display help and exit" complete -f -c apt-listbugs -s s -l severity -a "critical grave" --description "Set severity" complete -f -c apt-listbugs -s T -l tag --description "Tags you want to see" complete -f -c apt-listbugs -s S -l stats -a "outstanding 'pending upload' resolved done open" --description "Bug-status you want to see" complete -f -c apt-listbugs -s l -l showless --description "Ignore bugs in your system" complete -f -c apt-listbugs -s g -l showgreater --description "Ignore newer bugs than upgrade packages" complete -f -c apt-listbugs -s D -l show-downgrade --description "Bugs for downgrade packages" complete -f -c apt-listbugs -s H -l hostname -a "osdn.debian.or.jp" --description "Bug Tracking system" complete -f -c apt-listbugs -s p -l port --description "Specify port for web interface" complete -f -c apt-listbugs -s R -l release-critical --description "Use daily bug report" complete -f -c apt-listbugs -s I -l index --description "Use the raw index.db" complete -f -c apt-listbugs -s X -l indexdir --description "Specify index dir" complete -f -c apt-listbugs -s P -l pin-priority --description "Specify Pin-Priority value" complete -f -c apt-listbugs -l title --description "Specify the title of rss" complete -f -c apt-listbugs -s f -l force-download --description "Retrieve fresh bugs" complete -f -c apt-listbugs -s q -l quiet --description "Do not display progress bar" complete -f -c apt-listbugs -s c -l cache-dir -a "/var/cache/apt-listbugs/" --description "Specify local cache dir" complete -f -c apt-listbugs -s t -l timer --description "Specify the expire cache timer" complete -c apt-listbugs -s C -l aptconf --description "Specify apt config file" complete -f -c apt-listbugs -s y -l force-yes --description "Assume yes to all questions" complete -f -c apt-listbugs -s n -l force-no --description "Assume no to all questions" complete -c apt-listbugs -a list --description "List bugs from packages" complete -c apt-listbugs -a rss --description "List bugs in rss format" fish/share/completions/apt-listchanges.fish000066400000000000000000000020661214535744100214200ustar00rootroot00000000000000#apt-listchanges complete -c apt-listchanges -l help --description "Display help and exit" complete -c apt-listchanges -l apt --description "Read filenames from pipe" complete -f -c apt-listchanges -s v -l verbose --description "Verbose mode" complete -f -c apt-listchanges -s f -l frontend -a "pager browser xterm-pager xterm-browser text mail none" --description "Select frontend interface" complete -r -f -c apt-listchanges -l email-address --description "Specify email address" complete -f -c apt-listchanges -s c -l confirm --description "Ask confirmation" complete -f -c apt-listchanges -s a -l all --description "Display all changelogs" complete -r -c apt-listchanges -l save_seen --description "Avoid changelogs from db in named file" complete -r -f -c apt-listchanges -l which -a "news changelogs both" --description "Select display" complete -f -c apt-listchanges -s h -l headers --description "Insert header" complete -f -c apt-listchanges -l debug --description "Display debug info" complete -r -c apt-listchanges -l profile --description "Select an option profile" fish/share/completions/apt-move.fish000066400000000000000000000030701214535744100200560ustar00rootroot00000000000000#apt-move complete -c apt-move -a get --description "Generate master file" complete -c apt-move -a getlocal --description "Alias for 'get'" complete -f -c apt-move -a move --description "Move packages to local tree" complete -f -c apt-move -a delete --description "Delete obsolete package files" complete -f -c apt-move -a packages --description "Build new local files" complete -f -c apt-move -a fsck --description "Rebuild index files" complete -f -c apt-move -a update --description "Move packages from cache to local mirror" complete -f -c apt-move -a local --description "Alias for 'move delete packages'" complete -f -c apt-move -a localupdate --description "Alias for 'update'" complete -f -c apt-move -a mirror --description "Download package missing from mirror" complete -f -c apt-move -a sync --description "Sync packages installed" complete -f -c apt-move -a exclude -d 'test $LOCALDIR/.exclude file' complete -c apt-move -a movefile --description "Move file specified on commandline" complete -f -c apt-move -a listbin --description 'List packages that may serve as input to mirrorbin or mirrorsource' complete -f -c apt-move -a mirrorbin --description "Fetch package from STDIN" complete -f -c apt-move -a mirrorsrc --description "Fetch source package from STDIN" complete -f -c apt-move -s a --description "Process all packages" complete -c apt-move -s c --description "Use specific conffile" complete -f -c apt-move -s f --description "Force deletion" complete -f -c apt-move -s q --description "Suppresses normal output" complete -f -c apt-move -s t --description "Test run" fish/share/completions/apt-proxy-import.fish000066400000000000000000000013311214535744100215770ustar00rootroot00000000000000#apt-proxy-import complete -c apt-proxy-import -s h -l help --description 'Display help and exit' complete -f -c apt-proxy-import -s V -l version --description 'Display version and exit' complete -f -c apt-proxy-import -s v -l verbose --description 'Verbose mode' complete -f -c apt-proxy-import -s q -l quiet --description 'No message to STDOUT' complete -f -c apt-proxy-import -s r -l recursive --description 'Recurse into subdir' complete -r -c apt-proxy-import -s i -l import-dir -a '(ls -Fp|sgrep /\$)' --description 'Dir to import' complete -r -c apt-proxy-import -s u -l user -a '(__fish_complete_users)' --description 'Change to user' complete -r -c apt-proxy-import -s d -l debug --description 'Debug level[default 0]' fish/share/completions/apt-rdepends.fish000066400000000000000000000020631214535744100207150ustar00rootroot00000000000000#apt-rdepends complete -c apt-rdepends -l help --description "Display help and exit" complete -f -c apt-rdepends -s b -l build-depends --description "Show build dependencies" complete -f -c apt-rdepends -s d -l dotty --description "Generate a dotty graph" complete -f -c apt-rdepends -s p -l print-state --description "Show state of dependencies" complete -f -c apt-rdepends -s r -l reverse --description "List packages depending on" complete -r -f -c apt-rdepends -s f -l follow --description "Comma-separated list of dependency types to follow recursively" complete -r -f -c apt-rdepends -s s -l show --description "Comma-separated list of dependency types to show" complete -r -f -c apt-rdepends -l state-follow --description "Comma-separated list of package installation states to follow recursively" complete -r -f -c apt-rdepends -l state-show --description "Comma-separated list of package installation states to show" complete -f -c apt-rdepends -l man --description "Display man page" complete -f -c apt-rdepends -l version --description "Display version and exit" fish/share/completions/apt-setup.fish000066400000000000000000000002151214535744100202460ustar00rootroot00000000000000#apt-setup complete -c apt-setup -a probe --description "Probe a CD" complete -c apt-setup -s N --description "Run in non-interactive mode" fish/share/completions/apt-show-source.fish000066400000000000000000000015511214535744100213700ustar00rootroot00000000000000#apt-show-source complete -c apt-show-source -s h -l help --description 'Display help and exit' complete -r -c apt-show-source -l status-file --description 'Read package from file' -f complete -r -c apt-show-source -o stf --description 'Read package from file' -f complete -r -c apt-show-source -l list-dir -a '(ls -Fp .|sgrep /\$) /var/lib/apt/lists' --description 'Specify APT list dir' complete -r -c apt-show-source -o ld -a '(ls -Fp .|sgrep /\$) /var/lib/apt/lists' --description 'Specify APT list dir' complete -r -c apt-show-source -s p -l package -a '(apt-cache pkgnames)' --description 'List PKG info' complete -f -c apt-show-source -l version-only --description 'Display version and exit' complete -f -c apt-show-source -s a -l all --description 'Print all source packages with version' complete -f -c apt-show-source -s v -l verbose --description 'Verbose mode' fish/share/completions/apt-show-versions.fish000066400000000000000000000022551214535744100217420ustar00rootroot00000000000000#apt-show-versions complete -c apt-show-source -s h -l help --description 'Display help and exit' complete -r -c apt-show-versions -s p -l packages -a '(apt-cache pkgnames)' --description 'Print PKG versions' complete -f -c apt-show-versions -s r -l regex --description 'Using regex' complete -f -c apt-show-versions -s u -l upgradeable --description 'Print only upgradeable packages' complete -f -c apt-show-versions -s a -l allversions --description 'Print all versions' complete -f -c apt-show-versions -s b -l brief --description 'Print package name/distro' complete -f -c apt-show-versions -s v -l verbose --description 'Print verbose info' complete -f -c apt-show-versions -s i -l initialize --description 'Init or update cache only' complete -r -c apt-show-versions -l status-file --description 'Read package from file' complete -r -c apt-show-versions -o stf --description 'Read package from file' complete -r -c apt-show-versions -l list-dir -a '(ls -Fp .|sgrep /\$) /var/lib/apt/lists /var/state/apt/lists' --description 'Specify APT list dir' complete -r -c apt-show-versions -o ld -a '(ls -Fp .|sgrep /\$) /var/lib/apt/lists /var/state/apt/lists' --description 'Specify APT list dir' fish/share/completions/apt-sortpkgs.fish000066400000000000000000000006421214535744100207660ustar00rootroot00000000000000#apt-sortpkgs complete -c apt-sortpkgs -s h -l help --description "Display help and exit" complete -f -c apt-sortpkgs -s s -l source --description "Use source index field" complete -f -c apt-sortpkgs -s v -l version --description "Display version and exit" complete -r -c apt-sortpkgs -s c -l conf-file --description "Specify conffile" complete -r -f -c apt-sortpkgs -s o -l option --description "Set config options" fish/share/completions/apt-spy.fish000066400000000000000000000022611214535744100177240ustar00rootroot00000000000000#apt-spy complete -c apt-spy -s h --description "Display help and exit" complete -f -c apt-spy -s d -a "stable testing unstable" --description "Debian distribution" complete -f -c apt-spy -s a -a "Africa Asia Europe North-America Oceania South-America" --description "Servers in the areas" complete -c apt-spy -s c --description "Conf file" complete -f -c apt-spy -s e --description "Finish after number of servers" complete -c apt-spy -s f --description "File to grab servers" complete -c apt-spy -s i --description "File as input" complete -c apt-spy -s m --description "Mirror-list file" complete -c apt-spy -s o --description "Output sources.list file" complete -f -c apt-spy -s p --description "Use proxy server" complete -f -c apt-spy -s s --description "Comma separated country list" complete -f -c apt-spy -s t --description "How long in sec to download" complete -f -c apt-spy -s u --description "Custom URL to get mirror list" complete -c apt-spy -s w --description "Write top servers to file" complete -f -c apt-spy -s n --description "Number of top servers" complete -f -c apt-spy -a "update" --description "Update mirror list" complete -f -c apt-spy -s v --description "Version number" fish/share/completions/apt-src.fish000066400000000000000000000033121214535744100176760ustar00rootroot00000000000000#apt-src complete -c apt-src -s h -l help --description "Display help and exit" complete -f -c apt-src -a "update" --description "Update list of source packages" complete -f -c apt-src -a "install" --description "Install source packages" complete -f -c apt-src -a "upgrade" --description "Upgrade source packages" complete -f -c apt-src -a "remove" --description "Remove source packages" complete -f -c apt-src -a "build" --description "Build source packages" complete -f -c apt-src -a "clean" --description "Clean source packages" complete -f -c apt-src -a "import" --description "Detect known source tree" complete -f -c apt-src -a "list" --description "List installed source package\(s\)" complete -f -c apt-src -a "location" --description "Root source tree" complete -f -c apt-src -a "version" --description "Version of source package" complete -f -c apt-src -a "name" --description "Name of the source package" complete -f -c apt-src -s b -l build --description "Build source packages" complete -f -c apt-src -s i -l installdebs --description "Install after build" complete -f -c apt-src -s p -l patch --description "Patch local changes" complete -r -c apt-src -s l -l location --description "Specify a dir" complete -c apt-src -s c -l here --description "Run on current dir" complete -f -c apt-src -l upstream-version --description "Omit debian version" complete -f -c apt-src -s k -l keep-built --description "Do not del built files" complete -f -c apt-src -s n -l no-delete-source --description "Do not del source files" complete -f -c apt-src -l version --description "Source tree version" complete -f -c apt-src -s q -l quiet --description "Output to /dev/null" complete -f -c apt-src -s t -l trace --description "Output trace" fish/share/completions/apt-zip-inst.fish000066400000000000000000000011611214535744100206640ustar00rootroot00000000000000#apt-zip-inst complete -c apt-zip-inst -s h -l help --description "Display help and exit" complete -f -c apt-zip-inst -s V -l version --description "Display version and exit" complete -c apt-zip-inst -s m -l medium --description "Removable medium" complete -f -c apt-zip-inst -s a -l aptgetaction -a "dselect-upgrade upgrade dist-upgrade" --description "Select an action" complete -c apt-zip-inst -s p -l packages --description "List of packages to install" complete -f -c apt-zip-inst -s f -l fix-broken --description "Fix broken option" complete -c apt-zip-inst -l skip-mount --description "Specify a non-mountpoint dir" fish/share/completions/apt-zip-list.fish000066400000000000000000000017001214535744100206610ustar00rootroot00000000000000#apt-zip-list complete -c apt-zip-list -s h -l help --description "Display help and exit" complete -f -c apt-zip-list -s V -l version --description "Display version and exit" complete -c apt-zip-list -s m -l medium --description "Removable medium" complete -f -c apt-zip-list -s a -l aptgetaction -a "dselect-upgrade upgrade dist-upgrade" --description "Select an action" complete -c apt-zip-list -s p -l packages --description "List of packages to install" complete -f -c apt-zip-list -s f -l fix-broken --description "Fix broken option" complete -c apt-zip-list -l skip-mount --description "Specify a non-mountpoint dir" complete -c apt-zip-list -s M -l method --description "Select a method" complete -c apt-zip-list -s o -l options -a "tar restart" --description "Specify options" complete -c apt-zip-list -s A -l accept -a "http ftp" --description "Accept protocols" complete -c apt-zip-list -s R -l reject -a "http ftp" --description "Reject protocols" fish/share/completions/aptitude.fish000066400000000000000000000135561214535744100201570ustar00rootroot00000000000000#completion for aptitude function __fish_apt_no_subcommand --description 'Test if aptitude has yet to be given the subcommand' for i in (commandline -opc) if contains -- $i autoclean clean forget-new keep-all update safe-upgrade changelog full-upgrade download forbid-version hold install keep markauto purge reinstall remove show unhold unmarkauto search help return 1 end end return 0 end function __fish_apt_use_package --description 'Test if aptitude command should have packages as potential completion' for i in (commandline -opc) if contains -- $i changelog full-upgrade download forbid-version hold install keep-all markauto purge reinstall remove show unhold unmarkauto return 0 end end return 1 end complete -c aptitude -n '__fish_apt_use_package' -a '(__fish_print_packages)' --description 'Package' complete -c aptitude -s h -l help --description 'Display a brief help message. Identical to the help action' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'autoclean' --description 'Remove any cached packages which can no longer be downloaded' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'clean' --description 'Remove all downloaded .deb files from the package cache directory' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'forget-new' --description 'Forget all internal information about what packages are \'new\'' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'keep-all' --description 'Cancel all scheduled actions on all packages' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'update' --description 'Update the list of available packages from the apt sources' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'safe-upgrade' --description 'Upgrade installed packages to their most recent version' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'changelog' --description 'Download and displays the Debian changelog for the packages' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'full-upgrade' --description 'Upgrade, removing or installing packages as necessary' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'download' --description 'Download the packages to the current directory' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'forbid-version' --description 'Forbid the upgrade to a particular version' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'hold' --description 'Ignore the packages by future upgrade commands' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'install' --description 'Install the packages' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'keep' --description 'Cancel any scheduled actions on the packages' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'markauto' --description 'Mark packages as automatically installed' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'purge' --description 'Remove and delete all associated configuration and data files' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'reinstall' --description 'Reinstall the packages' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'remove' --description 'Remove the packages' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'show' --description 'Display detailed information about the packages' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'unhold' --description 'Consider the packages by future upgrade commands' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'unmarkauto' --description 'Mark packages as manually installed' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'search' --description 'Search for packages matching one of the patterns' complete -f -n '__fish_apt_no_subcommand' -c aptitude -a 'help' --description 'Display brief summary of the available commands and options' complete -c aptitude -s D -l show-deps --description 'Show explanations of automatic installations and removals' complete -c aptitude -s d -l download-only --description 'Download Only' complete -c aptitude -s f -l fix-broken --description 'Correct broken dependencies' complete -c aptitude -l purge-unused --description 'Purge packages that are not required by any installed package' complete -c aptitude -s P -l prompt --description 'Always display a prompt' complete -c aptitude -s R -l without-recommends --description 'Do not treat recommendations as dependencies' complete -c aptitude -s r -l with-recommends --description 'Treat recommendations as dependencies' complete -c aptitude -s s -l simulate --description 'Don\'t perform the actions. Just show them' complete -c aptitude -l schedule-only --description 'Schedule operations to be performed in the future' complete -c aptitude -s q -l quiet --description 'Suppress incremental progress indicators' complete -c aptitude -s V -l show-versions --description 'Show which versions of packages will be installed' complete -c aptitude -s v -l verbose --description 'Display extra information' complete -c aptitude -l version --description 'Display the version of aptitude and compile information' complete -c aptitude -l visual-preview --description 'Start up the visual interface and display its preview screen' complete -c aptitude -s y -l assume-yes --description 'Assume the answer yes for all question prompts' complete -c aptitude -s Z --description 'Show how much disk space will be used or freed' complete -r -c aptitude -s F -l display-format --description 'Specify the format to be used by the search command' complete -r -c aptitude -s t -l target-release --description 'Set the release from which packages should be installed' complete -r -c aptitude -s O -l sort --description 'Specify the order for the output from the search command' complete -r -c aptitude -s o --description 'Set a configuration file option directly' complete -r -c aptitude -s w -l width --description 'Specify the display width for the output from the search command' fish/share/completions/arepack.fish000066400000000000000000000000361214535744100177330ustar00rootroot00000000000000__fish_complete_atool arepack fish/share/completions/arp.fish000066400000000000000000000014741214535744100171160ustar00rootroot00000000000000#completion for arp complete -c arp -s v -l verbose --description "Verbose mode" complete -c arp -s n -l numeric --description "Numerical address" complete -x -c arp -s H -l tw-type -a "ether arcnet pronet ax25 netrom" --description "Class of hw type" complete -c arp -s a -l display -x -a "(__fish_print_hostnames)" --description "Show arp entries" complete -x -c arp -s d -l delete -a "(__fish_print_hostnames)" --description "Remove an entry for hostname" complete -c arp -s D -l use-device --description "Use hardware address" complete -x -c arp -s i -l device -a "(__fish_print_interfaces)" --description "Select interface" complete -x -c arp -s s -l set --description "Manually create ARP address" -a "(__fish_print_hostnames)" complete -f -c arp -s f -l file --description "Take addr from filename, default /etc/ethers" fish/share/completions/at.fish000066400000000000000000000010141214535744100167260ustar00rootroot00000000000000#at complete -f -c at -s V --description "Display version and exit" complete -f -c at -s q --description "Use specified queue" complete -f -c at -s m --description "Send mail to user" complete -c at -s f -x -a "(__fish_complete_suffix (commandline -ct) '' 'At job')" --description "Read job from file" complete -f -c at -s l --description "Alias for atq" complete -f -c at -s d --description "Alias for atrm" complete -f -c at -s v --description "Show the time" complete -f -c at -s c --description "Print the jobs listed" fish/share/completions/atd.fish000066400000000000000000000003751214535744100171030ustar00rootroot00000000000000#atd complete -f -c atd -s l --description "Limiting load factor" complete -f -c atd -s b --description "Minimum interval in seconds" complete -f -c atd -s d --description "Debug mode" complete -f -c atd -s s --description "Process at queue only once" fish/share/completions/atool.fish000066400000000000000000000000361214535744100174430ustar00rootroot00000000000000 __fish_complete_atool atool fish/share/completions/atq.fish000066400000000000000000000002031214535744100171060ustar00rootroot00000000000000#atq complete -f -c atq -s V --description "Display version and exit" complete -f -c atq -s q --description "Use specified queue" fish/share/completions/atrm.fish000066400000000000000000000001101214535744100172610ustar00rootroot00000000000000#atrm complete -f -c atrm -s V --description "Display version and exit" fish/share/completions/aunpack.fish000066400000000000000000000000361214535744100177470ustar00rootroot00000000000000__fish_complete_atool aunpack fish/share/completions/awk.fish000066400000000000000000000011451214535744100171110ustar00rootroot00000000000000# # Command specific completions for the awk command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c awk -s F --description 'Define the input field separator to be the extended regular expression ERE, before any input is read; see Regular Expressions' -r complete -c awk -s f --description 'Specify the pathname of the file progfile containing an awk program' -r complete -c awk -s v --description 'The application shall ensure that the assignment argument is in the same form as an assignment operand' -r fish/share/completions/badblocks.fish000066400000000000000000000030561214535744100202560ustar00rootroot00000000000000# # Command specific completions for the badblocks command. # These completions where generated from the commands # man page by the make_completions.py script, and # have been hand edited since. # complete -c badblocks -s b --description 'Block-size Specify the size of blocks in bytes' complete -c badblocks -s c --description 'Number of blocks is the number of blocks which are tested at a time' complete -c badblocks -s f --description 'Normally, badblocks will refuse to do a read/write or a nondestructive test on a device which is mounted, since either can cause the system to potentially crash and/or damage the filesys†tem even if it is mounted read-only' complete -c badblocks -s i --description 'Input_file Read a list of already existing known bad blocks' complete -c badblocks -s o --description 'Output_file Write the list of bad blocks to the specified file' complete -c badblocks -s p --description 'Repeat scanning the disk until there are no new blocks discovered in specified number of consecutive scans of the disk' complete -c badblocks -s t --description 'Test_pattern Specify a test pattern to be read (and written) to disk blocks' complete -c badblocks -s n --description 'Use non-destructive read-write mode' complete -c badblocks -s s --description 'Show the progress of the scan by writing out the block numbers as they are checked' complete -c badblocks -s v --description 'Verbose mode' complete -c badblocks -s w --description 'Use write-mode test' complete -c badblocks -s X --description 'Internal flag only to be used by e2fsck(8) and mke2fs(8)' fish/share/completions/bc.fish000066400000000000000000000010511214535744100167070ustar00rootroot00000000000000# Completions for the binary calculator complete -c bc -s i -l interactive --description "Force interactive mode" complete -c bc -s l -l math-lib --description "Define math library" complete -c bc -s w -l warn --description "Give warnings for extensions to POSIX bc" complete -c bc -s s -l standard --description "Process exactly POSIX bc" complete -c bc -s q -l quiet --description "Do not print the GNU welcome" complete -c bc -s v -l version --description "Display version and exit" complete -c bc -s h -l help --description "Display help and exit" fish/share/completions/bg.fish000066400000000000000000000001031214535744100167100ustar00rootroot00000000000000 complete -c bg -s h -l help --description 'Display help and exit' fish/share/completions/bind.fish000066400000000000000000000012001214535744100172330ustar00rootroot00000000000000 complete -c bind -s a -l all --description 'Show unavailable key bindings/erase all bindings' complete -c bind -s e -l erase --description 'Erase mode' complete -c bind -s f -l function-names --description 'Print names of available functions' complete -c bind -s h -l help --description "Display help and exit" complete -c bind -s k -l key --description 'Specify key name, not sequence' complete -c bind -s K -l key-names --description 'Print names of available keys' complete -c bind -n __fish_bind_test1 -a '(bind --key-names)' -d 'Key name' -x complete -c bind -n __fish_bind_test2 -a '(bind --function-names)' -d 'Function name' -x fish/share/completions/bison.fish000066400000000000000000000040121214535744100174350ustar00rootroot00000000000000# # Command specific completions for the bison command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c bison -s b -l file-prefix --description 'Specify a prefix to use for all bison output file names' -r complete -c bison -s d --description 'Write an extra output file containing macro definitions for the token type names defined in the grammar and the semantic value type YYSTYPE, as well as a few extern variable declarations' complete -c bison -l defines --description 'The behavior of --defines is the same than -d option' complete -c bison -s g --description 'Output a VCG definition of the LALR(1) grammar automaton com puted by Bison' complete -c bison -l graph --description 'The behavior of --graph is the same than -g option' complete -c bison -s k -l token-table --description 'This switch causes the name' complete -c bison -s l -l no-lines --description 'Dont put any #line preprocessor commands in the parser file' complete -c bison -s n -l no-parser --description 'Do not generate the parser code into the output; generate only declarations' complete -c bison -s o -l output --description 'Specify the name outfile for the parser file' complete -c bison -s p -l name-prefix --description 'Rename the external symbols used in the parser so that they start with prefix instead of yy' complete -c bison -s t -l debug --description 'In the parser file, define the macro YYDEBUG to 1 if it is not already defined, so that the debugging facilities are compiled' complete -c bison -s v -l verbose --description 'Write an extra output file containing verbose descriptions of the parser states and what is done for each type of look-ahead token in that state' complete -c bison -s V -l version --description 'Print the version number of bison and exit' complete -c bison -s h -l help --description 'Print a summary of the options to bison and exit' complete -c bison -s y -l yacc -l fixed-output-files --description 'Equivalent to -o y.tab.c' fish/share/completions/block.fish000066400000000000000000000005351214535744100174230ustar00rootroot00000000000000 complete -c block -s h -l help --description 'Display help and exit' complete -c block -s e -l erase --description 'Remove the topmost global event block' complete -c block -s l -l local --description 'Create a local (automatically erased) event block' complete -c block -s g -l global --description 'Create a global (manually erased) event block' fish/share/completions/break.fish000066400000000000000000000001061214535744100174070ustar00rootroot00000000000000 complete -c break -s h -l help --description 'Display help and exit' fish/share/completions/brew.fish000066400000000000000000000264511214535744100172750ustar00rootroot00000000000000function __fish_brew_needs_command set cmd (commandline -opc) if [ (count $cmd) -eq 1 -a $cmd[1] = 'brew' ] return 0 end return 1 end function __fish_brew_using_command set cmd (commandline -opc) if [ (count $cmd) -gt 1 ] if [ $argv[1] = $cmd[2] ] return 0 end end return 1 end function __fish_brew_formulae set -l formuladir (brew --repository)/Library/Formula/ # __fish_complete_suffix .rb ls $formuladir/*.rb | sed 's/.rb$//' | sed "s|^$formuladir||" end function __fish_brew_installed_formulas brew list end function __fish_brew_outdated_formulas brew outdated end ############ # commands # ############ # audit complete -f -c brew -n '__fish_brew_needs_command' -a audit -d 'Check formula' complete -f -c brew -n '__fish_brew_using_command audit' -a '(__fish_brew_formulae)' # cat complete -f -c brew -n '__fish_brew_needs_command' -a cat -d 'Display formula' complete -f -c brew -n '__fish_brew_using_command cat' -a '(__fish_brew_formulae)' # cleanup complete -f -c brew -n '__fish_brew_needs_command' -a cleanup -d 'Remove old installed versions' complete -f -c brew -n '__fish_brew_using_command cleanup' -l force -d 'Remove out-of-date keg-only brews as well' complete -f -c brew -n '__fish_brew_using_command cleanup' -s n -d 'Dry run' complete -f -c brew -n '__fish_brew_using_command cleanup' -s s -d 'Scrubs the cache' complete -f -c brew -n '__fish_brew_using_command cleanup' -a '(__fish_brew_installed_formulas)' # create complete -f -c brew -n '__fish_brew_needs_command' -a create -d 'Create new formula from URL' complete -f -c brew -n '__fish_brew_using_command create' -l cmake -d 'Use template for CMake-style build' complete -f -c brew -n '__fish_brew_using_command create' -l autotools -d 'Use template for Autotools-style build' complete -f -c brew -n '__fish_brew_using_command create' -l no-fetch -d 'Don\'t download URL' # deps complete -f -c brew -n '__fish_brew_needs_command' -a deps -d 'Show a formula\'s dependencies' complete -f -c brew -n '__fish_brew_using_command deps' -l 1 -d 'Show only 1 level down' complete -f -c brew -n '__fish_brew_using_command deps' -s n -d 'Show in topological order' complete -f -c brew -n '__fish_brew_using_command deps' -l tree -d 'Show dependencies as tree' complete -f -c brew -n '__fish_brew_using_command deps' -l all -d 'Show dependencies for all formulae' complete -f -c brew -n '__fish_brew_using_command deps' -a '(__fish_brew_formulae)' # diy complete -f -c brew -n '__fish_brew_needs_command' -a 'diy configure' -d 'Determine installation prefix for non-brew software' complete -f -c brew -n '__fish_brew_using_command diy' -l set-name -d 'Set name of package' complete -f -c brew -n '__fish_brew_using_command diy' -l set-version -d 'Set version of package' complete -f -c brew -n '__fish_brew_needs_command' -a 'doctor' -d 'Check your system for problems' complete -f -c brew -n '__fish_brew_needs_command' -a 'edit' -d 'Open brew/formula for editing' # fetch complete -f -c brew -n '__fish_brew_needs_command' -a fetch -d 'Download source for formula' complete -f -c brew -n '__fish_brew_using_command fetch' -l force -d 'Remove a previously cached version and re-fetch' complete -f -c brew -n '__fish_brew_using_command fetch' -l HEAD -d 'Download the HEAD version from a VCS' complete -f -c brew -n '__fish_brew_using_command fetch' -l deps -d 'Also download dependencies' complete -f -c brew -n '__fish_brew_using_command fetch' -s v -d 'Make HEAD checkout verbose' complete -f -c brew -n '__fish_brew_using_command fetch' -a '(__fish_brew_formulae)' complete -f -c brew -n '__fish_brew_needs_command' -a 'help' -d 'Display help' # home complete -f -c brew -n '__fish_brew_needs_command' -a home -d 'Open brew/formula\'s homepage' complete -c brew -n '__fish_brew_using_command home' -a '(__fish_brew_formulae)' # info complete -f -c brew -n '__fish_brew_needs_command' -a 'info abv' -d 'Display information about formula' complete -f -c brew -n '__fish_brew_using_command info' -l all -d 'Display info for all formulae' complete -f -c brew -n '__fish_brew_using_command info' -l github -d 'Open the GitHub History page for formula' complete -c brew -n '__fish_brew_using_command info' -a '(__fish_brew_formulae)' # install complete -f -c brew -n '__fish_brew_needs_command' -a 'install' -d 'Install formula' complete -f -c brew -n '__fish_brew_using_command install' -l force -d 'Force install' complete -f -c brew -n '__fish_brew_using_command install' -l debug -d 'If install fails, open shell in temp directory' complete -f -c brew -n '__fish_brew_using_command install' -l ignore-dependencies -d 'skip installing any dependencies of any kind' complete -f -c brew -n '__fish_brew_using_command install' -l fresh -d 'Don\'t re-use any options from previous installs' complete -f -c brew -n '__fish_brew_using_command install' -l use-clang -d 'Attempt to compile using clang' complete -f -c brew -n '__fish_brew_using_command install' -l use-gcc -d 'Attempt to compile using GCC' complete -f -c brew -n '__fish_brew_using_command install' -l use-llvm -d 'Attempt to compile using the LLVM' complete -f -c brew -n '__fish_brew_using_command install' -l build-from-source -d 'Compile from source even if a bottle is provided' complete -f -c brew -n '__fish_brew_using_command install' -l devel -d 'Install the development version of formula' complete -f -c brew -n '__fish_brew_using_command install' -l HEAD -d 'Install the HEAD version from VCS' complete -f -c brew -n '__fish_brew_using_command install' -l interactive -d 'Download and patch formula, then open a shell' complete -c brew -n '__fish_brew_using_command install' -a '(__fish_brew_formulae)' # link complete -f -c brew -n '__fish_brew_needs_command' -a 'link ln' -d 'Symlink installed formula' complete -f -c brew -n '__fish_brew_using_command link' -a '(__fish_brew_installed_formulas)' complete -f -c brew -n '__fish_brew_using_command ln' -a '(__fish_brew_installed_formulas)' # list complete -f -c brew -n '__fish_brew_needs_command' -a 'list ls' -d 'List all installed formula' complete -f -c brew -n '__fish_brew_using_command list' -l unbrewed -d 'List all files in the Homebrew prefix not installed by brew' complete -f -c brew -n '__fish_brew_using_command list' -l versions -d 'Show the version number' complete -c brew -n '__fish_brew_using_command list' -a '(__fish_brew_formulae)' #ls complete -f -c brew -n '__fish_brew_using_command ls' -l unbrewed -d 'List all files in the Homebrew prefix not installed by brew' complete -f -c brew -n '__fish_brew_using_command ls' -l versions -d 'Show the version number' complete -c brew -n '__fish_brew_using_command ls' -a '(__fish_brew_formulae)' # log complete -f -c brew -n '__fish_brew_needs_command' -a log -d 'Show log for formula' complete -c brew -n '__fish_brew_using_command log' -a '(__fish_brew_formulae)' -d 'formula' # missing complete -f -c brew -n '__fish_brew_needs_command' -a missing -d 'Check formula for missing dependencies' complete -c brew -n '__fish_brew_using_command missing' -a '(__fish_brew_formulae)' -d 'formula' # options complete -f -c brew -n '__fish_brew_needs_command' -a options -d 'Display install options for formula' complete -c brew -n '__fish_brew_using_command options' -a '(__fish_brew_formulae)' -d 'formula' # outdated complete -f -c brew -n '__fish_brew_needs_command' -a outdated -d 'Show formula that have updated versions' complete -f -c brew -n '__fish_brew_using_command outdated' -l quiet -d 'Display only names' # prune complete -f -c brew -n '__fish_brew_needs_command' -a prune -d 'Remove dead symlinks' # search complete -f -c brew -n '__fish_brew_needs_command' -a 'search -S' -d 'Search for formula by name' complete -f -c brew -n '__fish_brew_using_command search' -l macports -d 'Search on MacPorts' complete -f -c brew -n '__fish_brew_using_command search' -l fink -d 'Search on Fink' complete -f -c brew -n '__fish_brew_using_command -S' -l macports -d 'Search on MacPorts' complete -f -c brew -n '__fish_brew_using_command -S' -l fink -d 'Search on Fink' # tap complete -f -c brew -n '__fish_brew_needs_command' -a tap -d 'Tap a new formula repository on GitHub' # test complete -f -c brew -n '__fish_brew_needs_command' -a test -d 'Run tests for formula' complete -c brew -n '__fish_brew_using_command test' -a '(__fish_brew_formulae)' -d 'formula' # uninstall complete -f -c brew -n '__fish_brew_needs_command' -a 'uninstall remove rm' -d 'Uninstall formula' complete -f -c brew -n '__fish_brew_using_command uninstall' -a '(__fish_brew_installed_formulas)' complete -f -c brew -n '__fish_brew_using_command remove' -a '(__fish_brew_installed_formulas)' complete -f -c brew -n '__fish_brew_using_command rm' -a '(__fish_brew_installed_formulas)' complete -f -c brew -n '__fish_brew_using_command uninstall' -l force -d 'Delete all installed versions' complete -f -c brew -n '__fish_brew_using_command remove' -l force -d 'Delete all installed versions' complete -f -c brew -n '__fish_brew_using_command rm' -l force -d 'Delete all installed versions' # unlink complete -f -c brew -n '__fish_brew_needs_command' -a unlink -d 'Unlink formula' complete -c brew -n '__fish_brew_using_command unlink' -a '(__fish_brew_installed_formulas)' # untap complete -f -c brew -n '__fish_brew_needs_command' -a untap -d 'Remove a tapped repository' # update complete -f -c brew -n '__fish_brew_needs_command' -a update -d 'Fetch newest version of Homebrew and formulas' complete -f -c brew -n '__fish_brew_using_command update' -l rebase -d 'Use git pull --rebase' # upgrade complete -f -c brew -n '__fish_brew_needs_command' -a upgrade -d 'Upgrade outdated brews' complete -f -c brew -n '__fish_brew_using_command upgrade' -a '(__fish_brew_outdated_formulas)' # uses complete -f -c brew -n '__fish_brew_needs_command' -a uses -d 'Show formulas that depend on specified formula' complete -f -c brew -n '__fish_brew_using_command uses' -l installed -d 'List only installed formulae' complete -c brew -n '__fish_brew_using_command uses' -a '(__fish_brew_formulae)' # versions complete -f -c brew -n '__fish_brew_needs_command' -a versions -d 'List previous versions of formula' complete -f -c brew -n '__fish_brew_using_command versions' -l compact -d 'Show all options on a single line' complete -c brew -n '__fish_brew_using_command versions' -a '(__fish_brew_formulae)' ############ # switches # ############ complete -f -c brew -n '__fish_brew_needs_command' -a '-v --version' -d 'Print version number of brew' complete -f -c brew -n '__fish_brew_needs_command' -l repository -x -d 'Display where Homebrew\'s .git directory is located' complete -f -c brew -n '__fish_brew_needs_command' -l config -x -d 'Show Homebrew and system configuration' # --prefix complete -f -c brew -n '__fish_brew_needs_command' -l prefix -d 'Display Homebrew\'s install path' complete -f -c brew -n '__fish_brew_using_command --prefix' -a '(__fish_brew_formulae)' -d 'Display formula\'s install path' # --cache complete -f -c brew -n '__fish_brew_needs_command' -l cache -d 'Display Homebrew\'s download cache' complete -f -c brew -n '__fish_brew_needs_command' -n '__fish_brew_using_command --cache' -a '(__fish_brew_formulae)' -d 'Display the file or directory used to cache formula' # --cellar complete -f -c brew -n '__fish_brew_needs_command' -l cellar -d 'Display Homebrew\'s Cellar path' complete -f -c brew -n '__fish_brew_using_command --cellar' -a '(__fish_brew_formulae)' -d 'Display formula\'s install path in Cellar' fish/share/completions/btdownloadcurses.py.fish000066400000000000000000000000571214535744100223410ustar00rootroot00000000000000__fish_complete_bittorrent btdownloadcurses.py fish/share/completions/btdownloadheadless.py.fish000066400000000000000000000000611214535744100226200ustar00rootroot00000000000000__fish_complete_bittorrent btdownloadheadless.py fish/share/completions/builtin.fish000066400000000000000000000004261214535744100177760ustar00rootroot00000000000000 complete -c builtin -s h -l help --description 'Display help and exit' complete -c builtin -s n -l names --description 'Print names of all existing builtins' complete -c builtin -xa '(builtin -n)' complete -c builtin -n '__fish_use_subcommand' -xa '__fish_complete_subcommand' fish/share/completions/bunzip2.fish000066400000000000000000000012401214535744100177140ustar00rootroot00000000000000complete -c bunzip2 -x -a "( __fish_complete_suffix .tbz __fish_complete_suffix .tbz2 ) " complete -c bunzip2 -x -a "( __fish_complete_suffix .bz __fish_complete_suffix .bz2 ) " complete -c bunzip2 -s c -l stdout --description "Decompress to stdout" complete -c bunzip2 -s f -l force --description "Overwrite" complete -c bunzip2 -s k -l keep --description "Do not overwrite" complete -c bunzip2 -s s -l small --description "Reduce memory usage" complete -c bunzip2 -s v -l verbose --description "Print compression ratios" complete -c bunzip2 -s L -l license --description "Print license" complete -c bunzip2 -s V -l version --description "Display version and exit" fish/share/completions/bzcat.fish000066400000000000000000000003701214535744100174310ustar00rootroot00000000000000complete -c bzcat -x -a "( __fish_complete_suffix .tbz __fish_complete_suffix .tbz2 ) " complete -c bzcat -x -a "( __fish_complete_suffix .bz __fish_complete_suffix .bz2 ) " complete -c bzcat -s s -l small --description "Reduce memory usage" fish/share/completions/bzip2.fish000066400000000000000000000017611214535744100173610ustar00rootroot00000000000000complete -c bzip2 -s c -l stdout --description "Compress to stdout" complete -c bzip2 -s d -l decompress -x -a "( __fish_complete_suffix .tbz __fish_complete_suffix .tbz2 ) " complete -c bzip2 -s d -l decompress -x -a "( __fish_complete_suffix .bz __fish_complete_suffix .bz2 ) " complete -c bzip2 -s z -l compress --description "Compress file" complete -c bzip2 -s t -l test --description "Check integrity" complete -c bzip2 -s f -l force --description "Overwrite" complete -c bzip2 -s k -l keep --description "Do not overwrite" complete -c bzip2 -s s -l small --description "Reduce memory usage" complete -c bzip2 -s q -l quiet --description "Supress errors" complete -c bzip2 -s v -l verbose --description "Print compression ratios" complete -c bzip2 -s L -l license --description "Print license" complete -c bzip2 -s V -l version --description "Display version and exit" complete -c bzip2 -s 1 -l fast --description "Small block size" complete -c bzip2 -s 9 -l best --description "Large block size" fish/share/completions/bzip2recover.fish000066400000000000000000000003011214535744100207340ustar00rootroot00000000000000complete -c bzip2recover -x -a "( __fish_complete_suffix .tbz __fish_complete_suffix .tbz2 ) " complete -c bzip2recover -x -a "( __fish_complete_suffix .bz __fish_complete_suffix .bz2 ) " fish/share/completions/bzr.fish000066400000000000000000001401131214535744100171230ustar00rootroot00000000000000# # Command specific completions for the bzr command. # These completions were generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c bzr -l dry-run --description 'Show what would be done, but don\'t actually do anything' complete -c bzr -l file-ids-from --description 'ARG Lookup file ids from this tree' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-recurse --description 'Don\'t recursively add the contents of directories' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l dry-run --description 'Will show which files would be added, but not actually add them' complete -c bzr -l file-ids-from --description 'Will try to use the file ids from the supplied path' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l remove --description 'Remove the alias' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l all --description 'Show annotations on all lines' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l long --description 'Show commit date in annotations' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l show-ids --description 'Show internal object ids' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l bind --description 'Bind new branch to from location' complete -c bzr -l files-from --description 'ARG Get file contents from this tree' complete -c bzr -l hardlink --description 'Hard-link working tree files where possible' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-tree --description 'Create a branch without a working-tree' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l stacked --description 'Create a stacked branch referring to the source branch' complete -c bzr -l standalone --description 'Do not use a shared repository, even if available' complete -c bzr -l switch --description 'Switch the checkout in the current directory to the new branch' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l use-existing-dir --description 'By default branch will fail if the target directory exists, but does not already have a control directory' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l recursive -s R --description 'Recursively scan for branches rather than just looking in the specified location' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l config --description 'LOCATION is the directory where the config lock is' complete -c bzr -l force --description 'Do not ask for confirmation before breaking the lock' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l filters --description 'Apply content filters to display the convenience form' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l name-from-revision --description 'The path name in the old tree' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l branch --description 'Check the branch related to the current directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l repo --description 'Check the repository related to the current directory' complete -c bzr -l tree --description 'Check the working tree related to the current directory' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l files-from --description 'ARG Get file contents from this tree' complete -c bzr -l hardlink --description 'Hard-link working tree files where possible' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l lightweight --description 'Perform a lightweight checkout' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l detritus --description 'Delete conflict files, merge and revert backups, and failed selftest dirs' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l dry-run --description 'Show files to delete instead of deleting them' complete -c bzr -l force --description 'Do not prompt before deleting' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l ignored --description 'Delete all ignored files' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l unknown --description 'Delete files unknown to bzr (default)' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l author --description 'ARG Set the author\'s name, if it\'s different from the committer' complete -c bzr -l commit-time --description 'ARG Manually set a commit time using commit date format, e' complete -c bzr -l exclude --description 'ARG, -x Do not consider changes made to a given path' complete -c bzr -l file --description 'MSGFILE, -F Take commit message from this file' complete -c bzr -l fixes --description 'ARG Mark a bug as being fixed by this revision (see "bzr help bugs")' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l local --description 'Perform a local commit in a bound branch' complete -c bzr -l lossy --description 'When committing to a foreign version control system do not push data that can not be natively represented' complete -c bzr -l message --description 'ARG, -m Description of the new revision' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l show-diff -s p --description 'When no message is supplied, show the diff along with the status summary in the message editor' complete -c bzr -l strict --description 'Refuse to commit if there are unknown files in the working tree' complete -c bzr -l unchanged --description 'Commit even if nothing has changed' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l show-diff --description 'Option' complete -c bzr -l all --description 'Display all the defined values for the matching options' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l remove --description 'Remove the option from the configuration file' complete -c bzr -l scope --description 'ARG Reduce the scope to the specified configuration file' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l text --description 'List paths of files with text conflicts' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l show-ids --description 'Show internal object ids' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l change --description 'ARG, -c Select changes introduced by the specified revision' complete -c bzr -l diff-options --description 'ARG Pass these options to the external diff program' complete -c bzr -l format --description 'ARG, -F Diff format to use' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l new --description 'ARG Branch/tree to compare to' complete -c bzr -l old --description 'ARG Branch/tree to compare from' complete -c bzr -l prefix --description 'ARG, -p Set prefixes added to old and new filenames, as two values separated by a colon' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l using --description 'ARG Use this command to compare files' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to push from, rather than the one containing the working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-rebase --description 'Do not rebase after push' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l remember --description 'Remember the specified location as a default' complete -c bzr -l strict --description 'Refuse to push if there are uncommitted changes in the working tree, --no-strict disables the check' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l filters --description 'Apply content filters to export the convenient form' complete -c bzr -l format --description 'ARG Type of file to export to' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l per-file-timestamps --description 'Set modification time of files to that of the last revision in which it was changed' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l root --description 'ARG Name of the root directory inside the exported file' complete -c bzr -l uncommitted --description 'Export the working tree contents rather than that of the last revision' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l long --description 'Show help on all commands' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l default-rules --description 'Display the default ignore rules that bzr uses' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l append-revisions-only --description 'Never change revnos or the existing log' complete -c bzr -l create-prefix --description 'Create the path leading up to the branch if it does not already exist' complete -c bzr -l format --description 'ARG Specify a format for this branch' complete -c bzr -l 2a --description 'Format for the bzr 2' complete -c bzr -l default --description 'Format for the bzr 2' complete -c bzr -l development-colo --description 'The 2a format with experimental support for colocated branches' complete -c bzr -l pack-0.92 --description 'Pack-based format used in 1' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-tree --description 'Create a branch without a working tree' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l format --description 'ARG Specify a format for this repository' complete -c bzr -l 2a --description 'Format for the bzr 2' complete -c bzr -l default --description 'Format for the bzr 2' complete -c bzr -l development-colo --description 'The 2a format with experimental support for colocated branches' complete -c bzr -l pack-0.92 --description 'Pack-based format used in 1' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-trees --description 'Branches in the repository will default to not having a working tree' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l authors --description 'ARG What names to list as authors - first, all or committer' complete -c bzr -l change --description 'ARG, -c Show just the specified revision' complete -c bzr -l exclude-common-ancestry --description 'Display only the revisions that are not part of both ancestries (require -rX' complete -c bzr -l forward --description 'Show from oldest to newest' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l include-merged --description 'Show merged revisions like --levels 0 does' complete -c bzr -l levels --description 'N, -n Number of levels to display - 0 for all, 1 for flat' complete -c bzr -l limit --description 'N, -l Limit the output to the first N revisions' complete -c bzr -l log-format --description 'ARG Use specified log format' complete -c bzr -l gnu-changelog --description 'Format used by GNU ChangeLog files' complete -c bzr -l line --description 'Log format with one line per revision' complete -c bzr -l long --description 'Detailed log format' complete -c bzr -l short --description 'Moderately short log format' complete -c bzr -l match --description 'ARG, -m Show revisions whose properties match this expression' complete -c bzr -l match-author --description 'ARG Show revisions whose authors match this expression' complete -c bzr -l match-bugs --description 'ARG Show revisions whose bugs match this expression' complete -c bzr -l match-committer --description 'ARG Show revisions whose committer matches this expression' complete -c bzr -l match-message --description 'ARG Show revisions whose message matches this expression' complete -c bzr -l omit-merges --description 'Do not report commits with more than one parent' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l show-diff -s p --description 'Show changes made in each revision as a patch' complete -c bzr -l show-ids --description 'Show internal object ids' complete -c bzr -l signatures --description 'Show digital signature validity' complete -c bzr -l timezone --description 'ARG Display timezone as local, original, or utc' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Show files changed in each revision' complete -c bzr -s l --description 'N display a maximum of N revisions -n N display N levels of revisions (0 for all, 1 for collapsed) -v display a status summary (delta) for each revision -p display a diff (patch) for each revision --show-ids display revision-ids (and file-ids), not just revnos' complete -c bzr -o rX --description 'Display revision X -rX' complete -c bzr -o r..Y --description 'Display up to and including revision Y -rX' complete -c bzr -o r-1 --description 'Show just the tip -r-10' complete -c bzr -o rsubmit:.. --description 'Show what\'s new on this branch -rancestor:path' complete -c bzr -o rdate:yesterday.. --description 'Show changes since yesterday' complete -c bzr -l match-message --description 'Can be used to only match a specific field' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l from-root --description 'Print paths relative to the root of the branch' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l ignored -s i --description 'Print ignored files' complete -c bzr -l kind --description 'ARG, -k List entries of a particular kind: file, directory, symlink' complete -c bzr -l null -s 0 --description 'Use an ASCII NUL (\0) separator rather than a newline' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l recursive -s R --description 'Recurse into subdirectories' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l show-ids --description 'Show internal object ids' complete -c bzr -l unknown -s u --description 'Print unknown files' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l versioned -s V --description 'Print versioned files' complete -c bzr -l change --description 'ARG, -c Select changes introduced by the specified revision' complete -c bzr -l directory --description 'ARG, -d Branch to merge into, rather than the one containing the working directory' complete -c bzr -l force --description 'Merge even if the destination tree has uncommitted changes' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l interactive -s i --description 'Select changes interactively' complete -c bzr -l merge-type --description 'ARG Select a particular merge algorithm' complete -c bzr -l diff3 --description 'Merge using external diff3' complete -c bzr -l lca --description 'LCA-newness merge' complete -c bzr -l merge3 --description 'Native diff3-style merge' complete -c bzr -l weave --description 'Weave-based merge' complete -c bzr -l preview --description 'Instead of merging, show a diff of the merge' complete -c bzr -l pull --description 'If the destination is already completely merged into the source, pull from the source rather than merging' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l remember --description 'Remember the specified location as a default' complete -c bzr -l reprocess --description 'Reprocess to reduce spurious conflicts' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l show-base --description 'Show base revision text in conflicts' complete -c bzr -l uncommitted --description 'Apply uncommitted changes from a working copy, instead of branch changes' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l include-merged --description 'Show all revisions in addition to the mainline ones' complete -c bzr -l log-format --description 'ARG Use specified log format' complete -c bzr -l gnu-changelog --description 'Format used by GNU ChangeLog files' complete -c bzr -l line --description 'Log format with one line per revision' complete -c bzr -l long --description 'Detailed log format' complete -c bzr -l short --description 'Moderately short log format' complete -c bzr -l mine-only --description 'Display changes in the local branch only' complete -c bzr -l my-revision --description 'ARG Filter on local branch revisions (inclusive)' complete -c bzr -l other --description 'Same as --theirs-only' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l reverse --description 'Reverse the order of revisions' complete -c bzr -l revision --description 'ARG, -r Filter on other branch revisions (inclusive)' complete -c bzr -l show-ids --description 'Show internal object ids' complete -c bzr -l theirs-only --description 'Display changes in the remote branch only' complete -c bzr -l this --description 'Same as --mine-only' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l parents -s p --description 'No error if existing, make parent directories as needed' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l after --description 'Move only the bzr identifier of the file, because the file has already been moved' complete -c bzr -l auto --description 'Automatically guess renames' complete -c bzr -l dry-run --description 'Avoid making changes when guessing renames' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l clean-obsolete-packs --description 'Delete obsolete packs to save disk space' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l verbose --description 'Shows the path where each plugin is located' complete -c bzr -l directory --description 'ARG, -d Branch to pull into, rather than the one containing the working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l local --description 'Perform a local pull in a bound branch' complete -c bzr -l overwrite --description 'Ignore differences between branches and overwrite unconditionally' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l remember --description 'Remember the specified location as a default' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l show-base --description 'Show base revision text in conflicts' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Show logs of pulled revisions' complete -c bzr -l create-prefix --description 'Create the path leading up to the branch if it does not already exist' complete -c bzr -l directory --description 'ARG, -d Branch to push from, rather than the one containing the working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-tree --description 'Don\'t populate the working tree, even for protocols that support it' complete -c bzr -l overwrite --description 'Ignore differences between branches and overwrite unconditionally' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l remember --description 'Remember the specified location as a default' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l stacked --description 'Create a stacked branch that references the public location of the parent branch' complete -c bzr -l stacked-on --description 'ARG Create a stacked branch that refers to another branch for the commit history' complete -c bzr -l strict --description 'Refuse to push if there are uncommitted changes in the working tree, --no-strict disables the check' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l use-existing-dir --description 'By default push will fail if the target directory exists, but does not already have a control directory' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l bind-to --description 'ARG Branch to bind checkout to' complete -c bzr -l force --description 'Perform reconfiguration even if local changes will be lost' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l repository_trees --description 'ARG Whether new branches in the repository have trees' complete -c bzr -l with-no-trees --description 'Reconfigure repository to not create working trees on branches by default' complete -c bzr -l with-trees --description 'Reconfigure repository to create working trees on branches by default' complete -c bzr -l repository_type --description 'ARG Location fo the repository' complete -c bzr -l standalone --description 'Reconfigure to be a standalone branch (i' complete -c bzr -l use-shared --description 'Reconfigure to use a shared repository' complete -c bzr -l stacked-on --description 'ARG Reconfigure a branch to be stacked on another branch' complete -c bzr -l tree_type --description 'ARG The relation between branch and tree' complete -c bzr -l branch --description 'Reconfigure to be an unbound branch with no working tree' complete -c bzr -l checkout --description 'Reconfigure to be a bound branch with a working tree' complete -c bzr -l lightweight-checkout --description 'Reconfigure to be a lightweight checkout (with no local history)' complete -c bzr -l tree --description 'Reconfigure to be an unbound branch with a working tree' complete -c bzr -l unstacked --description 'Reconfigure a branch to be unstacked' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l merge-type --description 'ARG Select a particular merge algorithm' complete -c bzr -l diff3 --description 'Merge using external diff3' complete -c bzr -l lca --description 'LCA-newness merge' complete -c bzr -l merge3 --description 'Native diff3-style merge' complete -c bzr -l weave --description 'Weave-based merge' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l reprocess --description 'Reprocess to reduce spurious conflicts' complete -c bzr -l show-base --description 'Show base revision text in conflicts' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l file-deletion-strategy --description 'ARGThe file deletion mode to be used' complete -c bzr -l force --description 'Delete all the specified files, even if they can not be recovered and even if they are non-empty directories' complete -c bzr -l keep --description 'Delete from bzr but leave the working copy' complete -c bzr -l no-backup --description 'Don\'t backup changed files' complete -c bzr -l safe --description 'Backup changed files (default)' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l new --description 'Only remove files that have never been committed' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l force --description 'Remove branch even if it is the active branch' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l force --description 'Remove the working tree even if it has uncommitted or shelved changes' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l action --description 'ARG How to resolve the conflict' complete -c bzr -l done --description 'Marks the conflict as resolved' complete -c bzr -l take-other --description 'Resolve the conflict taking the merged version into account' complete -c bzr -l take-this --description 'Resolve the conflict preserving the version in the working tree' complete -c bzr -l all --description 'Resolve all conflicts in this tree' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l forget-merges --description 'Remove pending merge marker, without changing any files' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-backup --description 'Do not save backups of reverted files' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l tree --description 'Show revno of working tree' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l body --description 'ARG Body for the email' complete -c bzr -l format --description 'ARG Use the specified output format' complete -c bzr -l from --description 'ARG, -f Branch to generate the submission from, rather than the one containing the working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l mail-to --description 'ARG Mail the request to this address' complete -c bzr -l message --description 'ARG, -m Message string' complete -c bzr -l no-bundle --description 'Do not include a bundle in the merge directive' complete -c bzr -l no-patch --description 'Do not include a preview patch in the merge directive' complete -c bzr -l output --description 'ARG, -o Write merge directive to this file or directory; use - for stdout' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l remember --description 'Remember submit and public branch' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l strict --description 'Refuse to send if there are uncommitted changes in the working tree, --no-strict disables the check' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l allow-writes --description 'By default the server is a readonly server' complete -c bzr -l client-timeout --description 'ARG Override the default idle client timeout (5min)' complete -c bzr -l directory --description 'ARG, -d Serve contents of this directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l inet --description 'Serve on stdin/out for use from inetd or sshd' complete -c bzr -l port --description 'ARG Listen for connections on nominated port of the form [hostname:]portnumber' complete -c bzr -l protocol --description 'ARG Protocol to serve' complete -c bzr -l bzr --description 'The Bazaar smart server protocol over TCP' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l all --description 'Shelve all changes' complete -c bzr -l destroy --description 'Destroy removed changes instead of shelving them' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l list --description 'List shelved changes' complete -c bzr -l message --description 'ARG, -m Message string' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l writer --description 'ARG Method to use for writing diffs' complete -c bzr -l plain --description 'Plaintext diff output' complete -c bzr -l dry-run --description 'Don\'t actually sign anything, just print the revisions that would be signed' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l change --description 'ARG, -c Select changes introduced by the specified revision' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l no-classify --description 'Do not mark object type using indicator' complete -c bzr -l no-pending --description 'Don\'t show pending merges' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l short -s S --description 'Use short status indicators' complete -c bzr -l show-ids --description 'Show internal object ids' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l versioned -s V --description 'Only show versioned files' complete -c bzr -l create-branch -s b --description 'Create the target branch from this one before switching to it' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l force --description 'Switch even if local commits will be lost' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l delete --description 'Delete this tag rather than placing it' complete -c bzr -l directory --description 'ARG, -d Branch in which to place the tag' complete -c bzr -l force --description 'Replace existing tags' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l delete --description 'Oldname``' complete -c bzr -l directory --description 'ARG, -d Branch whose tags should be displayed' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l show-ids --description 'Show internal object ids' complete -c bzr -l sort --description 'ARG Sort tags by different criteria' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l long --description 'Produce long-format testament' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l strict --description 'Produce a strict-format testament' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l dry-run --description 'Don\'t actually make changes' complete -c bzr -l force --description 'Say yes to all questions' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l keep-tags --description 'Keep tags that point to removed revisions' complete -c bzr -l local --description 'Only remove the commits from the local branch when in a checkout' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l verbose --description 'Will print out what is being removed' complete -c bzr -l dry-run --description 'Will go through all the motions, but not actually remove anything' complete -c bzr -l action --description 'ARG The action to perform' complete -c bzr -l apply --description 'Apply changes and remove from the shelf' complete -c bzr -l delete-only --description 'Delete changes without applying them' complete -c bzr -l dry-run --description 'Show changes, but do not apply or remove them' complete -c bzr -l keep --description 'Apply changes but don\'t delete them' complete -c bzr -l preview --description 'Instead of unshelving the changes, show the diff that would result from unshelving' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l show-base --description 'Show base revision text in conflicts' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l clean --description 'Remove the backup' complete -c bzr -l dry-run --description 'Show what would be done, but don\'t actually do anything' complete -c bzr -l format --description 'ARG Upgrade to a specific format' complete -c bzr -l 2a --description 'Format for the bzr 2' complete -c bzr -l default --description 'Format for the bzr 2' complete -c bzr -l development-colo --description 'The 2a format with experimental support for colocated branches' complete -c bzr -l pack-0.92 --description 'Pack-based format used in 1' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l acceptable-keys --description 'ARG, -k Comma separated list of GPG key patterns which are acceptable for verification' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l short --description 'Print just the version number' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l all --description 'Include all possible information' complete -c bzr -l check-clean --description 'Check if tree is clean' complete -c bzr -l format --description 'ARG Select the output format' complete -c bzr -l custom --description 'Version info in Custom template-based format' complete -c bzr -l python --description 'Version info in Python format' complete -c bzr -l rio --description 'Version info in RIO (simple text) format (default)' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l include-file-revisions --description 'Include the last revision for each file' complete -c bzr -l include-history --description 'Include the revision-history' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l revision --description 'ARG, -r See "help revisionspec" for details' complete -c bzr -l template --description 'ARG Template for the output' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l template --description 'VERSION_INFO \"Project 1' complete -c bzr -l all --description 'Apply list or delete action to all views' complete -c bzr -l delete --description 'Delete the view' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l name --description 'ARG Name of the view to define, list or delete' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l switch --description 'ARG Name of the view to switch to' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' complete -c bzr -l branch --description 'Set identity for the current branch instead of globally' complete -c bzr -l directory --description 'ARG, -d Branch to operate on, instead of working directory' complete -c bzr -l email --description 'Display email address only' complete -c bzr -l help -s h --description 'Show help message' complete -c bzr -l quiet -s q --description 'Only display errors and warnings' complete -c bzr -l usage --description 'Show usage message and options' complete -c bzr -l verbose -s v --description 'Display more information' fish/share/completions/cabal-dev.fish000066400000000000000000000000631214535744100201430ustar00rootroot00000000000000complete -c cabal-dev -a '(__fish_complete_cabal)' fish/share/completions/cabal.fish000066400000000000000000000000571214535744100173720ustar00rootroot00000000000000complete -c cabal -a '(__fish_complete_cabal)' fish/share/completions/cancel.fish000066400000000000000000000001651214535744100175550ustar00rootroot00000000000000__fish_complete_lpr cancel complete -c cancel -s u -d 'Cancel jobs owned by username' -xa '(__fish_complete_users)' fish/share/completions/case.fish000066400000000000000000000001311214535744100172340ustar00rootroot00000000000000 complete -c case -s h -l help --description 'Display help and exit' complete -c case -u fish/share/completions/cat.fish000066400000000000000000000014701214535744100170770ustar00rootroot00000000000000complete -c cat -s A -l show-all --description "Escape all non-printing characters" complete -c cat -s b -l number-nonblank --description "Number nonblank lines" complete -c cat -s e --description "Escape non-printing characters except tab" complete -c cat -s E -l show-ends --description "Display \$ at end of line" complete -c cat -s n -l number --description "Number all lines" complete -c cat -s s -l squeeze-blank --description "Never more than single blank line" complete -c cat -s t --description "Escape non-printing characters except newline" complete -c cat -s T -l show-tabs --description "Escape tab" complete -c cat -s v --description "Escape non-printing except newline and tab" complete -c cat -l help --description "Display help and exit" complete -c cat -l version --description "Display version and exit" fish/share/completions/cd.fish000066400000000000000000000001571214535744100167170ustar00rootroot00000000000000 complete -x -c cd -a "(__fish_complete_cd)" complete -c cd -s h -l help --description 'Display help and exit' fish/share/completions/cdrecord.fish000066400000000000000000000223271214535744100201210ustar00rootroot00000000000000# # Completions for Cdrecord # complete -c cdrecord -o version --description "Display version and exit" complete -c cdrecord -s v --description "Increment the level of general verbosity by one" complete -c cdrecord -s V --description "Increment the verbose level in respect of SCSI command transport by one" complete -c cdrecord -a "debug={1,2,3,4,5}" --description "Set the misc debug value to #" complete -c cdrecord -s d --description "Increment the misc debug level by one" -a "1 2 3 4 5" complete -c cdrecord -s s -o silent --description "Do not print out a status report for failed SCSI commands" complete -c cdrecord -o force --description "Force to continue on some errors" complete -c cdrecord -o immed --description "Tell cdrecord to set the SCSI IMMED flag in certain commands" complete -c cdrecord -a "minbuf={25,35,45,55,65,75,85,95}" --description "Defines the minimum drive buffer fill ratio for the experimental ATAPI wait mode intended to free the IDE bus to allow hard disk and CD/DVD writer on the same IDE cable" complete -c cdrecord -o dummy --description "Complete CD/DVD-Recorder recording process with the laser turned off" complete -c cdrecord -o clone --description "Tells cdrecord to handle images created by readcd -clone" complete -c cdrecord -o dao complete -c cdrecord -o sao --description "Set SAO (Session At Once) mode, usually called Disk At Once mode" complete -c cdrecord -o tao --description "Set TAO (Track At Once) writing mode" complete -c cdrecord -o raw --description "Set RAW writing mode" complete -c cdrecord -o raw96r --description "Select Set RAW writing, the preferred raw writing mode" complete -c cdrecord -o raw96p --description "Select Set RAW writing, the less preferred raw writing mode" complete -c cdrecord -o raw16 --description "Select Set RAW writing, the preferred raw writing mode if raw96r is not supported" complete -c cdrecord -o multi --description "Allow multi session CDs to be made" complete -c cdrecord -o msinfo --description "Retrieve multi session info in a form suitable for mkisofs-1.10 or later" complete -c cdrecord -o toc --description "Retrieve and print out the table of content or PMA of a CD" complete -c cdrecord -o atip --description "Retrieve and print out the ATIP (absolute Time in Pre-groove) info" complete -c cdrecord -o fix --description "The disk will only be fixated" complete -c cdrecord -o nofix --description "Do not fixate the disk after writing the tracks" complete -c cdrecord -o waiti --description "Wait for input to become available on standard input before trying to open the SCSI driver" complete -c cdrecord -o load --description "Load the media and exit" complete -c cdrecord -o lock --description "Load the media, lock the door and exit" complete -c cdrecord -o eject --description "Eject disk after doing the work" complete -c cdrecord -a "speed={0,150,172,1385}" --description "Set the speed factor of the writing process to #" complete -c cdrecord -a "blank={help,all,fast,track,unreserve,trtail,unclose,session}" --description "Blank a CD-RW and exit or blank a CD-RW before writing" complete -c cdrecord -o format --description "Format a CD-RW/DVD-RW/DVD+RW disc" complete -c cdrecord -a "fs=" --description "Set the FIFO (ring buffer) size to #" complete -c cdrecord -a "ts=" --description "Set the maximum transfer size for a single SCSI command to #" complete -c cdrecord -a "dev=" --description "Sets the SCSI target for the CD/DVD-Recorder" complete -c cdrecord -a "gracetime=" --description "Set the grace time before starting to write to ># seconds" complete -c cdrecord -a "timeout=" --description "Set the default SCSI command timeout value to # seconds" complete -c cdrecord -a "driver={help,mmc_cd,mmc_cd_dvd,mmc_cdr,mmc_cdr_sony,mmc_dvd,mmc_dvdplus,mmc_dvdplusr,mmc_dvdplusrw,cw_7501,kodak_pcd_600,philips_cdd521,philips_cdd521_old,philips_cdd522,philips_dumb,pioneer_dws114x,plasmon_rf4100,ricoh_ro1060c,ricoh_ro1420c,scsi2_cd,sony_cdu924,teac_cdr50,tyuden_ew50,yamaha_cdr100,cdr_simul,dvd_simul}" --description "Allows the user to manually select a driver for the device" # TODO: This argument accepts a comma separated list of arguments complete -c cdrecord -a "driveropts=" --description "Set driver specific options" complete -c cdrecord -o setdropts --description "Set the driveropts specified by driveropts=option list, the speed of the drive and the dummy flag and exit" complete -c cdrecord -o checkdrive --description "Checks if a driver for the current drive is present and exit" complete -c cdrecord -o prcap --description "Print the drive capabilities for SCSI-3/mmc compliant drives as obtained from mode page 0x2A" complete -c cdrecord -o inq --description "Do an inquiry for the drive, print the inquiry info and exit" complete -c cdrecord -o scanbus --description "Scan all SCSI devices on all SCSI busses and print the inquiry strings" complete -c cdrecord -o reset --description "Try to reset the SCSI bus where the CD recorder is located" complete -c cdrecord -o abort --description "Try to send an abort sequence to the drive" complete -c cdrecord -o overburn --description "Allow cdrecord to write more than the official size of a medium" complete -c cdrecord -o ignsize --description "Ignore the known size of the medium, use for debugging only" complete -c cdrecord -o useinfo --description "Use *.inf files to overwrite audio options" complete -c cdrecord -a "defpregap=" --description "Set the default pre-gap size for all tracks except track nr 1" complete -c cdrecord -o packet --description "Set Packet writing mode (experimental interface)" complete -c cdrecord -a "pktsize=" --description "Set the packet size to #, forces fixed packet mode (experimental)" complete -c cdrecord -o noclose --description "Do not close the current track, only when in packet writing mode (experimental)" complete -c cdrecord -a "mcn=" --description "Set the Media Catalog Number of the CD" complete -c cdrecord -o text --description "Write CD-Text info based on info taken from a file that contains ascii info for the text strings" complete -c cdrecord -a "textfile=" --description "Write CD-Text based on info found in the binary file filename" complete -c cdrecord -a "cuefile=" --description "Take all recording related info from a CDRWIN compliant CUE sheet file" # These completions are TRACK OPTIONS complete -c cdrecord -a "isrc=" --description "Set the International Standard Recording Number for the next track" complete -c cdrecord -a "index=" --description "Sets an index list for the next track" complete -c cdrecord -o audio --description "All subsequent tracks are written in CD-DA audio format" complete -c cdrecord -o swab --description "Audio data is assumed to be in byte-swapped (little-endian) order" complete -c cdrecord -o data --description "All subsequent tracks are written in CD-ROM mode 1 (Yellow Book) format" complete -c cdrecord -o mode2 --description "All subsequent tracks are written in CD-ROM mode 2 format" complete -c cdrecord -o xa --description "All subsequent tracks are written in CD-ROM XA mode 2 form 1 format" complete -c cdrecord -o xa1 --description "All subsequent tracks are written in CD-ROM XA mode 2 form 1 format" complete -c cdrecord -o xa2 --description "All subsequent tracks are written in CD-ROM XA mode 2 form 2 format" complete -c cdrecord -o xamix --description "All subsequent tracks are written in a way that allows a mix of CD-ROM XA mode 2 form 1/2 format" complete -c cdrecord -o cdi --description "The TOC type for the disk is set to CDI, with XA only" complete -c cdrecord -o isosize --description "Use the ISO-9660 file system size as the size of the next track" complete -c cdrecord -o pad --description "15 sectors of zeroed data will be added to the end of this and each subsequent data track" complete -c cdrecord -a "padsize=" --description "Set the amount of data to be appended as padding to the next track" complete -c cdrecord -o nopad --description "Do not pad the following tracks - the default" complete -c cdrecord -o shorttrack --description "Allow all subsequent tracks to violate the Red Book track length standard (min 4 s)" complete -c cdrecord -o noshorttrack --description "Re-enforce the Red Book track length standard (min 4 s)" complete -c cdrecord -a "pregap=" --description "Set the pre-gap size for the next track" complete -c cdrecord -o preemp --description "All TOC entries for subsequent audio tracks will indicate that the audio data has been sampled with 50/15 microsec pre-emphasis" complete -c cdrecord -o nopreemp --description "All TOC entries for subsequent audio tracks will indicate that the audio data has been mastered with linear data" complete -c cdrecord -o copy --description "All TOC entries for subsequent audio tracks of the resulting CD will indicate that the audio data has permission to be copied without limit" complete -c cdrecord -o nocopy --description "All TOC entries for subsequent audio tracks of the resulting CD will indicate that the audio data has permission to be copied only once for personal use" complete -c cdrecord -o scms --description "All TOC entries for subsequent audio tracks of the resulting CD will indicate that the audio data has no permission to be copied" complete -c cdrecord -a "tsize=" --description "If the master image for the next track has been stored on a raw disk, use this option to specify the valid amount of data on this disk" fish/share/completions/chgrp.fish000066400000000000000000000014571214535744100174400ustar00rootroot00000000000000 complete -c chgrp -s c -l changes --description "Output diagnostic for changed files" complete -c chgrp -l dereference --description "Dereference symbolic links" complete -c chgrp -s h -l no-dereference --description "Do not dereference symbolic links" complete -c chgrp -l from --description "Change from owner/group" complete -c chgrp -s f -l silent --description "Suppress errors" complete -c chgrp -l reference --description "Use same owner/group as file" -r complete -c chgrp -s R -l recursive --description "Operate recursively" complete -c chgrp -s v -l verbose --description "Output diagnostic for every file" complete -c chgrp -s h -l help --description "Display help and exit" complete -c chgrp -l version --description "Display version and exit" complete -c chgrp -d Group -a "(__fish_complete_groups)" fish/share/completions/chmod.fish000066400000000000000000000017161214535744100174250ustar00rootroot00000000000000# # Command specific completions for the chmod command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c chmod -s c -l changes --description 'Like verbose but report only when a change is made' complete -c chmod -l no-preserve-root --description 'Do not treat / specially (the default)' complete -c chmod -l preserve-root --description 'Fail to operate recursively on /' complete -c chmod -s f -l silent -l quiet --description 'Suppress most error messages' complete -c chmod -s v -l verbose --description 'Output a diagnostic for every file processed' complete -c chmod -l reference --description 'Use RFILEs mode instead of MODE values' -r complete -c chmod -s R -l recursive --description 'Change files and directories recursively' complete -c chmod -l help --description 'Display help and exit' complete -c chmod -l version --description 'Display version and exit' fish/share/completions/chown.fish000066400000000000000000000016621214535744100174510ustar00rootroot00000000000000complete -c chown -s c -l changes --description "Output diagnostic for changed files" complete -c chown -l dereference --description "Dereference symbolic links" complete -c chown -s h -l no-dereference --description "Do not dereference symbolic links" complete -c chown -l from --description "Change from owner/group" complete -c chown -s f -l silent --description "Suppress errors" complete -c chown -l reference --description "Use same owner/group as file" -r complete -c chown -s R -l recursive --description "Operate recursively" complete -c chown -s v -l verbose --description "Output diagnostic for every file" complete -c chown -s h -l help --description "Display help and exit" complete -c chown -l version --description "Display version and exit" complete -c chown --description "Username" -a "(__fish_print_users):" complete -c chown --description "Username" -a "(echo (commandline -ct)|sgrep -o '.*:')(cat /etc/group |cut -d : -f 1)" fish/share/completions/chsh.fish000066400000000000000000000005711214535744100172560ustar00rootroot00000000000000# # Completions for the chsh command # # This grep tries to match nonempty lines that do not start with hash complete -c chsh -s s -l shell -x -a "(sgrep '^[^#]' /etc/shells)" -d "Specify your login shell" complete -c chsh -s u -l help -d "Display help and exit" complete -c chsh -s v -l version -d "Display version and exit" complete -x -c chsh -a "(__fish_complete_users)" fish/share/completions/colordiff.fish000066400000000000000000000000661214535744100202770ustar00rootroot00000000000000# Completions for diff __fish_complete_diff colordiff fish/share/completions/colorsvn.fish000066400000000000000000000000361214535744100201720ustar00rootroot00000000000000__fish_complete_svn colorsvn fish/share/completions/combine.fish000066400000000000000000000007171214535744100177470ustar00rootroot00000000000000complete -c combine -d 'Combine sets of lines from two files using boolean operations' complete -c combine -a and -d 'Output lines that are in both files' complete -c combine -a not -d 'Output lines that are inf file1 but not in file2' complete -c combine -a or -d 'Output lines that are in file1 or in file2' complete -c combine -a xor -d 'Output lines that are in either file1 or file2, but not in both files' complete -c combine -a - -d 'Read file from stdin' fish/share/completions/command.fish000066400000000000000000000002361214535744100177450ustar00rootroot00000000000000 complete -c command -s h -l help --description 'Display help and exit' complete -c command --description "Command to run" -xa "(__fish_complete_subcommand)" fish/share/completions/commandline.fish000066400000000000000000000024101214535744100206110ustar00rootroot00000000000000 complete -c commandline -s h -l help --description "Display help and exit" complete -c commandline -s a -l append --description "Add text to the end of the selected area" complete -c commandline -s i -l insert --description "Add text at cursor" complete -c commandline -s r -l replace --description "Replace selected part" complete -c commandline -s j -l current-job --description "Select job under cursor" complete -c commandline -s p -l current-process --description "Select process under cursor" complete -c commandline -s t -l current-token --description "Select token under cursor" complete -c commandline -s b -l current-buffer --description "Select entire command line (default)" complete -c commandline -s c -l cut-at-cursor --description "Only return that part of the command line before the cursor" complete -c commandline -s f -l function --description "Inject readline functions to reader" complete -c commandline -s o -l tokenize --description "Print each token on a separate line" complete -c commandline -s I -l input --description "Specify command to operate on" complete -c commandline -s C -l cursor --description "Set/get cursor position, not buffer contents" complete -c commandline -n __fish_commandline_test -a '(bind --function-names)' -d 'Function name' -x fish/share/completions/compare.fish000066400000000000000000000116001214535744100177520ustar00rootroot00000000000000complete -c compare -o alpha -d 'On, activate, off, deactivate, set, opaque, copy transparent, extract, background, or shape [option]' -xa '(compare -list alpha)' complete -c compare -o authenticate -d 'Decipher image with this password [password]' complete -c compare -o channel -d 'Apply option to select image channels [type]' -xa '(compare -list channel)' complete -c compare -o colorspace -d 'Alternate image colorspace [type]' -xa '(compare -list colorspace)' complete -c compare -o compose -d 'Set image composite operator [operator]' complete -c compare -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(compare -list compress)' complete -c compare -o decipher -d 'Convert cipher pixels to plain pixels [filename]' -r complete -c compare -o define -d 'Define one or more image format options [format:option]' complete -c compare -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c compare -o depth -d 'Image depth [value]' complete -c compare -o dissimilarity-threshold -d 'Maximum distortion for (sub)image match [value]' complete -c compare -o encipher -d 'Convert plain pixels to cipher pixels [filename]' -r complete -c compare -o extract -d 'Extract area from image [geometry]' complete -c compare -o format -d 'Output formatted image characteristics ["string"]' complete -c compare -o fuzz -d 'Colors within this distance are considered equal [distance]' complete -c compare -o highlight-color -d 'Emphasize pixel differences with this color [color]' -xa '(__fish_complete_convert_options color)' complete -c compare -o identify -d 'Identify the format and characteristics of the image' complete -c compare -o interlace -d 'Type of image interlacing scheme [type]' -xa '(compare -list interlace)' complete -c compare -o limit -d 'Pixel cache resource limit [type value]' -x complete -c compare -o lowlight-color -d 'De-emphasize pixel differences with this color [color]' -xa '(__fish_complete_convert_options color)' complete -c compare -o metric -d 'Measure differences between images with this metric [type]' -xa '(compare -list metric)' complete -c compare -o monitor -d 'Monitor progress ' complete -c compare -o passphrase -d 'Get the passphrase from this file [filename]' -r complete -c compare -o profile -d 'Add, delete, or apply an image profile [filename]' -r complete -c compare -o quality -d 'JPEG/MIFF/PNG compression level [value]' complete -c compare -o quiet -d 'Suppress all warning messages' complete -c compare -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(compare -list colorspace)' complete -c compare -o regard-warnings -d 'Pay attention to warning messages' complete -c compare -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c compare -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c compare -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c compare -o set -d 'Attribute set an image attribute [ value]' complete -c compare -o size -d 'Width and height of image [geometry]' complete -c compare -o subimage-search -d 'Search for subimage' complete -c compare -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c compare -o type -d 'Image type [type]' -xa '(compare -list type)' complete -c compare -o verbose -d 'Print detailed information about the image' complete -c compare -o version -d 'Print version information' complete -c compare -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(compare -list virtual-pixel)' complete -c compare -o debug -d 'Display copious debugging information [events]' -xa '(compare -list debug)' complete -c compare -o help -d 'Print program options' complete -c compare -o list -d 'Print a list of supported option arguments [type]' -xa '(compare -list list)' complete -c compare -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c compare -o synchronize -d 'Synchronize image to storage device' complete -c compare -o taint -d 'Declare the image as modified' fish/share/completions/complete.fish000066400000000000000000000024771214535744100201500ustar00rootroot00000000000000complete -c complete -s c -l command --description "Command to add completion to" -r complete -c complete -s p -l path --description "Path to add completion to" complete -c complete -s s -l short-option --description "Posix-style option to complete" complete -c complete -s l -l long-option --description "GNU-style option to complete" complete -c complete -s o -l old-option --description "Old style long option to complete" complete -c complete -s f -l no-files --description "Do not use file completion" complete -c complete -s r -l require-parameter --description "Require parameter" complete -c complete -s x -l exclusive --description "Require parameter and do not use file completion" complete -c complete -s a -l arguments --description "A list of possible arguments" complete -c complete -s d -l description --description "Description of this completions" complete -c complete -s u -l unauthorative --description "Option list is not complete" complete -c complete -s e -l erase --description "Remove completion" complete -c complete -s h -l help --description "Display help and exit" complete -c complete -s C -l do-complete --description "Print all completions for the specified commandline" complete -c complete -s n -l condition --description "The completion should only be used if the specified command has a zero exit status" -r fish/share/completions/composite.fish000066400000000000000000000216131214535744100203330ustar00rootroot00000000000000complete -c composite -o affine -d 'Affine transform matrix [matrix]' complete -c composite -o alpha -d 'On, activate, off, deactivate, set, opaque, copy transparent, extract, background, or shape [option]' -xa '(convert -list alpha)' complete -c composite -o authenticate -d 'Decipher image with this password [password]' complete -c composite -o blue-primary -d 'Chromaticity blue primary point [point]' complete -c composite -o channel -d 'Apply option to select image channels [type]' -xa '(convert -list channel)' complete -c composite -o colorspace -d 'Alternate image colorspace [type]' -xa '(convert -list colorspace)' complete -c composite -o comment -d 'Annotate image with comment [string]' complete -c composite -o compose -d 'Composite operator [operator]' complete -c composite -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(convert -list compress)' complete -c composite -o define -d 'Define one or more image format options [format:option]' complete -c composite -o depth -d 'Image depth [value]' complete -c composite -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c composite -o display -d 'Get image or font from this X server [server]' complete -c composite -o dispose -d 'Layer disposal method [method]' -xa '(convert -list dispose)' complete -c composite -o dither -d 'Apply error diffusion to image [method]' -xa '(convert -list dither)' complete -c composite -o encoding -d 'Encoding type [type text]' -xa '(__fish_print_encodings)' complete -c composite -o endian -d 'Endianness (MSB or LSB) of the image [type]' -xa '(convert -list endian)' complete -c composite -o filter -d 'Use this filter when resizing an image [type]' -xa '(convert -list filter)' complete -c composite -o font -d 'Render text with this font [name]' -xa '(__fish_complete_convert_options font)' complete -c composite -o format -d 'Output formatted image characteristics ["string"]' complete -c composite -o gravity -d 'Which direction to gravitate towards [type]' -xa '(convert -list gravity)' complete -c composite -o green-primary -d 'Chromaticity green primary point [point]' complete -c composite -o interlace -d 'Type of image interlacing scheme [type]' -xa '(convert -list interlace)' complete -c composite -o interpolate -d 'Pixel color interpolation method [method]' -xa '(convert -list interpolate)' complete -c composite -o label -d 'Assign a label to an image [string]' complete -c composite -o limit -d 'Pixel cache resource limit [type value]' -x complete -c composite -o monitor -d 'Monitor progress ' complete -c composite -o page -d 'Size and location of an image canvas (setting) [geometry]' complete -c composite -o pointsize -d 'Font point size [value]' complete -c composite -o quality -d 'JPEG/MIFF/PNG compression level [value]' complete -c composite -o quiet -d 'Suppress all warning messages' complete -c composite -o red-primary -d 'Chromaticity red primary point [point]' complete -c composite -o regard-warnings -d 'Pay attention to warning messages' complete -c composite -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c composite -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c composite -o scene -d 'Image scene number [value]' complete -c composite -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c composite -o size -d 'Width and height of image [geometry]' complete -c composite -o synchronize -d 'Synchronize image to storage device' complete -c composite -o taint -d 'Declare the image as modified' complete -c composite -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c composite -o treedepth -d 'Color tree depth [value]' complete -c composite -o tile -d 'Repeat composite operation across and down image' complete -c composite -o units -d 'The units of image resolution [type]' -xa '(convert -list units)' complete -c composite -o verbose -d 'Print detailed information about the image' complete -c composite -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(convert -list virtual-pixel)' complete -c composite -o white-point -d 'Chromaticity white point [point]' complete -c composite -o blend -d 'Blend images [geometry]' complete -c composite -o border -d 'Surround image with a border of color [geometry]' complete -c composite -o bordercolor -d 'Border color [color]' -xa '(__fish_complete_convert_options color)' complete -c composite -o colors -d 'Preferred number of colors in the image [value]' complete -c composite -o decipher -d 'Convert cipher pixels to plain pixels [filename]' -r complete -c composite -o displace -d 'Shift lookup according to a relative displacement map [geometry]' complete -c composite -o dissolve -d 'Dissolve the two images a given percent [value]' complete -c composite -o distort -d 'Shift lookup according to a absolute distortion map [geometry]' complete -c composite -o encipher -d 'Convert plain pixels to cipher pixels [filename]' -r complete -c composite -o extract -d 'Extract area from image [geometry]' complete -c composite -o geometry -d 'Location of the composite image [geometry]' complete -c composite -o identify -d 'Identify the format and characteristics of the image' complete -c composite -o monochrome -d 'Transform image to black and white' complete -c composite -o negate -d 'Replace every pixel with its complementary color ' complete -c composite -o profile -d 'Add ICM or IPTC information profile to image [filename]' -r complete -c composite -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(convert -list colorspace)' complete -c composite -o repage -d 'Size and location of an image canvas (operator) [geometry]' complete -c composite -o rotate -d 'Apply Paeth rotation to the image [degrees]' complete -c composite -o resize -d 'Resize the image [geometry]' complete -c composite -o sharpen -d 'Sharpen the image [geometry]' complete -c composite -o shave -d 'Shave pixels from the image edges [geometry]' complete -c composite -o stegano -d 'Offset hide watermark within an image' complete -c composite -o stereo -d 'Combine two image to create a stereo anaglyph [geometry]' complete -c composite -o strip -d 'Strip image of all profiles and comments' complete -c composite -o thumbnail -d 'Create a thumbnail of the image [geometry]' complete -c composite -o transform -d 'Affine transform image' complete -c composite -o type -d 'Image type [type]' -xa '(convert -list type)' complete -c composite -o unsharp -d 'Sharpen the image [geometry]' complete -c composite -o watermark -d 'Percent brightness and saturation of a watermark [geometry]' complete -c composite -o write -d 'Write images to this file [filename]' -r complete -c composite -o swap -d 'Swap two images in the image sequence [indexes]' complete -c composite -o debug -d 'Display copious debugging information [events]' -xa '(convert -list debug)' complete -c composite -o help -d 'Print program options' complete -c composite -o list -d 'Print a list of supported option arguments [type]' -xa '(convert -list list)' complete -c composite -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c composite -o version -d 'Print version information' complete -c composite -o matte -d 'Store matte channel if the image has one' complete -c composite -o support -d 'Resize support: > 1.0 is blurry, < 1.0 is sharp [factor]' fish/share/completions/configure.fish000066400000000000000000000023141214535744100203070ustar00rootroot00000000000000complete -c configure -s h -l help -x -a "short recursive" --description "Display help and exit" complete -c configure -s V -l version --description "Display version and exit" complete -c configure -s q -l quiet --description "Quiet mode" complete -c configure -l cache-file -f --description "Cache test results in specified file" complete -c configure -s C -l config-cache --description "Cache test results in file config.cache" complete -c configure -s n -l no-create --description "Do not create output files" complete -c configure -l srcdir --description "Set source directory" -a "__fish_complete_directories (commandline -ct)" -x complete -c configure -l prefix --description "Architecture-independent install directory" -a "__fish_complete_directories (commandline -ct)" -x complete -c configure -l exec-prefix --description "Architecture-dependent install directory" -a "__fish_complete_directories (commandline -ct)" -x complete -c configure -l build --description "Configure for building on BUILD" -x complete -c configure -l host --description "Cross-compile to build programs to run on HOST" -x complete -c configure -l target --description "Configure for building compilers for TARGET" -x complete -c configure -u fish/share/completions/conjure.fish000066400000000000000000000016721214535744100200010ustar00rootroot00000000000000complete -c conjure -o monitor -d 'Monitor progress ' complete -c conjure -o quiet -d 'Suppress all warning messages' complete -c conjure -o regard-warnings -d 'Pay attention to warning messages' complete -c conjure -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c conjure -o verbose -d 'Print detailed information about the image' complete -c conjure -o debug -d 'Display copious debugging information [events]' -xa '(convert -list debug)' complete -c conjure -o help -d 'Print program options' complete -c conjure -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' #complete -c conjure -o list -d 'Print a list of supported option arguments [type]' -xa '(convert -list list)' fish/share/completions/continue.fish000066400000000000000000000001121214535744100201440ustar00rootroot00000000000000 complete -c continue -s h -l help --description 'Display help and exit' fish/share/completions/convert.fish000066400000000000000000000673641214535744100200260ustar00rootroot00000000000000complete -c convert -o adjoin -d 'Join images into a single multi-image file' complete -c convert -o affine -d 'Affine transform matrix [matrix]' complete -c convert -o alpha -d 'Activate, deactivate, reset, or set the alpha channel [option]' -xa '(convert -list alpha)' complete -c convert -o antialias -d 'Remove pixel-aliasing ' complete -c convert -o authenticate -d 'Decipher image with this password [password]' complete -c convert -o attenuate -d 'Lessen (or intensify) when adding noise to an image [value]' complete -c convert -o background -d 'Background color [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o bias -d 'Add bias when convolving an image [value]' complete -c convert -o black-point-compensation -d 'Use black point compensation' complete -c convert -o blue-primary -d 'Chromaticity blue primary point [point]' complete -c convert -o bordercolor -d 'Border color [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o caption -d 'Assign a caption to an image [string]' complete -c convert -o channel -d 'Apply option to select image channels [type]' -xa '(convert -list channel)' complete -c convert -o colors -d 'Preferred number of colors in the image [value]' complete -c convert -o colorspace -d 'Alternate image colorspace [type]' -xa '(convert -list colorspace)' complete -c convert -o comment -d 'Annotate image with comment [string]' complete -c convert -o compose -d 'Set image composite operator [operator]' complete -c convert -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(convert -list compress)' complete -c convert -o define -d 'Define one or more image format options [format:option]' complete -c convert -o delay -d 'Display the next image after pausing [value]' complete -c convert -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c convert -o depth -d 'Image depth [value]' complete -c convert -o direction -d 'Render text right-to-left or left-to-right [type]' -xa '(convert -list direction)' complete -c convert -o display -d 'Get image or font from this X server [server]' complete -c convert -o dispose -d 'Layer disposal method [method]' -xa '(convert -list dispose)' complete -c convert -o dither -d 'Apply error diffusion to image [method]' -xa '(convert -list dither)' complete -c convert -o encoding -d 'Encoding type [type text]' -xa '(__fish_print_encodings)' complete -c convert -o endian -d 'Endianness (MSB or LSB) of the image [type]' -xa '(convert -list endian)' complete -c convert -o family -d 'Render text with this font family [name]' -xa '(__fish_complete_convert_options family)' complete -c convert -o fill -d 'Color to use when filling a graphic primitive [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o filter -d 'Use this filter when resizing an image [type]' -xa '(convert -list filter)' complete -c convert -o font -d 'Render text with this font [name]' -xa '(__fish_complete_convert_options font)' complete -c convert -o format -d 'Output formatted image characteristics ["string"]' complete -c convert -o fuzz -d 'Colors within this distance are considered equal [distance]' complete -c convert -o gravity -d 'Horizontal and vertical text placement [type]' -xa '(convert -list gravity)' complete -c convert -o green-primary -d 'Chromaticity green primary point [point]' complete -c convert -o intent -d 'Type of rendering intent when managing the image color [type]' -xa '(convert -list intent)' complete -c convert -o interlace -d 'Type of image interlacing scheme [type]' -xa '(convert -list interlace)' complete -c convert -o interline-spacing -d 'Set the space between two text lines [value]' complete -c convert -o interpolate -d 'Pixel color interpolation method [method]' -xa '(convert -list interpolate)' complete -c convert -o interword-spacing -d 'Set the space between two words [value]' complete -c convert -o kerning -d 'Set the space between two letters [value]' complete -c convert -o label -d 'Assign a label to an image [string]' complete -c convert -o limit -d 'Pixel cache resource limit [type value]' -x complete -c convert -o loop -d 'Add Netscape loop extension to your GIF animation [iterations]' complete -c convert -o mask -d 'Associate a mask with the image [filename]' -r complete -c convert -o mattecolor -d 'Frame color [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o monitor -d 'Monitor progress ' complete -c convert -o orient -d 'Image orientation [type]' -xa '(convert -list orientation)' complete -c convert -o page -d 'Size and location of an image canvas (setting) [geometry]' complete -c convert -o ping -d 'Efficiently determine image attributes' complete -c convert -o pointsize -d 'Font point size [value]' complete -c convert -o precision -d 'Maximum number of significant digits to print [value]' complete -c convert -o preview -d 'Image preview type [type]' -xa '(convert -list preview)' complete -c convert -o quality -d 'JPEG/MIFF/PNG compression level [value]' complete -c convert -o quiet -d 'Suppress all warning messages' complete -c convert -o red-primary -d 'Chromaticity red primary point [point]' complete -c convert -o regard-warnings -d 'Pay attention to warning messages' complete -c convert -o remap -d 'Transform image colors to match this set of colors [filename]' -r complete -c convert -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c convert -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c convert -o scene -d 'Image scene number [value]' complete -c convert -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c convert -o size -d 'Width and height of image [geometry]' complete -c convert -o stretch -d 'Render text with this font stretch [type]' -xa '(convert -list stretch)' complete -c convert -o stroke -d 'Graphic primitive stroke color [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o strokewidth -d 'Graphic primitive stroke width [value]' complete -c convert -o style -d 'Render text with this font style [type]' -xa '(convert -list style)' complete -c convert -o synchronize -d 'Synchronize image to storage device' complete -c convert -o taint -d 'Declare the image as modified' complete -c convert -o texture -d 'Name of texture to tile onto the image background [filename]' -r complete -c convert -o tile-offset -d 'Tile offset [geometry]' complete -c convert -o treedepth -d 'Color tree depth [value]' complete -c convert -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o undercolor -d 'Annotation bounding box color [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o units -d 'The units of image resolution [type]' -xa '(convert -list units)' complete -c convert -o verbose -d 'Print detailed information about the image' complete -c convert -o view -d 'FlashPix viewing transforms' complete -c convert -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(convert -list virtual-pixel)' complete -c convert -o weight -d 'Render text with this font weight [type]' -x complete -c convert -o white-point -d 'Chromaticity white point [point]' complete -c convert -o adaptive-blur -d 'Adaptively blur pixels; decrease effect near edges [geometry]' complete -c convert -o adaptive-resize -d 'Adaptively resize image using \'mesh\' interpolation [geometry]' complete -c convert -o adaptive-sharpen -d 'Adaptively sharpen pixels; increase effect near edges [geometry]' complete -c convert -o annotate -d 'Annotate the image with text [geometry text]' complete -c convert -o auto-gamma -d 'Automagically adjust gamma level of image' complete -c convert -o auto-level -d 'Automagically adjust color levels of image' complete -c convert -o auto-orient -d 'Automagically orient (rotate) image' complete -c convert -o bench -d 'Measure performance [iterations]' complete -c convert -o black-threshold -d 'Force all pixels below the threshold into black [value]' complete -c convert -o blue-shift -d 'Simulate a scene at nighttime in the moonlight [factor]' complete -c convert -o blur -d 'Reduce image noise and reduce detail levels [geometry]' complete -c convert -o border -d 'Surround image with a border of color [geometry]' complete -c convert -o brightness-contrast -d 'Improve brightness / contrast of the image [geometry]' complete -c convert -o cdl -d 'Color correct with a color decision list [filename]' -r complete -c convert -o charcoal -d 'Simulate a charcoal drawing [radius]' complete -c convert -o chop -d 'Remove pixels from the image interior [geometry]' complete -c convert -o clamp -d 'Restrict pixel range from 0 to the quantum depth' complete -c convert -o clip -d 'Clip along the first path from the 8BIM profile' complete -c convert -o clip-mask -d 'Associate a clip mask with the image [filename]' -r complete -c convert -o clip-path -d 'Clip along a named path from the 8BIM profile [id]' complete -c convert -o colorize -d 'Colorize the image with the fill color [value]' complete -c convert -o color-matrix -d 'Apply color correction to the image [matrix]' complete -c convert -o contrast -d 'Enhance or reduce the image contrast' complete -c convert -o contrast-stretch -d 'Improve contrast by `stretching\' the intensity range [geometry]' complete -c convert -o convolve -d 'Apply a convolution kernel to the image [coefficients]' complete -c convert -o cycle -d 'Cycle the image colormap [amount]' complete -c convert -o decipher -d 'Convert cipher pixels to plain pixels [filename]' -r complete -c convert -o deskew -d 'Straighten an image [threshold]' complete -c convert -o despeckle -d 'Reduce the speckles within an image' complete -c convert -o distort -d 'Args distort images according to given method ad args [method]' -xa '(convert -list distort)' complete -c convert -o draw -d 'Annotate the image with a graphic primitive [string]' complete -c convert -o edge -d 'Apply a filter to detect edges in the image [radius]' complete -c convert -o encipher -d 'Convert plain pixels to cipher pixels [filename]' -r complete -c convert -o emboss -d 'Emboss an image [radius]' complete -c convert -o enhance -d 'Apply a digital filter to enhance a noisy image' complete -c convert -o equalize -d 'Perform histogram equalization to an image' complete -c convert -o evaluate -d 'Evaluate an arithmetic, relational, or logical expression [operator value]' complete -c convert -o extent -d 'Set the image size [geometry]' complete -c convert -o extract -d 'Extract area from image [geometry]' complete -c convert -o fft -d 'Implements the discrete Fourier transform (DFT)' complete -c convert -o flip -d 'Flip image vertically' complete -c convert -o floodfill -d 'Color floodfill the image with color [geometry]' complete -c convert -o flop -d 'Flop image horizontally' complete -c convert -o frame -d 'Surround image with an ornamental border [geometry]' complete -c convert -o function -d 'Apply function over image values [name parameters]' -xa '(convert -list function)' complete -c convert -o gamma -d 'Level of gamma correction [value]' complete -c convert -o gaussian-blur -d 'Reduce image noise and reduce detail levels [geometry]' complete -c convert -o geometry -d 'Preferred size or location of the image [geometry]' complete -c convert -o identify -d 'Identify the format and characteristics of the image' complete -c convert -o ift -d 'Implements the inverse discrete Fourier transform (DFT)' complete -c convert -o implode -d 'Implode image pixels about the center [amount]' complete -c convert -o lat -d 'Local adaptive thresholding [geometry]' complete -c convert -o layers -d 'Optimize, merge, or compare image layers [method]' -xa '(convert -list layers)' complete -c convert -o level -d 'Adjust the level of image contrast [value]' complete -c convert -o level-colors -d 'Level image with the given colors [color,color]' -xa '(__fish_complete_list , "__fish_complete_convert_options color")' complete -c convert -o linear-stretch -d 'Improve contrast by `stretching with saturation\' [geometry]' complete -c convert -o liquid-rescale -d 'Rescale image with seam-carving [geometry]' complete -c convert -o median -d 'Apply a median filter to the image [geometry]' complete -c convert -o mode -d 'Make each pixel the \'predominant color\' of the neighborhood [geometry]' complete -c convert -o modulate -d 'Vary the brightness, saturation, and hue [value]' complete -c convert -o monochrome -d 'Transform image to black and white' complete -c convert -o morphology -d 'Apply a morphology method to the image [method kernel]' -xa '(convert -list morphology)' complete -c convert -o motion-blur -d 'Simulate motion blur [geometry]' complete -c convert -o negate -d 'Replace every pixel with its complementary color ' complete -c convert -o noise -d 'Add or reduce noise in an image [geometry]' complete -c convert -o normalize -d 'Transform image to span the full range of colors' complete -c convert -o opaque -d 'Change this color to the fill color [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o ordered-dither -d 'Add a noise pattern to the image with specific amplitudes [NxN]' complete -c convert -o paint -d 'Simulate an oil painting [radius]' complete -c convert -o polaroid -d 'Simulate a Polaroid picture [angle]' complete -c convert -o posterize -d 'Reduce the image to a limited number of color levels [levels]' complete -c convert -o profile -d 'Add, delete, or apply an image profile [filename]' -r complete -c convert -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(convert -list colorspace)' complete -c convert -o radial-blur -d 'Radial blur the image [angle]' complete -c convert -o raise -d 'Lighten/darken image edges to create a 3-D effect [value]' complete -c convert -o random-threshold -d 'Random threshold the image [low,high]' complete -c convert -o region -d 'Apply options to a portion of the image [geometry]' complete -c convert -o render -d 'Render vector graphics' complete -c convert -o repage -d 'Size and location of an image canvas [geometry]' complete -c convert -o resample -d 'Change the resolution of an image [geometry]' complete -c convert -o resize -d 'Resize the image [geometry]' complete -c convert -o roll -d 'Roll an image vertically or horizontally [geometry]' complete -c convert -o rotate -d 'Apply Paeth rotation to the image [degrees]' complete -c convert -o sample -d 'Scale image with pixel sampling [geometry]' complete -c convert -o scale -d 'Scale the image [geometry]' complete -c convert -o segment -d 'Segment an image [values]' complete -c convert -o selective-blur -d 'Selectively blur pixels within a contrast threshold [geometry]' complete -c convert -o sepia-tone -d 'Simulate a sepia-toned photo [threshold]' complete -c convert -o set -d 'Set an image property [property value]' complete -c convert -o shade -d 'Shade the image using a distant light source [degrees]' complete -c convert -o shadow -d 'Simulate an image shadow [geometry]' complete -c convert -o sharpen -d 'Sharpen the image [geometry]' complete -c convert -o shave -d 'Shave pixels from the image edges [geometry]' complete -c convert -o shear -d 'Slide one edge of the image along the X or Y axis [geometry]' complete -c convert -o sigmoidal-contrast -d 'Increase the contrast without saturating highlights or shadows [geometry]' complete -c convert -o sketch -d 'Simulate a pencil sketch [geometry]' complete -c convert -o solarize -d 'Negate all pixels above the threshold level [threshold]' complete -c convert -o sparse-color -d 'Args fill in a image based on a few color points [method]' -xa '(convert -list sparse-color)' complete -c convert -o splice -d 'Splice the background color into the image [geometry]' complete -c convert -o spread -d 'Displace image pixels by a random amount [radius]' complete -c convert -o statistic -d 'Replace each pixel with corresponding statistic from the neighborhood [type geometry]' -xa '(convert -list statistic)' complete -c convert -o strip -d 'Strip image of all profiles and comments' complete -c convert -o swirl -d 'Swirl image pixels about the center [degrees]' complete -c convert -o threshold -d 'Threshold the image [value]' complete -c convert -o thumbnail -d 'Create a thumbnail of the image [geometry]' complete -c convert -o tile -d 'Tile image when filling a graphic primitive [filename]' -r complete -c convert -o tint -d 'Tint the image with the fill color [value]' complete -c convert -o transform -d 'Affine transform image' complete -c convert -o transparent -d 'Make this color transparent within the image [color]' -xa '(__fish_complete_convert_options color)' complete -c convert -o transpose -d 'Flip image vertically and rotate 90 degrees' complete -c convert -o transverse -d 'Flop image horizontally and rotate 270 degrees' complete -c convert -o trim -d 'Trim image edges' complete -c convert -o type -d 'Image type [type]' -xa '(convert -list type)' complete -c convert -o unique-colors -d 'Discard all but one of any pixel color' complete -c convert -o unsharp -d 'Sharpen the image [geometry]' complete -c convert -o vignette -d 'Soften the edges of the image in vignette style [geometry]' complete -c convert -o wave -d 'Alter an image along a sine wave [geometry]' complete -c convert -o white-threshold -d 'Force all pixels above the threshold into white [value]' complete -c convert -o append -d 'Append an image sequence' complete -c convert -o clut -d 'Apply a color lookup table to the image' complete -c convert -o coalesce -d 'Merge a sequence of images' complete -c convert -o combine -d 'Combine a sequence of images' complete -c convert -o composite -d 'Composite image ' complete -c convert -o crop -d 'Cut out a rectangular region of the image [geometry]' complete -c convert -o deconstruct -d 'Break down an image sequence into constituent parts' complete -c convert -o evaluate-sequence -d 'Evaluate an arithmetic, relational, or logical expression [operator]' complete -c convert -o flatten -d 'Flatten a sequence of images' complete -c convert -o fx -d 'Apply mathematical expression to an image channel(s) [expression]' complete -c convert -o hald-clut -d 'Apply a Hald color lookup table to the image' complete -c convert -o morph -d 'Morph an image sequence [value]' complete -c convert -o mosaic -d 'Create a mosaic from an image sequence' complete -c convert -o print -d 'Interpret string and print to console [string]' complete -c convert -o process -d 'Process the image with a custom image filter [arguments]' -xa '(convert -list filter)' complete -c convert -o separate -d 'Separate an image channel into a grayscale image' complete -c convert -o smush -d 'Smush an image sequence together [geometry]' complete -c convert -o write -d 'Write images to this file [filename]' -r complete -c convert -o clone -d 'Clone an image [indexes]' complete -c convert -o delete -d 'Delete the image from the image sequence [indexes]' complete -c convert -o duplicate -d 'Duplicate an image one or more times [count,indexes]' complete -c convert -o insert -d 'Insert last image into the image sequence [index]' complete -c convert -o reverse -d 'Reverse image sequence' complete -c convert -o swap -d 'Swap two images in the image sequence [indexes]' complete -c convert -o debug -d 'Display copious debugging information [events]' -xa '(convert -list debug)' complete -c convert -o help -d 'Print program options' complete -c convert -o list -d 'Print a list of supported option arguments [type]' -xa '(convert -list list)' complete -c convert -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c convert -o version -d 'Print version information' complete -c convert -o matte -d 'Store matte channel if the image has one' complete -c convert -o origin -d 'Image origin [geometry]' complete -c convert -o support -d 'Resize support: > 1.0 is blurry, < 1.0 is sharp [factor]' complete -c convert -o affinity -d 'Transform image colors to match this set of colors [filename]' -r fish/share/completions/cower.fish000066400000000000000000000040101214535744100174400ustar00rootroot00000000000000# Command specific completions for cower (an Archlinux AUR helper). # Written by SanskritFritz (gmail) complete -c cower -f -s b -l 'brief' -d 'Show output in a more script friendly format' complete -c cower -f -s d -l 'download' -d 'Download [twice to fetch dependencies]' complete -c cower -f -s i -l 'info' -d 'Show info for target [twice for more details]' complete -c cower -f -s m -l 'msearch' -d 'Search for packages by maintainer' complete -c cower -f -s s -l 'search' -d 'Search for packages by name' complete -c cower -f -s u -l 'update' -d 'Check AUR packages for updates' complete -c cower -f -s c -l 'color' -xa 'always auto never' -d 'Use colored output' complete -c cower -f -s v -l 'debug' -d 'Show debug output' complete -c cower -f -s f -l 'force' -d 'Overwrite existing files when downloading' complete -c cower -f -l 'format' -d 'Print formatted' complete -c cower -f -s h -l 'help' -d 'Display help and quit' complete -c cower -f -l 'ignore' -xa "(pacman -Qq)" -d 'Ignore a package upgrade' complete -c cower -f -l 'ignorerepo' -xa "(cat /etc/pacman.conf | grep '^\[.\+\]' | sed 's/[]\[]//g')" -d 'Ignore a binary repo when checking for updates' complete -c cower -f -l 'listdelim' -d 'Specify a delimiter for list formatters' complete -c cower -f -l 'nossl' -d 'No secure http connections to the AUR' complete -c cower -f -s q -l 'quiet' -d 'Output less' complete -c cower -f -s t -l 'target' -d 'Download targets to DIR' complete -c cower -f -l 'threads' -d 'Limit the number of threads created [10]' complete -c cower -f -l 'timeout' -d 'Curl timeout in seconds' complete -c cower -f -s v -l 'verbose' -d 'Output more' # Complete with AUR packages: complete -c cower -f --condition 'not expr -- (commandline --current-token) : "^\-.*" > /dev/null' --arguments '(cower --format="%n\n" --search (commandline --current-token))' fish/share/completions/cowsay.fish000066400000000000000000000012701214535744100176330ustar00rootroot00000000000000 complete -c cowsay -s e -d "Specify eye string" -r complete -c cowsay -s f -d "Specify cow file" -x -a '(cowsay -l|tail -n +2|tr \ \n)' complete -c cowsay -s h -d "Display help and exit" complete -c cowsay -s l -d "List all cowfiles" complete -c cowsay -s n -d "No word wrapping" complete -c cowsay -s T -d "Specify tounge string" complete -c cowsay -s W -d "Column width" -r complete -c cowsay -s b -d "Borg cow" complete -c cowsay -s d -d "Dead cow" complete -c cowsay -s g -d "Greedy cow" complete -c cowsay -s p -d "Paranoid cow" complete -c cowsay -s s -d "Stoned cow" complete -c cowsay -s t -d "Tired cow" complete -c cowsay -s w -d "Wired cow" complete -c cowsay -s y -d "Young cow" fish/share/completions/cowthink.fish000066400000000000000000000013301214535744100201510ustar00rootroot00000000000000 complete -c cowthink -s e -d "Specify eye string" -r complete -c cowthink -s f -d "Specify cow file" -x -a '(cowthink -l|tail -n +2|tr \ \n)' complete -c cowthink -s h -d "Display help and exit" complete -c cowthink -s l -d "List all cowfiles" complete -c cowthink -s n -d "No word wrapping" complete -c cowthink -s T -d "Specify tounge string" complete -c cowthink -s W -d "Column width" -r complete -c cowthink -s b -d "Borg cow" complete -c cowthink -s d -d "Dead cow" complete -c cowthink -s g -d "Greedy cow" complete -c cowthink -s p -d "Paranoid cow" complete -c cowthink -s s -d "Stoned cow" complete -c cowthink -s t -d "Tired cow" complete -c cowthink -s w -d "Wired cow" complete -c cowthink -s y -d "Young cow" fish/share/completions/cp.fish000066400000000000000000000047361214535744100167420ustar00rootroot00000000000000complete -c cp -s a -l archive --description "Same as -dpR" complete -c cp -s b -l backup --description "Make backup of each existing destination file" -a "none off numbered t existing nil simple never" complete -c cp -l copy-contents --description "Copy contents of special files when recursive" complete -c cp -s d --description "Same as --no-dereference --preserve=link" complete -c cp -s f -l force --description "Do not prompt before overwriting" complete -c cp -s i -l interactive --description "Prompt before overwrite" complete -c cp -s H --description "Follow command-line symbolic links" complete -c cp -s l -l link --description "Link files instead of copying" complete -c cp -l strip-trailing-slashes --description "Remove trailing slashes from source" complete -c cp -s S -l suffix -r --description "Backup suffix" complete -c cp -s t -l target-directory --description "Target directory" -x -a "(__fish_complete_directories (commandline -ct) 'Target directory')" complete -c cp -s u -l update --description "Do not overwrite newer files" complete -c cp -s v -l verbose --description "Verbose mode" complete -c cp -l help --description "Display help and exit" complete -c cp -l version --description "Display version and exit" complete -c cp -s L -l dereference --description "Always follow symbolic links" complete -c cp -s P -l no-dereference --description "Never follow symbolic links" complete -c cp -s p --description "Same as --preserve=mode,ownership,timestamps" complete -c cp -l preserve --description "Preserve the specified attributes and security contexts, if possible" -a "mode ownership timestamps links all" complete -c cp -l no-preserve -r --description "Don't preserve the specified attributes" -a "mode ownership timestamps links all" complete -c cp -l parents --description "Use full source file name under DIRECTORY" complete -c cp -s r -s R -l recursive --description "Copy directories recursively" complete -c cp -l remove-destination --description "Remove each existing destination file before attempting to open it (contrast with --force)" complete -c cp -l sparse -r --description "Control creation of sparse files" -a "always auto never" complete -c cp -s s -l symbolic-link --description "Make symbolic links instead of copying" complete -c cp -s T -l no-target-directory --description "Treat DEST as a normal file" complete -c cp -s x -l one-file-system --description "Stay on this file system" complete -c cp -s X -l context -r --description "Set security context of copy to CONTEXT" fish/share/completions/cupsaccept.fish000066400000000000000000000001221214535744100204530ustar00rootroot00000000000000__fish_complete_lpr cupsaccept complete -c cupsaccept -s r -d 'Accept reason' -x fish/share/completions/cupsdisable.fish000066400000000000000000000004741214535744100206310ustar00rootroot00000000000000__fish_complete_lpr cupsdisable complete -c cupsdisable -s c -d 'Cancels all jobs on the named destination' complete -c cupsdisable -l hold -d 'Holds remaining jobs on the named printer' complete -c cupsdisable -l release -d 'Releases pending jobs for printing' complete -c cupsdisable -s r -d 'Disable reason' -x fish/share/completions/cupsenable.fish000066400000000000000000000004661214535744100204550ustar00rootroot00000000000000__fish_complete_lpr cupsenable complete -c cupsenable -s c -d 'Cancels all jobs on the named destination' complete -c cupsenable -l hold -d 'Holds remaining jobs on the named printer' complete -c cupsenable -l release -d 'Releases pending jobs for printing' complete -c cupsenable -s r -d 'Cancel reason' -x fish/share/completions/cupsreject.fish000066400000000000000000000001221214535744100204700ustar00rootroot00000000000000__fish_complete_lpr cupsreject complete -c cupsreject -s r -d 'Reject reason' -x fish/share/completions/cut.fish000066400000000000000000000012411214535744100171170ustar00rootroot00000000000000complete -c cut -x complete -c cut -s b -l bytes -x --description "Output byte range" complete -c cut -s c -l characters -x --description "Output character range" complete -c cut -s d -l delimiter -x --description "Select field delimiter" complete -c cut -s d -l fields -x --description "Select fields" complete -c cut -s n --description "Don't split multi byte characters" complete -c cut -s s -l only-delimited --description "Do not print lines without delimiter" complete -c cut -l output-delimiter --description "Select output delimiter" complete -c cut -l help --description "Display help and exit" complete -c cut -l version --description "Display version and exit" fish/share/completions/cvs.fish000066400000000000000000001066171214535744100171340ustar00rootroot00000000000000 # # Completions for the cvs command # This file was autogenerated by the file make_vcs_completions.fish # which is shipped with the fish source code. # # # Completions from commandline # # # Global switches # complete -c cvs -n '__fish_use_subcommand' -s H --description 'Displays usage information for command.' complete -c cvs -n '__fish_use_subcommand' -s Q --description 'Cause CVS to be really quiet.' complete -c cvs -n '__fish_use_subcommand' -s q --description 'Cause CVS to be somewhat quiet.' complete -c cvs -n '__fish_use_subcommand' -s r --description 'Make checked-out files read-only.' complete -c cvs -n '__fish_use_subcommand' -s w --description 'Make checked-out files read-write (default).' complete -c cvs -n '__fish_use_subcommand' -s n --description 'Do not execute anything that will change the disk.' complete -c cvs -n '__fish_use_subcommand' -s t --description 'Show trace of program execution -- try with -n.' complete -c cvs -n '__fish_use_subcommand' -s R --description 'Assume repository is read-only, such as CDROM' complete -c cvs -n '__fish_use_subcommand' -s v --description 'CVS version and copyright.' complete -c cvs -n '__fish_use_subcommand' -s T -x --description 'Use \'tmpdir\' for temporary files.' complete -c cvs -n '__fish_use_subcommand' -s e -x --description 'Use \'editor\' for editing log information.' complete -c cvs -n '__fish_use_subcommand' -s d -x --description 'Overrides $CVSROOT as the root of the CVS tree.' complete -c cvs -n '__fish_use_subcommand' -s f --description 'Do not use the ~/.cvsrc file.' complete -c cvs -n '__fish_use_subcommand' -s z -x --description 'Request compression level \'#\' for net traffic.' complete -c cvs -n '__fish_use_subcommand' -s x --description 'Encrypt all net traffic.' complete -c cvs -n '__fish_use_subcommand' -s a --description 'Authenticate all net traffic.' complete -c cvs -n '__fish_use_subcommand' -s 4 --description 'Use IPv4 addresses only.' complete -c cvs -n '__fish_use_subcommand' -s 6 --description 'Use IPv6 addresses only.' complete -c cvs -n '__fish_use_subcommand' -s s -x --description 'Set CVS user variable.' # # subcommands # complete -c cvs -n '__fish_use_subcommand' -x -a add --description 'Add a new file/directory to the repository' complete -c cvs -n '__fish_use_subcommand' -x -a admin --description 'Administration front end for rcs' complete -c cvs -n '__fish_use_subcommand' -x -a annotate --description 'Show last revision where each line was modified' complete -c cvs -n '__fish_use_subcommand' -x -a checkout --description 'Checkout sources for editing' complete -c cvs -n '__fish_use_subcommand' -x -a commit --description 'Check files into the repository' complete -c cvs -n '__fish_use_subcommand' -x -a diff --description 'Show differences between revisions' complete -c cvs -n '__fish_use_subcommand' -x -a edit --description 'Get ready to edit a watched file' complete -c cvs -n '__fish_use_subcommand' -x -a editors --description 'See who is editing a watched file' complete -c cvs -n '__fish_use_subcommand' -x -a export --description 'Export sources from CVS, similar to checkout' complete -c cvs -n '__fish_use_subcommand' -x -a history --description 'Show repository access history' complete -c cvs -n '__fish_use_subcommand' -x -a import --description 'Import sources into CVS, using vendor branches' complete -c cvs -n '__fish_use_subcommand' -x -a init --description 'Create a CVS repository if it doesn\'t exist' complete -c cvs -n '__fish_use_subcommand' -x -a kserver --description 'Kerberos server mode' complete -c cvs -n '__fish_use_subcommand' -x -a log --description 'Print out history information for files' complete -c cvs -n '__fish_use_subcommand' -x -a login --description 'Prompt for password for authenticating server' complete -c cvs -n '__fish_use_subcommand' -x -a logout --description 'Removes entry in .cvspass for remote repository' complete -c cvs -n '__fish_use_subcommand' -x -a ls --description 'List files available from CVS' complete -c cvs -n '__fish_use_subcommand' -x -a pserver --description 'Password server mode' complete -c cvs -n '__fish_use_subcommand' -x -a rannotate --description 'Show last revision where each line of module was modified' complete -c cvs -n '__fish_use_subcommand' -x -a rdiff --description 'Create \'patch\' format diffs between releases' complete -c cvs -n '__fish_use_subcommand' -x -a release --description 'Indicate that a Module is no longer in use' complete -c cvs -n '__fish_use_subcommand' -x -a remove --description 'Remove an entry from the repository' complete -c cvs -n '__fish_use_subcommand' -x -a rlog --description 'Print out history information for a module' complete -c cvs -n '__fish_use_subcommand' -x -a rls --description 'List files in a module' complete -c cvs -n '__fish_use_subcommand' -x -a rtag --description 'Add a symbolic tag to a module' complete -c cvs -n '__fish_use_subcommand' -x -a server --description 'Server mode' complete -c cvs -n '__fish_use_subcommand' -x -a status --description 'Display status information on checked out files' complete -c cvs -n '__fish_use_subcommand' -x -a tag --description 'Add a symbolic tag to checked out version of files' complete -c cvs -n '__fish_use_subcommand' -x -a unedit --description 'Undo an edit command' complete -c cvs -n '__fish_use_subcommand' -x -a update --description 'Bring work tree in sync with repository' complete -c cvs -n '__fish_use_subcommand' -x -a version --description 'Show current CVS version(s)' complete -c cvs -n '__fish_use_subcommand' -x -a watch --description 'Set watches' complete -c cvs -n '__fish_use_subcommand' -x -a watchers --description 'See who is watching a file' # # Completions for the 'add' subcommand # complete -c cvs -n 'contains \'add\' (commandline -poc)' -s k -x --description 'Use "rcs-kflag" to add the file with the specified' complete -c cvs -n 'contains \'add\' (commandline -poc)' -s m -x --description 'Use "message" for the creation log.' # # Completions for the 'admin' subcommand # complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s a -x --description 'Append (comma-separated) user names to access list.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s A -x --description 'Append another file\'s access list.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s b --description '[rev] Set default branch (highest branch on trunk if omitted).' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s c -x --description 'Set comment leader.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s e --description '[users] Remove (comma-separated) user names from access list' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s I --description 'Run interactively.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s k -x --description 'Set keyword substitution mode:' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s l --description '[rev] Lock revision (latest revision on branch,' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s L --description 'Set strict locking.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s m -x --description 'Replace revision\'s log message.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s n -x --description 'Tag branch or revision. If :rev is omitted,' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s N -x --description 'Same as -n except override existing tag.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s o -x --description 'Delete (outdate) specified range of revisions:' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s q --description 'Run quietly.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s s -x --description 'Set revision state (latest revision on branch,' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s t --description '[file] Get descriptive text from file (stdin if omitted).' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s t --description '-string Set descriptive text.' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s u --description '[rev] Unlock the revision (latest revision on branch,' complete -c cvs -n 'contains \'admin\' (commandline -poc)' -s U --description 'Unset strict locking.' # # Completions for the 'annotate' subcommand # complete -c cvs -n 'contains \'annotate\' (commandline -poc)' -s l --description 'Local directory only, no recursion.' complete -c cvs -n 'contains \'annotate\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'annotate\' (commandline -poc)' -s f --description 'Use head revision if tag/date not found.' complete -c cvs -n 'contains \'annotate\' (commandline -poc)' -s F --description 'Annotate binary files.' complete -c cvs -n 'contains \'annotate\' (commandline -poc)' -s r -x --description 'Annotate file as of specified revision/tag.' complete -c cvs -n 'contains \'annotate\' (commandline -poc)' -s D -x --description 'Annotate file as of specified date.' # # Completions for the 'checkout' subcommand # complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s A --description 'Reset any sticky tags/date/kopts.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s N --description 'Don\'t shorten module paths if -d specified.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s P --description 'Prune empty directories.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s c --description '"cat" the module database.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s f --description 'Force a head revision match if tag/date not found.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s l --description 'Local directory only, not recursive' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s n --description 'Do not run module program (if any).' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s p --description 'Check out files to standard output (avoids stickiness).' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s s --description 'Like -c, but include module status.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s r -x --description 'Check out revision or tag. (implies -P) (is sticky)' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s D -x --description 'Check out revisions as of date. (implies -P) (is sticky)' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s d -x -a '(__fish_complete_directories (commandline -ct))' --description 'Check out into dir instead of module name.' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s k -x --description 'Use RCS kopt -k option on checkout. (is sticky)' complete -c cvs -n 'contains \'checkout\' (commandline -poc)' -s j -x --description 'Merge in changes made between current revision and rev.' # # Completions for the 'commit' subcommand # complete -c cvs -n 'contains \'commit\' (commandline -poc)' -s c --description 'Check for valid edits before committing.' complete -c cvs -n 'contains \'commit\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'commit\' (commandline -poc)' -s l --description 'Local directory only (not recursive).' complete -c cvs -n 'contains \'commit\' (commandline -poc)' -s f --description 'Force the file to be committed; disables recursion.' complete -c cvs -n 'contains \'commit\' (commandline -poc)' -s F -x --description 'Read the log message from file.' complete -c cvs -n 'contains \'commit\' (commandline -poc)' -s m -x --description 'Log message.' complete -c cvs -n 'contains \'commit\' (commandline -poc)' -s r -x --description 'Commit to this branch or trunk revision.' # # Completions for the 'diff' subcommand # complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s l --description 'Local directory only, not recursive' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s k -x --description 'Specify keyword expansion mode.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s D -x --description 'Diff revision for date against working file.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s D -x --description 'Diff rev1/date1 against date2.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s r -x --description 'Diff revision for rev1 against working file.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s r -x --description 'Diff rev1/date1 against rev2.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s i --description '--ignore-case Consider upper- and lower-case to be the same.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s w --description '--ignore-all-space Ignore all white space.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s b --description '--ignore-space-change Ignore changes in the amount of white space.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s B --description '--ignore-blank-lines Ignore changes whose lines are all blank.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s I -x --description '--ignore-matching-lines=RE Ignore changes whose lines all match RE.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'Binary Read and write data in binary mode.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s a --description '--text Treat all files as text.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s c --description '-C NUM --context[=NUM] Output NUM (default 2) lines of copied context.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s u --description '-U NUM --unified[=NUM] Output NUM (default 2) lines of unified context.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s N --description 'UM Use NUM context lines.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s L -x --description '--label LABEL Use LABEL instead of file name.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s p --description '--show-c-function Show which C function each change is in.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s F -x --description '--show-function-line=RE Show the most recent line matching RE.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'Brief Output only whether files differ.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s e --description '--ed Output an ed script.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s f --description '--forward-ed Output something like an ed script in forward order.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s n --description '--rcs Output an RCS format diff.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s y --description '--side-by-side Output in two columns.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s W -x --description '--width=NUM Output at most NUM (default 130) characters per line.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'Left-column Output only the left column of common lines.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'Suppress-common-lines Do not output common lines.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'Ifdef=NAME Output merged file to show `#ifdef NAME\' diffs.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'Line-format=LFMT Similar, but format all input lines with LFMT.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s t --description '--expand-tabs Expand tabs to spaces in output.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s T --description '--initial-tab Make tabs line up by prepending a tab.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s N --description '--new-file Treat absent files as empty.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s s --description '--report-identical-files Report when two files are the same.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s - --description 'Horizon-lines=NUM Keep NUM lines of the common prefix and suffix.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s d --description '--minimal Try hard to find a smaller set of changes.' complete -c cvs -n 'contains \'diff\' (commandline -poc)' -s H --description '--speed-large-files Assume large files and many scattered small changes.' # # Completions for the 'edit' subcommand # complete -c cvs -n 'contains \'edit\' (commandline -poc)' -s l --description 'Local directory only, not recursive.' complete -c cvs -n 'contains \'edit\' (commandline -poc)' -s R --description 'Process directories recursively (default).' complete -c cvs -n 'contains \'edit\' (commandline -poc)' -s a --description 'Specify action to register for temporary watch, one of:' complete -c cvs -n 'contains \'edit\' (commandline -poc)' -s c --description 'Check for s edited by others and abort if found.' complete -c cvs -n 'contains \'edit\' (commandline -poc)' -s f --description 'Allow edit if s are edited by others (default).' # # Completions for the 'editors' subcommand # complete -c cvs -n 'contains \'editors\' (commandline -poc)' -s l --description 'Process this directory only (not recursive).' complete -c cvs -n 'contains \'editors\' (commandline -poc)' -s R --description 'Process directories recursively (default).' # # Completions for the 'export' subcommand # complete -c cvs -n 'contains \'export\' (commandline -poc)' -s N --description 'Don\'t shorten module paths if -d specified.' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s f --description 'Force a head revision match if tag/date not found.' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s l --description 'Local directory only, not recursive' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s R --description 'Process directories recursively (default).' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s n --description 'Do not run module program (if any).' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s r -x --description 'Export tagged revisions.' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s D -x --description 'Export revisions as of date.' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s d -x -a '(__fish_complete_directories (commandline -ct))' --description 'Export into dir instead of module name.' complete -c cvs -n 'contains \'export\' (commandline -poc)' -s k -x --description 'Use RCS kopt -k option on checkout.' # # Completions for the 'history' subcommand # complete -c cvs -n 'contains \'history\' (commandline -poc)' -s T --description 'Produce report on all TAGs' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s c --description 'Committed (Modified) files' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s o --description 'Checked out modules' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s m -x --description 'Look for specified module (repeatable)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s x -x --description 'Extract by record type' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s e --description 'Everything (same as -x, but all record types)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s a --description 'All users (Default is self)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s l --description 'Last modified (committed or modified report)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s w --description 'Working directory must match' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s D -x --description 'Since date (Many formats)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s b -x --description 'Back to record with str in module/file/repos field' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s f -r --description 'Specified file (same as command line) (repeatable)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s n -x --description 'In module (repeatable)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s p -x --description 'In repository (repeatable)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s r -x --description 'Since rev or tag (looks inside RCS files!)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s t -x --description 'Since tag record placed in history file (by anyone).' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s u -x -a '(__fish_complete_users)' --description 'For user name (repeatable)' complete -c cvs -n 'contains \'history\' (commandline -poc)' -s z -x --description 'Output for time zone (e.g. -z -0700)' # # Completions for the 'import' subcommand # complete -c cvs -n 'contains \'import\' (commandline -poc)' -s d --description 'Use the file\'s modification time as the time of import.' complete -c cvs -n 'contains \'import\' (commandline -poc)' -s X --description 'When importing new files, mark their trunk revisions as dead.' complete -c cvs -n 'contains \'import\' (commandline -poc)' -s k -x --description 'Set default RCS keyword substitution mode.' complete -c cvs -n 'contains \'import\' (commandline -poc)' -s I -x --description 'More files to ignore (! to reset).' complete -c cvs -n 'contains \'import\' (commandline -poc)' -s b -x --description 'Vendor branch id.' complete -c cvs -n 'contains \'import\' (commandline -poc)' -s m -x --description 'Log message.' complete -c cvs -n 'contains \'import\' (commandline -poc)' -s W -x --description 'Wrappers specification line.' # # Completions for the 'init' subcommand # # # Completions for the 'kserver' subcommand # # # Completions for the 'log' subcommand # complete -c cvs -n 'contains \'log\' (commandline -poc)' -s l --description 'Local directory only, no recursion.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s b --description 'Only list revisions on the default branch.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s h --description 'Only print header.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s R --description 'Only print name of RCS file.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s t --description 'Only print header and descriptive text.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s N --description 'Do not list tags.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s S --description 'Do not print name/header if no revisions selected. -d, -r,' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s s --description ', & -w have little effect in conjunction with -b, -h, -R, and' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s t -x --description 'This option.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s r --description '[revisions]' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s d -x --description 'A semicolon-separated list of dates' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s s -x --description 'Only list revisions with specified states.' complete -c cvs -n 'contains \'log\' (commandline -poc)' -s w --description '[logins]' # # Completions for the 'login' subcommand # # # Completions for the 'logout' subcommand # # # Completions for the 'ls' subcommand # complete -c cvs -n 'contains \'ls\' (commandline -poc)' -s d --description 'Show dead revisions (with tag when specified).' complete -c cvs -n 'contains \'ls\' (commandline -poc)' -s e --description 'Display in CVS/Entries format.' complete -c cvs -n 'contains \'ls\' (commandline -poc)' -s l --description 'Display all details.' complete -c cvs -n 'contains \'ls\' (commandline -poc)' -s P --description 'Prune empty directories.' complete -c cvs -n 'contains \'ls\' (commandline -poc)' -s R --description 'List recursively.' complete -c cvs -n 'contains \'ls\' (commandline -poc)' -s r -x --description 'Show files with revision or tag.' complete -c cvs -n 'contains \'ls\' (commandline -poc)' -s D -x --description 'Show files from date.' # # Completions for the 'pserver' subcommand # complete -c cvs -n 'contains \'pserver\' (commandline -poc)' -s c -x --description 'Path to an alternative CVS config file.' # # Completions for the 'rannotate' subcommand # complete -c cvs -n 'contains \'rannotate\' (commandline -poc)' -s l --description 'Local directory only, no recursion.' complete -c cvs -n 'contains \'rannotate\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'rannotate\' (commandline -poc)' -s f --description 'Use head revision if tag/date not found.' complete -c cvs -n 'contains \'rannotate\' (commandline -poc)' -s F --description 'Annotate binary files.' complete -c cvs -n 'contains \'rannotate\' (commandline -poc)' -s r -x --description 'Annotate file as of specified revision/tag.' complete -c cvs -n 'contains \'rannotate\' (commandline -poc)' -s D -x --description 'Annotate file as of specified date.' # # Completions for the 'rdiff' subcommand # complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s r -x --description 'Date [-r rev2 | -D date2] modules...' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s f --description 'Force a head revision match if tag/date not found.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s l --description 'Local directory only, not recursive' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s c --description 'Context diffs (default)' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s u --description 'Unidiff format.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s s --description 'Short patch - one liner per file.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s t --description 'Top two diffs - last change made to the file.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s V -x --description 'Use RCS Version "vers" for keyword expansion.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s k -x --description 'Specify keyword expansion mode.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s D -x --description 'Date.' complete -c cvs -n 'contains \'rdiff\' (commandline -poc)' -s r -x --description 'Revision - symbolic or numeric.' # # Completions for the 'release' subcommand # complete -c cvs -n 'contains \'release\' (commandline -poc)' -s d --description 'Delete the given directory.' # # Completions for the 'remove' subcommand # complete -c cvs -n 'contains \'remove\' (commandline -poc)' -s f --description 'Delete the file before removing it.' complete -c cvs -n 'contains \'remove\' (commandline -poc)' -s l --description 'Process this directory only (not recursive).' complete -c cvs -n 'contains \'remove\' (commandline -poc)' -s R --description 'Process directories recursively.' # # Completions for the 'rlog' subcommand # complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s l --description 'Local directory only, no recursion.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s b --description 'Only list revisions on the default branch.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s h --description 'Only print header.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s R --description 'Only print name of RCS file.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s t --description 'Only print header and descriptive text.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s N --description 'Do not list tags.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s S --description 'Do not print name/header if no revisions selected. -d, -r,' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s s --description ', & -w have little effect in conjunction with -b, -h, -R, and' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s t -x --description 'This option.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s r --description '[revisions]' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s d -x --description 'A semicolon-separated list of dates' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s s -x --description 'Only list revisions with specified states.' complete -c cvs -n 'contains \'rlog\' (commandline -poc)' -s w --description '[logins]' # # Completions for the 'rls' subcommand # complete -c cvs -n 'contains \'rls\' (commandline -poc)' -s d --description 'Show dead revisions (with tag when specified).' complete -c cvs -n 'contains \'rls\' (commandline -poc)' -s e --description 'Display in CVS/Entries format.' complete -c cvs -n 'contains \'rls\' (commandline -poc)' -s l --description 'Display all details.' complete -c cvs -n 'contains \'rls\' (commandline -poc)' -s P --description 'Prune empty directories.' complete -c cvs -n 'contains \'rls\' (commandline -poc)' -s R --description 'List recursively.' complete -c cvs -n 'contains \'rls\' (commandline -poc)' -s r -x --description 'Show files with revision or tag.' complete -c cvs -n 'contains \'rls\' (commandline -poc)' -s D -x --description 'Show files from date.' # # Completions for the 'rtag' subcommand # complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s a --description 'Clear tag from removed files that would not otherwise be tagged.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s b --description 'Make the tag a "branch" tag, allowing concurrent development.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s B --description 'Allows -F and -d to disturb branch tags. Use with extreme care.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s d --description 'Delete the given tag.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s F --description 'Move tag if it already exists.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s f --description 'Force a head revision match if tag/date not found.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s l --description 'Local directory only, not recursive.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s n --description 'No execution of \'tag program\'.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s r -x --description 'Existing revision/tag.' complete -c cvs -n 'contains \'rtag\' (commandline -poc)' -s D --description 'Existing date.' # # Completions for the 'server' subcommand # complete -c cvs -n 'contains \'server\' (commandline -poc)' -s c -x --description 'Path to an alternative CVS config file.' # # Completions for the 'status' subcommand # complete -c cvs -n 'contains \'status\' (commandline -poc)' -s v --description 'Verbose format; includes tag information for the file' complete -c cvs -n 'contains \'status\' (commandline -poc)' -s l --description 'Process this directory only (not recursive).' complete -c cvs -n 'contains \'status\' (commandline -poc)' -s R --description 'Process directories recursively.' # # Completions for the 'tag' subcommand # complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s b --description 'Make the tag a "branch" tag, allowing concurrent development.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s B --description 'Allows -F and -d to disturb branch tags. Use with extreme care.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s c --description 'Check that working files are unmodified.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s d --description 'Delete the given tag.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s F --description 'Move tag if it already exists.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s f --description 'Force a head revision match if tag/date not found.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s l --description 'Local directory only, not recursive.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s r -x --description 'Existing revision/tag.' complete -c cvs -n 'contains \'tag\' (commandline -poc)' -s D --description 'Existing date.' # # Completions for the 'unedit' subcommand # complete -c cvs -n 'contains \'unedit\' (commandline -poc)' -s l --description 'Local directory only, not recursive.' complete -c cvs -n 'contains \'unedit\' (commandline -poc)' -s R --description 'Process directories recursively (default).' # # Completions for the 'update' subcommand # complete -c cvs -n 'contains \'update\' (commandline -poc)' -s A --description 'Reset any sticky tags/date/kopts.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s P --description 'Prune empty directories.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s C --description 'Overwrite locally modified files with clean repository copies.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s d --description 'Build directories, like checkout does.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s f --description 'Force a head revision match if tag/date not found.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s l --description 'Local directory only, no recursion.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s R --description 'Process directories recursively.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s p --description 'Send updates to standard output (avoids stickiness).' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s k -x --description 'Use RCS kopt -k option on checkout. (is sticky)' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s r -x --description 'Update using specified revision/tag (is sticky).' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s D -x --description 'Set date to update from (is sticky).' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s j -x --description 'Merge in changes made between current revision and rev.' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s I -x --description 'More files to ignore (! to reset).' complete -c cvs -n 'contains \'update\' (commandline -poc)' -s W -x --description 'Wrappers specification line.' # # Completions for the 'version' subcommand # # # Completions for the 'watch' subcommand # complete -c cvs -n 'contains \'watch\' (commandline -poc)' -s l -x -a 'on off add remove' --description 'Local directory only, not recursive.' complete -c cvs -n 'contains \'watch\' (commandline -poc)' -s R -x -a 'on off add remove' --description 'Process directories recursively (default).' complete -c cvs -n 'contains \'watch\' (commandline -poc)' -s a -x -a 'add remove' --description 'Specify what actions, one of: `edit\', `unedit\',' # # Completions for the 'watchers' subcommand # complete -c cvs -n 'contains \'watchers\' (commandline -poc)' -s l --description 'Process this directory only (not recursive).' complete -c cvs -n 'contains \'watchers\' (commandline -poc)' -s R --description 'Process directories recursively (default).' fish/share/completions/darcs.fish000066400000000000000000004173231214535744100174340ustar00rootroot00000000000000 # # Completions for the darcs command # This file was autogenerated by the file make_vcs_completions.fish # which is shipped with the fish source code. # # # Completions from commandline # complete -c darcs -n "not __fish_use_subcommand" -a "(test -f _darcs/prefs/repos; and cat _darcs/prefs/repos)" --description "Darcs repo" complete -c darcs -a "test predist boringfile binariesfile" -n "contains setpref (commandline -poc)" --description "Set the specified option" -x # # subcommands # complete -c darcs -n '__fish_use_subcommand' -x -a help --description 'Display help about darcs and darcs commands' complete -c darcs -n '__fish_use_subcommand' -x -a add --description 'Add one or more new files or directories' complete -c darcs -n '__fish_use_subcommand' -x -a remove --description 'Remove files from version control' complete -c darcs -n '__fish_use_subcommand' -x -a move --description 'Move or rename files' complete -c darcs -n '__fish_use_subcommand' -x -a replace --description 'Substitute one word for another' complete -c darcs -n '__fish_use_subcommand' -x -a revert --description 'Discard unrecorded changes' complete -c darcs -n '__fish_use_subcommand' -x -a unrevert --description 'Undo the last revert (may fail if changes after the revert)' complete -c darcs -n '__fish_use_subcommand' -x -a whatsnew --description 'List unrecorded changes in the working tree' complete -c darcs -n '__fish_use_subcommand' -x -a record --description 'Create a patch from unrecorded changes' complete -c darcs -n '__fish_use_subcommand' -x -a unrecord --description 'Remove recorded patches without changing the working copy' complete -c darcs -n '__fish_use_subcommand' -x -a amend-record --description 'Improve a patch before it leaves your repository' complete -c darcs -n '__fish_use_subcommand' -x -a mark-conflicts --description 'Mark unresolved conflicts in working tree, for manual resolution' complete -c darcs -n '__fish_use_subcommand' -x -a tag --description 'Name the current repository state for future reference' complete -c darcs -n '__fish_use_subcommand' -x -a setpref --description 'Set a preference (test, predist, boringfile or binariesfile)' complete -c darcs -n '__fish_use_subcommand' -x -a diff --description 'Create a diff between two versions of the repository' complete -c darcs -n '__fish_use_subcommand' -x -a changes --description 'List patches in the repository' complete -c darcs -n '__fish_use_subcommand' -x -a annotate --description 'Display which patch last modified something' complete -c darcs -n '__fish_use_subcommand' -x -a dist --description 'Create a distribution tarball' complete -c darcs -n '__fish_use_subcommand' -x -a trackdown --description 'Locate the most recent version lacking an error' complete -c darcs -n '__fish_use_subcommand' -x -a show --description 'Show information which is stored by darcs' complete -c darcs -n '__fish_use_subcommand' -x -a pull --description 'Copy and apply patches from another repository to this one' complete -c darcs -n '__fish_use_subcommand' -x -a obliterate --description 'Delete selected patches from the repository. (UNSAFE!)' complete -c darcs -n '__fish_use_subcommand' -x -a rollback --description 'Record a new patch reversing some recorded changes' complete -c darcs -n '__fish_use_subcommand' -x -a push --description 'Copy and apply patches from this repository to another one' complete -c darcs -n '__fish_use_subcommand' -x -a send --description 'Send by email a bundle of one or more patches' complete -c darcs -n '__fish_use_subcommand' -x -a apply --description 'Apply a patch bundle created by `darcs send'' complete -c darcs -n '__fish_use_subcommand' -x -a get --description 'Create a local copy of a repository' complete -c darcs -n '__fish_use_subcommand' -x -a put --description 'Makes a copy of the repository' complete -c darcs -n '__fish_use_subcommand' -x -a initialize --description 'Make the current directory a repository' complete -c darcs -n '__fish_use_subcommand' -x -a optimize --description 'Optimize the repository' complete -c darcs -n '__fish_use_subcommand' -x -a check --description 'Check the repository for consistency' complete -c darcs -n '__fish_use_subcommand' -x -a repair --description 'Repair a corrupted repository' complete -c darcs -n '__fish_use_subcommand' -x -a convert --description 'Convert a repository from a legacy format' # # Completions for the 'help' subcommand # complete -c darcs -n 'contains \'help\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'help\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'help\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'help\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'help\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'add' subcommand # complete -c darcs -n 'contains \'add\' (commandline -poc)' -l boring --description 'Don\'t skip boring files' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l no-boring --description 'Skip borign files [DEFAULT]' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l case-ok --description 'Don\'t refuse to add files differing only in case' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l no-case-ok --description 'Refuse to add files whose name differ only in case [DEFAULT]' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l reserved-ok --description 'Don\'t refuse to add files with Windows-reserved names' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l no-reserved-ok --description 'Refuse to add files with Windows-reserved names [DEFAULT]' complete -c darcs -n 'contains \'add\' (commandline -poc)' -s r -l recursive --description 'Add contents of subdirectories' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l date-trick --description 'Add files with date appended to avoid conflict [EXPERIMENTAL]' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l no-date-trick --description 'Don\'t use experimental date appending trick [DEFAULT]' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l dry-run --description 'Don\'t actually take the action' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'add\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'add\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'add\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'add\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'remove' subcommand # complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -s r -l recursive --description 'Recurse into subdirectories' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'remove\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'move' subcommand # complete -c darcs -n 'contains \'move\' (commandline -poc)' -l case-ok --description 'Don\'t refuse to add files differing only in case' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l no-case-ok --description 'Refuse to add files whose name differ only in case [DEFAULT]' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l reserved-ok --description 'Don\'t refuse to add files with Windows-reserved names' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l no-reserved-ok --description 'Refuse to add files with Windows-reserved names [DEFAULT]' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'move\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'move\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'move\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'move\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'replace' subcommand # complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l token-chars -x --description 'Define token to contain these characters' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -s f -l force --description 'Proceed with replace even if \'new\' token already exists' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l no-force --description 'Don\'t force the replace if it looks scary' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'replace\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'revert' subcommand # complete -c darcs -n 'contains \'revert\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'revert\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'unrevert' subcommand # complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'unrevert\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'whatsnew' subcommand # complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -s s -l summary --description 'Summarize changes' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l no-summary --description 'Don\'t summarize changes' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -s u -l unified --description 'Output patch in a darcs-specific format similar to diff -u' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l no-unified --description 'Output patch in darcs\' usual format' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -s l -l look-for-adds --description 'Look for (non-boring) files that could be added' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l boring --description 'Don\'t skip boring files' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l no-boring --description 'Skip borign files [DEFAULT]' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'whatsnew\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'record' subcommand # complete -c darcs -n 'contains \'record\' (commandline -poc)' -s m -l patch-name -x --description 'Name of patch' complete -c darcs -n 'contains \'record\' (commandline -poc)' -s A -l author -x --description 'Specify author id' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l no-test --description 'Don\'t run the test script' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l test --description 'Run the test script' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l leave-test-directory --description 'Don\'t remove the test directory' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l remove-test-directory --description 'Remove the test directory' complete -c darcs -n 'contains \'record\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l pipe --description 'Ask user interactively for the patch metadata' complete -c darcs -n 'contains \'record\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l ask-deps --description 'Ask for extra dependencies' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l no-ask-deps --description 'Don\'t ask for extra dependencies' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l edit-long-comment --description 'Edit the long comment by default' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l skip-long-comment --description 'Don\'t give a long comment' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l prompt-long-comment --description 'Prompt for whether to edit the long comment' complete -c darcs -n 'contains \'record\' (commandline -poc)' -s l -l look-for-adds --description 'Look for (non-boring) files that could be added' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'record\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'record\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'record\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l logfile -r --description 'Give patch name and comment in file' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l delete-logfile --description 'Delete the logfile when done' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l no-delete-logfile --description 'Keep the logfile when done [DEFAULT]' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'record\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'unrecord' subcommand # complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l from-match -x --description 'Select changes starting with a patch matching PATTERN' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l from-patch -x --description 'Select changes starting with a patch matching REGEXP' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l from-tag -x --description 'Select changes starting with a tag matching REGEXP' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l last -x --description 'Select the last NUMBER patches' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l matches -x --description 'Select patches matching PATTERN' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -s p -l patches -x --description 'Select patches matching REGEXP' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -s t -l tags -x --description 'Select tags matching REGEXP' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l no-deps --description 'Don\'t automatically fulfill dependencies' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l dont-prompt-for-dependencies --description 'Don\'t ask about patches that are depended on by matched patches (with --match or --patch)' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l prompt-for-dependencies --description 'Prompt about patches that are depended on by matched patches [DEFAULT]' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'unrecord\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'amend-record' subcommand # complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l match -x --description 'Select a single patch matching PATTERN' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s p -l patch -x --description 'Select a single patch matching REGEXP' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s n -l index -x --description 'Select one patch' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l no-test --description 'Don\'t run the test script' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l test --description 'Run the test script' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l leave-test-directory --description 'Don\'t remove the test directory' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l remove-test-directory --description 'Remove the test directory' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s A -l author -x --description 'Specify author id' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s m -l patch-name -x --description 'Name of patch' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l edit-long-comment --description 'Edit the long comment by default' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l skip-long-comment --description 'Don\'t give a long comment' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l prompt-long-comment --description 'Prompt for whether to edit the long comment' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s l -l look-for-adds --description 'Look for (non-boring) files that could be added' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'amend-record\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'mark-conflicts' subcommand # complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'mark-conflicts\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'tag' subcommand # complete -c darcs -n 'contains \'tag\' (commandline -poc)' -s m -l patch-name -x --description 'Name of patch' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -s A -l author -x --description 'Specify author id' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l pipe --description 'Ask user interactively for the patch metadata' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l edit-long-comment --description 'Edit the long comment by default' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l skip-long-comment --description 'Don\'t give a long comment' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l prompt-long-comment --description 'Prompt for whether to edit the long comment' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'tag\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'setpref' subcommand # complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -x --description 'Shell command that runs regression tests' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -x --description 'Shell command to run before `darcs dist\'' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -x --description 'Path to a version-controlled boring file' complete -c darcs -n 'contains \'setpref\' (commandline -poc)' -x --description 'Path to a version-controlled binaries file' # # Completions for the 'diff' subcommand # complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l to-match -x --description 'Select changes up to a patch matching PATTERN' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l to-patch -x --description 'Select changes up to a patch matching REGEXP' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l to-tag -x --description 'Select changes up to a tag matching REGEXP' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l from-match -x --description 'Select changes starting with a patch matching PATTERN' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l from-patch -x --description 'Select changes starting with a patch matching REGEXP' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l from-tag -x --description 'Select changes starting with a tag matching REGEXP' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l match -x --description 'Select a single patch matching PATTERN' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -s p -l patch -x --description 'Select a single patch matching REGEXP' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l last -x --description 'Select the last NUMBER patches' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -s n -l index -x --description 'Select a range of patches' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l diff-command -x -a '(__fish_complete_command)' --description 'Specify diff command (ignores --diff-opts)' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l diff-opts -x --description 'Options to pass to diff' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -s u -l unified --description 'Pass -u option to diff' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l no-unified --description 'Output patch in diff\'s dumb format' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l store-in-memory --description 'Do patch application in memory rather than on disk' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l no-store-in-memory --description 'Do patch application on disk [DEFAULT]' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'diff\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'changes' subcommand # complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l to-match -x --description 'Select changes up to a patch matching PATTERN' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l to-patch -x --description 'Select changes up to a patch matching REGEXP' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l to-tag -x --description 'Select changes up to a tag matching REGEXP' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l from-match -x --description 'Select changes starting with a patch matching PATTERN' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l from-patch -x --description 'Select changes starting with a patch matching REGEXP' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l from-tag -x --description 'Select changes starting with a tag matching REGEXP' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l last -x --description 'Select the last NUMBER patches' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s n -l index -x --description 'Select a range of patches' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l matches -x --description 'Select patches matching PATTERN' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s p -l patches -x --description 'Select patches matching REGEXP' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s t -l tags -x --description 'Select tags matching REGEXP' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l max-count -x --description 'Return only NUMBER results' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l only-to-files --description 'Show only changes to specified files' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-only-to-files --description 'Show changes to all files [DEFAULT]' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l context --description 'Give output suitable for get --context' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l xml-output --description 'Generate XML formatted output' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l human-readable --description 'Give human-readable output' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l number --description 'Number the changes' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l count --description 'Output count of changes' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s s -l summary --description 'Summarize changes' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-summary --description 'Don\'t summarize changes' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l reverse --description 'Show changes in reverse order' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-reverse --description 'Show changes in the usual order [DEFAULT]' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l repo -x --description 'Specify the repository URL' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l ssh-cm --description 'Use SSH ControlMaster feature' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-ssh-cm --description 'Don\'t use SSH ControlMaster feature [DEFAULT]' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l http-pipelining --description 'Enable HTTP pipelining [DEFAULT]' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-http-pipelining --description 'Disable HTTP pipelining' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l remote-darcs -x -a '(__fish_complete_command)' --description 'Name of the darcs executable on the remote server' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'changes\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'annotate' subcommand # complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s s -l summary --description 'Summarize changes' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l no-summary --description 'Don\'t summarize changes' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s u -l unified --description 'Output patch in a darcs-specific format similar to diff -u' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l no-unified --description 'Output patch in darcs\' usual format' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l human-readable --description 'Give human-readable output' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l xml-output --description 'Generate XML formatted output' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l match -x --description 'Select a single patch matching PATTERN' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s p -l patch -x --description 'Select a single patch matching REGEXP' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s t -l tag -x --description 'Select tag matching REGEXP' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s n -l index -x --description 'Select one patch' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l creator-hash -x --description 'Specify hash of creator patch (see docs)' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'annotate\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'dist' subcommand # complete -c darcs -n 'contains \'dist\' (commandline -poc)' -s d -l dist-name -x --description 'Name of version' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l match -x --description 'Select a single patch matching PATTERN' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -s p -l patch -x --description 'Select a single patch matching REGEXP' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -s t -l tag -x --description 'Select tag matching REGEXP' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -s n -l index -x --description 'Select one patch' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l store-in-memory --description 'Do patch application in memory rather than on disk' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l no-store-in-memory --description 'Do patch application on disk [DEFAULT]' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'dist\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'trackdown' subcommand # complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'trackdown\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'show' subcommand # complete -c darcs -n 'contains \'show\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' # # Completions for the 'pull' subcommand # complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l matches -x --description 'Select patches matching PATTERN' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s p -l patches -x --description 'Select patches matching REGEXP' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s t -l tags -x --description 'Select tags matching REGEXP' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l mark-conflicts --description 'Mark conflicts [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l allow-conflicts --description 'Allow conflicts, but don\'t mark them' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l skip-conflicts --description 'Filter out any patches that would create conflicts' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l external-merge -x -a '(__fish_complete_command)' --description 'Use external tool to merge conflicts' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l test --description 'Run the test script' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-test --description 'Don\'t run the test script' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l dry-run --description 'Don\'t actually take the action' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l xml-output --description 'Generate XML formatted output' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s s -l summary --description 'Summarize changes' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-summary --description 'Don\'t summarize changes' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-deps --description 'Don\'t automatically fulfill dependencies' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l dont-prompt-for-dependencies --description 'Don\'t ask about patches that are depended on by matched patches (with --match or --patch)' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l prompt-for-dependencies --description 'Prompt about patches that are depended on by matched patches [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l set-default --description 'Set default repository [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-set-default --description 'Don\'t set default repository' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l ignore-unrelated-repos --description 'Do not check if repositories are unrelated' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l intersection --description 'Take intersection of all repositories' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l union --description 'Take union of all repositories [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l complement --description 'Take complement of repositories (in order listed)' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l nolinks --description 'Do not link repository or pristine to sibling' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l remote-repo -x --description 'Specify the remote repository URL to work with' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l restrict-paths --description 'Don\'t allow darcs to touch external files or repo metadata' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l ssh-cm --description 'Use SSH ControlMaster feature' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-ssh-cm --description 'Don\'t use SSH ControlMaster feature [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l http-pipelining --description 'Enable HTTP pipelining [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-http-pipelining --description 'Disable HTTP pipelining' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l remote-darcs -x -a '(__fish_complete_command)' --description 'Name of the darcs executable on the remote server' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'pull\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'obliterate' subcommand # complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l from-match -x --description 'Select changes starting with a patch matching PATTERN' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l from-patch -x --description 'Select changes starting with a patch matching REGEXP' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l from-tag -x --description 'Select changes starting with a tag matching REGEXP' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l last -x --description 'Select the last NUMBER patches' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l matches -x --description 'Select patches matching PATTERN' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s p -l patches -x --description 'Select patches matching REGEXP' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s t -l tags -x --description 'Select tags matching REGEXP' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l no-deps --description 'Don\'t automatically fulfill dependencies' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l dont-prompt-for-dependencies --description 'Don\'t ask about patches that are depended on by matched patches (with --match or --patch)' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l prompt-for-dependencies --description 'Prompt about patches that are depended on by matched patches [DEFAULT]' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s s -l summary --description 'Summarize changes' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l no-summary --description 'Don\'t summarize changes' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l dry-run --description 'Don\'t actually take the action' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l xml-output --description 'Generate XML formatted output' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'obliterate\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'rollback' subcommand # complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l from-match -x --description 'Select changes starting with a patch matching PATTERN' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l from-patch -x --description 'Select changes starting with a patch matching REGEXP' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l from-tag -x --description 'Select changes starting with a tag matching REGEXP' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l last -x --description 'Select the last NUMBER patches' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l matches -x --description 'Select patches matching PATTERN' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s p -l patches -x --description 'Select patches matching REGEXP' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s t -l tags -x --description 'Select tags matching REGEXP' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s A -l author -x --description 'Specify author id' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s m -l patch-name -x --description 'Name of patch' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l edit-long-comment --description 'Edit the long comment by default' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l skip-long-comment --description 'Don\'t give a long comment' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l prompt-long-comment --description 'Prompt for whether to edit the long comment' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l no-test --description 'Don\'t run the test script' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l test --description 'Run the test script' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l leave-test-directory --description 'Don\'t remove the test directory' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l remove-test-directory --description 'Remove the test directory' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'rollback\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'push' subcommand # complete -c darcs -n 'contains \'push\' (commandline -poc)' -l matches -x --description 'Select patches matching PATTERN' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s p -l patches -x --description 'Select patches matching REGEXP' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s t -l tags -x --description 'Select tags matching REGEXP' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-deps --description 'Don\'t automatically fulfill dependencies' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l dont-prompt-for-dependencies --description 'Don\'t ask about patches that are depended on by matched patches (with --match or --patch)' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l prompt-for-dependencies --description 'Prompt about patches that are depended on by matched patches [DEFAULT]' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l sign --description 'Sign the patch with your gpg key' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l sign-as -x --description 'Sign the patch with a given keyid' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l sign-ssl -x --description 'Sign the patch using openssl with a given private key' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l dry-run --description 'Don\'t actually take the action' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l xml-output --description 'Generate XML formatted output' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s s -l summary --description 'Summarize changes' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-summary --description 'Don\'t summarize changes' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l set-default --description 'Set default repository [DEFAULT]' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-set-default --description 'Don\'t set default repository' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l ignore-unrelated-repos --description 'Do not check if repositories are unrelated' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'push\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l apply-as -x -a '(__fish_complete_users)' --description 'Apply patch as another user using sudo' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-apply-as --description 'Don\'t use sudo to apply as another user [DEFAULT]' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l nolinks --description 'Do not link repository or pristine to sibling' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l remote-repo -x --description 'Specify the remote repository URL to work with' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l ssh-cm --description 'Use SSH ControlMaster feature' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-ssh-cm --description 'Don\'t use SSH ControlMaster feature [DEFAULT]' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l http-pipelining --description 'Enable HTTP pipelining [DEFAULT]' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-http-pipelining --description 'Disable HTTP pipelining' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l remote-darcs -x -a '(__fish_complete_command)' --description 'Name of the darcs executable on the remote server' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'push\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'send' subcommand # complete -c darcs -n 'contains \'send\' (commandline -poc)' -l matches -x --description 'Select patches matching PATTERN' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s p -l patches -x --description 'Select patches matching REGEXP' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s t -l tags -x --description 'Select tags matching REGEXP' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-deps --description 'Don\'t automatically fulfill dependencies' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l dont-prompt-for-dependencies --description 'Don\'t ask about patches that are depended on by matched patches (with --match or --patch)' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l prompt-for-dependencies --description 'Prompt about patches that are depended on by matched patches [DEFAULT]' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l from -x --description 'Specify email address' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s A -l author -x --description 'Specify author id' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l to -x --description 'Specify destination email' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l cc -x --description 'Mail results to additional EMAIL(s)' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l subject -x --description 'Specify mail subject' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l in-reply-to -x --description 'Specify in-reply-to header' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s o -l output -r --description 'Specify output filename' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l sign --description 'Sign the patch with your gpg key' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l sign-as -x --description 'Sign the patch with a given keyid' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l sign-ssl -x --description 'Sign the patch using openssl with a given private key' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l dry-run --description 'Don\'t actually take the action' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l xml-output --description 'Generate XML formatted output' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s s -l summary --description 'Summarize changes' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-summary --description 'Don\'t summarize changes' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l edit-description --description 'Edit the patch bundle description' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l set-default --description 'Set default repository [DEFAULT]' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-set-default --description 'Don\'t set default repository' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l sendmail-command -x -a '(__fish_complete_command)' --description 'Specify sendmail command' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l ignore-unrelated-repos --description 'Do not check if repositories are unrelated' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'send\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l logfile -r --description 'Give patch name and comment in file' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l delete-logfile --description 'Delete the logfile when done' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-delete-logfile --description 'Keep the logfile when done [DEFAULT]' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l remote-repo -x --description 'Specify the remote repository URL to work with' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l context -r --description 'Send to context stored in FILENAME' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l ssh-cm --description 'Use SSH ControlMaster feature' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-ssh-cm --description 'Don\'t use SSH ControlMaster feature [DEFAULT]' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l http-pipelining --description 'Enable HTTP pipelining [DEFAULT]' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-http-pipelining --description 'Disable HTTP pipelining' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l remote-darcs -x -a '(__fish_complete_command)' --description 'Name of the darcs executable on the remote server' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'send\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'apply' subcommand # complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l verify -x --description 'Verify that the patch was signed by a key in PUBRING' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l verify-ssl -x --description 'Verify using openSSL with authorized keys from file KEYS' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l no-verify --description 'Don\'t verify patch signature' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -s a -l all --description 'Answer yes to all patches' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -s i -l interactive --description 'Prompt user interactively' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l dry-run --description 'Don\'t actually take the action' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l xml-output --description 'Generate XML formatted output' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l mark-conflicts --description 'Mark conflicts' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l allow-conflicts --description 'Allow conflicts, but don\'t mark them' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l no-resolve-conflicts --description 'Equivalent to --dont-allow-conflicts, for backwards compatibility' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l skip-conflicts --description 'Filter out any patches that would create conflicts' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l external-merge -x -a '(__fish_complete_command)' --description 'Use external tool to merge conflicts' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l no-test --description 'Don\'t run the test script' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l test --description 'Run the test script' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l leave-test-directory --description 'Don\'t remove the test directory' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l remove-test-directory --description 'Remove the test directory' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l reply -x --description 'Reply to email-based patch using FROM address' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l cc -x --description 'Mail results to additional EMAIL(s). Requires --reply' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l happy-forwarding --description 'Forward unsigned messages without extra header' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l no-happy-forwarding --description 'Don\'t forward unsigned messages without extra header [DEFAULT]' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l sendmail-command -x -a '(__fish_complete_command)' --description 'Specify sendmail command' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l restrict-paths --description 'Don\'t allow darcs to touch external files or repo metadata' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'apply\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'get' subcommand # complete -c darcs -n 'contains \'get\' (commandline -poc)' -l repo-name -x --description '--repodir=DIRECTORY' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l partial --description 'Get partial repository using checkpoint (old-fashioned format only)' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l lazy --description 'Get patch files only as needed' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l ephemeral --description 'Don\'t save patch files in the repository' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l complete --description 'Get a complete copy of the repository' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l to-match -x --description 'Select changes up to a patch matching PATTERN' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l to-patch -x --description 'Select changes up to a patch matching REGEXP' complete -c darcs -n 'contains \'get\' (commandline -poc)' -s t -l tag -x --description 'Select tag matching REGEXP' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l context -r --description 'Version specified by the context in FILENAME' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l set-default --description 'Set default repository [DEFAULT]' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l no-set-default --description 'Don\'t set default repository' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l nolinks --description 'Do not link repository or pristine to sibling' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l hashed --description 'Convert darcs-1 format to hashed format' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l old-fashioned-inventory --description 'Convert from hashed to darcs-1 format' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'get\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'get\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'get\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l ssh-cm --description 'Use SSH ControlMaster feature' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l no-ssh-cm --description 'Don\'t use SSH ControlMaster feature [DEFAULT]' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l http-pipelining --description 'Enable HTTP pipelining [DEFAULT]' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l no-http-pipelining --description 'Disable HTTP pipelining' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l remote-darcs -x -a '(__fish_complete_command)' --description 'Name of the darcs executable on the remote server' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'get\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'put' subcommand # complete -c darcs -n 'contains \'put\' (commandline -poc)' -l to-match -x --description 'Select changes up to a patch matching PATTERN' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l to-patch -x --description 'Select changes up to a patch matching REGEXP' complete -c darcs -n 'contains \'put\' (commandline -poc)' -s t -l tag -x --description 'Select tag matching REGEXP' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l context -r --description 'Version specified by the context in FILENAME' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l hashed --description 'Convert darcs-1 format to hashed format' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l old-fashioned-inventory --description 'Convert from hashed to darcs-1 format' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l set-default --description 'Set default repository [DEFAULT]' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l no-set-default --description 'Don\'t set default repository' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'put\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'put\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'put\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l apply-as -x -a '(__fish_complete_users)' --description 'Apply patch as another user using sudo' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l no-apply-as --description 'Don\'t use sudo to apply as another user [DEFAULT]' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l ssh-cm --description 'Use SSH ControlMaster feature' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l no-ssh-cm --description 'Don\'t use SSH ControlMaster feature [DEFAULT]' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l http-pipelining --description 'Enable HTTP pipelining [DEFAULT]' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l no-http-pipelining --description 'Disable HTTP pipelining' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l remote-darcs -x -a '(__fish_complete_command)' --description 'Name of the darcs executable on the remote server' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'put\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'initialize' subcommand # complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l hashed --description 'Some new features. Compatible with older repos' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l darcs-2 --description 'All features. Related repos must use same format [DEFAULT]' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l old-fashioned-inventory --description 'Minimal features. What older repos use' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'initialize\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'optimize' subcommand # complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l reorder-patches --description 'Reorder the patches in the repository' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l sibling -x --description 'Specify a sibling directory' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l relink --description 'Relink random internal data to a sibling' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l relink-pristine --description 'Relink pristine tree (not recommended)' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l upgrade --description 'Upgrade repository to latest compatible format' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l pristine --description 'Optimize hashed pristine layout' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l compress --description 'Create compressed patches' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l uncompress --description 'Uncompress patches' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'optimize\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'check' subcommand # complete -c darcs -n 'contains \'check\' (commandline -poc)' -l complete --description 'Get a complete copy of the repository' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l partial --description 'Get partial repository using checkpoint (old-fashioned format only)' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l no-test --description 'Don\'t run the test script' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l test --description 'Run the test script' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l leave-test-directory --description 'Don\'t remove the test directory' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l remove-test-directory --description 'Remove the test directory' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l ignore-times --description 'Don\'t trust the file modification times' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l no-ignore-times --description 'Trust modification times to find modified files [DEFAULT]' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'check\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'check\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'check\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'check\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'repair' subcommand # complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l repodir -x -a '(__fish_complete_directories (commandline -ct))' --description 'Specify the repository directory in which to run' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l umask -x --description 'Specify umask to use when writing' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'repair\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' # # Completions for the 'convert' subcommand # complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l repo-name -x --description '--repodir=DIRECTORY' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l set-scripts-executable --description 'Make scripts executable' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l disable --description 'Disable this command' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -s h -l help --description 'Shows brief description of command and its arguments' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l debug --description 'Give only debug output' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l debug-verbose --description 'Give debug and verbose output' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l debug-http --description 'Give debug output for libcurl' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -s v -l verbose --description 'Give verbose output' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -s q -l quiet --description 'Suppress informational output' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l standard-verbosity --description 'Neither verbose nor quiet output' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l timings --description 'Provide debugging timings information' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l ssh-cm --description 'Use SSH ControlMaster feature' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l no-ssh-cm --description 'Don\'t use SSH ControlMaster feature [DEFAULT]' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l http-pipelining --description 'Enable HTTP pipelining [DEFAULT]' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l no-http-pipelining --description 'Disable HTTP pipelining' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l no-cache --description 'Don\'t use patch caches' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l remote-darcs -x -a '(__fish_complete_command)' --description 'Name of the darcs executable on the remote server' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l posthook -x -a '(__fish_complete_command)' --description 'Specify command to run after this darcs command' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l no-posthook --description 'Don\'t run posthook command' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l prompt-posthook --description 'Prompt before running posthook [DEFAULT]' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l run-posthook --description 'Run posthook command without prompting' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l prehook -x -a '(__fish_complete_command)' --description 'Specify command to run before this darcs command' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l no-prehook --description 'Don\'t run prehook command' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l prompt-prehook --description 'Prompt before running prehook [DEFAULT]' complete -c darcs -n 'contains \'convert\' (commandline -poc)' -l run-prehook --description 'Run prehook command without prompting' fish/share/completions/date.fish000066400000000000000000000015011214535744100172400ustar00rootroot00000000000000complete -c date -s d -l date --description "Display date described by string" -x complete -c date -s f -l file --description "Display date for each line in file" -r complete -c date -s I -l iso-8601 --description "Output in ISO 8601 format" -x -a "date hours minutes seconds" complete -c date -s s -l set --description "Set time" -x complete -c date -s R -l rfc-2822 --description "Output RFC-2822 compliant date string" complete -c date -s r -l reference --description "Display the last modification time of file" -r complete -c date -s u -l utc --description "Print or set Coordinated Universal Time" complete -c date -l universal --description "Print or set Coordinated Universal Time" complete -c date -s h -l help --description "Display help and exit" complete -c date -s v -l version --description "Display version and exit" fish/share/completions/dcop.fish000066400000000000000000000030711214535744100172540ustar00rootroot00000000000000# # Completions for the shell interface to the KDE DCOP server # function __fish_complete_dcop -d "Completions for kde dcop" set -l com (commandline) if eval "$com >/dev/null 2>&1" # use dcop output if available eval "$com | sed -e 's/ (default)//; s/^\w[^ ]* \(\w*\)([^)]*)\$/\1/'" else set -l op (commandline -o) if test (count $op) -le 2 # select an application dcop | grep -- $op[-1] else # select a function set -l o for i in (seq 1 (count $op)) # strip the \ character which causes problems set o[$i] (echo $op[$i] | sed -e 's/\\\//g') end set -l idx (seq 2 (expr (count $o) - 1)) # list only function names dcop $o[$idx] | grep -- $o[-1] | sed -e 's/ (default)//; s/^\w[^ ]* \(\w*\)([^)]*)$/\1/' end end end complete -c dcop -l help -s h -f --description "Show help about options" complete -c dcop -l user -x -a '(awk -F: "{print \$1}" /etc/passwd)' --description "Connect to the given user's DCOP server" complete -c dcop -l all-users -f --description "Send the same DCOP call to all users with a running DCOP server" complete -c dcop -l list-sessions -f --description "List all active KDE session for a user or all users" complete -c dcop -l session -x -a '(dcop --list-sessions --all-users | grep DCOP)' --description "Send to the given KDE session" complete -c dcop -l no-user-time -f --description "Don't update the user activity timestamp in the called application" complete -c dcop -l pipe -f --description "Call DCOP for each line read from stdin" complete -c dcop -x -a "(__fish_complete_dcop)" fish/share/completions/dd.fish000066400000000000000000000045031214535744100167170ustar00rootroot00000000000000complete -c dd -xa '(__fish_complete_dd)' complete -c dd -d 'display help and exit' -xa '--help' complete -c dd -d 'output version information and exit' -xa '--version' function __fish_complete_dd --description 'Complete dd operands' # set operand_string as a local variable containing the current command-line token. set -l operand_string (commandline -t) switch $operand_string case 'if=*' 'of=*' # the read command uses $IFS to tokenise stdin input set -l IFS = # $operand now contains the left side of the operator, $value the right echo $operand_string | read -l operand value for entry in $value* # if $entry is a directory, append a '/' if test -d $entry echo $operand"="$entry/ else echo $operand"="$entry end end case 'iflag=*' 'oflag=*' set -l flags append direct directory dsync sync fullblock nonblock noatime nocache noctty nofollow set -l IFS = echo $operand_string | read -l operand value set -l IFS ' ' echo $value | sed -e 's/\(.*\)\(,\)/\1 \2/' | read -l complete comma # check if there is only one option if test $comma = '' set complete '' else set complete $complete, end for flag in $flags echo $operand"="$complete$flag end case 'conv=*' set -l convs ascii ebcdic ibm block unblock lcase ucase swab sync excl nocreat notrunc noerror fdatasync fsync set -l IFS = echo $operand_string | read -l operand value set -l IFS ' ' echo $value | sed -e 's/\(.*\)\(,\)/\1 \2/' | read -l complete comma if test $comma = '' set complete '' else set complete $complete, end for conv in $convs echo $operand"="$complete$conv end case 'status=*' echo status=noxfer case '*' set -l operands bs cbs conv count ibs if iflag obs of oflag seek skip status for operand in $operands echo $operand= end end end fish/share/completions/df.fish000066400000000000000000000033231214535744100167200ustar00rootroot00000000000000# # Completions for df # # # Test if we are using GNU sed # set -l is_gnu df --version >/dev/null ^/dev/null; and set is_gnu --is-gnu __fish_gnu_complete -c df -s h -l human-readable --description "Human readable sizes" $is_gnu __fish_gnu_complete -c df -s i -l inodes --description "List inode information" $is_gnu __fish_gnu_complete -c df -s k --description "Use 1kB block size" $is_gnu __fish_gnu_complete -c df -s l -l local --description "List only local file systems" $is_gnu __fish_gnu_complete -c df -s P -l portability --description "Use POSIX format" $is_gnu __fish_gnu_complete -c df -s t -l type -r --description "Show file systems of specified type" $is_gnu -x -a "(__fish_print_filesystems)" if test -n "$is_gnu" complete -c df -s a -l all --description "Include empty file systems" complete -c df -s B -l block-size -r --description "Block size" complete -c df -s H -l si --description "Human readable sizes, powers of 1000" complete -c df -l no-sync --description "Do not sync before getting usage info" complete -c df -l sync --description "Sync before getting usage info" complete -c df -s T -l print-type --description "Print file system type" complete -c df -s x -l exclude-type --description "Excluded file system type" -r -x -a "(__fish_print_filesystems)" complete -c df -l help --description "Display help and exit" complete -c df -l version --description "Display version and exit" else complete -c df -s a --description "Show all file systems" complete -c df -s g --description "Show sizes in gigabytes" complete -c df -s m --description "Show sizes in megabytes" complete -c df -s n --description "Print out the previously obtained statistics from the file systems" end fish/share/completions/diff.fish000066400000000000000000000000611214535744100172330ustar00rootroot00000000000000# Completions for diff __fish_complete_diff diff fish/share/completions/display.fish000066400000000000000000000237731214535744100200070ustar00rootroot00000000000000complete -c display -o alpha -d 'On, activate, off, deactivate, set, opaque, copy transparent, extract, background, or shape [option]' -xa '(display -list alpha)' complete -c display -o antialias -d 'Remove pixel-aliasing ' complete -c display -o authenticate -d 'Decipher image with this password [password]' complete -c display -o backdrop -d 'Display image centered on a backdrop' complete -c display -o channel -d 'Apply option to select image channels [type]' -xa '(display -list channel)' complete -c display -o colormap -d 'Shared or Private [type]' -x complete -c display -o colorspace -d 'Alternate image colorspace [type]' -xa '(display -list colorspace)' complete -c display -o comment -d 'Annotate image with comment [string]' complete -c display -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(display -list compress)' complete -c display -o define -d 'Define one or more image format options [format:option]' complete -c display -o delay -d 'Display the next image after pausing [value]' complete -c display -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c display -o depth -d 'Image depth [value]' complete -c display -o display -d 'Display image to this X server [server]' complete -c display -o dispose -d 'Layer disposal method [method]' -xa '(display -list dispose)' complete -c display -o dither -d 'Apply error diffusion to image [method]' -xa '(display -list dither)' complete -c display -o endian -d 'Endianness (MSB or LSB) of the image [type]' -xa '(display -list endian)' complete -c display -o filter -d 'Use this filter when resizing an image [type]' -xa '(display -list filter)' complete -c display -o format -d 'Output formatted image characteristics [string]' complete -c display -o geometry -d 'Preferred size and location of the Image window [geometry]' complete -c display -o gravity -d 'Horizontal and vertical backdrop placement [type]' -xa '(display -list gravity)' complete -c display -o identify -d 'Identify the format and characteristics of the image' complete -c display -o immutable -d 'Displayed image cannot be modified' complete -c display -o interlace -d 'Type of image interlacing scheme [type]' -xa '(display -list interlace)' complete -c display -o interpolate -d 'Pixel color interpolation method [method]' -xa '(display -list interpolate)' complete -c display -o label -d 'Assign a label to an image [string]' complete -c display -o limit -d 'Pixel cache resource limit [type value]' -x complete -c display -o loop -d 'Loop images then exit [iterations]' complete -c display -o map -d 'Display image using this Standard Colormap [type]' -x complete -c display -o monitor -d 'Monitor progress ' complete -c display -o page -d 'Size and location of an image canvas [geometry]' complete -c display -o profile -d 'Add, delete, or apply an image profile [filename]' -r complete -c display -o quality -d 'JPEG/MIFF/PNG compression level [value]' complete -c display -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(display -list colorspace)' complete -c display -o quiet -d 'Suppress all warning messages' complete -c display -o regard-warnings -d 'Pay attention to warning messages' complete -c display -o remote -d 'Command execute a command in an remote display process' complete -c display -o repage -d 'Size and location of an image canvas (operator) [geometry]' complete -c display -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c display -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c display -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c display -o set -d 'Set an image property [property value]' complete -c display -o size -d 'Width and height of image [geometry]' complete -c display -o texture -d 'Name of texture to tile onto the image background [filename]' -r complete -c display -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c display -o treedepth -d 'Color tree depth [value]' complete -c display -o update -d 'Seconds detect when image file is modified and redisplay' complete -c display -o verbose -d 'Print detailed information about the image' complete -c display -o visual -d 'Display image using this visual type [type]' -x complete -c display -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(display -list virtual-pixel)' complete -c display -o window -d 'Display image to background of this window [id]' -xa 'root (__fish_print_xwindows)' complete -c display -o window-group -d 'Exit program when this window id is destroyed [id]' complete -c display -o write -d 'Write image to a file [filename]' -r complete -c display -o auto-orient -d 'Automagically orient image' complete -c display -o border -d 'Surround image with a border of color [geometry]' complete -c display -o clip -d 'Clip along the first path from the 8BIM profile' complete -c display -o clip-path -d 'Clip along a named path from the 8BIM profile [id]' complete -c display -o colors -d 'Preferred number of colors in the image [value]' complete -c display -o contrast -d 'Enhance or reduce the image contrast' complete -c display -o crop -d 'Preferred size and location of the cropped image [geometry]' complete -c display -o decipher -d 'Convert cipher pixels to plain pixels [filename]' -r complete -c display -o deskew -d 'Straighten an image [threshold]' complete -c display -o despeckle -d 'Reduce the speckles within an image' complete -c display -o edge -d 'Apply a filter to detect edges in the image [factor]' complete -c display -o enhance -d 'Apply a digital filter to enhance a noisy image' complete -c display -o equalize -d 'Perform histogram equalization to an image' complete -c display -o extract -d 'Extract area from image [geometry]' complete -c display -o flip -d 'Flip image in the vertical direction' complete -c display -o flop -d 'Flop image in the horizontal direction' complete -c display -o frame -d 'Surround image with an ornamental border [geometry]' complete -c display -o fuzz -d 'Colors within this distance are considered equal [distance]' complete -c display -o gamma -d 'Level of gamma correction [value]' complete -c display -o monochrome -d 'Transform image to black and white' complete -c display -o negate -d 'Replace every pixel with its complementary color' complete -c display -o normalize -d 'Transform image to span the full range of colors' complete -c display -o raise -d 'Lighten/darken image edges to create a 3-D effect [value]' complete -c display -o resample -d 'Change the resolution of an image [geometry]' complete -c display -o resize -d 'Resize the image [geometry]' complete -c display -o roll -d 'Roll an image vertically or horizontally [geometry]' complete -c display -o rotate -d 'Apply Paeth rotation to the image [degrees]' complete -c display -o sample -d 'Scale image with pixel sampling [geometry]' complete -c display -o segment -d 'Segment an image [value]' complete -c display -o sharpen -d 'Sharpen the image [geometry]' complete -c display -o strip -d 'Strip image of all profiles and comments' complete -c display -o threshold -d 'Threshold the image [value]' complete -c display -o thumbnail -d 'Create a thumbnail of the image [geometry]' complete -c display -o trim -d 'Trim image edges' complete -c display -o coalesce -d 'Merge a sequence of images' complete -c display -o flatten -d 'Flatten a sequence of images' complete -c display -o debug -d 'Display copious debugging information [events]' -xa '(display -list debug)' complete -c display -o help -d 'Print program options' complete -c display -o list -d 'Print a list of supported option arguments [type]' -xa '(display -list list)' complete -c display -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c display -o version -d 'Print version information' complete -c display -o matte -d 'Store matte channel if the image has one' complete -c display -o scenes -d 'Range image scene range' complete -c display -o support -d 'Resize support: > 1.0 is blurry, < 1.0 is sharp [factor]' fish/share/completions/djview.fish000066400000000000000000000000741214535744100176170ustar00rootroot00000000000000 complete -c djview -x -a "(__fish_complete_suffix .djvu)" fish/share/completions/djview3.fish000066400000000000000000000000751214535744100177030ustar00rootroot00000000000000 complete -c djview3 -x -a "(__fish_complete_suffix .djvu)" fish/share/completions/djview4.fish000066400000000000000000000000751214535744100177040ustar00rootroot00000000000000 complete -c djview4 -x -a "(__fish_complete_suffix .djvu)" fish/share/completions/dlocate.fish000066400000000000000000000005361214535744100177450ustar00rootroot00000000000000 complete -c dlocate -s S -x -d 'List records that match filenames' complete -c dlocate -s L -d 'List all files in the package' -xa '(__fish_print_packages)' complete -c dlocate -o ls -d 'ls -ldF all files in the package' -xa '(__fish_print_packages)' complete -c dlocate -o du -d 'du -sck all files in the package' -xa '(__fish_print_packages)' fish/share/completions/dmesg.fish000066400000000000000000000033421214535744100174270ustar00rootroot00000000000000set -l levels '( __fish_complete_list , "echo emerg\nalert\ncrit\nerr\nwarn\nnotice\ninfo\ndebug" )' complete -c dmesg -s C -l clear -d 'Clear the kernel ring buffer' complete -c dmesg -s c -l read-clear -d 'Read and clear all messages' complete -c dmesg -s D -l console-off -d 'Disable printing messages to console' complete -c dmesg -s d -l show-delta -d 'Show time delta between printed messages' complete -c dmesg -s E -l console-on -d 'Enable printing messages to console' complete -c dmesg -s F -l file -d 'Use the file instead of the kernel log buffer' complete -c dmesg -s f -l facility -d 'Restrict output to defined facilities' -xa '( __fish_complete_list , "echo kern\nuser\nmail\ndaemon\nauth\nsyslog\nlpr\nnews" )' complete -c dmesg -s h -l help -d 'Display this help and exit' complete -c dmesg -s k -l kernel -d 'Display kernel messages' complete -c dmesg -s l -l level -d 'Restrict output to defined levels' -xa $levels complete -c dmesg -s n -l console-level -d 'Set level of messages printed to console' -xa $levels complete -c dmesg -s r -l raw -d 'Print the raw message buffer' complete -c dmesg -s s -l buffer-size -d 'Buffer size to query the kernel ring buffer' -x complete -c dmesg -s T -l ctime -d 'Show human readable timestamp ' complete -c dmesg -s t -l notime -d 'Don\'t print messages timestamp' complete -c dmesg -s u -l userspace -d 'Display userspace messages' complete -c dmesg -s V -l version -d 'Output version information and exit' complete -c dmesg -s x -l decode -d 'Decode facility and level to readable string' fish/share/completions/dpkg.fish000066400000000000000000000005361214535744100172570ustar00rootroot00000000000000 complete -c dpkg -s i -l install -d 'Install .deb package' -xa '(__fish_complete_suffix .deb)' complete -c dpkg -s r -l remove -d 'Remove package' -xa '(__fish_print_packages)' complete -c dpkg -s P -l purge -d 'Purge package' -xa '(__fish_print_packages)' complete -c dpkg -l force-all -d 'Continue on all problems' fish/share/completions/du.fish000066400000000000000000000025761214535744100167500ustar00rootroot00000000000000complete -c du -s a -l all --description "Write size for all files" complete -c du -l apparent-size --description "Print file size, not disk usage" complete -c du -s B -l block-size --description "Block size" complete -c du -s b -l bytes --description "Use 1B block size" complete -c du -s c -l total --description "Produce grand total" complete -c du -s D -l dereference-args --description "Dereference file symlinks" complete -c du -s h -l human-readable --description "Human readable sizes" complete -c du -s H -l si --description "Human readable sizes, powers of 1000" complete -c du -s k --description "Use 1kB block size" complete -c du -s l -l count-links --description "Count hard links multiple times" complete -c du -s L -l dereference --description "Dereference all symlinks" complete -c du -s S -l separate-dirs --description "Do not include subdirectory size" complete -c du -s s -l summarize --description "Display only a total for each argument" complete -c du -s x -l one-file-system --description "Skip other file systems" complete -c du -s X -l exclude-from -r --description "Exclude files that match pattern in file" complete -c du -l exclude -r --description "Exclude files that match pattern" complete -c du -l max-depth -r --description "Recursion limit" complete -c du -l help --description "Display help and exit" complete -c du -l version --description "Display version and exit" fish/share/completions/duply.fish000066400000000000000000000066571214535744100175010ustar00rootroot00000000000000# Completions for duply # Author: SanskritFritz (gmail) # First parameter is the profile name, or 'usage' complete --command duply --no-files --condition '__fish_is_first_token' --arguments '(/bin/ls /etc/duply ^/dev/null) (/bin/ls ~/.duply ^/dev/null)' --description 'Profile' complete --command duply --no-files --arguments 'usage' --description 'Get usage help text' # Second parameter is a duply command complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'create' --description 'Creates a configuration profile' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'backup' --description 'Backup with pre/post script execution' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'bkp' --description 'Backup without executing pre/post scripts' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'pre' --description 'Execute /pre script' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'post' --description 'Execute /post script' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'full' --description 'Force full backup' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'incr' --description 'Force incremental backup' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'list' --description 'List all files in backup (as it was at , default: now)' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'status' --description 'Prints backup sets and chains currently in repository' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'verify' --description 'List files changed since latest backup' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'purge' --description 'Shows outdated backup archives [--force, delete these files]' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'purge-full' --description 'Shows outdated backups [--force, delete these files]' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'cleanup' --description 'Shows broken backup archives [--force, delete these files]' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'restore' --description 'Restore the backup to [as it was at ]' complete --command duply --no-files --condition 'not __fish_is_first_token' --arguments 'fetch' --description 'Restore single file/folder from backup [as it was at ]' # Options complete --command duply --no-files --long-option force --description 'Really execute the commands: purge, purge-full, cleanup' complete --command duply --no-files --long-option preview --description 'Do nothing but print out generated duplicity command lines' complete --command duply --no-files --long-option dry-run --description 'Calculate what would be done, but don''t perform any actions' complete --command duply --no-files --long-option allow-source-mismatch --description 'Don''t abort when backup different dirs to the same backend' complete --command duply --no-files --long-option verbosity --arguments '0 2 4 8 9' --description 'Output verbosity level' fish/share/completions/dvipdf.fish000066400000000000000000000001111214535744100175730ustar00rootroot00000000000000complete -c dvipdf -x -a "( __fish_complete_suffix .dvi )" fish/share/completions/dvipdfm.fish000066400000000000000000000001101214535744100177470ustar00rootroot00000000000000complete -c dvipdfm -x -a " ( __fish_complete_suffix .dvi )" fish/share/completions/echo.fish000066400000000000000000000002361214535744100172450ustar00rootroot00000000000000complete -c echo -s n --description "Do not output a newline" complete -c echo -s s --description "Do not separate arguments with spaces" complete -c echo -u fish/share/completions/effectv.fish000066400000000000000000000107571214535744100177620ustar00rootroot00000000000000# completions for effectv 0.3.9 or similiar complete -c effectv -f -a "QuarkTV" -d "Dissolves moving objects" complete -c effectv -f -a "FireTV" -d "Clips incoming objects and burns it" complete -c effectv -f -a "BurningTV" -d "Burns incoming objects" complete -c effectv -f -a "RadioacTV" -d "Brightens moving objects and blurs it" complete -c effectv -f -a "StreakTV" -d "Makes 8 afterimages" complete -c effectv -f -a "BaltanTV" -d "Makes afterimages longer" complete -c effectv -f -a "1DTV" -d "Grabs a horizontal line from video every 1/30 sec" complete -c effectv -f -a "DotTV" -d "Converts the picture into a set of dots" complete -c effectv -f -a "MosaicTV" -d "Censors incoming objects" complete -c effectv -f -a "PuzzleTV" -d "Scrambles the picture" complete -c effectv -f -a "PredatorTV" -d "Makes incoming objects invisible visibly" complete -c effectv -f -a "SpiralTV" -d "Spiraling effect" complete -c effectv -f -a "SimuraTV" -d "Color distortion and image mirroring" complete -c effectv -f -a "EdgeTV" -d "Detects edge and display it like good old computer way" complete -c effectv -f -a "ShagadelicTV" -d "Go back to swinging '60s" complete -c effectv -f -a "NoiseTV" -d "Makes incoming objects noisy" complete -c effectv -f -a "AgingTV" -d "Film-aging effect" complete -c effectv -f -a "LifeTV" -d "Conway's life game with video input interaction" complete -c effectv -f -a "TransFormTV" -d "Performs positional translations on images" complete -c effectv -f -a "SparkTV" -d "Spark effect" complete -c effectv -f -a "warpTV" -d "Goo'ing effect" complete -c effectv -f -a "HolographicTV" -d "Holographic vision seen in Star Wars" complete -c effectv -f -a "cycleTV" -d "Color cycling effect" complete -c effectv -f -a "RippleTV" -d "Ripple mark effect" complete -c effectv -f -a "DiceTV" -d "A 'dicing' effect" complete -c effectv -f -a "VertigoTV" -d "Alpha blending with zoomed and rotated images" complete -c effectv -f -a "DeinterlaceTV" -d "Deinterlacing video images" complete -c effectv -f -a "nervousTV" -d "Real-time frame shuffling effect" complete -c effectv -f -a "RndmTV" -d "Gives you a noisy picture in color or B/W" complete -c effectv -f -a "RevTV" -d "Waveform monitor effect" complete -c effectv -f -a "RandomDotStereoTV" -d "Makes random dot stereo stream from video input" complete -c effectv -f -a "LensTV" -d "Old school demo lens effect" complete -c effectv -f -a "DiffTV" -d "Highlights interframe differences" complete -c effectv -f -a "BrokenTV" -d "Simulates broken TV" complete -c effectv -f -a "WarholTV" -d "Homage to Andy Warhol" complete -c effectv -f -a "MatrixTV" -d "A Matrix like effect" complete -c effectv -f -a "PUPTV" -d "Comes from \"Partial UPdate\", certain part of image is updated at a frame" complete -c effectv -f -a "ChameleonTV" -d "Vanishing into the wall..." complete -c effectv -o help -d "show usage information" complete -c effectv -o device -r -d "[FILE] use device FILE for video4linux (default is /dev/video0)" complete -c effectv -o channel -r -d "[CHANNEL] channel number of video source (default is 0)" set __fish_effectv_norms "ntsc pal secam pal-nc pal-m pal-n ntsc-jp" complete -c effectv -o norm -x -a '(echo $__fish_effectv_norms)' -d "[NORM] set video norm (default is ntsc)" set __fish_effectv_freqs "argentina australia australia-optus canada-cable china-bcast europe-east europe-west france ireland italy japan-bcast japan-cable newzealand southafrica us-bcast us-cable us-cable-hrc" complete -c effectv -o freqtab -x -a '(echo $__fish_effectv_freqs)' -d "[FREQUTAB] set frequency table" complete -c effectv -o fullscreen -d "enable fullscreen mode" complete -c effectv -o hardware -d "use direct video memory (if possible)" complete -c effectv -o doublebuffer -d "enable double buffering mode (if possible)" complete -c effectv -o fps -d "show frames/sec" complete -c effectv -o size -x -a "WxH" -d "[WxH] set the size of capturing image to WxH pixels (default 320x240)" complete -c effectv -o geometry -x -a "WxH" -d "[WxH] set the size of screen to WxH pixels" complete -c effectv -o scale -x -d "[NUMBER] set the scaling. When the capturing size is set, the screen size is scaled by NUMBER" complete -c effectv -o autoplay -x -d "[FRAMES] change effects automatically every FRAMES" set __fish_effectv_palettes "grey rgb24 rgb555 rgb565 yuv410p yuv411p yuv420p yuv422 yuv422p" complete -c effectv -o palette -x -a '(echo $__fish_effectv_palettes)' -d "[PALETTE] set the PALETTE of capturing device" complete -c effectv -o vloopback -r -d "[FILE] use device FILE for output of vloopback device" fish/share/completions/egrep.fish000066400000000000000000000000331214535744100174240ustar00rootroot00000000000000__fish_complete_grep egrep fish/share/completions/eix-sync.fish000066400000000000000000000031511214535744100200650ustar00rootroot00000000000000# Completions for the eix tool's eix-sync command # http://dev.croup.de/proj/eix and http://sourceforge.net/projects/eix/ # Author: Tassilo Horn ########## # EIX-SYNC complete -c eix-sync -s i -d "Ignore all previous options" complete -c eix-sync -s d -d "Only show differences to the previously saved database and exit" complete -c eix-sync -s s -xua '(__fish_print_users)@(__fish_print_hostnames):' -d "Sync via rsync from the given SERVER" complete -c eix-sync -s c -xua '(__fish_print_users)@(__fish_print_hostnames):' -d "Sync via rsync *to* the given CLIENT" complete -c eix-sync -s U -d "Do not touch the database and omit the hooks after update-eix. (Implies -R)" complete -c eix-sync -s u -d "Update database only and show differences" complete -c eix-sync -s g -d "Do not call gensync (and the !commands in /etc/eix-sync.conf)" complete -c eix-sync -s @ -d "Do not execute the hooks of /etc/eix-sync.conf" complete -c eix-sync -s S -d "Do not execute the hooks after emerge --sync (@@ entries)" complete -c eix-sync -s m -d "Run emerge --metadata instead of emerge --sync" complete -c eix-sync -s t -d "Use temporary file to save the current database" complete -c eix-sync -s v -d "Don't suppress output of update-eix and emerge" complete -c eix-sync -s q -d "Be quiet (close stdout)" complete -c eix-sync -s w -d "Run emerge-webrsync instead of emerge --sync" complete -c eix-sync -s r -d "Really recreate the dep-cache (rm -rf /var/cache/edb/dep/*) (default)" complete -c eix-sync -s R -d "Do not really recreate the dep-cache" complete -c eix-sync -s h -d "Show a short help text and exit" ########## fish/share/completions/eix.fish000066400000000000000000000061401214535744100171140ustar00rootroot00000000000000# Completions for the eix tool # http://dev.croup.de/proj/eix and http://sourceforge.net/projects/eix/ # Author: Tassilo Horn ########## # EIX ##### # Global options ### # exclusive options complete -c eix -s h -l help -d "Show a help screen and exit" complete -c eix -s V -l version -d "Show version and exit" complete -c eix -l dump -d "Dump variables to stdout" complete -c eix -l dump-defaults -d "Dump default values of variables to stdout" ### # special options complete -c eix -s t -l test-non-matching -d "Print non-matching entries first" complete -c eix -s Q -l quick -d "Don't read unguessable slots of installed packages (toggle)" complete -c eix -l care -d "Always read slots of installed packages" ### # ootput options complete -c eix -s q -l quiet -d "(no) output (toggle)" complete -c eix -s n -l nocolor -d "Don't use ANSI color codes" complete -c eix -s F -l force-color -d "Force colorful output" complete -c eix -s c -l compact -d "Compact search results (toggle)" complete -c eix -s v -l verbose -d "Verbose search results (toggle)" complete -c eix -s x -l versionsort -d "Sort output by slots/versions (toggle)" complete -c eix -s l -l versionlines -d "Print available versions line-by-line (toggle)" complete -c eix -l format -d "Format string for normal output" complete -c eix -l format-compact -d "Format string for compact output" complete -c eix -l format-verbose -d "Format string for verbose output" ##### # Local options ### # Miscellaneous complete -c eix -s I -l installed -d "Next expression only matches installed packages" complete -c eix -s i -l multi-installed -d "Match packages installed in several versions" complete -c eix -s d -l dup-packages -d "Match duplicated packages" complete -c eix -s D -l dup-versions -d "Match packages with duplicated versions" complete -c eix -s 1 -l slotted -d "Match packages with a nontrivial slot" complete -c eix -s 2 -l slots -d "Match packages with two different slots" complete -c eix -s u -l update -d "Match packages without best slotted version" complete -c eix -s o -l overlay -d "Match packages from overlays" complete -c eix -s T -l test-obsolete -d "Match packages with obsolete entries" complete -c eix -s '!' -l not -d "Invert the expression (toggle)" complete -c eix -s '|' -l pipe -d "Use input from pipe of emerge -pv" ### # Search Fields complete -c eix -s S -l description -d "Search the description field" complete -c eix -s A -l category-name -d "Search the category and name fields" complete -c eix -s C -l category -d "Search the category field" complete -c eix -s s -l name -d "Search the name field (default)" complete -c eix -s H -l homepage -d "Search the homepage field" complete -c eix -s L -l license -d "Search the license field" complete -c eix -s P -l provides -d "Search the provides field" ### # Type of Pattern complete -c eix -s r -l regex -d "Pattern is a regexp (default)" complete -c eix -s e -l exact -d "Pattern is the exact string" complete -c eix -s p -l pattern -d "Pattern is a wildcards-pattern" complete -c eix -s f -l fuzzy -d "Use fuzzy-search with the given max. levenshtein-distance (default: 2)" ##### ########## fish/share/completions/elatex.fish000066400000000000000000000000341214535744100176050ustar00rootroot00000000000000__fish_complete_tex elatex fish/share/completions/emacs.fish000066400000000000000000000011711214535744100174160ustar00rootroot00000000000000# # These completions are uncomplete # # Primarily complete text files complete -c emacs -x -a "(__fish_complete_mime 'text/*')" complete -c emacs -s q --description "Do not load init files" complete -c emacs -s u --description "Load users init file" -xa "(__fish_complete_users)" complete -c emacs -s t --description "Use file as terminal" -r complete -c emacs -s f --description "Execute Lisp function" -x complete -c emacs -s l --description "Load Lisp code from file" -r complete -c emacs -o nw --description "Do not use X interface" complete -uc emacs -s d -o display --description "Create window on the specified display" -x fish/share/completions/emerge.fish000066400000000000000000000123121214535744100175710ustar00rootroot00000000000000# Completions for emerge # Author: Tassilo Horn function __fish_emerge_print_installed_pkgs --description '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'/' -f5-6 | sort | uniq | sed 's/-[0-9]\{1,\}\..*$//' | sed -e '/^ *$/d' return end end function __fish_emerge_print_all_pkgs --description 'Prints completions for all available packages on the system from /usr/portage' if test -d /usr/portage find /usr/portage/ -maxdepth 2 -type d | cut -d'/' -f4-5 | sed 's/^\(distfiles\|profiles\|eclass\).*$//' | sort | uniq | sed 's/-[0-9]\{1,\}\..*$//' | sed -e '/^ *$/d' return end end function __fish_emerge_use_installed_package --description 'Tests if emerge command should have an installed package as potential completion' for i in (commandline -opc) if contains -- $i -u --update -C --unmerge -P --prune --config return 0 end end return 1 end ######################### # Actions complete -c emerge -n '__fish_emerge_use_installed_package' -xua 'system\t"'(_ "All base system packages")'" world\t"'(_ "All packages in world")'" (__fish_emerge_print_installed_pkgs)\t"'(_ "Installed package")'"' complete -c emerge -n 'not __fish_emerge_use_installed_package' -xua 'system\t"'(_ "All base system packages")'" world\t"'(_ "All packages in world")'" (__fish_emerge_print_all_pkgs)\t"'(_ "Package")'"' complete -c emerge -l sync -d "Synchronize the portage tree" complete -c emerge -l info -d "Get informations to include in bug reports" complete -c emerge -s V -l version -d "Displays the version number of emerge" complete -c emerge -s h -l help -xa '""\t"'(_ "Usage overview of emerge")'" system\t"'(_ "Help on subject system")'" config\t"'(_ "Help on subject config")'" sync\t"'(_ "Help on subject sync")'"' -d "Displays help information for emerge" complete -c emerge -s c -l clean -d "Remove packages that will not affect the functionality of the system" complete -c emerge -l config -d "Run package specific actions needed to be executed after the emerge process" complete -c emerge -l depclean -d "WARNING: Delete all packages that are neither deps nor in world" complete -c emerge -l metadata -d "Process all meta-cache files" complete -c emerge -s P -l prune -d "WARNING: Remove all but the latest version of package" complete -c emerge -l regen -d "Check and update the dependency cache" complete -c emerge -l resume -d "Resume the last merge operation" complete -c emerge -s s -l search -d "Search for matches in the portage tree" complete -c emerge -s S -l searchdesc -d "Search for matches in package names and descriptions" complete -c emerge -s C -l unmerge -d "WARNING: Remove the given package" complete -c emerge -s u -l update -d "Update the given package" # END Actions ######################### ######################### # Options complete -c emerge -l alphabetical -d "Sort flag lists alphabetically" complete -c emerge -s a -l ask -d "Prompt the user before peforming the merge" complete -c emerge -s b -l buildpkg -d "Build a binary package additionally" complete -c emerge -s B -l buildpkgonly -d "Only build a binary package" complete -c emerge -s l -l changelog -d "Show changelog of package. Use with --pretend" complete -c emerge -l color -xa 'y\t"'(_ "Use colors in output")'" n\t"'(_ "Don't use colors in output")'"' -d "Toggle colorized output" complete -c emerge -l colums -d "Align output. Use with --pretend" complete -c emerge -s d -l debug -d "Run in debug mode" complete -c emerge -s D -l deep -d "Consider the whole dependency tree" complete -c emerge -s e -l emptytree -d "Reinstall all world packages" complete -c emerge -s f -l fetchonly -d "Only download the packages but don't install them" complete -c emerge -s F -l fetch-all-uri -d "Same as --fetchonly and grab all potential files" complete -c emerge -s g -l getbinpkg -d "Download infos from each binary package. Implies -k" complete -c emerge -s G -l getbinpkgonly -d "As -g but don't use local infos" complete -c emerge -l ignore-default-opts -d "Ignore EMERGE_DEFAULT_OPTS" complete -c emerge -s N -l newuse -d "Include installed packages with changed USE flags" complete -c emerge -l noconfmem -d "Disregard merge records" complete -c emerge -s O -l nodeps -d "Don't merge dependencies" complete -c emerge -s n -l noreplace -d "Skip already installed packages" complete -c emerge -l nospinner -d "Disable the spinner" complete -c emerge -s 1 -l oneshot -d "Don't add packages to world" complete -c emerge -s o -l onlydeps -d "Only merge dependencies" complete -c emerge -s p -l pretend -d "Display what would be done without doing it" complete -c emerge -s q -l quit -d "Use a condensed output" complete -c emerge -l skipfirst -d "Remove the first package in the resume list. Use with --resume" complete -c emerge -s t -l tree -d "Show the dependency tree" complete -c emerge -s k -l usepkg -d "Use binary package if available" complete -c emerge -s K -l usepkgonly -d "Only use binary packages" complete -c emerge -s v -l verbose -d "Run in verbose mode" complete -c emerge -l with-bdeps -xa 'y\t"'(_ "Pull in build time dependencies")'" n\t"'(_ "Don't pull in build time dependencies")'"' -d "Toggle build time dependencies" # END Options ######################### fish/share/completions/env.fish000066400000000000000000000010551214535744100171170ustar00rootroot00000000000000 complete -c env -a "(set -n)=" -x --description "Redefine variable" complete -c env -a "(__fish_complete_subcommand -- -u --unset)" --description "Command" complete -c env -s i -l ignore-environment --description "Start with an empty environment" complete -c env -s u -l unset --description "Remove variable from the environment" -x -a "(set -n)" complete -c env -l help --description "Display help and exit" complete -c env -l version --description "Display version and exit" # Since env runs subcommands, it can accept any switches complete -c env -u fish/share/completions/equery.fish000066400000000000000000000147011214535744100176430ustar00rootroot00000000000000# Completions for Gentoo's equery tool # Author: Tassilo Horn function __fish_equery_print_installed_pkgs --description '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'/' -f5-6 | sort | uniq | sed 's/-[0-9]\{1,\}\..*$//' return end end function __fish_equery_print_all_pkgs --description 'Prints completions for all available packages on the system from /usr/portage' if test -d /usr/portage find /usr/portage/ -maxdepth 2 -type d | cut -d'/' -f4-5 | sed 's/^\(distfiles\|profiles\|eclass\).*$//' | sort | uniq | sed 's/-[0-9]\{1,\}\..*$//' return end end function __fish_equery_print_all_categories --description 'Prints completions for all available categories on the system from /usr/portage' if test -d /usr/portage find /usr/portage/ -maxdepth 1 -type d | cut -d'/' -f4 | sed 's/^\(distfiles\|profiles\|eclass\).*$//' | sort | uniq | sed 's/-[0-9]\{1,\}\..*$//' return end end ######################################################################### # Global Opts complete -c equery -s q -l quit -d "causes minimal output to be emitted" complete -c equery -s C -l nocolor -d "turns off colours" complete -c equery -s h -l help -d "displays a help summary" complete -c equery -s V -l version -d "displays the equery version" complete -c equery -s N -l no-pipe -d "turns off pipe detection" # END Global Opts ######################################################################### ######################################################################### # Subcommands complete -c equery -n '__fish_use_subcommand' -xa 'belongs\t"'(_ "list all packages owning file(s)")'"' complete -c equery -n '__fish_use_subcommand' -xa 'check\t"'(_ "check MD5sums and timestamps of package")'"' complete -c equery -n '__fish_use_subcommand' -xa 'depends\t"'(_ "list all packages depending on specified package")'"' complete -c equery -n '__fish_use_subcommand' -xa 'depgraph\t"'(_ "display a dependency tree for package")'"' complete -c equery -n '__fish_use_subcommand' -xa 'files\t"'(_ "list files owned by package")'"' complete -c equery -n '__fish_use_subcommand' -xa 'hasuse\t"'(_ "list all packages with specified useflag")'"' complete -c equery -n '__fish_use_subcommand' -xa 'list\t"'(_ "list all packages matching pattern")'"' complete -c equery -n '__fish_use_subcommand' -xa 'size\t"'(_ "print size of files contained in package")'"' complete -c equery -n '__fish_use_subcommand' -xa 'uses\t"'(_ "display USE flags for package")'"' complete -c equery -n '__fish_use_subcommand' -xa 'which\t"'(_ "print full path to ebuild for package")'"' # END Subcommands ######################################################################### ######################################################################### # Local opts # belongs complete -c equery -n '__fish_seen_subcommand_from belongs' -s c -l category -xa '(__fish_equery_print_all_categories)' -d "only search in given category" complete -c equery -n '__fish_seen_subcommand_from belongs' -s f -l full-regex -d "supplied query is a regex" complete -c equery -n '__fish_seen_subcommand_from belongs' -s e -l earlyout -d "stop when first match found" # depends complete -c equery -n '__fish_seen_subcommand_from depends' -s a -l all-packages -d "search in all available packages (slow)" complete -c equery -n '__fish_seen_subcommand_from depends' -s d -l direct -d "search direct dependencies only (default)" complete -c equery -n '__fish_seen_subcommand_from depends' -s D -l indirect -d "search indirect dependencies (very slow)" # depgraph complete -c equery -n '__fish_seen_subcommand_from depgraph' -s U -l no-useflags -d "do not show USE flags" complete -c equery -n '__fish_seen_subcommand_from depgraph' -s l -l linear -d "do not use fancy formatting" # files complete -c equery -n '__fish_seen_subcommand_from files' -l timestamp -d "output the timestamp of each file" complete -c equery -n '__fish_seen_subcommand_from files' -l md5sum -d "output the md5sum of each file" complete -c equery -n '__fish_seen_subcommand_from files' -l type -d "output the type of each file" complete -c equery -n '__fish_seen_subcommand_from files' -l filter -xa "dir obj sym dev fifo path conf cmd doc man info" -d "filter output based on files type or path (comma separated list)" # hasuse complete -c equery -n '__fish_seen_subcommand_from hasuse' -s i -l installed -d "search installed packages (default)" complete -c equery -n '__fish_seen_subcommand_from hasuse' -s I -l exclude-installed -d "do not search installed packages" complete -c equery -n '__fish_seen_subcommand_from hasuse' -s p -l portage-tree -d "also search in portage tree (/usr/portage)" complete -c equery -n '__fish_seen_subcommand_from hasuse' -s o -l overlay-tree -d "also search in overlay tree (/usr/local/portage)" # list complete -c equery -n '__fish_seen_subcommand_from list' -s i -l installed -d "search installed packages (default)" complete -c equery -n '__fish_seen_subcommand_from list' -s I -l exclude-installed -d "do not search installed packages" complete -c equery -n '__fish_seen_subcommand_from list' -s p -l portage-tree -d "also search in portage tree (/usr/portage)" complete -c equery -n '__fish_seen_subcommand_from list' -s o -l overlay-tree -d "also search in overlay tree (/usr/local/portage)" complete -c equery -n '__fish_seen_subcommand_from list' -s f -l full-regex -d "query is a regular expression" complete -c equery -n '__fish_seen_subcommand_from list' -s e -l exact-name -d "list only those packages that exactly match" complete -c equery -n '__fish_seen_subcommand_from list' -s d -l duplicates -d "only list installed duplicate packages" # size complete -c equery -n '__fish_seen_subcommand_from size' -s b -l bytes -d "report size in bytes" # uses complete -c equery -n '__fish_seen_subcommand_from uses' -s a -l all -d "include non-installed packages" # END Local opts ######################################################################### ######################################################################### # Arguments # Commands applied to a package which doesn't need to be installed complete -c equery -n '__fish_seen_subcommand_from depends depgraph hasuse which' -xa '(__fish_equery_print_all_pkgs)' # Commands applied to a package which has to be installed complete -c equery -n '__fish_seen_subcommand_from check files uses size' -xa '(__fish_equery_print_installed_pkgs)' # END Arguments #########################################################################fish/share/completions/etex.fish000066400000000000000000000000311214535744100172650ustar00rootroot00000000000000__fish_complete_tex etex fish/share/completions/eval.fish000066400000000000000000000001051214535744100172510ustar00rootroot00000000000000 complete -c eval -s h -l help --description 'Display help and exit' fish/share/completions/evince.fish000066400000000000000000000006301214535744100175760ustar00rootroot00000000000000 complete -c evince -a '(__fish_complete_file_url)' complete -c evince -s p -l page-label -d "The page of the document to display" -x complete -c evince -s f -l fullscreen -d "Run evince in fullscreen mode" complete -c evince -s s -l presentation -d "Run evince in presentation mode" complete -c evince -s w -l preview -d "Run evince as a previewer" complete -c evince -l display -d "X display to use" fish/share/completions/exec.fish000066400000000000000000000001051214535744100172460ustar00rootroot00000000000000 complete -c exec -s h -l help --description 'Display help and exit' fish/share/completions/exit.fish000066400000000000000000000002751214535744100173030ustar00rootroot00000000000000 complete -c exit -s h -l help --description 'Display help and exit' complete -c exit -x -a 0 -d "Quit with normal exit status" complete -c exit -x -a 1 -d "Quit with abnormal exit status" fish/share/completions/expand.fish000066400000000000000000000006221214535744100176050ustar00rootroot00000000000000complete -c expand -s i -l initial -d 'do not convert tabs after non blanks' complete -c expand -s t -l tabs -x -d 'have tabs NUMBER characters apart, not 8' complete -c expand -s t -l tabs -x -d 'use comma separated list of explicit tab positions' complete -c expand -l help -d 'display this help and exit' complete -c expand -l version -d 'output version information and exit' fish/share/completions/fg.fish000066400000000000000000000001031214535744100167140ustar00rootroot00000000000000 complete -c fg -s h -l help --description 'Display help and exit' fish/share/completions/fgrep.fish000066400000000000000000000000331214535744100174250ustar00rootroot00000000000000__fish_complete_grep fgrep fish/share/completions/file.fish000066400000000000000000000032701214535744100172470ustar00rootroot00000000000000#completion for file complete -c file -s b -l brief --description 'Do not prepend filenames to output lines' complete -c file -s c -l checking-printout --description 'Print the parsed form of the magic file' complete -c file -s C -l compile --description 'Write an output file containing a pre-parsed version of file' complete -c file -s h -l no-dereference --description 'Do not follow symlinks' complete -c file -s i -l mime --description 'Output mime type strings instead human readable strings' complete -c file -s k -l keep-going --description 'Don\'t stop at the first match' complete -c file -s L -l dereference --description 'Follow symlinks' complete -c file -s n -l no-buffer --description 'Flush stdout after checking each file' complete -c file -s N -l no-pad --description 'Don\'t pad filenames so that they align in the output' complete -c file -s p -l preserve-date --description 'Attempt to preserve the access time of files analyzed' complete -c file -s r -l raw --description 'Don\'t translate unprintable characters to octal' complete -c file -s s -l special-files --description 'Read block and character device files too' complete -c file -s v -l version --description 'Print the version of the program and exit' complete -c file -s z -l uncompress --description 'Try to look inside compressed files' complete -c file -l help --description 'Print a help message and exit' complete -r -c file -s f -l files-from --description 'Read the names of the files to be examined from a file' complete -r -c file -s F -l separator --description 'Use other string as result field separator instead of :' complete -r -c file -s m -l magic-file --description 'Alternate list of files containing magic numbers' fish/share/completions/find.fish000066400000000000000000000153421214535744100172530ustar00rootroot00000000000000# Completions for the 'find' command # There are quite a few of them... # Switches for how to handle symlinks complete -c find -s P --description "Never follow symlinks" complete -c find -s L -o follow --description "Follow symlinks" complete -c find -s H --description "Do not follow symbolic links, except while processing the command line arguments" # General options complete -c find -o daystart --description "Measure from the beginning of today rather than from 24 hours ago" complete -c find -s d -o depth --description "Process subdirectories before the directory itself" complete -c find -o help -l help --description "Display help and exit" complete -c find -o ignore_readdir_race --description "Do not print error messages for files that are deleted while running find" complete -c find -o maxdepth --description "Maximum recursion depth" -a "1 2 3 4 5 6 7 8 9" complete -c find -o mindepth --description "Do not apply any tests or actions at levels less than specified level" -a "1 2 3 4 5 6 7 8 9" complete -c find -o mount -o xdev --description "Don't descend directories on other filesystems" complete -c find -o noignore_readdir_race --description "Print error messages for files that are deleted while running find" complete -c find -o noleaf --description "Do not optimize by assuming that directories contain 2 fewer subdirectories than their hard link count" complete -c find -o regextype --description "Specify regular expression type" -a "emacs posix-awk posix-basic posiz-egrep posix-extended" complete -c find -o version -l version --description "Display version and exit" complete -c find -o warn --description "Turn warnings on" complete -c find -o nowarn --description "Turn warnings off" # Tests complete -c find -o amin --description "File last accessed specified number of minutes ago" -r complete -c find -o anewer --description "File last accessed more recently than file was modified" -r complete -c find -o atime --description "File last accessed specified number of days ago" -r complete -c find -o cmin --description "File status last changed specified number of minutes ago" -r complete -c find -o cnewer --description "File status last changed more recently than file was modified" -r complete -c find -o ctime --description "File status last changed specified number of days ago" -r complete -c find -o empty --description "File is empty and is either a regular file or a directory" complete -c find -o executable --description "File is executable" complete -c find -o false --description "Always false" complete -c find -o fstype --description "File is on filesystem of specified type" -a "(__fish_print_filesystems)" -r complete -c find -o gid --description "Numeric group id of file" -r complete -c find -o group --description "Group name of file" -a "(__fish_complete_groups)" complete -c find -o ilname --description "File is symlink matching specified case insensitive pattern" -r complete -c find -o iname --description "File name matches case insensitive pattern" -r complete -c find -o inum --description "File has specified inode number" -r complete -c find -o ipath -o iwholename --description "File path matches case insensitive pattern" -r complete -c find -o iregex --description "File name matches case insensetive regex" -r complete -c find -o links --description "File has specified number of links" -r -a "1 2 3 4 5 6 7 8 9" complete -c find -o lname --description "File is symlink matching specified pattern" -r complete -c find -o mmin --description "File last modified specified number of minutes ago" -r complete -c find -o newer --description "File last modified more recently than file was modified" -r complete -c find -o mtime --description "File last modified specified number of days ago" -r complete -c find -o name --description "File name matches pattern" -r complete -c find -o nouser --description "No user corresponds to file's numeric user ID" complete -c find -o nogroup --description "No group corresponds to file's numeric group ID" complete -c find -o path -o wholename --description "File path matches pattern" -r complete -c find -o perm --description "Files has specified permissions set" -r complete -c find -o regex --description "File name matches regex" -r complete -c find -o samefile --description "File refers to the same inode as specified file" -r complete -c find -o size --description "File uses specified units of space" -r complete -c find -o true --description "Always true" set -l type_comp 'b\t"Block device" c\t"Character device" d\t"Directory" p\t"Named pipe" f\t"File" l\t"Symbolic link" s\t"Socket"' complete -c find -o type --description "File is of specified type" -x -a $type_comp complete -c find -o uid --description "File's owner has specified numeric user ID" -r complete -c find -o used --description "File was last accessed specified number of days after its status was last changed" -r complete -c find -o user --description "File's owner" -a "(__fish_complete_users)" -r complete -c find -o xtype --description "Check type of file - in case of symlink, check the file that is not checked by -type" -x -a $type_comp complete -c find -o context --description "File's security context matches specified pattern" -r # Actions complete -c find -o delete --description "Delete selected files" complete -c find -o exec --description "Execute specified command for each located file" -r complete -c find -o execdir --description "Execute specified command for each located file, in the files directory" -r complete -c find -o fls --description "List file in ls -dils format, write to specified file" -r complete -c find -o fprint --description "Print full file names into specified file" -r complete -c find -o fprint0 --description "Print null separated full file names into specified file" -r complete -c find -o fprintf --description "Print formated data into specified file" -r complete -c find -o ok --description "Execute specified command for each located file after asking user" -r complete -c find -o print --description "Print full file names" complete -c find -o okdir --description "Execute specified command for each located file, in the files directory, after asking user" -r complete -c find -o print0 --description "Print null separated full file names" complete -c find -o printf --description "Print formated data" -r complete -c find -o prune --description "Do not recurse unless -depth is specified" complete -c find -o quit --description "Exit at once" complete -c find -o ls --description "List file in ls -dils format" -r # Grouping complete -c find -o not --description "Negate result of action" complete -c find -o and -s a --description "Result is only true if both previous and next action are true" complete -c find -o or -s o --description "Result is true if either previous or next action are true" fish/share/completions/fish.fish000066400000000000000000000010421214535744100172540ustar00rootroot00000000000000complete -c fish -s c -l "command" --description "Run fish with this command" complete -c fish -s h -l help --description "Display help and exit" complete -c fish -s v -l version --description "Display version and exit" complete -c fish -s n -l no-execute --description "Only parse input, do not execute" complete -c fish -s i -l interactive --description "Run in interactive mode" complete -c fish -s l -l login --description "Run in login mode" complete -c fish -s p -l profile --description "Output profiling information to specified file" -f fish/share/completions/fish_indent.fish000066400000000000000000000004201214535744100206140ustar00rootroot00000000000000complete -c fish_indent -s h -l help --description 'Display help and exit' complete -c fish_indent -s v -l version --description 'Display version and exit' complete -c fish_indent -s i -l no-indent --description 'Do not indent output, only reformat into one job per line' fish/share/completions/flac.fish000066400000000000000000000147011214535744100172360ustar00rootroot00000000000000# # Completions for flac # complete -c flac -s v -l version -d "Show the flac version number" complete -c flac -s h -l help -d "Show this screen" complete -c flac -s H -l explain -d "Show detailed explanation of usage and options" complete -c flac -s d -l decode -d "Decode (the default behavior is to encode)" complete -c flac -s t -l test -d "Same as -d except no decoded file is written" complete -c flac -s a -l analyze -d "Same as -d except an analysis file is written" complete -c flac -s c -l stdout -d "Write output to stdout" complete -c flac -s s -l silent -d "Do not write runtime encode/decode statistics" complete -c flac -l totally-silent -d "Do not print anything including errors" complete -c flac -s f -l force -d "Force overwriting of output files" complete -c flac -r -s o -l output-name= -d "Force the output file name" complete -c flac -l output-prefix= -d "Prepend STRING to output names" complete -c flac -l delete-input-file -d "Deletes after a successful encode/decode" complete -c flac -l skip= -d "Skip the given initial samples for each input {#|mm:ss.ss}" complete -c flac -l until= -d "Stop at the given sample for each input file {#|[+|-]mm:ss.ss}" complete -c flac -l ogg -d "Use Ogg as transport layer" complete -c flac -l serial-number -d "Serial number to use for the FLAC stream" complete -c flac -l residual-text -d "Include residual signal in text output" complete -c flac -l residual-gnuplot -d "Generate gnuplot files of residual distribution" complete -c flac -s F -l decode-through-errors -d "Continue decoding through stream errors" complete -c flac -l cue= -d "Set the beginning and ending cuepoints to decode [#.#][-[#.#]]" complete -c flac -s V -l verify -d "Verify a correct encoding" complete -c flac -l lax -d "Allow encoder to generate non-Subset files" complete -c flac -l sector-align -d "Align multiple files on sector boundaries" complete -c flac -l replay-gain -d "Calculate ReplayGain & store in Vorbis comments" complete -c flac -l cuesheet= -d "Import cuesheet and store in CUESHEET block" complete -c flac -x -s T -l tag= -d "Add a Vorbis comment FIELD=VALUE; may appear multiple times" complete -c flac -x -s T -l tag-from-file= -d "Read tags from file" complete -c flac -x -s S -l seekpoint= -d "Add seek point(s) {#|X|#x|#s}" complete -c flac -x -s P -l padding= -d "Write a PADDING block of length #" complete -c flac -s 0 -l compression-level-0 -d "Synonymous with -l 0 -b 1152 -r 22" complete -c flac -l fast -d "Synonymous with -l 0 -b 1152 -r 22" complete -c flac -s 1 -l compression-level-1 -d "Synonymous with -l 0 -b 1152 -M -r 2,2" complete -c flac -s 2 -l compression-level-2 -d "Synonymous with -l 0 -b 1152 -m -r 3" complete -c flac -s 3 -l compression-level-3 -d "Synonymous with -l 6 -b 4608 -r 3,3" complete -c flac -s 4 -l compression-level-4 -d "Synonymous with -l 8 -b 4608 -M -r 3,3" complete -c flac -s 5 -l compression-level-5 -d "Synonymous with -l 8 -b 4608 -m -r 3,3" complete -c flac -s 6 -l compression-level-6 -d "Synonymous with -l 8 -b 4608 -m -r 4" complete -c flac -s 7 -l compression-level-7 -d "Synonymous with -l 8 -b 4608 -m -e -r 6" complete -c flac -s 8 -l compression-level-8 -d "Synonymous with -l 12 -b 4608 -m -e -r 6" complete -c flac -l best -d "Synonymous with -l 12 -b 4608 -m -e -r 6" complete -c flac -x -s b -l blocksize= -d "Specify blocksize in samples" complete -c flac -s m -l mid-side -d "Try mid-side coding for each frame" complete -c flac -s M -l adaptive-mid-side -d "Adaptive mid-side coding for all frames" complete -c flac -s e -l exhaustive-model-search -d "Do exhaustive model search (expensive!)" complete -c flac -x -s l -l max-lpc-order= -d "Max LPC order; 0 => only fixed predictors" complete -c flac -s p -l qlp-coeff-precision-search -d "Exhaustively search LP coeff quantization" complete -c flac -x -s q -l qlp-coeff-precision= -d "Specify precision in bits" complete -c flac -x -s r -l rice-partition-order= -d "Set [min,]max residual partition order" complete -c flac -l endian=big -d "Set byte order for samples" complete -c flac -l endian=little -d "Set byte order for samples" complete -c flac -l channels= -d "Number of channels" complete -c flac -l bps= -d "Number of bits per sample" complete -c flac -l sample-rate= -d "Sample rate in Hz" complete -c flac -l sign=unsigned -d "Sign of samples" complete -c flac -l sign=signed -d "Sign of samples" complete -c flac -l input-size= -d "Size of the raw input in bytes" complete -c flac -l force-aiff-format -d "Force decoding to AIFF format" complete -c flac -l force-raw-format -d "Treat input or output as raw samples" complete -c flac -l no-adaptive-mid-side -d "No adaptive mid-side coding for all frames" complete -c flac -l no-decode-through-errors -d "Don't continue decoding through stream errors" complete -c flac -l no-delete-input-file -d "Don't delete after a successful encode/decode" complete -c flac -l no-exhaustive-model-search -d "No exhaustive model search" complete -c flac -l no-lax -d "Don't allow encoder to generate non-Subset files" complete -c flac -l no-mid-side -d "Don't try mid-side coding for each frame" complete -c flac -l no-ogg -d "Don't use Ogg as transport layer" complete -c flac -l no-padding -d "Don't write a PADDING block of length #" complete -c flac -l no-qlp-coeff-prec-search -d "Don't exhaustively search LP coeff quantization" complete -c flac -l no-replay-gain -d "Don't calculate ReplayGain & store in Vorbis comments" complete -c flac -l no-residual-gnuplot -d "Don't generate gnuplot files of residual distribution" complete -c flac -l no-residual-text -d "Don't include residual signal in text output" complete -c flac -l no-sector-align -d "Don't align multiple files on sector boundaries" complete -c flac -l no-seektable complete -c flac -l no-silent -d "Write runtime encode/decode statistics" complete -c flac -l no-force -d "Don't force overwriting of output files" complete -c flac -l no-verify -d "Don't verify a correct encoding" fish/share/completions/fluxbox-remote.fish000066400000000000000000000000721214535744100213050ustar00rootroot00000000000000complete -c fluxbox-remote -xa '(fluxbox -list-commands)' fish/share/completions/ftp.fish000066400000000000000000000000301214535744100171100ustar00rootroot00000000000000__fish_complete_ftp ftp fish/share/completions/funced.fish000066400000000000000000000003641214535744100175750ustar00rootroot00000000000000complete -c funced -xa "(functions -na)" --description "Save function" complete -c funced -s e -l editor -d 'Open function in external editor' -xa '(__fish_complete_command)' complete -c funced -s i -l interactive -d 'Edit in interactive mode' fish/share/completions/funcsave.fish000066400000000000000000000001111214535744100201310ustar00rootroot00000000000000complete -c funcsave -xa "(functions -na)" --description "Save function" fish/share/completions/function.fish000066400000000000000000000017151214535744100201570ustar00rootroot00000000000000complete -c function -s d -l description --description "Set function description" -x complete -c function -xa "(functions -n)" --description "Function" complete -c function -xa "(builtin -n)" --description "Builtin" complete -c function -s j -l on-job-exit --description "Make the function a job exit event handler" -x complete -c function -s p -l on-process-exit --description "Make the function a process exit event handler" -x complete -c function -s s -l on-signal --description "Make the function a signal event handler" -x complete -c function -s v -l on-variable --description "Make the function a variable update event handler" -x complete -c function -s e -l on-event --description "Make the function a generic event handler" -xa 'fish_prompt fish_command_not_found' complete -c function -s a -l argument-names --description "Specify named arguments" complete -c function -s S -l no-scope-shadowing --description "Do not shadow variable scope of calling function" fish/share/completions/functions.fish000066400000000000000000000011041214535744100203320ustar00rootroot00000000000000complete -c functions -s e -l erase --description "Erase function" -x -a "(functions -n)" complete -c functions -xa "(functions -na)" --description "Function" complete -c functions -s a -l all --description "Show hidden functions" complete -c functions -s h -l help --description "Display help and exit" complete -c functions -s d -l description --description "Set function description" -x complete -c functions -s q -l query --description "Test if function is defined" complete -c functions -s n -l names --description "List the names of the functions, but not their definition" fish/share/completions/fuser.fish000066400000000000000000000023661214535744100174610ustar00rootroot00000000000000__fish_make_completion_signals for i in $__kill_signals set number (echo $i | cut -d " " -f 1) set name (echo $i | cut -d " " -f 2) complete -c fuser -o $number -d $name complete -c fuser -o $name -d $name end complete -c fuser -s a -l all -d 'Show all files specified on the command line' complete -c fuser -s k -l kill -d 'Kill processes, accessing the file' complete -c fuser -s i -d 'Ask the user for confirmation before killing a process' complete -c fuser -s l -l list-signals -d 'List all known signal names' complete -c fuser -s m -l mount -d 'All processes accessing files on that file system are listed' -xa '(__fish_print_mounted)' complete -c fuser -s M -l ismountpoint -d 'Request will be fulfilled if -m specifies a mountpoint' complete -c fuser -s w -d 'Kill only processes which have write access' complete -c fuser -s n -l namespace -d 'Slect a different namespace' -r complete -c fuser -s s -l silent -d 'Silent operation' complete -c fuser -s u -l user -d 'Append the user name of the process owner to each PID' complete -c fuser -s v -l verbose -d 'Verbose mode' complete -c fuser -s V -d 'Print version and exit' complete -c fuser -s 4 -l ipv4 -d 'Search only for IPv4 sockets' complete -c fuser -s 6 -l ip64 -d 'Search only for IPv6 sockets' fish/share/completions/fusermount.fish000066400000000000000000000013021214535744100205310ustar00rootroot00000000000000# # Completions for fusermount # # Find mount points, borrowed from umount.fish # complete -c fusermount --description "Mount point" -x -a ' ( cat /etc/mtab | sgrep "^sshfs" | cut -d " " -f 1-2|tr " " \n|sed -e "s/[0-9\.]*:\//\//"|sgrep "^/" cat /etc/mtab | sgrep "^fuseiso" | cut -d " " -f 1-2|tr " " \n|sed -e "s/[0-9\.]*:\//\//"|sgrep "^/" ) ' complete -c fusermount -s h --description "Display help and exit" complete -c fusermount -s v --description "Display version and exit" complete -c fusermount -s o -x --description "Mount options" complete -c fusermount -s u --description "Unmount" complete -c fusermount -s q --description "Quiet" complete -c fusermount -s z --description "Lazy unmount" fish/share/completions/gcc.fish000066400000000000000000005460121214535744100170720ustar00rootroot00000000000000# # This is the insanely huge list of completions for gcc. Most of it is autogenerated, but it needs some hand editing... # # # These are 'special' completions, ones that take some kind of parameter. # complete -c gcc -o std --description "Standard mode" -x -a ' c89\t"ISO C90" iso9899:1990\t"ISO C90" iso9899:199409\t"ISO C90 as modified in amendment 1" c99\t"ISO C99" c9x \t"ISO C99" iso9899:1999\t"ISO C99" iso9899:199x\t"ISO C99" gnu89\t"ISO C90 plus GNU extentions" gnu99\t"ISO C99 plus GNU extentions" gnu9x\t"ISO C99 plus GNU extentions" c++98\t"ISO C++98" gnu++98\t"ISO C++98 plus GNU extentions" ' for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17; complete -c gcc -o ftemplate-depth-$i --description "Set maximum template depth" end; complete -c gcc -s o --description 'Place output in file' -r complete -c gcc -o aux-info --description 'Output to the given filename prototyped declarations for all functions declared and/or defined in a translation unit, including those in header files' -r complete -c gcc -o fabi-version --description 'Use specified version of the C++ ABI' -xa "0 1" complete -c gcc -l sysroot -x -a '(__fish_complete_directories)' --description 'Use dir as the logical root directory for headers and libraries' # # These completions are autogenerated form the manual page using make_completions.py # complete -c gcc -s x --description 'Specify explicitly the language for the following input files (rather than letting the compiler choose a default based on the file name suffix)' complete -c gcc -s x --description 'Turn off any specification of a language, so that subsequent files are handled according to their file name suffixes (as they are if -x has not been used at all)' complete -c gcc -o pass-exit-codes --description 'Normally the gcc program will exit with the code of 1 if any phase of the compiler returns a non-success return code' complete -c gcc -s c --description 'Compile or assemble the source files, but do not link' complete -c gcc -s S --description 'Stop after the stage of compilation proper; do not assemble' complete -c gcc -s E --description 'Stop after the preprocessing stage; do not run the compiler proper' complete -c gcc -s v --description 'Print (on standard error output) the commands executed to run the stages of compilation' complete -c gcc -o \#\#\# --description 'Like -v except the commands are not executed and all command arguments are quoted' complete -c gcc -o pipe --description 'Use pipes rather than temporary files for communication between the various stages of compilation' complete -c gcc -o combine --description 'If you are compiling multiple source files, this option tells the driver to pass all the source files to the compiler at once (for those languages for which the compiler can handle this)' complete -c gcc -l help --description 'Print (on the standard output) a description of the command line options understood by gcc' complete -c gcc -l target-help --description 'Print (on the standard output) a description of target specific command line options for each tool' complete -c gcc -l version --description 'Display the version number and copyrights of the invoked GCC' complete -c gcc -o ansi --description 'In C mode, support all ISO C90 programs' complete -c gcc -o fno-asm --description 'Do not recognize "asm", "inline" or "typeof" as a keyword, so that code can use these words as identifiers' complete -c gcc -o fno-builtin --description 'Don’t recognize built-in functions that do not begin with __builtin_ as prefix' complete -c gcc -o fno-builtin-function --description 'Don’t recognize built-in functions that do not begin with __builtin_ as prefix' complete -c gcc -o fhosted --description 'Assert that compilation takes place in a hosted environment' complete -c gcc -o ffreestanding --description 'Assert that compilation takes place in a freestanding environment' complete -c gcc -o fms-extensions --description 'Accept some non-standard constructs used in Microsoft header files' complete -c gcc -o trigraphs --description 'Support ISO C trigraphs' complete -c gcc -o no-integrated-cpp --description 'Performs a compilation in two passes: preprocessing and compiling' complete -c gcc -o traditional --description 'Formerly, these options caused GCC to attempt to emulate a prestandard C compiler' complete -c gcc -o traditional-cpp --description 'Formerly, these options caused GCC to attempt to emulate a prestandard C compiler' complete -c gcc -o fcond-mismatch --description 'Allow conditional expressions with mismatched types in the second and third arguments' complete -c gcc -o funsigned-char --description 'Let the type "char" be unsigned, like "unsigned char"' complete -c gcc -o fsigned-char --description 'Let the type "char" be signed, like "signed char"' complete -c gcc -o fsigned-bitfields --description 'These options control whether a bit-field is signed or unsigned, when the declaration does not use either "signed" or "unsigned"' complete -c gcc -o funsigned-bitfields --description 'These options control whether a bit-field is signed or unsigned, when the declaration does not use either "signed" or "unsigned"' complete -c gcc -o fno-signed-bitfields --description 'These options control whether a bit-field is signed or unsigned, when the declaration does not use either "signed" or "unsigned"' complete -c gcc -o fno-unsigned-bitfields --description 'These options control whether a bit-field is signed or unsigned, when the declaration does not use either "signed" or "unsigned"' complete -c gcc -o fno-access-control --description 'Turn off all access checking' complete -c gcc -o fcheck-new --description 'Check that the pointer returned by "operator new" is non-null before attempting to modify the storage allocated' complete -c gcc -o fconserve-space --description 'Put uninitialized or runtime-initialized global variables into the common segment, as C does' complete -c gcc -o ffriend-injection --description 'Inject friend functions into the enclosing namespace, so that they are visible outside the scope of the class in which they are declared' complete -c gcc -o fno-const-strings --description 'Give string constants type "char *" instead of type "const char *"' complete -c gcc -o fno-elide-constructors --description 'The C++ standard allows an implementation to omit creating a temporary which is only used to initialize another object of the same type' complete -c gcc -o fno-enforce-eh-specs --description 'Don’t generate code to check for violation of exception specifications at runtime' complete -c gcc -o ffor-scope --description 'If -ffor-scope is specified, the scope of variables declared in a for-init-statement is limited to the for loop itself, as specified by the C++ standard' complete -c gcc -o fno-for-scope --description 'If -ffor-scope is specified, the scope of variables declared in a for-init-statement is limited to the for loop itself, as specified by the C++ standard' complete -c gcc -o fno-gnu-keywords --description 'Do not recognize "typeof" as a keyword, so that code can use this word as an identifier' complete -c gcc -o fno-implicit-templates --description 'Never emit code for non-inline templates which are instantiated implicitly (i' complete -c gcc -o fno-implicit-inline-templates --description 'Don’t emit code for implicit instantiations of inline templates, either' complete -c gcc -o fno-implement-inlines --description 'To save space, do not emit out-of-line copies of inline functions controlled by #pragma implementation' complete -c gcc -o fms-extensions --description 'Disable pedantic warnings about constructs used in MFC, such as implicit int and getting a pointer to member function via non-standard syntax' complete -c gcc -o fno-nonansi-builtins --description 'Disable built-in declarations of functions that are not mandated by ANSI/ISO C' complete -c gcc -o fno-operator-names --description 'Do not treat the operator name keywords "and", "bitand", "bitor", "compl", "not", "or" and "xor" as synonyms as keywords' complete -c gcc -o fno-optional-diags --description 'Disable diagnostics that the standard says a compiler does not need to issue' complete -c gcc -o fpermissive --description 'Downgrade some diagnostics about nonconformant code from errors to warnings' complete -c gcc -o frepo --description 'Enable automatic template instantiation at link time' complete -c gcc -o fno-rtti --description 'Disable generation of information about every class with virtual functions for use by the C++ runtime type identification features (dynamic_cast and typeid)' complete -c gcc -o fstats --description 'Emit statistics about front-end processing at the end of the compilation' complete -c gcc -o fno-threadsafe-statics --description 'Do not emit the extra code to use the routines specified in the C++ ABI for thread-safe initialization of local statics' complete -c gcc -o fuse-cxa-atexit --description 'Register destructors for objects with static storage duration with the "__cxa_atexit" function rather than the "atexit" function' complete -c gcc -o fvisibility-inlines-hidden --description 'Causes all inlined methods to be marked with "__attribute__ ((visibility ("hidden")))" so that they do not appear in the export table of a DSO and do not require a PLT indirection when used within the DSO' complete -c gcc -o fno-weak --description 'Do not use weak symbol support, even if it is provided by the linker' complete -c gcc -o nostdinc++ --description 'Do not search for header files in the standard directories specific to C++, but do still search the other standard directories' complete -c gcc -o fno-default-inline --description 'Do not assume inline for functions defined inside a class scope' complete -c gcc -o Wabi --description '(C++ only) Warn when G++ generates code that is probably not compatible with the vendor-neutral C++ ABI' complete -c gcc -o Wctor-dtor-privacy --description '(C++ only) Warn when a class seems unusable because all the constructors or destructors in that class are private, and it has neither friends nor public static member functions' complete -c gcc -o Wnon-virtual-dtor --description '(C++ only) Warn when a class appears to be polymorphic, thereby requiring a virtual destructor, yet it declares a non-virtual one' complete -c gcc -o Wreorder --description '(C++ only) Warn when the order of member initializers given in the code does not match the order in which they must be executed' complete -c gcc -o Weffc++ --description '(C++ only) Warn about violations of the following style guidelines from Scott Meyers’ Effective C++ book: * Item 11: Define a copy constructor and an assignment operator for classes with dynamically allocated memory' complete -c gcc -o Wno-deprecated --description '(C++ only) Do not warn about usage of deprecated features' complete -c gcc -o Wstrict-null-sentinel --description '(C++ only) Warn also about the use of an uncasted "NULL" as sentinel' complete -c gcc -o Wno-non-template-friend --description '(C++ only) Disable warnings when non-templatized friend functions are declared within a template' complete -c gcc -o Wold-style-cast --description '(C++ only) Warn if an old-style (C-style) cast to a non-void type is used within a C++ program' complete -c gcc -o Woverloaded-virtual --description '(C++ only) Warn when a function declaration hides virtual functions from a base class' complete -c gcc -o Wno-pmf-conversions --description '(C++ only) Disable the diagnostic for converting a bound pointer to member function to a plain pointer' complete -c gcc -o Wsign-promo --description '(C++ only) Warn when overload resolution chooses a promotion from unsigned or enumerated type to a signed type, over a conversion to an unsigned type of the same size' complete -c gcc -o fconstant-string-class --description 'Use class-name as the name of the class to instantiate for each literal string specified with the syntax "@"' complete -c gcc -o name --description 'Use class-name as the name of the class to instantiate for each literal string specified with the syntax "@"' complete -c gcc -o fgnu-runtime --description 'Generate object code compatible with the standard GNU Objective-C runtime' complete -c gcc -o fnext-runtime --description 'Generate output compatible with the NeXT runtime' complete -c gcc -o fno-nil-receivers --description 'Assume that all Objective-C message dispatches (e' complete -c gcc -o fobjc-call-cxx-cdtors --description 'For each Objective-C class, check if any of its instance variables is a C++ object with a non-trivial default constructor' complete -c gcc -o fobjc-direct-dispatch --description 'Allow fast jumps to the message dispatcher' complete -c gcc -o fobjc-exceptions --description 'Enable syntactic support for structured exception handling in Objective-C, similar to what is offered by C++ and Java' complete -c gcc -o fobjc-gc --description 'Enable garbage collection (GC) in Objective-C and Objective-C++ programs' complete -c gcc -o freplace-objc-classes --description 'Emit a special marker instructing ld(1) not to statically link in the resulting object file, and allow dyld(1) to load it in at run time instead' complete -c gcc -o fzero-link --description 'When compiling for the NeXT runtime, the compiler ordinarily replaces calls to "objc_getClass("' complete -c gcc -o gen-decls --description 'Dump interface declarations for all classes seen in the source file to a file named sourcename' complete -c gcc -o Wassign-intercept --description 'Warn whenever an Objective-C assignment is being intercepted by the garbage collector' complete -c gcc -o Wno-protocol --description 'If a class is declared to implement a protocol, a warning is issued for every method in the protocol that is not implemented by the class' complete -c gcc -o Wselector --description 'Warn if multiple methods of different types for the same selector are found during compilation' complete -c gcc -o Wstrict-selector-match --description 'Warn if multiple methods with differing argument and/or return types are found for a given selector when attempting to send a message using this selector to a receiver of type "id" or "Class"' complete -c gcc -o Wundeclared-selector --description 'Warn if a "@selector(' complete -c gcc -o print-objc-runtime-info --description 'Generate C header describing the largest structure that is passed by value, if any' complete -c gcc -o fmessage-length --description 'Try to format error messages so that they fit on lines of the specified number of characters' -x -a "80" complete -c gcc -o fdiagnostics-show-location --description 'Only meaningful in line-wrapping mode' -a "once" complete -c gcc -o line --description 'Only meaningful in line-wrapping mode' complete -c gcc -o fdiagnostics-show-options --description 'This option instructs the diagnostic machinery to add text to each diagnostic emitted, which indicates which command line option directly controls that diagnostic, when such an option is known to the diagnostic machinery' complete -c gcc -o Wno- --description 'to turn off warnings; for example, -Wno-implicit' complete -c gcc -o fsyntax-only --description 'Check the code for syntax errors, but don’t do anything beyond that' complete -c gcc -o pedantic --description 'Issue all the warnings demanded by strict ISO C and ISO C++; reject all programs that use forbidden extensions, and some other programs that do not follow ISO C and ISO C++' complete -c gcc -o pedantic-errors --description 'Like -pedantic, except that errors are produced rather than warnings' complete -c gcc -s w --description 'Inhibit all warning messages' complete -c gcc -o Wno-import --description 'Inhibit warning messages about the use of #import' complete -c gcc -o Wchar-subscripts --description 'Warn if an array subscript has type "char"' complete -c gcc -o Wcomment --description 'Warn whenever a comment-start sequence /* appears in a /* comment, or whenever a Backslash-Newline appears in a // comment' complete -c gcc -o Wfatal-errors --description 'This option causes the compiler to abort compilation on the first error occurred rather than trying to keep going and printing further error messages' complete -c gcc -o Wformat --description 'Check calls to "printf" and "scanf", etc' complete -c gcc -o Wformat-y2k --description 'If -Wformat is specified, also warn about "strftime" formats which may yield only a two-digit year' complete -c gcc -o Wno-format-extra-args --description 'If -Wformat is specified, do not warn about excess arguments to a "printf" or "scanf" format function' complete -c gcc -o Wno-format-zero-length --description 'If -Wformat is specified, do not warn about zero-length formats' complete -c gcc -o Wformat-nonliteral --description 'If -Wformat is specified, also warn if the format string is not a string literal and so cannot be checked, unless the format function takes its format arguments as a "va_list"' complete -c gcc -o Wformat-security --description 'If -Wformat is specified, also warn about uses of format functions that represent possible security problems' complete -c gcc -o Wnonnull --description 'Warn about passing a null pointer for arguments marked as requiring a non-null value by the "nonnull" function attribute' complete -c gcc -o Winit-self --description '(C, C++, Objective-C and Objective-C++ only) Warn about uninitialized variables which are initialized with themselves' complete -c gcc -o Wimplicit-int --description 'Warn when a declaration does not specify a type' complete -c gcc -o Wimplicit-function-declaration --description 'Give a warning (or error) whenever a function is used before being declared' complete -c gcc -o Werror-implicit-function-declaration --description 'Give a warning (or error) whenever a function is used before being declared' complete -c gcc -o Wimplicit --description 'Same as -Wimplicit-int and -Wimplicit-function-declaration' complete -c gcc -o Wmain --description 'Warn if the type of main is suspicious' complete -c gcc -o Wmissing-braces --description 'Warn if an aggregate or union initializer is not fully bracketed' complete -c gcc -o Wmissing-include-dirs --description '(C, C++, Objective-C and Objective-C++ only) Warn if a user-supplied include directory does not exist' complete -c gcc -o Wparentheses --description 'Warn if parentheses are omitted in certain contexts, such as when there is an assignment in a context where a truth value is expected, or when operators are nested whose precedence people often get confused about' complete -c gcc -o Wsequence-point --description 'Warn about code that may have undefined semantics because of violations of sequence point rules in the C standard' complete -c gcc -o Wreturn-type --description 'Warn whenever a function is defined with a return-type that defaults to "int"' complete -c gcc -o Wswitch --description 'Warn whenever a "switch" statement has an index of enumerated type and lacks a "case" for one or more of the named codes of that enumeration' complete -c gcc -o Wswitch-default --description 'Warn whenever a "switch" statement does not have a "default" case' complete -c gcc -o Wswitch-enum --description 'Warn whenever a "switch" statement has an index of enumerated type and lacks a "case" for one or more of the named codes of that enumeration' complete -c gcc -o Wtrigraphs --description 'Warn if any trigraphs are encountered that might change the meaning of the program (trigraphs within comments are not warned about)' complete -c gcc -o Wunused-function --description 'Warn whenever a static function is declared but not defined or a non-inline static function is unused' complete -c gcc -o Wunused-label --description 'Warn whenever a label is declared but not used' complete -c gcc -o Wunused-parameter --description 'Warn whenever a function parameter is unused aside from its declaration' complete -c gcc -o Wunused-variable --description 'Warn whenever a local variable or non-constant static variable is unused aside from its declaration' complete -c gcc -o Wunused-value --description 'Warn whenever a statement computes a result that is explicitly not used' complete -c gcc -o Wunused --description 'All the above -Wunused options combined' complete -c gcc -o Wuninitialized --description 'Warn if an automatic variable is used without first being initialized or if a variable may be clobbered by a "setjmp" call' complete -c gcc -o Wunknown-pragmas --description 'Warn when a #pragma directive is encountered which is not understood by GCC' complete -c gcc -o Wno-pragmas --description 'Do not warn about misuses of pragmas, such as incorrect parameters, invalid syntax, or conflicts between pragmas' complete -c gcc -o Wstrict-aliasing --description 'This option is only active when -fstrict-aliasing is active' -a "2" complete -c gcc -o Wall --description 'All of the above -W options combined' complete -c gcc -o Wextra --description '(This option used to be called -W' complete -c gcc -o Wno-div-by-zero --description 'Do not warn about compile-time integer division by zero' complete -c gcc -o Wsystem-headers --description 'Print warning messages for constructs found in system header files' complete -c gcc -o Wfloat-equal --description 'Warn if floating point values are used in equality comparisons' complete -c gcc -o Wtraditional --description '(C only) Warn about certain constructs that behave differently in traditional and ISO C' complete -c gcc -o Wdeclaration-after-statement --description '(C only) Warn when a declaration is found after a statement in a block' complete -c gcc -o Wundef --description 'Warn if an undefined identifier is evaluated in an #if directive' complete -c gcc -o Wno-endif-labels --description 'Do not warn whenever an #else or an #endif are followed by text' complete -c gcc -o Wshadow --description 'Warn whenever a local variable shadows another local variable, parameter or global variable or whenever a built-in function is shadowed' complete -c gcc -o Wlarger-than-len --description 'Warn whenever an object of larger than len bytes is defined' complete -c gcc -o Wunsafe-loop-optimizations --description 'Warn if the loop cannot be optimized because the compiler could not assume anything on the bounds of the loop indices' complete -c gcc -o Wpointer-arith --description 'Warn about anything that depends on the "size of" a function type or of "void"' complete -c gcc -o Wbad-function-cast --description '(C only) Warn whenever a function call is cast to a non-matching type' complete -c gcc -o Wc++-compat --description 'Warn about ISO C constructs that are outside of the common subset of ISO C and ISO C++, e' complete -c gcc -o Wcast-qual --description 'Warn whenever a pointer is cast so as to remove a type qualifier from the target type' complete -c gcc -o Wcast-align --description 'Warn whenever a pointer is cast such that the required alignment of the target is increased' complete -c gcc -o Wwrite-strings --description 'When compiling C, give string constants the type "const char[length]" so that copying the address of one into a non-"const" "char *" pointer will get a warning; when compiling C++, warn about the deprecated conversion from string constants to "char *"' complete -c gcc -o Wconversion --description 'Warn if a prototype causes a type conversion that is different from what would happen to the same argument in the absence of a prototype' complete -c gcc -o Wsign-compare --description 'Warn when a comparison between signed and unsigned values could produce an incorrect result when the signed value is converted to unsigned' complete -c gcc -o Waggregate-return --description 'Warn if any functions that return structures or unions are defined or called' complete -c gcc -o Wno-attributes --description 'Do not warn if an unexpected "__attribute__" is used, such as unrecognized attributes, function attributes applied to variables, etc' complete -c gcc -o Wstrict-prototypes --description '(C only) Warn if a function is declared or defined without specifying the argument types' complete -c gcc -o Wold-style-definition --description '(C only) Warn if an old-style function definition is used' complete -c gcc -o Wmissing-prototypes --description '(C only) Warn if a global function is defined without a previous prototype declaration' complete -c gcc -o Wmissing-declarations --description '(C only) Warn if a global function is defined without a previous declaration' complete -c gcc -o Wmissing-field-initializers --description 'Warn if a structure’s initializer has some fields missing' complete -c gcc -o Wmissing-noreturn --description 'Warn about functions which might be candidates for attribute "noreturn"' complete -c gcc -o Wmissing-format-attribute --description 'Warn about function pointers which might be candidates for "format" attributes' complete -c gcc -o Wno-multichar --description 'Do not warn if a multicharacter constant (’FOOF’) is used' complete -c gcc -o Wnormalized --description 'In ISO C and ISO C++, two identifiers are different if they are different sequences of characters' -x -a "none id nfc nfkc" complete -c gcc -o Wno-deprecated-declarations --description 'Do not warn about uses of functions, variables, and types marked as deprecated by using the "deprecated" attribute' complete -c gcc -o Wpacked --description 'Warn if a structure is given the packed attribute, but the packed attribute has no effect on the layout or size of the structure' complete -c gcc -o Wpadded --description 'Warn if padding is included in a structure, either to align an element of the structure or to align the whole structure' complete -c gcc -o Wredundant-decls --description 'Warn if anything is declared more than once in the same scope, even in cases where multiple declaration is valid and changes nothing' complete -c gcc -o Wnested-externs --description '(C only) Warn if an "extern" declaration is encountered within a function' complete -c gcc -o Wunreachable-code --description 'Warn if the compiler detects that code will never be executed' complete -c gcc -o Winline --description 'Warn if a function can not be inlined and it was declared as inline' complete -c gcc -o Wno-invalid-offsetof --description '(C++ only) Suppress warnings from applying the offsetof macro to a non-POD type' complete -c gcc -o Wno-int-to-pointer-cast --description '(C only) Suppress warnings from casts to pointer type of an integer of a different size' complete -c gcc -o Wno-pointer-to-int-cast --description '(C only) Suppress warnings from casts from a pointer to an integer type of a different size' complete -c gcc -o Winvalid-pch --description 'Warn if a precompiled header is found in the search path but can’t be used' complete -c gcc -o Wlong-long --description 'Warn if long long type is used' complete -c gcc -o Wvariadic-macros --description 'Warn if variadic macros are used in pedantic ISO C90 mode, or the GNU alternate syntax when in pedantic ISO C99 mode' complete -c gcc -o Wvolatile-register-var --description 'Warn if a register variable is declared volatile' complete -c gcc -o Wdisabled-optimization --description 'Warn if a requested optimization pass is disabled' complete -c gcc -o Wpointer-sign --description 'Warn for pointer argument passing or assignment with different signedness' complete -c gcc -o Werror --description 'Make all warnings into errors' complete -c gcc -o Wstack-protector --description 'This option is only active when -fstack-protector is active' complete -c gcc -s g --description 'Produce debugging information in the operating system’s native format (stabs, COFF, XCOFF, or DWARF 2)' complete -c gcc -o ggdb --description 'Produce debugging information for use by GDB' complete -c gcc -o gstabs --description 'Produce debugging information in stabs format (if that is supported), without GDB extensions' complete -c gcc -o feliminate-unused-debug-symbols --description 'Produce debugging information in stabs format (if that is supported), for only symbols that are actually used' complete -c gcc -o gstabs+ --description 'Produce debugging information in stabs format (if that is supported), using GNU extensions understood only by the GNU debugger (GDB)' complete -c gcc -o gcoff --description 'Produce debugging information in COFF format (if that is supported)' complete -c gcc -o gxcoff --description 'Produce debugging information in XCOFF format (if that is supported)' complete -c gcc -o gxcoff+ --description 'Produce debugging information in XCOFF format (if that is supported), using GNU extensions understood only by the GNU debugger (GDB)' complete -c gcc -o gdwarf-2 --description 'Produce debugging information in DWARF version 2 format (if that is supported)' complete -c gcc -o gvms --description 'Produce debugging information in VMS debug format (if that is supported)' complete -c gcc -o glevel --description 'Request debugging information and also use level to specify how much information' complete -c gcc -o ggdblevel --description 'Request debugging information and also use level to specify how much information' complete -c gcc -o gstabslevel --description 'Request debugging information and also use level to specify how much information' complete -c gcc -o gcofflevel --description 'Request debugging information and also use level to specify how much information' complete -c gcc -o gxcofflevel --description 'Request debugging information and also use level to specify how much information' complete -c gcc -o gvmslevel --description 'Request debugging information and also use level to specify how much information' complete -c gcc -o feliminate-dwarf2-dups --description 'Compress DWARF2 debugging information by eliminating duplicated information about each symbol' complete -c gcc -s p --description 'Generate extra code to write profile information suitable for the analysis program prof' complete -c gcc -o pg --description 'Generate extra code to write profile information suitable for the analysis program gprof' complete -c gcc -s Q --description 'Makes the compiler print out each function name as it is compiled, and print some statistics about each pass when it finishes' complete -c gcc -o ftime-report --description 'Makes the compiler print some statistics about the time consumed by each pass when it finishes' complete -c gcc -o fmem-report --description 'Makes the compiler print some statistics about permanent memory allocation when it finishes' complete -c gcc -o fprofile-arcs --description 'Add code so that program flow arcs are instrumented' complete -c gcc -l coverage --description 'This option is used to compile and link code instrumented for coverage analysis' complete -c gcc -o ftest-coverage --description 'Produce a notes file that the gcov code-coverage utility can use to show program coverage' complete -c gcc -o dletters --description 'Says to make debugging dumps during compilation at times specified by letters' complete -c gcc -o fdump-rtl-pass --description 'Says to make debugging dumps during compilation at times specified by letters' complete -c gcc -o fdump-unnumbered --description 'When doing debugging dumps (see -d option above), suppress instruction numbers and line number note output' complete -c gcc -o fdump-translation-unit --description '(C++ only) Dump a representation of the tree structure for the entire translation unit to a file' complete -c gcc -o fdump-translation-unit-options --description '(C++ only) Dump a representation of the tree structure for the entire translation unit to a file' complete -c gcc -o fdump-class-hierarchy --description '(C++ only) Dump a representation of each class’s hierarchy and virtual function table layout to a file' complete -c gcc -o fdump-class-hierarchy-options --description '(C++ only) Dump a representation of each class’s hierarchy and virtual function table layout to a file' complete -c gcc -o fdump-ipa-switch --description 'Control the dumping at various stages of inter-procedural analysis language tree to a file' complete -c gcc -o fdump-tree-switch --description 'Control the dumping at various stages of processing the intermediate language tree to a file' complete -c gcc -o fdump-tree-switch-options --description 'Control the dumping at various stages of processing the intermediate language tree to a file' complete -c gcc -o ftree-vectorizer-verbose --description 'This option controls the amount of debugging output the vectorizer prints' -x -a "1 2 3 4 5" complete -c gcc -o frandom-seed --description 'This option provides a seed that GCC uses when it would otherwise use random numbers' -x complete -c gcc -o fsched-verbose --description 'On targets that use instruction scheduling, this option controls the amount of debugging output the scheduler prints' -x -a "1 2 3 4 5" complete -c gcc -o save-temps --description 'Store the usual "temporary" intermediate files permanently; place them in the current directory and name them based on the source file' complete -c gcc -o time --description 'Report the CPU time taken by each subprocess in the compilation sequence' complete -c gcc -o fvar-tracking --description 'Run variable tracking pass' complete -c gcc -o print-file-name -r --description 'Print the full absolute name of the library file library that would be used when linking---and don\'t do anything else' complete -c gcc -o print-multi-directory --description 'Print the directory name corresponding to the multilib selected by any other switches present in the command line' complete -c gcc -o print-multi-lib --description 'Print the mapping from multilib directory names to compiler switches that enable them' complete -c gcc -o print-prog-name -r --description 'Like -print-file-name, but searches for a program such as cpp' complete -c gcc -o print-libgcc-file-name --description 'Same as -print-file-name=libgcc' complete -c gcc -o print-search-dirs --description 'Print the name of the configured installation directory and a list of program and library directories gcc will search---and don’t do anything else' complete -c gcc -o dumpmachine --description 'Print the compiler’s target machine (for example, i686-pc-linux-gnu)---and don’t do anything else' complete -c gcc -o dumpversion --description 'Print the compiler version (for example, 3' complete -c gcc -o dumpspecs --description 'Print the compiler’s built-in specs---and don’t do anything else' complete -c gcc -o feliminate-unused-debug-types --description 'Normally, when producing DWARF2 output, GCC will emit debugging information for all types declared in a compilation unit, regardless of whether or not they are actually used in that compilation unit' complete -c gcc -o O2 --description 'Optimize even more' complete -c gcc -o O3 --description 'Optimize yet more' complete -c gcc -o O0 --description 'Do not optimize' complete -c gcc -o Os --description 'Optimize for size' complete -c gcc -o fno-default-inline --description 'Do not make member functions inline by default merely because they are defined inside the class scope (C++ only)' complete -c gcc -o fno-defer-pop --description 'Always pop the arguments to each function call as soon as that function returns' complete -c gcc -o fforce-mem --description 'Force memory operands to be copied into registers before doing arithmetic on them' complete -c gcc -o fforce-addr --description 'Force memory address constants to be copied into registers before doing arithmetic on them' complete -c gcc -o fomit-frame-pointer --description 'Don’t keep the frame pointer in a register for functions that don’t need one' complete -c gcc -o foptimize-sibling-calls --description 'Optimize sibling and tail recursive calls' complete -c gcc -o fno-inline --description 'Don’t pay attention to the "inline" keyword' complete -c gcc -o finline-functions --description 'Integrate all simple functions into their callers' complete -c gcc -o finline-functions-called-once --description 'Consider all "static" functions called once for inlining into their caller even if they are not marked "inline"' complete -c gcc -o fearly-inlining --description 'Inline functions marked by "always_inline" and functions whose body seems smaller than the function call overhead early before doing -fprofile-generate instrumentation and real inlining pass' complete -c gcc -o finline-limit --description 'By default, GCC limits the size of functions that can be inlined' -x -a "1 2 3 4 5" complete -c gcc -o fkeep-inline-functions --description 'In C, emit "static" functions that are declared "inline" into the object file, even if the function has been inlined into all of its callers' complete -c gcc -o fkeep-static-consts --description 'Emit variables declared "static const" when optimization isn’t turned on, even if the variables aren’t referenced' complete -c gcc -o fmerge-constants --description 'Attempt to merge identical constants (string constants and floating point constants) across compilation units' complete -c gcc -o fmerge-all-constants --description 'Attempt to merge identical constants and identical variables' complete -c gcc -o fmodulo-sched --description 'Perform swing modulo scheduling immediately before the first scheduling pass' complete -c gcc -o fno-branch-count-reg --description 'Do not use "decrement and branch" instructions on a count register, but instead generate a sequence of instructions that decrement a register, compare it against zero, then branch based upon the result' complete -c gcc -o fno-function-cse --description 'Do not put function addresses in registers; make each instruction that calls a constant function contain the function’s address explicitly' complete -c gcc -o fno-zero-initialized-in-bss --description 'If the target supports a BSS section, GCC by default puts variables that are initialized to zero into BSS' complete -c gcc -o fbounds-check --description 'For front-ends that support it, generate additional code to check that indices used to access arrays are within the declared range' complete -c gcc -o fmudflap --description 'For front-ends that support it (C and C++), instrument all risky pointer/array dereferencing operations, some standard library string/heap functions, and some other associated constructs with range/validity tests' complete -c gcc -o fmudflapth --description 'For front-ends that support it (C and C++), instrument all risky pointer/array dereferencing operations, some standard library string/heap functions, and some other associated constructs with range/validity tests' complete -c gcc -o fmudflapir --description 'For front-ends that support it (C and C++), instrument all risky pointer/array dereferencing operations, some standard library string/heap functions, and some other associated constructs with range/validity tests' complete -c gcc -o fstrength-reduce --description 'Perform the optimizations of loop strength reduction and elimination of iteration variables' complete -c gcc -o fthread-jumps --description 'Perform optimizations where we check to see if a jump branches to a location where another comparison subsumed by the first is found' complete -c gcc -o fcse-follow-jumps --description 'In common subexpression elimination, scan through jump instructions when the target of the jump is not reached by any other path' complete -c gcc -o fcse-skip-blocks --description 'This is similar to -fcse-follow-jumps, but causes CSE to follow jumps which conditionally skip over blocks' complete -c gcc -o frerun-cse-after-loop --description 'Re-run common subexpression elimination after loop optimizations has been performed' complete -c gcc -o frerun-loop-opt --description 'Run the loop optimizer twice' complete -c gcc -o fgcse --description 'Perform a global common subexpression elimination pass' complete -c gcc -o fgcse-lm --description 'When -fgcse-lm is enabled, global common subexpression elimination will attempt to move loads which are only killed by stores into themselves' complete -c gcc -o fgcse-sm --description 'When -fgcse-sm is enabled, a store motion pass is run after global common subexpression elimination' complete -c gcc -o fgcse-las --description 'When -fgcse-las is enabled, the global common subexpression elimination pass eliminates redundant loads that come after stores to the same memory location (both partial and full redundancies)' complete -c gcc -o fgcse-after-reload --description 'When -fgcse-after-reload is enabled, a redundant load elimination pass is performed after reload' complete -c gcc -o floop-optimize --description 'Perform loop optimizations: move constant expressions out of loops, simplify exit test conditions and optionally do strength-reduction as well' complete -c gcc -o floop-optimize2 --description 'Perform loop optimizations using the new loop optimizer' complete -c gcc -o funsafe-loop-optimizations --description 'If given, the loop optimizer will assume that loop indices do not overflow, and that the loops with nontrivial exit condition are not infinite' complete -c gcc -o fcrossjumping --description 'Perform cross-jumping transformation' complete -c gcc -o fif-conversion --description 'Attempt to transform conditional jumps into branch-less equivalents' complete -c gcc -o fif-conversion2 --description 'Use conditional execution (where available) to transform conditional jumps into branch-less equivalents' complete -c gcc -o fdelete-null-pointer-checks --description 'Use global dataflow analysis to identify and eliminate useless checks for null pointers' complete -c gcc -o fexpensive-optimizations --description 'Perform a number of minor optimizations that are relatively expensive' complete -c gcc -o foptimize-register-move --description 'Attempt to reassign register numbers in move instructions and as operands of other simple instructions in order to maximize the amount of register tying' complete -c gcc -o fregmove --description 'Attempt to reassign register numbers in move instructions and as operands of other simple instructions in order to maximize the amount of register tying' complete -c gcc -o fdelayed-branch --description 'If supported for the target machine, attempt to reorder instructions to exploit instruction slots available after delayed branch instructions' complete -c gcc -o fschedule-insns --description 'If supported for the target machine, attempt to reorder instructions to eliminate execution stalls due to required data being unavailable' complete -c gcc -o fschedule-insns2 --description 'Similar to -fschedule-insns, but requests an additional pass of instruction scheduling after register allocation has been done' complete -c gcc -o fno-sched-interblock --description 'Don’t schedule instructions across basic blocks' complete -c gcc -o fno-sched-spec --description 'Don’t allow speculative motion of non-load instructions' complete -c gcc -o fsched-spec-load --description 'Allow speculative motion of some load instructions' complete -c gcc -o fsched-spec-load-dangerous --description 'Allow speculative motion of more load instructions' complete -c gcc -o fsched-stalled-insns --description 'Define how many insns (if any) can be moved prematurely from the queue of stalled insns into the ready list, during the second scheduling pass' complete -c gcc -o fsched-stalled-insns-dep --description 'Define how many insn groups (cycles) will be examined for a dependency on a stalled insn that is candidate for premature removal from the queue of stalled insns' complete -c gcc -o fsched2-use-superblocks --description 'When scheduling after register allocation, do use superblock scheduling algorithm' complete -c gcc -o fsched2-use-traces --description 'Use -fsched2-use-superblocks algorithm when scheduling after register allocation and additionally perform code duplication in order to increase the size of superblocks using tracer pass' complete -c gcc -o freschedule-modulo-scheduled-loops --description 'The modulo scheduling comes before the traditional scheduling, if a loop was modulo scheduled we may want to prevent the later scheduling passes from changing its schedule, we use this option to control that' complete -c gcc -o fcaller-saves --description 'Enable values to be allocated in registers that will be clobbered by function calls, by emitting extra instructions to save and restore the registers around such calls' complete -c gcc -o ftree-pre --description 'Perform Partial Redundancy Elimination (PRE) on trees' complete -c gcc -o ftree-fre --description 'Perform Full Redundancy Elimination (FRE) on trees' complete -c gcc -o ftree-copy-prop --description 'Perform copy propagation on trees' complete -c gcc -o ftree-store-copy-prop --description 'Perform copy propagation of memory loads and stores' complete -c gcc -o ftree-salias --description 'Perform structural alias analysis on trees' complete -c gcc -o ftree-sink --description 'Perform forward store motion on trees' complete -c gcc -o ftree-ccp --description 'Perform sparse conditional constant propagation (CCP) on trees' complete -c gcc -o ftree-store-ccp --description 'Perform sparse conditional constant propagation (CCP) on trees' complete -c gcc -o ftree-dce --description 'Perform dead code elimination (DCE) on trees' complete -c gcc -o ftree-dominator-opts --description 'Perform a variety of simple scalar cleanups (constant/copy propagation, redundancy elimination, range propagation and expression simplification) based on a dominator tree traversal' complete -c gcc -o ftree-ch --description 'Perform loop header copying on trees' complete -c gcc -o ftree-loop-optimize --description 'Perform loop optimizations on trees' complete -c gcc -o ftree-loop-linear --description 'Perform linear loop transformations on tree' complete -c gcc -o ftree-loop-im --description 'Perform loop invariant motion on trees' complete -c gcc -o ftree-loop-ivcanon --description 'Create a canonical counter for number of iterations in the loop for that determining number of iterations requires complicated analysis' complete -c gcc -o fivopts --description 'Perform induction variable optimizations (strength reduction, induction variable merging and induction variable elimination) on trees' complete -c gcc -o ftree-sra --description 'Perform scalar replacement of aggregates' complete -c gcc -o ftree-copyrename --description 'Perform copy renaming on trees' complete -c gcc -o ftree-ter --description 'Perform temporary expression replacement during the SSA->normal phase' complete -c gcc -o ftree-lrs --description 'Perform live range splitting during the SSA->normal phase' complete -c gcc -o ftree-vectorize --description 'Perform loop vectorization on trees' complete -c gcc -o ftree-vect-loop-version --description 'Perform loop versioning when doing loop vectorization on trees' complete -c gcc -o ftree-vrp --description 'Perform Value Range Propagation on trees' complete -c gcc -o ftracer --description 'Perform tail duplication to enlarge superblock size' complete -c gcc -o funroll-loops --description 'Unroll loops whose number of iterations can be determined at compile time or upon entry to the loop' complete -c gcc -o funroll-all-loops --description 'Unroll all loops, even if their number of iterations is uncertain when the loop is entered' complete -c gcc -o fsplit-ivs-in-unroller --description 'Enables expressing of values of induction variables in later iterations of the unrolled loop using the value in the first iteration' complete -c gcc -o fvariable-expansion-in-unroller --description 'With this option, the compiler will create multiple copies of some local variables when unrolling a loop which can result in superior code' complete -c gcc -o fprefetch-loop-arrays --description 'If supported by the target machine, generate instructions to prefetch memory to improve the performance of loops that access large arrays' complete -c gcc -o fno-peephole --description 'Disable any machine-specific peephole optimizations' complete -c gcc -o fno-peephole2 --description 'Disable any machine-specific peephole optimizations' complete -c gcc -o fno-guess-branch-probability --description 'Do not guess branch probabilities using heuristics' complete -c gcc -o freorder-blocks --description 'Reorder basic blocks in the compiled function in order to reduce number of taken branches and improve code locality' complete -c gcc -o freorder-blocks-and-partition --description 'In addition to reordering basic blocks in the compiled function, in order to reduce number of taken branches, partitions hot and cold basic blocks into separate sections of the assembly and ' complete -c gcc -o freorder-functions --description 'Reorder functions in the object file in order to improve code locality' complete -c gcc -o fstrict-aliasing --description 'Allows the compiler to assume the strictest aliasing rules applicable to the language being compiled' complete -c gcc -o falign-functions --description 'Align the start of functions to the next power-of-two greater than n, skipping up to n bytes' complete -c gcc -o falign-functions --description 'Align the start of functions to the next power-of-two greater than n, skipping up to n bytes' complete -c gcc -o falign-labels --description 'Align all branch targets to a power-of-two boundary, skipping up to n bytes like -falign-functions' complete -c gcc -o falign-labels --description 'Align all branch targets to a power-of-two boundary, skipping up to n bytes like -falign-functions' complete -c gcc -o falign-loops --description 'Align loops to a power-of-two boundary, skipping up to n bytes like -falign-functions' complete -c gcc -o falign-loops --description 'Align loops to a power-of-two boundary, skipping up to n bytes like -falign-functions' complete -c gcc -o falign-jumps --description 'Align branch targets to a power-of-two boundary, for branch targets where the targets can only be reached by jumping, skipping up to n bytes like -falign-functions' complete -c gcc -o falign-jumps --description 'Align branch targets to a power-of-two boundary, for branch targets where the targets can only be reached by jumping, skipping up to n bytes like -falign-functions' complete -c gcc -o funit-at-a-time --description 'Parse the whole compilation unit before starting to produce code' complete -c gcc -o fweb --description 'Constructs webs as commonly used for register allocation purposes and assign each web individual pseudo register' complete -c gcc -o fwhole-program --description 'Assume that the current compilation unit represents whole program being compiled' complete -c gcc -o fno-cprop-registers --description 'After register allocation and post-register allocation instruction splitting, we perform a copy-propagation pass to try to reduce scheduling dependencies and occasionally eliminate the copy' complete -c gcc -o fprofile-generate --description 'Enable options usually used for instrumenting application to produce profile useful for later recompilation with profile feedback based optimization' complete -c gcc -o fprofile-use --description 'Enable profile feedback directed optimizations, and optimizations generally profitable only with profile feedback available' complete -c gcc -o ffloat-store --description 'Do not store floating point variables in registers, and inhibit other options that might change whether a floating point value is taken from a register or memory' complete -c gcc -o ffast-math --description 'Sets -fno-math-errno, -funsafe-math-optimizations, -fno-trapping-math, -ffinite-math-only, -fno-rounding-math, -fno-signaling-nans and fcx-limited-range' complete -c gcc -o fno-math-errno --description 'Do not set ERRNO after calling math functions that are executed with a single instruction, e' complete -c gcc -o funsafe-math-optimizations --description 'Allow optimizations for floating-point arithmetic that (a) assume that arguments and results are valid and (b) may violate IEEE or ANSI standards' complete -c gcc -o ffinite-math-only --description 'Allow optimizations for floating-point arithmetic that assume that arguments and results are not NaNs or +-Infs' complete -c gcc -o fno-trapping-math --description 'Compile code assuming that floating-point operations cannot generate user-visible traps' complete -c gcc -o frounding-math --description 'Disable transformations and optimizations that assume default floating point rounding behavior' complete -c gcc -o fsignaling-nans --description 'Compile code assuming that IEEE signaling NaNs may generate uservisible traps during floating-point operations' complete -c gcc -o fsingle-precision-constant --description 'Treat floating point constant as single precision constant instead of implicitly converting it to double precision constant' complete -c gcc -o fcx-limited-range --description 'When enabled, this option states that a range reduction step is not needed when performing complex division' complete -c gcc -o fno-cx-limited-range --description 'When enabled, this option states that a range reduction step is not needed when performing complex division' complete -c gcc -o fbranch-probabilities --description 'After running a program compiled with -fprofile-arcs, you can compile it a second time using -fbranch-probabilities, to improve optimizations based on the number of times each branch was taken' complete -c gcc -o fprofile-values --description 'If combined with -fprofile-arcs, it adds code so that some data about values of expressions in the program is gathered' complete -c gcc -o fvpt --description 'If combined with -fprofile-arcs, it instructs the compiler to add a code to gather information about values of expressions' complete -c gcc -o frename-registers --description 'Attempt to avoid false dependencies in scheduled code by making use of registers left over after register allocation' complete -c gcc -o ftracer --description 'Perform tail duplication to enlarge superblock size' complete -c gcc -o funroll-loops --description 'Unroll loops whose number of iterations can be determined at compile time or upon entry to the loop' complete -c gcc -o funroll-all-loops --description 'Unroll all loops, even if their number of iterations is uncertain when the loop is entered' complete -c gcc -o fpeel-loops --description 'Peels the loops for that there is enough information that they do not roll much (from profile feedback)' complete -c gcc -o fmove-loop-invariants --description 'Enables the loop invariant motion pass in the new loop optimizer' complete -c gcc -o funswitch-loops --description 'Move branches with loop invariant conditions out of the loop, with duplicates of the loop on both branches (modified according to result of the condition)' complete -c gcc -o fprefetch-loop-arrays --description 'If supported by the target machine, generate instructions to prefetch memory to improve the performance of loops that access large arrays' complete -c gcc -o ffunction-sections --description 'Place each function or data item into its own section in the output file if the target supports arbitrary sections' complete -c gcc -o fdata-sections --description 'Place each function or data item into its own section in the output file if the target supports arbitrary sections' complete -c gcc -o fbranch-target-load-optimize --description 'Perform branch target register load optimization before prologue / epilogue threading' complete -c gcc -o fbranch-target-load-optimize2 --description 'Perform branch target register load optimization after prologue / epilogue threading' complete -c gcc -o fbtr-bb-exclusive --description 'When performing branch target register load optimization, don’t reuse branch target registers in within any basic block' complete -c gcc -o fstack-protector --description 'Emit extra code to check for buffer overflows, such as stack smashing attacks' complete -c gcc -o fstack-protector-all --description 'Like -fstack-protector except that all functions are protected' complete -c gcc -l param --description 'In some places, GCC uses various constants to control the amount of optimization that is done' complete -c gcc -o Xpreprocessor --description 'Pass option as an option to the preprocessor' complete -c gcc -s D --description 'Predefine name as a macro, with definition 1' complete -c gcc -s D --description 'The contents of definition are tokenized and processed as if they appeared during translation phase three in a #define directive' complete -c gcc -s U --description 'Cancel any previous definition of name, either built in or provided with a -D option' complete -c gcc -o undef --description 'Do not predefine any system-specific or GCC-specific macros' complete -c gcc -s I --description 'Add the directory dir to the list of directories to be searched for header files' complete -c gcc -s o --description 'Write output to file' complete -c gcc -o Wall --description 'Turns on all optional warnings which are desirable for normal code' complete -c gcc -o Wcomment --description 'Warn whenever a comment-start sequence /* appears in a /* comment, or whenever a backslash-newline appears in a // comment' complete -c gcc -o Wcomments --description 'Warn whenever a comment-start sequence /* appears in a /* comment, or whenever a backslash-newline appears in a // comment' complete -c gcc -o Wtrigraphs --description '@anchor{Wtrigraphs} Most trigraphs in comments cannot affect the meaning of the program' complete -c gcc -o Wtraditional --description 'Warn about certain constructs that behave differently in traditional and ISO C' complete -c gcc -o Wimport --description 'Warn the first time #import is used' complete -c gcc -o Wundef --description 'Warn whenever an identifier which is not a macro is encountered in an #if directive, outside of defined' complete -c gcc -o Wunused-macros --description 'Warn about macros defined in the main file that are unused' complete -c gcc -o Wendif-labels --description 'Warn whenever an #else or an #endif are followed by text' complete -c gcc -o Werror --description 'Make all warnings into hard errors' complete -c gcc -o Wsystem-headers --description 'Issue warnings for code in system headers' complete -c gcc -s w --description 'Suppress all warnings, including those which GNU CPP issues by default' complete -c gcc -o pedantic --description 'Issue all the mandatory diagnostics listed in the C standard' complete -c gcc -o pedantic-errors --description 'Issue all the mandatory diagnostics, and make all mandatory diagnostics into errors' complete -c gcc -s M --description 'Instead of outputting the result of preprocessing, output a rule suitable for make describing the dependencies of the main source file' complete -c gcc -o MM --description 'Like -M but do not mention header files that are found in system header directories, nor header files that are included, directly or indirectly, from such a header' complete -c gcc -o MF --description 'When used with -M or -MM, specifies a file to write the dependencies to' complete -c gcc -o MG --description 'In conjunction with an option such as -M requesting dependency generation, -MG assumes missing header files are generated files and adds them to the dependency list without raising an error' complete -c gcc -o MP --description 'This option instructs CPP to add a phony target for each dependency other than the main file, causing each to depend on nothing' complete -c gcc -o MT --description 'Change the target of the rule emitted by dependency generation' complete -c gcc -o MQ --description 'Same as -MT, but it quotes any characters which are special to Make' complete -c gcc -o MD --description 'is equivalent to -M -MF file, except that -E is not implied' complete -c gcc -o MD --description 'is equivalent to -M -MF file, except that -E is not implied' complete -c gcc -o MMD --description 'Like -MD except mention only user header files, not system header files' complete -c gcc -o fpch-deps --description 'When using precompiled headers, this flag will cause the dependency-output flags to also list the files from the precompiled header’s dependencies' complete -c gcc -o fpch-preprocess --description 'This option allows use of a precompiled header together with -E' complete -c gcc -s x --description 'assembler-with-cpp Specify the source language: C, C++, Objective-C, or assembly' complete -c gcc -s x --description 'assembler-with-cpp Specify the source language: C, C++, Objective-C, or assembly' complete -c gcc -s x --description 'assembler-with-cpp Specify the source language: C, C++, Objective-C, or assembly' complete -c gcc -s x --description 'assembler-with-cpp Specify the source language: C, C++, Objective-C, or assembly' complete -c gcc -o std --description 'Specify the standard to which the code should conform' complete -c gcc -o ansi --description 'Specify the standard to which the code should conform' complete -c gcc -o I- --description 'Split the include path' complete -c gcc -o nostdinc --description 'Do not search the standard system directories for header files' complete -c gcc -o nostdinc++ --description 'Do not search for header files in the C++-specific standard directories, but do still search the other standard directories' complete -c gcc -o include --description 'Process file as if "#include "file"" appeared as the first line of the primary source file' complete -c gcc -o imacros --description 'Exactly like -include, except that any output produced by scanning file is thrown away' complete -c gcc -o idirafter --description 'Search dir for header files, but do it after all directories specified with -I and the standard system directories have been exhausted' complete -c gcc -o iprefix --description 'Specify prefix as the prefix for subsequent -iwithprefix options' complete -c gcc -o iwithprefix --description 'Append dir to the prefix specified previously with -iprefix, and add the resulting directory to the include search path' complete -c gcc -o iwithprefixbefore --description 'Append dir to the prefix specified previously with -iprefix, and add the resulting directory to the include search path' complete -c gcc -o isysroot --description 'This option is like the --sysroot option, but applies only to header files' complete -c gcc -o isystem --description 'Search dir for header files, after all directories specified by -I but before the standard system directories' complete -c gcc -o iquote --description 'Search dir only for header files requested with "#include "file""; they are not searched for "#include ", before all directories specified by -I and before the standard system directories' complete -c gcc -o fdollars-in-identifiers --description '@anchor{fdollars-in-identifiers} Accept $ in identifiers' complete -c gcc -o fextended-identifiers --description 'Accept universal character names in identifiers' complete -c gcc -o fpreprocessed --description 'Indicate to the preprocessor that the input file has already been preprocessed' complete -c gcc -o ftabstop --description 'Set the distance between tab stops' complete -c gcc -o fexec-charset --description 'Set the execution character set, used for string and character constants' -a "(__fish_print_encodings)" complete -c gcc -o fwide-exec-charset --description 'Set the wide execution character set, used for wide string and character constants' -a "(__fish_print_encodings)" complete -c gcc -o finput-charset --description 'Set the input character set, used for translation from the character set of the input file to the source character set used by GCC' -a "(__fish_print_encodings)" complete -c gcc -o fworking-directory --description 'Enable generation of linemarkers in the preprocessor output that will let the compiler know the current working directory at the time of preprocessing' complete -c gcc -o fno-show-column --description 'Do not print column numbers in diagnostics' complete -c gcc -s A --description 'Make an assertion with the predicate predicate and answer answer' complete -c gcc -s A --description 'Cancel an assertion with the predicate predicate and answer answer' -x complete -c gcc -o predicate --description 'Cancel an assertion with the predicate predicate and answer answer' -x complete -c gcc -o dCHARS --description 'CHARS is a sequence of one or more of the following characters, and must not be preceded by a space' complete -c gcc -s P --description 'Inhibit generation of linemarkers in the output from the preprocessor' complete -c gcc -s C --description 'Do not discard comments' complete -c gcc -o CC --description 'Do not discard comments, including during macro expansion' complete -c gcc -o traditional-cpp --description 'Try to imitate the behavior of old-fashioned C preprocessors, as opposed to ISO C preprocessors' complete -c gcc -o trigraphs --description 'Process trigraph sequences' complete -c gcc -o remap --description 'Enable special code to work around file systems which only permit very short file names, such as MS-DOS' complete -c gcc -l help --description 'Print text describing all the command line options instead of preprocessing anything' complete -c gcc -l target-help --description 'Print text describing all the command line options instead of preprocessing anything' complete -c gcc -s v --description 'Verbose mode' complete -c gcc -s H --description 'Print the name of each header file used, in addition to other normal activities' complete -c gcc -o version --description 'Print out GNU CPP’s version number' complete -c gcc -l version --description 'Print out GNU CPP’s version number' complete -c gcc -o Xassembler --description 'Pass option as an option to the assembler' complete -c gcc -s c --description 'If any of these options is used, then the linker is not run, and object file names should not be used as arguments' complete -c gcc -s S --description 'If any of these options is used, then the linker is not run, and object file names should not be used as arguments' complete -c gcc -s E --description 'If any of these options is used, then the linker is not run, and object file names should not be used as arguments' complete -c gcc -o llibrary --description 'Search the library named library when linking' complete -c gcc -s l --description 'Search the library named library when linking' complete -c gcc -o lobjc --description 'You need this special case of the -l option in order to link an Objective-C or Objective-C++ program' complete -c gcc -o nostartfiles --description 'Do not use the standard system startup files when linking' complete -c gcc -o nodefaultlibs --description 'Do not use the standard system libraries when linking' complete -c gcc -o nostdlib --description 'Do not use the standard system startup files or libraries when linking' complete -c gcc -o pie --description 'Produce a position independent executable on targets which support it' complete -c gcc -o rdynamic --description 'Pass the flag -export-dynamic to the ELF linker, on targets that support it' complete -c gcc -s s --description 'Remove all symbol table and relocation information from the executable' complete -c gcc -o static --description 'On systems that support dynamic linking, this prevents linking with the shared libraries' complete -c gcc -o shared --description 'Produce a shared object which can then be linked with other objects to form an executable' complete -c gcc -o shared-libgcc --description 'On systems that provide libgcc as a shared library, these options force the use of either the shared or static version respectively' complete -c gcc -o static-libgcc --description 'On systems that provide libgcc as a shared library, these options force the use of either the shared or static version respectively' complete -c gcc -o symbolic --description 'Bind references to global symbols when building a shared object' complete -c gcc -o Xlinker --description 'Pass option as an option to the linker' complete -c gcc -s u --description 'Pretend the symbol symbol is undefined, to force linking of library modules to define it' complete -c gcc -o Idir --description 'Add the directory dir to the head of the list of directories to be searched for header files' complete -c gcc -o iquotedir --description 'Add the directory dir to the head of the list of directories to be searched for header files only for the case of #include "file"; they are not searched for #include , otherwise just like -I' complete -c gcc -o Ldir --description 'Add directory dir to the list of directories to be searched for -l' complete -c gcc -o Bprefix --description 'This option specifies where to find the executables, libraries, include files, and data files of the compiler itself' complete -c gcc -o specs -r --description 'Process file after the compiler reads in the standard specs file, in order to override the defaults that the gcc driver program uses when determining what switches to pass to cc1, cc1plus, as, ld, etc' complete -c gcc -l sysroot -x -a '(__fish_complete_directories)' --description 'Use dir as the logical root directory for headers and libraries' complete -c gcc -o I- --description 'This option has been deprecated' complete -c gcc -s b --description 'The argument machine specifies the target machine for compilation' complete -c gcc -s V --description 'The argument version specifies which version of GCC to run' complete -c gcc -o EL --description 'Compile code for little endian mode' complete -c gcc -o EB --description 'Compile code for big endian mode' complete -c gcc -o mmangle-cpu --description 'Prepend the name of the cpu to all public symbol names' complete -c gcc -o mcpu --description 'Compile code for ARC variant cpu' -x complete -c gcc -o mtext --description 'Put functions, data, and readonly data in text-section, data-section, and readonly-data-section respectively by default' complete -c gcc -o mdata --description 'Put functions, data, and readonly data in text-section, data-section, and readonly-data-section respectively by default' complete -c gcc -o mrodata --description 'Put functions, data, and readonly data in text-section, data-section, and readonly-data-section respectively by default' complete -c gcc -o section --description 'Put functions, data, and readonly data in text-section, data-section, and readonly-data-section respectively by default' complete -c gcc -o mabi --description 'Generate code for the specified ABI' -x complete -c gcc -o mapcs-frame --description 'Generate a stack frame that is compliant with the ARM Procedure Call Standard for all functions, even if this is not strictly necessary for correct execution of the code' complete -c gcc -o mapcs --description 'This is a synonym for -mapcs-frame' complete -c gcc -o mthumb-interwork --description 'Generate code which supports calling between the ARM and Thumb instruction sets' complete -c gcc -o mno-sched-prolog --description 'Prevent the reordering of instructions in the function prolog, or the merging of those instruction with the instructions in the function’s body' complete -c gcc -o mhard-float --description 'Generate output containing floating point instructions' complete -c gcc -o msoft-float --description 'Generate output containing library calls for floating point' complete -c gcc -o mfloat-abi --description 'Specifies which ABI to use for floating point values' -x complete -c gcc -o mlittle-endian --description 'Generate code for a processor running in little-endian mode' complete -c gcc -o mbig-endian --description 'Generate code for a processor running in big-endian mode; the default is to compile code for a little-endian processor' complete -c gcc -o mwords-little-endian --description 'This option only applies when generating code for big-endian processors' complete -c gcc -o mcpu --description 'This specifies the name of the target ARM processor' -x complete -c gcc -o mtune --description 'This option is very similar to the -mcpu= option, except that instead of specifying the actual target processor type, and hence restricting which instructions can be used, it specifies that GCC should tune the performance of the code as if the target were of the type specified in this option, but still choosing the instructions that it will generate based on the cpu specified by a -mcpu= option' -x complete -c gcc -o march --description 'This specifies the name of the target ARM architecture' -x complete -c gcc -o mfpu -x --description 'This specifies what floating point hardware (or hardware emulation) is available on the target' complete -c gcc -o mfpe -x --description 'This specifies what floating point hardware (or hardware emulation) is available on the target' complete -c gcc -o mfp -x --description 'This specifies what floating point hardware (or hardware emulation) is available on the target' complete -c gcc -o mstructure-size-boundary -x --description 'The size of all structures and unions will be rounded up to a multiple of the number of bits set by this option' complete -c gcc -o mabort-on-noreturn --description 'Generate a call to the function "abort" at the end of a "noreturn" function' complete -c gcc -o mlong-calls --description 'Tells the compiler to perform function calls by first loading the address of the function into a register and then performing a subroutine call on this register' complete -c gcc -o mno-long-calls --description 'Tells the compiler to perform function calls by first loading the address of the function into a register and then performing a subroutine call on this register' complete -c gcc -o mnop-fun-dllimport --description 'Disable support for the "dllimport" attribute' complete -c gcc -o msingle-pic-base --description 'Treat the register used for PIC addressing as read-only, rather than loading it in the prologue for each function' complete -c gcc -o mpic-register -x --description 'Specify the register to be used for PIC addressing' complete -c gcc -o mcirrus-fix-invalid-insns --description 'Insert NOPs into the instruction stream to in order to work around problems with invalid Maverick instruction combinations' complete -c gcc -o mpoke-function-name --description 'Write the name of each function into the text section, directly preceding the function prologue' complete -c gcc -o mthumb --description 'Generate code for the 16-bit Thumb instruction set' complete -c gcc -o mtpcs-frame --description 'Generate a stack frame that is compliant with the Thumb Procedure Call Standard for all non-leaf functions' complete -c gcc -o mtpcs-leaf-frame --description 'Generate a stack frame that is compliant with the Thumb Procedure Call Standard for all leaf functions' complete -c gcc -o mcallee-super-interworking --description 'Gives all externally visible functions in the file being compiled an ARM instruction set header which switches to Thumb mode before executing the rest of the function' complete -c gcc -o mcaller-super-interworking --description 'Allows calls via function pointers (including virtual functions) to execute correctly regardless of whether the target code has been compiled for interworking or not' complete -c gcc -o mtp -x --description 'Specify the access model for the thread local storage pointer' complete -c gcc -o mmcu -x --description 'Specify ATMEL AVR instruction set or MCU type' complete -c gcc -o msize --description 'Output instruction sizes to the asm file' complete -c gcc -o minit-stack -x --description 'Specify the initial stack address, which may be a symbol or numeric value, __stack is the default' complete -c gcc -o mno-interrupts --description 'Generated code is not compatible with hardware interrupts' complete -c gcc -o mcall-prologues --description 'Functions prologues/epilogues expanded as call to appropriate subroutines' complete -c gcc -o mno-tablejump --description 'Do not generate tablejump insns which sometimes increase code size' complete -c gcc -o mtiny-stack --description 'Change only the low 8 bits of the stack pointer' complete -c gcc -o mint8 --description 'Assume int to be 8 bit integer' complete -c gcc -o momit-leaf-frame-pointer --description 'Don’t keep the frame pointer in a register for leaf functions' complete -c gcc -o mspecld-anomaly --description 'When enabled, the compiler will ensure that the generated code does not contain speculative loads after jump instructions' complete -c gcc -o mno-specld-anomaly --description 'Don’t generate extra code to prevent speculative loads from occurring' complete -c gcc -o mcsync-anomaly --description 'When enabled, the compiler will ensure that the generated code does not contain CSYNC or SSYNC instructions too soon after conditional branches' complete -c gcc -o mno-csync-anomaly --description 'Don’t generate extra code to prevent CSYNC or SSYNC instructions from occurring too soon after a conditional branch' complete -c gcc -o mlow-64k --description 'When enabled, the compiler is free to take advantage of the knowledge that the entire program fits into the low 64k of memory' complete -c gcc -o mno-low-64k --description 'Assume that the program is arbitrarily large' complete -c gcc -o mid-shared-library --description 'Generate code that supports shared libraries via the library ID method' complete -c gcc -o mno-id-shared-library --description 'Generate code that doesn’t assume ID based shared libraries are being used' complete -c gcc -o mshared-library-id -x --description 'Specified the identification number of the ID based shared library being compiled' complete -c gcc -o mlong-calls --description 'Tells the compiler to perform function calls by first loading the address of the function into a register and then performing a subroutine call on this register' complete -c gcc -o mno-long-calls --description 'Tells the compiler to perform function calls by first loading the address of the function into a register and then performing a subroutine call on this register' complete -c gcc -o march --description 'Generate code for the specified architecture' complete -c gcc -o mcpu --description 'Generate code for the specified architecture' complete -c gcc -o type --description 'Generate code for the specified architecture' complete -c gcc -o mtune --description 'Tune to architecture-type everything applicable about the generated code, except for the ABI and the set of available instructions' complete -c gcc -o type --description 'Tune to architecture-type everything applicable about the generated code, except for the ABI and the set of available instructions' complete -c gcc -o mmax-stack-frame --description '=n Warn when the stack frame of a function exceeds n bytes' complete -c gcc -o melinux-stacksize --description '=n Only available with the cris-axis-aout target' complete -c gcc -o metrax4 --description 'The options -metrax4 and -metrax100 are synonyms for -march=v3 and -march=v8 respectively' complete -c gcc -o metrax100 --description 'The options -metrax4 and -metrax100 are synonyms for -march=v3 and -march=v8 respectively' complete -c gcc -o mmul-bug-workaround --description 'Work around a bug in the "muls" and "mulu" instructions for CPU models where it applies' complete -c gcc -o mno-mul-bug-workaround --description 'Work around a bug in the "muls" and "mulu" instructions for CPU models where it applies' complete -c gcc -o mpdebug --description 'Enable CRIS-specific verbose debug-related information in the assembly code' complete -c gcc -o mcc-init --description 'Do not use condition-code results from previous instruction; always emit compare and test instructions before use of condition codes' complete -c gcc -o mno-side-effects --description 'Do not emit instructions with side-effects in addressing modes other than post-increment' complete -c gcc -o mstack-align --description 'These options (no-options) arranges (eliminate arrangements) for the stack-frame, individual data and constants to be aligned for the maximum single data access size for the chosen CPU model' complete -c gcc -o mno-stack-align --description 'These options (no-options) arranges (eliminate arrangements) for the stack-frame, individual data and constants to be aligned for the maximum single data access size for the chosen CPU model' complete -c gcc -o mdata-align --description 'These options (no-options) arranges (eliminate arrangements) for the stack-frame, individual data and constants to be aligned for the maximum single data access size for the chosen CPU model' complete -c gcc -o mno-data-align --description 'These options (no-options) arranges (eliminate arrangements) for the stack-frame, individual data and constants to be aligned for the maximum single data access size for the chosen CPU model' complete -c gcc -o mconst-align --description 'These options (no-options) arranges (eliminate arrangements) for the stack-frame, individual data and constants to be aligned for the maximum single data access size for the chosen CPU model' complete -c gcc -o mno-const-align --description 'These options (no-options) arranges (eliminate arrangements) for the stack-frame, individual data and constants to be aligned for the maximum single data access size for the chosen CPU model' complete -c gcc -o m32-bit --description 'Similar to the stack- data- and const-align options above, these options arrange for stack-frame, writable data and constants to all be 32-bit, 16-bit or 8-bit aligned' complete -c gcc -o m16-bit --description 'Similar to the stack- data- and const-align options above, these options arrange for stack-frame, writable data and constants to all be 32-bit, 16-bit or 8-bit aligned' complete -c gcc -o m8-bit --description 'Similar to the stack- data- and const-align options above, these options arrange for stack-frame, writable data and constants to all be 32-bit, 16-bit or 8-bit aligned' complete -c gcc -o mno-prologue-epilogue --description 'With -mno-prologue-epilogue, the normal function prologue and epilogue that sets up the stack-frame are omitted and no return instructions or return sequences are generated in the code' complete -c gcc -o mprologue-epilogue --description 'With -mno-prologue-epilogue, the normal function prologue and epilogue that sets up the stack-frame are omitted and no return instructions or return sequences are generated in the code' complete -c gcc -o mno-gotplt --description 'With -fpic and -fPIC, don’t generate (do generate) instruction sequences that load addresses for functions from the PLT part of the GOT rather than (traditional on other architectures) calls to the PLT' complete -c gcc -o mgotplt --description 'With -fpic and -fPIC, don’t generate (do generate) instruction sequences that load addresses for functions from the PLT part of the GOT rather than (traditional on other architectures) calls to the PLT' complete -c gcc -o maout --description 'Legacy no-op option only recognized with the cris-axis-aout target' complete -c gcc -o melf --description 'Legacy no-op option only recognized with the cris-axis-elf and cris-axis-linux-gnu targets' complete -c gcc -o melinux --description 'Only recognized with the cris-axis-aout target, where it selects a GNU/linux-like multilib, include files and instruction set for -march=v8' complete -c gcc -o mlinux --description 'Legacy no-op option only recognized with the cris-axis-linux-gnu target' complete -c gcc -o sim --description 'This option, recognized for the cris-axis-aout and cris-axis-elf arranges to link with input-output functions from a simulator library' complete -c gcc -o sim2 --description 'Like -sim, but pass linker options to locate initialized data at 0x40000000 and zero-initialized data at 0x80000000' complete -c gcc -o mmac --description 'Enable the use of multiply-accumulate instructions' complete -c gcc -o mpush-args --description 'Push instructions will be used to pass outgoing arguments when functions are called' complete -c gcc -o Fdir --description 'Add the framework directory dir to the head of the list of directories to be searched for header files' complete -c gcc -o gused --description 'Emit debugging information for symbols that are used' complete -c gcc -o gfull --description 'Emit debugging information for all symbols and types' complete -c gcc -o mmacosx-version-min --description '=version The earliest version of MacOS X that this executable will run on is version' complete -c gcc -o mone-byte-bool --description 'Override the defaults for bool so that sizeof(bool)==1' complete -c gcc -o mfix-and-continue --description 'Generate code suitable for fast turn around development' complete -c gcc -o ffix-and-continue --description 'Generate code suitable for fast turn around development' complete -c gcc -o findirect-data --description 'Generate code suitable for fast turn around development' complete -c gcc -o all_load --description 'Loads all members of static archive libraries' complete -c gcc -o arch_errors_fatal --description 'Cause the errors having to do with files that have the wrong architecture to be fatal' complete -c gcc -o bind_at_load --description 'Causes the output file to be marked such that the dynamic linker will bind all undefined references when the file is loaded or launched' complete -c gcc -o bundle --description 'Produce a Mach-o bundle format file' complete -c gcc -o bundle_loader --description 'This option specifies the executable that will be loading the build output file being linked' complete -c gcc -o dynamiclib --description 'When passed this option, GCC will produce a dynamic library instead of an executable when linking, using the Darwin libtool command' complete -c gcc -o force_cpusubtype_ALL --description 'This causes GCC’s output file to have the ALL subtype, instead of one controlled by the -mcpu or -march option' complete -c gcc -o allowable_client --description 'These options are passed to the Darwin linker' complete -c gcc -o client_name --description 'These options are passed to the Darwin linker' complete -c gcc -o compatibility_version --description 'These options are passed to the Darwin linker' complete -c gcc -o current_version --description 'These options are passed to the Darwin linker' complete -c gcc -o dead_strip --description 'These options are passed to the Darwin linker' complete -c gcc -o dependency-file --description 'These options are passed to the Darwin linker' complete -c gcc -o dylib_file --description 'These options are passed to the Darwin linker' complete -c gcc -o dylinker_install_name --description 'These options are passed to the Darwin linker' complete -c gcc -o dynamic --description 'These options are passed to the Darwin linker' complete -c gcc -o exported_symbols_list --description 'These options are passed to the Darwin linker' complete -c gcc -o filelist --description 'These options are passed to the Darwin linker' complete -c gcc -o flat_namespace --description 'These options are passed to the Darwin linker' complete -c gcc -o force_flat_namespace --description 'These options are passed to the Darwin linker' complete -c gcc -o headerpad_max_install_names --description 'These options are passed to the Darwin linker' complete -c gcc -o image_base --description 'These options are passed to the Darwin linker' complete -c gcc -o init --description 'These options are passed to the Darwin linker' complete -c gcc -o install_name --description 'These options are passed to the Darwin linker' complete -c gcc -o keep_private_externs --description 'These options are passed to the Darwin linker' complete -c gcc -o multi_module --description 'These options are passed to the Darwin linker' complete -c gcc -o multiply_defined --description 'These options are passed to the Darwin linker' complete -c gcc -o multiply_defined_unused --description 'These options are passed to the Darwin linker' complete -c gcc -o noall_load --description 'These options are passed to the Darwin linker' complete -c gcc -o no_dead_strip_inits_and_terms --description 'These options are passed to the Darwin linker' complete -c gcc -o nofixprebinding --description 'These options are passed to the Darwin linker' complete -c gcc -o nomultidefs --description 'These options are passed to the Darwin linker' complete -c gcc -o noprebind --description 'These options are passed to the Darwin linker' complete -c gcc -o noseglinkedit --description 'These options are passed to the Darwin linker' complete -c gcc -o pagezero_size --description 'These options are passed to the Darwin linker' complete -c gcc -o prebind --description 'These options are passed to the Darwin linker' complete -c gcc -o prebind_all_twolevel_modules --description 'These options are passed to the Darwin linker' complete -c gcc -o private_bundle --description 'These options are passed to the Darwin linker' complete -c gcc -o read_only_relocs --description 'These options are passed to the Darwin linker' complete -c gcc -o sectalign --description 'These options are passed to the Darwin linker' complete -c gcc -o sectobjectsymbols --description 'These options are passed to the Darwin linker' complete -c gcc -o whyload --description 'These options are passed to the Darwin linker' complete -c gcc -o seg1addr --description 'These options are passed to the Darwin linker' complete -c gcc -o sectcreate --description 'These options are passed to the Darwin linker' complete -c gcc -o sectobjectsymbols --description 'These options are passed to the Darwin linker' complete -c gcc -o sectorder --description 'These options are passed to the Darwin linker' complete -c gcc -o segaddr --description 'These options are passed to the Darwin linker' complete -c gcc -o segs_read_only_addr --description 'These options are passed to the Darwin linker' complete -c gcc -o segs_read_write_addr --description 'These options are passed to the Darwin linker' complete -c gcc -o seg_addr_table --description 'These options are passed to the Darwin linker' complete -c gcc -o seg_addr_table_filename --description 'These options are passed to the Darwin linker' complete -c gcc -o seglinkedit --description 'These options are passed to the Darwin linker' complete -c gcc -o segprot --description 'These options are passed to the Darwin linker' complete -c gcc -o segs_read_only_addr --description 'These options are passed to the Darwin linker' complete -c gcc -o segs_read_write_addr --description 'These options are passed to the Darwin linker' complete -c gcc -o single_module --description 'These options are passed to the Darwin linker' complete -c gcc -o static --description 'These options are passed to the Darwin linker' complete -c gcc -o sub_library --description 'These options are passed to the Darwin linker' complete -c gcc -o sub_umbrella --description 'These options are passed to the Darwin linker' complete -c gcc -o twolevel_namespace --description 'These options are passed to the Darwin linker' complete -c gcc -o umbrella --description 'These options are passed to the Darwin linker' complete -c gcc -o undefined --description 'These options are passed to the Darwin linker' complete -c gcc -o unexported_symbols_list --description 'These options are passed to the Darwin linker' complete -c gcc -o weak_reference_mismatches --description 'These options are passed to the Darwin linker' complete -c gcc -o whatsloaded --description 'These options are passed to the Darwin linker' complete -c gcc -o mno-soft-float --description 'Use (do not use) the hardware floating-point instructions for floating-point operations' complete -c gcc -o msoft-float --description 'Use (do not use) the hardware floating-point instructions for floating-point operations' complete -c gcc -o mfp-reg --description 'Generate code that uses (does not use) the floating-point register set' complete -c gcc -o mno-fp-regs --description 'Generate code that uses (does not use) the floating-point register set' complete -c gcc -o mieee --description 'The Alpha architecture implements floating-point hardware optimized for maximum performance' complete -c gcc -o mieee-with-inexact --description 'This is like -mieee except the generated code also maintains the IEEE inexact-flag' complete -c gcc -o mfp-trap-mode --description 'This option controls what floating-point related traps are enabled' complete -c gcc -o mode --description 'This option controls what floating-point related traps are enabled' complete -c gcc -o mfp-rounding-mode --description 'Selects the IEEE rounding mode' complete -c gcc -o mode --description 'Selects the IEEE rounding mode' complete -c gcc -o mtrap-precision --description 'In the Alpha architecture, floating point traps are imprecise' complete -c gcc -o precision --description 'In the Alpha architecture, floating point traps are imprecise' complete -c gcc -o mieee-conformant --description 'This option marks the generated code as IEEE conformant' complete -c gcc -o mbuild-constants --description 'Normally GCC examines a 32- or 64-bit integer constant to see if it can construct it from smaller constants in two or three instructions' complete -c gcc -o malpha-as --description 'Select whether to generate code to be assembled by the vendor-supplied assembler (-malpha-as) or by the GNU assembler -mgas' complete -c gcc -o mgas --description 'Select whether to generate code to be assembled by the vendor-supplied assembler (-malpha-as) or by the GNU assembler -mgas' complete -c gcc -o mbwx --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mno-bwx --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mcix --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mno-cix --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mfix --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mno-fix --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mmax --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mno-max --description 'Indicate whether GCC should generate code to use the optional BWX, CIX, FIX and MAX instruction sets' complete -c gcc -o mfloat-vax --description 'Generate code that uses (does not use) VAX F and G floating point arithmetic instead of IEEE single and double precision' complete -c gcc -o mfloat-ieee --description 'Generate code that uses (does not use) VAX F and G floating point arithmetic instead of IEEE single and double precision' complete -c gcc -o mexplicit-relocs --description 'Older Alpha assemblers provided no way to generate symbol relocations except via assembler macros' complete -c gcc -o mno-explicit-relocs --description 'Older Alpha assemblers provided no way to generate symbol relocations except via assembler macros' complete -c gcc -o msmall-data --description 'When -mexplicit-relocs is in effect, static data is accessed via gp-relative relocations' complete -c gcc -o mlarge-data --description 'When -mexplicit-relocs is in effect, static data is accessed via gp-relative relocations' complete -c gcc -o msmall-text --description 'When -msmall-text is used, the compiler assumes that the code of the entire program (or shared library) fits in 4MB, and is thus reachable with a branch instruction' complete -c gcc -o mlarge-text --description 'When -msmall-text is used, the compiler assumes that the code of the entire program (or shared library) fits in 4MB, and is thus reachable with a branch instruction' complete -c gcc -o mcpu --description '=cpu_type Set the instruction set and instruction scheduling parameters for machine type cpu_type' complete -c gcc -o mtune --description '=cpu_type Set only the instruction scheduling parameters for machine type cpu_type' complete -c gcc -o mmemory-latency --description '=time Sets the latency the scheduler should assume for typical memory references as seen by the application' complete -c gcc -o mvms-return-codes --description 'Return VMS condition codes from main' complete -c gcc -o mgpr-32 --description 'Only use the first 32 general purpose registers' complete -c gcc -o mgpr-64 --description 'Use all 64 general purpose registers' complete -c gcc -o mfpr-32 --description 'Use only the first 32 floating point registers' complete -c gcc -o mfpr-64 --description 'Use hardware instructions for floating point operations' complete -c gcc -o mhard-float --description 'Use hardware instructions for floating point operations' complete -c gcc -o msoft-float --description 'Use library routines for floating point operations' complete -c gcc -o malloc-cc --description 'Dynamically allocate condition code registers' complete -c gcc -o mfixed-cc --description 'Do not try to dynamically allocate condition code registers, only use "icc0" and "fcc0"' complete -c gcc -o mdword --description 'Change ABI to use double word insns' complete -c gcc -o mno-dword --description 'Do not use double word instructions' complete -c gcc -o mdouble --description 'Use floating point double instructions' complete -c gcc -o mno-double --description 'Do not use floating point double instructions' complete -c gcc -o mmedia --description 'Use media instructions' complete -c gcc -o mno-media --description 'Do not use media instructions' complete -c gcc -o mmuladd --description 'Use multiply and add/subtract instructions' complete -c gcc -o mno-muladd --description 'Do not use multiply and add/subtract instructions' complete -c gcc -o mfdpic --description 'Select the FDPIC ABI, that uses function descriptors to represent pointers to functions' complete -c gcc -o minline-plt --description 'Enable inlining of PLT entries in function calls to functions that are not known to bind locally' complete -c gcc -o mTLS --description 'Assume a large TLS segment when generating thread-local code' complete -c gcc -o mtls --description 'Do not assume a large TLS segment when generating thread-local code' complete -c gcc -o mgprel-ro --description 'Enable the use of "GPREL" relocations in the FDPIC ABI for data that is known to be in read-only sections' complete -c gcc -o multilib-library-pic --description 'Link with the (library, not FD) pic libraries' complete -c gcc -o mlinked-fp --description 'Follow the EABI requirement of always creating a frame pointer whenever a stack frame is allocated' complete -c gcc -o mlong-calls --description 'Use indirect addressing to call functions outside the current compilation unit' complete -c gcc -o malign-labels --description 'Try to align labels to an 8-byte boundary by inserting nops into the previous packet' complete -c gcc -o mlibrary-pic --description 'Generate position-independent EABI code' complete -c gcc -o macc-4 --description 'Use only the first four media accumulator registers' complete -c gcc -o macc-8 --description 'Use all eight media accumulator registers' complete -c gcc -o mpack --description 'Pack VLIW instructions' complete -c gcc -o mno-pack --description 'Do not pack VLIW instructions' complete -c gcc -o mno-eflags --description 'Do not mark ABI switches in e_flags' complete -c gcc -o mcond-move --description 'Enable the use of conditional-move instructions (default)' complete -c gcc -o mno-cond-move --description 'Disable the use of conditional-move instructions' complete -c gcc -o mscc --description 'Enable the use of conditional set instructions (default)' complete -c gcc -o mno-scc --description 'Disable the use of conditional set instructions' complete -c gcc -o mcond-exec --description 'Enable the use of conditional execution (default)' complete -c gcc -o mno-cond-exec --description 'Disable the use of conditional execution' complete -c gcc -o mvliw-branch --description 'Run a pass to pack branches into VLIW instructions (default)' complete -c gcc -o mno-vliw-branch --description 'Do not run a pass to pack branches into VLIW instructions' complete -c gcc -o mmulti-cond-exec --description 'Enable optimization of "&&" and "││" in conditional execution (default)' complete -c gcc -o mno-multi-cond-exec --description 'Disable optimization of "&&" and "││" in conditional execution' complete -c gcc -o mnested-cond-exec --description 'Enable nested conditional execution optimizations (default)' complete -c gcc -o mno-nested-cond-exec --description 'Disable nested conditional execution optimizations' complete -c gcc -o moptimize-membar --description 'This switch removes redundant "membar" instructions from the compiler generated code' complete -c gcc -o mno-optimize-membar --description 'This switch disables the automatic removal of redundant "membar" instructions from the generated code' complete -c gcc -o mtomcat-stats --description 'Cause gas to print out tomcat statistics' complete -c gcc -o mcpu --description '=cpu Select the processor type for which to generate code' complete -c gcc -o mrelax --description 'Shorten some address references at link time, when possible; uses the linker option -relax' complete -c gcc -o mh --description 'Generate code for the H8/300H' complete -c gcc -o ms --description 'Generate code for the H8S' complete -c gcc -o mn --description 'Generate code for the H8S and H8/300H in the normal mode' complete -c gcc -o ms2600 --description 'Generate code for the H8S/2600' complete -c gcc -o mint32 --description 'Make "int" data 32 bits by default' complete -c gcc -o malign-300 --description 'On the H8/300H and H8S, use the same alignment rules as for the H8/300' complete -c gcc -o march --description 'Generate code for the specified architecture' complete -c gcc -o type --description 'Generate code for the specified architecture' complete -c gcc -o mpa-risc-1-0 --description 'Synonyms for -march=1' complete -c gcc -o mpa-risc-1-1 --description 'Synonyms for -march=1' complete -c gcc -o mpa-risc-2-0 --description 'Synonyms for -march=1' complete -c gcc -o mbig-switch --description 'Generate code suitable for big switch tables' complete -c gcc -o mjump-in-delay --description 'Fill delay slots of function calls with unconditional jump instructions by modifying the return pointer for the function call to be the target of the conditional jump' complete -c gcc -o mdisable-fpregs --description 'Prevent floating point registers from being used in any manner' complete -c gcc -o mdisable-indexing --description 'Prevent the compiler from using indexing address modes' complete -c gcc -o mno-space-regs --description 'Generate code that assumes the target has no space registers' complete -c gcc -o mfast-indirect-calls --description 'Generate code that assumes calls never cross space boundaries' complete -c gcc -o mfixed-range --description 'Generate code treating the given register range as fixed registers' complete -c gcc -o range --description 'Generate code treating the given register range as fixed registers' complete -c gcc -o mlong-load-store --description 'Generate 3-instruction load and store sequences as sometimes required by the HP-UX 10 linker' complete -c gcc -o mportable-runtime --description 'Use the portable calling conventions proposed by HP for ELF systems' complete -c gcc -o mgas --description 'Enable the use of assembler directives only GAS understands' complete -c gcc -o mschedule --description 'Schedule code according to the constraints for the machine type cpu-type' complete -c gcc -o type --description 'Schedule code according to the constraints for the machine type cpu-type' complete -c gcc -o mlinker-opt --description 'Enable the optimization pass in the HP-UX linker' complete -c gcc -o msoft-float --description 'Generate output containing library calls for floating point' complete -c gcc -o msio --description 'Generate the predefine, "_SIO", for server IO' complete -c gcc -o mgnu-ld --description 'Use GNU ld specific options' complete -c gcc -o mhp-ld --description 'Use HP ld specific options' complete -c gcc -o mlong-calls --description 'Generate code that uses long call sequences' complete -c gcc -o munix --description 'Generate compiler predefines and select a startfile for the specified UNIX standard' complete -c gcc -o std --description 'Generate compiler predefines and select a startfile for the specified UNIX standard' complete -c gcc -o nolibdld --description 'Suppress the generation of link options to search libdld' complete -c gcc -o static --description 'The HP-UX implementation of setlocale in libc has a dependency on libdld' complete -c gcc -o threads --description 'Add support for multithreading with the dce thread library under HP-UX' complete -c gcc -o mtune --description 'Tune to cpu-type everything applicable about the generated code, except for the ABI and the set of available instructions' complete -c gcc -o type --description 'Tune to cpu-type everything applicable about the generated code, except for the ABI and the set of available instructions' complete -c gcc -o march --description 'Generate instructions for the machine type cpu-type' complete -c gcc -o type --description 'Generate instructions for the machine type cpu-type' complete -c gcc -o mcpu --description 'A deprecated synonym for -mtune' complete -c gcc -o type --description 'A deprecated synonym for -mtune' complete -c gcc -o m386 --description 'These options are synonyms for -mtune=i386, -mtune=i486, -mtune=pentium, and -mtune=pentiumpro respectively' complete -c gcc -o m486 --description 'These options are synonyms for -mtune=i386, -mtune=i486, -mtune=pentium, and -mtune=pentiumpro respectively' complete -c gcc -o mpentium --description 'These options are synonyms for -mtune=i386, -mtune=i486, -mtune=pentium, and -mtune=pentiumpro respectively' complete -c gcc -o mpentiumpro --description 'These options are synonyms for -mtune=i386, -mtune=i486, -mtune=pentium, and -mtune=pentiumpro respectively' complete -c gcc -o mfpmath --description '=unit Generate floating point arithmetics for selected unit unit' complete -c gcc -o masm --description '=dialect Output asm instructions using selected dialect' complete -c gcc -o mieee-fp --description 'Control whether or not the compiler uses IEEE floating point comparisons' complete -c gcc -o mno-ieee-fp --description 'Control whether or not the compiler uses IEEE floating point comparisons' complete -c gcc -o msoft-float --description 'Generate output containing library calls for floating point' complete -c gcc -o mno-fp-ret-in-387 --description 'Do not use the FPU registers for return values of functions' complete -c gcc -o mno-fancy-math-387 --description 'Some 387 emulators do not support the "sin", "cos" and "sqrt" instructions for the 387' complete -c gcc -o malign-double --description 'Control whether GCC aligns "double", "long double", and "long long" variables on a two word boundary or a one word boundary' complete -c gcc -o mno-align-double --description 'Control whether GCC aligns "double", "long double", and "long long" variables on a two word boundary or a one word boundary' complete -c gcc -o m96bit-long-double --description 'These switches control the size of "long double" type' complete -c gcc -o m128bit-long-double --description 'These switches control the size of "long double" type' complete -c gcc -o mmlarge-data-threshold --description '=number When -mcmodel=medium is specified, the data greater than threshold are placed in large data section' complete -c gcc -o msvr3-shlib --description 'Control whether GCC places uninitialized local variables into the "bss" or "data" segments' complete -c gcc -o mno-svr3-shlib --description 'Control whether GCC places uninitialized local variables into the "bss" or "data" segments' complete -c gcc -o mrtd --description 'Use a different function-calling convention, in which functions that take a fixed number of arguments return with the "ret" num instruction, which pops their arguments while returning' complete -c gcc -o mregparm --description '=num Control how many registers are used to pass integer arguments' complete -c gcc -o msseregparm --description 'Use SSE register passing conventions for float and double arguments and return values' complete -c gcc -o mpreferred-stack-boundary --description '=num Attempt to keep the stack boundary aligned to a 2 raised to num byte boundary' complete -c gcc -o mmmx --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mno-mmx --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o msse --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mno-sse --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o msse2 --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mno-sse2 --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o msse3 --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mno-sse3 --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mmni --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mno-mni --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o m3dnow --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mno-3dnow --description 'These switches enable or disable the use of instructions in the MMX, SSE, SSE2 or 3DNow! extended instruction sets' complete -c gcc -o mpush-args --description 'Use PUSH operations to store outgoing parameters' complete -c gcc -o mno-push-args --description 'Use PUSH operations to store outgoing parameters' complete -c gcc -o maccumulate-outgoing-args --description 'If enabled, the maximum amount of space required for outgoing arguments will be computed in the function prologue' complete -c gcc -o mthreads --description 'Support thread-safe exception handling on Mingw32' complete -c gcc -o mno-align-stringops --description 'Do not align destination of inlined string operations' complete -c gcc -o minline-all-stringops --description 'By default GCC inlines string operations only when destination is known to be aligned at least to 4 byte boundary' complete -c gcc -o momit-leaf-frame-pointer --description 'Don’t keep the frame pointer in a register for leaf functions' complete -c gcc -o mtls-direct-seg-refs --description 'Controls whether TLS variables may be accessed with offsets from the TLS segment register (%gs for 32-bit, %fs for 64-bit), or whether the thread base pointer must be added' complete -c gcc -o mno-tls-direct-seg-refs --description 'Controls whether TLS variables may be accessed with offsets from the TLS segment register (%gs for 32-bit, %fs for 64-bit), or whether the thread base pointer must be added' complete -c gcc -o m32 --description 'Generate code for a 32-bit or 64-bit environment' complete -c gcc -o m64 --description 'Generate code for a 32-bit or 64-bit environment' complete -c gcc -o mno-red-zone --description 'Do not use a so called red zone for x86-64 code' complete -c gcc -o mcmodel --description '=small Generate code for the small code model: the program and its symbols must be linked in the lower 2 GB of the address space' complete -c gcc -o mcmodel --description '=kernel Generate code for the kernel code model' complete -c gcc -o mcmodel --description '=medium Generate code for the medium model: The program is linked in the lower 2 GB of the address space but symbols can be located anywhere in the address space' complete -c gcc -o mcmodel --description '=large Generate code for the large model: This model makes no assumptions about addresses and sizes of sections' complete -c gcc -o mbig-endian --description 'Generate code for a big endian target' complete -c gcc -o mlittle-endian --description 'Generate code for a little endian target' complete -c gcc -o mgnu-as --description 'Generate (or don’t) code for the GNU assembler' complete -c gcc -o mno-gnu-as --description 'Generate (or don’t) code for the GNU assembler' complete -c gcc -o mgnu-ld --description 'Generate (or don’t) code for the GNU linker' complete -c gcc -o mno-gnu-ld --description 'Generate (or don’t) code for the GNU linker' complete -c gcc -o mno-pic --description 'Generate code that does not use a global pointer register' complete -c gcc -o mvolatile-asm-stop --description 'Generate (or don’t) a stop bit immediately before and after volatile asm statements' complete -c gcc -o mno-volatile-asm-stop --description 'Generate (or don’t) a stop bit immediately before and after volatile asm statements' complete -c gcc -o mregister-names --description 'Generate (or don’t) in, loc, and out register names for the stacked registers' complete -c gcc -o mno-register-names --description 'Generate (or don’t) in, loc, and out register names for the stacked registers' complete -c gcc -o mno-sdata --description 'Disable (or enable) optimizations that use the small data section' complete -c gcc -o msdata --description 'Disable (or enable) optimizations that use the small data section' complete -c gcc -o mconstant-gp --description 'Generate code that uses a single constant global pointer value' complete -c gcc -o mauto-pic --description 'Generate code that is self-relocatable' complete -c gcc -o minline-float-divide-min-latency --description 'Generate code for inline divides of floating point values using the minimum latency algorithm' complete -c gcc -o minline-float-divide-max-throughput --description 'Generate code for inline divides of floating point values using the maximum throughput algorithm' complete -c gcc -o minline-int-divide-min-latency --description 'Generate code for inline divides of integer values using the minimum latency algorithm' complete -c gcc -o minline-int-divide-max-throughput --description 'Generate code for inline divides of integer values using the maximum throughput algorithm' complete -c gcc -o minline-sqrt-min-latency --description 'Generate code for inline square roots using the minimum latency algorithm' complete -c gcc -o minline-sqrt-max-throughput --description 'Generate code for inline square roots using the maximum throughput algorithm' complete -c gcc -o mno-dwarf2-asm --description 'Don’t (or do) generate assembler code for the DWARF2 line number debugging info' complete -c gcc -o mdwarf2-asm --description 'Don’t (or do) generate assembler code for the DWARF2 line number debugging info' complete -c gcc -o mearly-stop-bits --description 'Allow stop bits to be placed earlier than immediately preceding the instruction that triggered the stop bit' complete -c gcc -o mno-early-stop-bits --description 'Allow stop bits to be placed earlier than immediately preceding the instruction that triggered the stop bit' complete -c gcc -o mfixed-range --description 'Generate code treating the given register range as fixed registers' complete -c gcc -o range --description 'Generate code treating the given register range as fixed registers' complete -c gcc -o mtls-size --description 'Specify bit size of immediate TLS offsets' complete -c gcc -o size --description 'Specify bit size of immediate TLS offsets' complete -c gcc -o mtune --description 'Tune the instruction scheduling for a particular CPU, Valid values are itanium, itanium1, merced, itanium2, and mckinley' complete -c gcc -o type --description 'Tune the instruction scheduling for a particular CPU, Valid values are itanium, itanium1, merced, itanium2, and mckinley' complete -c gcc -o mt --description 'Add support for multithreading using the POSIX threads library' complete -c gcc -o pthread --description 'Add support for multithreading using the POSIX threads library' complete -c gcc -o milp32 --description 'Generate code for a 32-bit or 64-bit environment' complete -c gcc -o mlp64 --description 'Generate code for a 32-bit or 64-bit environment' complete -c gcc -o mcpu --description '=name Select the CPU for which code is generated' complete -c gcc -o msim --description 'Specifies that the program will be run on the simulator' complete -c gcc -o memregs --description '=number Specifies the number of memory-based pseudo-registers GCC will use during code generation' complete -c gcc -o m32r2 --description 'Generate code for the M32R/2' complete -c gcc -o m32rx --description 'Generate code for the M32R/X' complete -c gcc -o m32r --description 'Generate code for the M32R' complete -c gcc -o mmodel --description '=small Assume all objects live in the lower 16MB of memory (so that their addresses can be loaded with the "ld24" instruction), and assume all subroutines are reachable with the "bl" instruction' complete -c gcc -o mmodel --description '=medium Assume objects may be anywhere in the 32-bit address space (the compiler will generate "seth/add3" instructions to load their addresses), and assume all subroutines are reachable with the "bl" instruction' complete -c gcc -o mmodel --description '=large Assume objects may be anywhere in the 32-bit address space (the compiler will generate "seth/add3" instructions to load their addresses), and assume subroutines may not be reachable with the "bl" instruction (the compiler will generate the much slower "seth/add3/jl" instruction sequence)' complete -c gcc -o msdata --description '=none Disable use of the small data area' complete -c gcc -o msdata --description '=sdata Put small global and static data in the small data area, but do not generate special code to reference them' complete -c gcc -o msdata --description '=use Put small global and static data in the small data area, and generate special instructions to reference them' complete -c gcc -s G --description 'Put global and static objects less than or equal to num bytes into the small data or bss sections instead of the normal data or bss sections' complete -c gcc -o mdebug --description 'Makes the M32R specific code in the compiler display some statistics that might help in debugging programs' complete -c gcc -o malign-loops --description 'Align all loops to a 32-byte boundary' complete -c gcc -o mno-align-loops --description 'Do not enforce a 32-byte alignment for loops' complete -c gcc -o missue-rate --description '=number Issue number instructions per cycle' complete -c gcc -o mbranch-cost --description '=number number can only be 1 or 2' complete -c gcc -o mflush-trap --description '=number Specifies the trap number to use to flush the cache' complete -c gcc -o mno-flush-trap --description 'Specifies that the cache cannot be flushed by using a trap' complete -c gcc -o mflush-func --description '=name Specifies the name of the operating system function to call to flush the cache' complete -c gcc -o mno-flush-func --description 'Indicates that there is no OS function for flushing the cache' complete -c gcc -o m68000 --description 'Generate output for a 68000' complete -c gcc -o mc68000 --description 'Generate output for a 68000' complete -c gcc -o m68020 --description 'Generate output for a 68020' complete -c gcc -o mc68020 --description 'Generate output for a 68020' complete -c gcc -o m68881 --description 'Generate output containing 68881 instructions for floating point' complete -c gcc -o m68030 --description 'Generate output for a 68030' complete -c gcc -o m68040 --description 'Generate output for a 68040' complete -c gcc -o m68060 --description 'Generate output for a 68060' complete -c gcc -o mcpu32 --description 'Generate output for a CPU32' complete -c gcc -o m5200 --description 'Generate output for a 520X "coldfire" family cpu' complete -c gcc -o m68020-40 --description 'Generate output for a 68040, without using any of the new instructions' complete -c gcc -o m68020-60 --description 'Generate output for a 68060, without using any of the new instructions' complete -c gcc -o msoft-float --description 'Generate output containing library calls for floating point' complete -c gcc -o mshort --description 'Consider type "int" to be 16 bits wide, like "short int"' complete -c gcc -o mnobitfield --description 'Do not use the bit-field instructions' complete -c gcc -o mbitfield --description 'Do use the bit-field instructions' complete -c gcc -o mrtd --description 'Use a different function-calling convention, in which functions that take a fixed number of arguments return with the "rtd" instruction, which pops their arguments while returning' complete -c gcc -o malign-int --description 'Control whether GCC aligns "int", "long", "long long", "float", "double", and "long double" variables on a 32-bit boundary (-malign-int) or a 16-bit boundary (-mno-align-int)' complete -c gcc -o mno-align-int --description 'Control whether GCC aligns "int", "long", "long long", "float", "double", and "long double" variables on a 32-bit boundary (-malign-int) or a 16-bit boundary (-mno-align-int)' complete -c gcc -o mpcrel --description 'Use the pc-relative addressing mode of the 68000 directly, instead of using a global offset table' complete -c gcc -o mno-strict-align --description 'Do not (do) assume that unaligned memory references will be handled by the system' complete -c gcc -o mstrict-align --description 'Do not (do) assume that unaligned memory references will be handled by the system' complete -c gcc -o msep-data --description 'Generate code that allows the data segment to be located in a different area of memory from the text segment' complete -c gcc -o mno-sep-data --description 'Generate code that assumes that the data segment follows the text segment' complete -c gcc -o mid-shared-library --description 'Generate code that supports shared libraries via the library ID method' complete -c gcc -o mno-id-shared-library --description 'Generate code that doesn’t assume ID based shared libraries are being used' complete -c gcc -o mshared-library-id --description '=n Specified the identification number of the ID based shared library being compiled' complete -c gcc -o m6811 --description 'Generate output for a 68HC11' complete -c gcc -o m68hc11 --description 'Generate output for a 68HC11' complete -c gcc -o m6812 --description 'Generate output for a 68HC12' complete -c gcc -o m68hc12 --description 'Generate output for a 68HC12' complete -c gcc -o m68S12 --description 'Generate output for a 68HCS12' complete -c gcc -o m68hcs12 --description 'Generate output for a 68HCS12' complete -c gcc -o mauto-incdec --description 'Enable the use of 68HC12 pre and post auto-increment and autodecrement addressing modes' complete -c gcc -o minmax --description 'Enable the use of 68HC12 min and max instructions' complete -c gcc -o nominmax --description 'Enable the use of 68HC12 min and max instructions' complete -c gcc -o mlong-calls --description 'Treat all calls as being far away (near)' complete -c gcc -o mno-long-calls --description 'Treat all calls as being far away (near)' complete -c gcc -o mshort --description 'Consider type "int" to be 16 bits wide, like "short int"' complete -c gcc -o msoft-reg-count --description '=count Specify the number of pseudo-soft registers which are used for the code generation' complete -c gcc -o mhardlit --description 'Inline constants into the code stream if it can be done in two instructions or less' complete -c gcc -o mno-hardlit --description 'Inline constants into the code stream if it can be done in two instructions or less' complete -c gcc -o mdiv --description 'Use the divide instruction' complete -c gcc -o mno-div --description 'Use the divide instruction' complete -c gcc -o mrelax-immediate --description 'Allow arbitrary sized immediates in bit operations' complete -c gcc -o mno-relax-immediate --description 'Allow arbitrary sized immediates in bit operations' complete -c gcc -o mwide-bitfields --description 'Always treat bit-fields as int-sized' complete -c gcc -o mno-wide-bitfields --description 'Always treat bit-fields as int-sized' complete -c gcc -o m4byte-functions --description 'Force all functions to be aligned to a four byte boundary' complete -c gcc -o mno-4byte-functions --description 'Force all functions to be aligned to a four byte boundary' complete -c gcc -o mcallgraph-data --description 'Emit callgraph information' complete -c gcc -o mno-callgraph-data --description 'Emit callgraph information' complete -c gcc -o mslow-bytes --description 'Prefer word access when reading byte quantities' complete -c gcc -o mno-slow-bytes --description 'Prefer word access when reading byte quantities' complete -c gcc -o mlittle-endian --description 'Generate code for a little endian target' complete -c gcc -o mbig-endian --description 'Generate code for a little endian target' complete -c gcc -o m210 --description 'Generate code for the 210 processor' complete -c gcc -o m340 --description 'Generate code for the 210 processor' complete -c gcc -o EB --description 'Generate big-endian code' complete -c gcc -o EL --description 'Generate little-endian code' complete -c gcc -o march --description '=arch Generate code that will run on arch, which can be the name of a generic MIPS ISA, or the name of a particular processor' complete -c gcc -o mtune --description '=arch Optimize for arch' complete -c gcc -o mips1 --description 'Equivalent to -march=mips1' complete -c gcc -o mips2 --description 'Equivalent to -march=mips2' complete -c gcc -o mips3 --description 'Equivalent to -march=mips3' complete -c gcc -o mips4 --description 'Equivalent to -march=mips4' complete -c gcc -o mips32 --description 'Equivalent to -march=mips32' complete -c gcc -o mips32r2 --description 'Equivalent to -march=mips32r2' complete -c gcc -o mips64 --description 'Equivalent to -march=mips64' complete -c gcc -o mips16 --description 'Generate (do not generate) MIPS16 code' complete -c gcc -o mno-mips16 --description 'Generate (do not generate) MIPS16 code' complete -c gcc -o mabi --description '=eabi Generate code for the given ABI' complete -c gcc -o mabi --description '=eabi Generate code for the given ABI' complete -c gcc -o mabi --description '=eabi Generate code for the given ABI' complete -c gcc -o mabi --description '=eabi Generate code for the given ABI' complete -c gcc -o mabi --description '=eabi Generate code for the given ABI' complete -c gcc -o mabicalls --description 'Generate (do not generate) SVR4-style position-independent code' complete -c gcc -o mno-abicalls --description 'Generate (do not generate) SVR4-style position-independent code' complete -c gcc -o mxgot --description 'Lift (do not lift) the usual restrictions on the size of the global offset table' complete -c gcc -o mno-xgot --description 'Lift (do not lift) the usual restrictions on the size of the global offset table' complete -c gcc -o mgp32 --description 'Assume that general-purpose registers are 32 bits wide' complete -c gcc -o mgp64 --description 'Assume that general-purpose registers are 64 bits wide' complete -c gcc -o mfp32 --description 'Assume that floating-point registers are 32 bits wide' complete -c gcc -o mfp64 --description 'Assume that floating-point registers are 64 bits wide' complete -c gcc -o mhard-float --description 'Use floating-point coprocessor instructions' complete -c gcc -o msoft-float --description 'Do not use floating-point coprocessor instructions' complete -c gcc -o msingle-float --description 'Assume that the floating-point coprocessor only supports singleprecision operations' complete -c gcc -o mdouble-float --description 'Assume that the floating-point coprocessor supports double-precision operations' complete -c gcc -o mdsp --description 'Use (do not use) the MIPS DSP ASE' complete -c gcc -o mno-dsp --description 'Use (do not use) the MIPS DSP ASE' complete -c gcc -o mpaired-single --description 'Use (do not use) paired-single floating-point instructions' complete -c gcc -o mno-paired-single --description 'Use (do not use) paired-single floating-point instructions' complete -c gcc -o mips3d --description 'Use (do not use) the MIPS-3D ASE' complete -c gcc -o mno-mips3d --description 'Use (do not use) the MIPS-3D ASE' complete -c gcc -o mlong64 --description 'Force "long" types to be 64 bits wide' complete -c gcc -o mlong32 --description 'Force "long", "int", and pointer types to be 32 bits wide' complete -c gcc -o msym32 --description 'Assume (do not assume) that all symbols have 32-bit values, regardless of the selected ABI' complete -c gcc -o mno-sym32 --description 'Assume (do not assume) that all symbols have 32-bit values, regardless of the selected ABI' complete -c gcc -s G --description 'Put global and static items less than or equal to num bytes into the small data or bss section instead of the normal data or bss section' complete -c gcc -o membedded-data --description 'Allocate variables to the read-only data section first if possible, then next in the small data section if possible, otherwise in data' complete -c gcc -o mno-embedded-data --description 'Allocate variables to the read-only data section first if possible, then next in the small data section if possible, otherwise in data' complete -c gcc -o muninit-const-in-rodata --description 'Put uninitialized "const" variables in the read-only data section' complete -c gcc -o mno-uninit-const-in-rodata --description 'Put uninitialized "const" variables in the read-only data section' complete -c gcc -o msplit-addresses --description 'Enable (disable) use of the "%hi()" and "%lo()" assembler relocation operators' complete -c gcc -o mno-split-addresses --description 'Enable (disable) use of the "%hi()" and "%lo()" assembler relocation operators' complete -c gcc -o mexplicit-relocs --description 'Use (do not use) assembler relocation operators when dealing with symbolic addresses' complete -c gcc -o mno-explicit-relocs --description 'Use (do not use) assembler relocation operators when dealing with symbolic addresses' complete -c gcc -o mcheck-zero-division --description 'Trap (do not trap) on integer division by zero' complete -c gcc -o mno-check-zero-division --description 'Trap (do not trap) on integer division by zero' complete -c gcc -o mdivide-traps --description 'MIPS systems check for division by zero by generating either a conditional trap or a break instruction' complete -c gcc -o mdivide-breaks --description 'MIPS systems check for division by zero by generating either a conditional trap or a break instruction' complete -c gcc -o mmemcpy --description 'Force (do not force) the use of "memcpy()" for non-trivial block moves' complete -c gcc -o mno-memcpy --description 'Force (do not force) the use of "memcpy()" for non-trivial block moves' complete -c gcc -o mlong-calls --description 'Disable (do not disable) use of the "jal" instruction' complete -c gcc -o mno-long-calls --description 'Disable (do not disable) use of the "jal" instruction' complete -c gcc -o mmad --description 'Enable (disable) use of the "mad", "madu" and "mul" instructions, as provided by the R4650 ISA' complete -c gcc -o mno-mad --description 'Enable (disable) use of the "mad", "madu" and "mul" instructions, as provided by the R4650 ISA' complete -c gcc -o mfused-madd --description 'Enable (disable) use of the floating point multiply-accumulate instructions, when they are available' complete -c gcc -o mno-fused-madd --description 'Enable (disable) use of the floating point multiply-accumulate instructions, when they are available' complete -c gcc -o nocpp --description 'Tell the MIPS assembler to not run its preprocessor over user assembler files (with a ' complete -c gcc -o mfix-r4000 --description 'Work around certain R4000 CPU errata: - A double-word or a variable shift may give an incorrect result if executed immediately after starting an integer division' complete -c gcc -o mno-fix-r4000 --description 'Work around certain R4000 CPU errata: - A double-word or a variable shift may give an incorrect result if executed immediately after starting an integer division' complete -c gcc -o mfix-r4400 --description 'Work around certain R4400 CPU errata: - A double-word or a variable shift may give an incorrect result if executed immediately after starting an integer division' complete -c gcc -o mno-fix-r4400 --description 'Work around certain R4400 CPU errata: - A double-word or a variable shift may give an incorrect result if executed immediately after starting an integer division' complete -c gcc -o mfix-vr4120 --description 'Work around certain VR4120 errata: - "dmultu" does not always produce the correct result' complete -c gcc -o mno-fix-vr4120 --description 'Work around certain VR4120 errata: - "dmultu" does not always produce the correct result' complete -c gcc -o mfix-vr4130 --description 'Work around the VR4130 "mflo"/"mfhi" errata' complete -c gcc -o mfix-sb1 --description 'Work around certain SB-1 CPU core errata' complete -c gcc -o mno-fix-sb1 --description 'Work around certain SB-1 CPU core errata' complete -c gcc -o mflush-func --description 'Specifies the function to call to flush the I and D caches, or to not call any such function' complete -c gcc -o mno-flush-func --description 'Specifies the function to call to flush the I and D caches, or to not call any such function' complete -c gcc -o mbranch-likely --description 'Enable or disable use of Branch Likely instructions, regardless of the default for the selected architecture' complete -c gcc -o mno-branch-likely --description 'Enable or disable use of Branch Likely instructions, regardless of the default for the selected architecture' complete -c gcc -o mfp-exceptions --description 'Specifies whether FP exceptions are enabled' complete -c gcc -o mno-fp-exceptions --description 'Specifies whether FP exceptions are enabled' complete -c gcc -o mvr4130-align --description 'The VR4130 pipeline is two-way superscalar, but can only issue two instructions together if the first one is 8-byte aligned' complete -c gcc -o mno-vr4130-align --description 'The VR4130 pipeline is two-way superscalar, but can only issue two instructions together if the first one is 8-byte aligned' complete -c gcc -o mlibfuncs --description 'Specify that intrinsic library functions are being compiled, passing all values in registers, no matter the size' complete -c gcc -o mno-libfuncs --description 'Specify that intrinsic library functions are being compiled, passing all values in registers, no matter the size' complete -c gcc -o mepsilon --description 'Generate floating-point comparison instructions that compare with respect to the "rE" epsilon register' complete -c gcc -o mno-epsilon --description 'Generate floating-point comparison instructions that compare with respect to the "rE" epsilon register' complete -c gcc -o mabi --description '=gnu Generate code that passes function parameters and return values that (in the called function) are seen as registers $0 and up, as opposed to the GNU ABI which uses global registers $231 and up' complete -c gcc -o mabi --description '=gnu Generate code that passes function parameters and return values that (in the called function) are seen as registers $0 and up, as opposed to the GNU ABI which uses global registers $231 and up' complete -c gcc -o mzero-extend --description 'When reading data from memory in sizes shorter than 64 bits, use (do not use) zero-extending load instructions by default, rather than sign-extending ones' complete -c gcc -o mno-zero-extend --description 'When reading data from memory in sizes shorter than 64 bits, use (do not use) zero-extending load instructions by default, rather than sign-extending ones' complete -c gcc -o mknuthdiv --description 'Make the result of a division yielding a remainder have the same sign as the divisor' complete -c gcc -o mno-knuthdiv --description 'Make the result of a division yielding a remainder have the same sign as the divisor' complete -c gcc -o mtoplevel-symbols --description 'Prepend (do not prepend) a : to all global symbols, so the assembly code can be used with the "PREFIX" assembly directive' complete -c gcc -o mno-toplevel-symbols --description 'Prepend (do not prepend) a : to all global symbols, so the assembly code can be used with the "PREFIX" assembly directive' complete -c gcc -o melf --description 'Generate an executable in the ELF format, rather than the default mmo format used by the mmix simulator' complete -c gcc -o mbranch-predict --description 'Use (do not use) the probable-branch instructions, when static branch prediction indicates a probable branch' complete -c gcc -o mno-branch-predict --description 'Use (do not use) the probable-branch instructions, when static branch prediction indicates a probable branch' complete -c gcc -o mbase-addresses --description 'Generate (do not generate) code that uses base addresses' complete -c gcc -o mno-base-addresses --description 'Generate (do not generate) code that uses base addresses' complete -c gcc -o msingle-exit --description 'Force (do not force) generated code to have a single exit point in each function' complete -c gcc -o mno-single-exit --description 'Force (do not force) generated code to have a single exit point in each function' complete -c gcc -o mmult-bug --description 'Generate code to avoid bugs in the multiply instructions for the MN10300 processors' complete -c gcc -o mno-mult-bug --description 'Do not generate code to avoid bugs in the multiply instructions for the MN10300 processors' complete -c gcc -o mam33 --description 'Generate code which uses features specific to the AM33 processor' complete -c gcc -o mno-am33 --description 'Do not generate code which uses features specific to the AM33 processor' complete -c gcc -o mreturn-pointer-on-d0 --description 'When generating a function which returns a pointer, return the pointer in both "a0" and "d0"' complete -c gcc -o mno-crt0 --description 'Do not link in the C run-time initialization object file' complete -c gcc -o mrelax --description 'Indicate to the linker that it should perform a relaxation optimization pass to shorten branches, calls and absolute memory addresses' complete -c gcc -o march --description 'Generate code that will run on cpu-type, which is the name of a system representing a certain processor type' complete -c gcc -o type --description 'Generate code that will run on cpu-type, which is the name of a system representing a certain processor type' complete -c gcc -o mbacc --description 'Use byte loads and stores when generating code' complete -c gcc -o mno-bacc --description 'Do not use byte loads and stores when generating code' complete -c gcc -o msim --description 'Do not link in the C run-time initialization object file crti' complete -c gcc -o mno-crt0 --description 'Do not link in the C run-time initialization object file crti' complete -c gcc -o mfpu --description 'Use hardware FPP floating point' complete -c gcc -o msoft-float --description 'Do not use hardware floating point' complete -c gcc -o mac0 --description 'Return floating-point results in ac0 (fr0 in Unix assembler syntax)' complete -c gcc -o mno-ac0 --description 'Return floating-point results in memory' complete -c gcc -o m40 --description 'Generate code for a PDP-11/40' complete -c gcc -o m45 --description 'Generate code for a PDP-11/45' complete -c gcc -o m10 --description 'Generate code for a PDP-11/10' complete -c gcc -o mbcopy-builtin --description 'Use inline "movmemhi" patterns for copying memory' complete -c gcc -o mbcopy --description 'Do not use inline "movmemhi" patterns for copying memory' complete -c gcc -o mint16 --description 'Use 16-bit "int"' complete -c gcc -o mno-int32 --description 'Use 16-bit "int"' complete -c gcc -o mint32 --description 'Use 32-bit "int"' complete -c gcc -o mno-int16 --description 'Use 32-bit "int"' complete -c gcc -o mfloat64 --description 'Use 64-bit "float"' complete -c gcc -o mno-float32 --description 'Use 64-bit "float"' complete -c gcc -o mfloat32 --description 'Use 32-bit "float"' complete -c gcc -o mno-float64 --description 'Use 32-bit "float"' complete -c gcc -o mabshi --description 'Use "abshi2" pattern' complete -c gcc -o mno-abshi --description 'Do not use "abshi2" pattern' complete -c gcc -o mbranch-expensive --description 'Pretend that branches are expensive' complete -c gcc -o mbranch-cheap --description 'Do not pretend that branches are expensive' complete -c gcc -o msplit --description 'Generate code for a system with split I&D' complete -c gcc -o mno-split --description 'Generate code for a system without split I&D' complete -c gcc -o munix-asm --description 'Use Unix assembler syntax' complete -c gcc -o mdec-asm --description 'Use DEC assembler syntax' complete -c gcc -o mpower --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-power --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mpower2 --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-power2 --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mpowerpc --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-powerpc --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mpowerpc-gpopt --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-powerpc-gpopt --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mpowerpc-gfxopt --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-powerpc-gfxopt --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mpowerpc64 --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-powerpc64 --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mmfcrf --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-mfcrf --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mpopcntb --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-popcntb --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mfprnd --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-fprnd --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mmfpgpr --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mno-mfpgpr --description 'GCC supports two related instruction set architectures for the RS/6000 and PowerPC' complete -c gcc -o mnew-mnemonics --description 'Select which mnemonics to use in the generated assembler code' complete -c gcc -o mold-mnemonics --description 'Select which mnemonics to use in the generated assembler code' complete -c gcc -o mcpu --description '=cpu_type Set architecture type, register usage, choice of mnemonics, and instruction scheduling parameters for machine type cpu_type' complete -c gcc -o mtune --description '=cpu_type Set the instruction scheduling parameters for machine type cpu_type, but do not set the architecture type, register usage, or choice of mnemonics, as -mcpu=cpu_type would' complete -c gcc -o mswdiv --description 'Generate code to compute division as reciprocal estimate and iterative refinement, creating opportunities for increased throughput' complete -c gcc -o mno-swdiv --description 'Generate code to compute division as reciprocal estimate and iterative refinement, creating opportunities for increased throughput' complete -c gcc -o maltivec --description 'Generate code that uses (does not use) AltiVec instructions, and also enable the use of built-in functions that allow more direct access to the AltiVec instruction set' complete -c gcc -o mno-altivec --description 'Generate code that uses (does not use) AltiVec instructions, and also enable the use of built-in functions that allow more direct access to the AltiVec instruction set' complete -c gcc -o mvrsave --description 'Generate VRSAVE instructions when generating AltiVec code' complete -c gcc -o mno-vrsave --description 'Generate VRSAVE instructions when generating AltiVec code' complete -c gcc -o msecure-plt --description 'Generate code that allows ld and ld' complete -c gcc -o mbss-plt --description 'Generate code that uses a BSS ' complete -c gcc -o misel --description 'This switch enables or disables the generation of ISEL instructions' complete -c gcc -o mno-isel --description 'This switch enables or disables the generation of ISEL instructions' complete -c gcc -o misel --description '=yes/no This switch has been deprecated' complete -c gcc -o mspe --description 'This switch enables or disables the generation of SPE simd instructions' complete -c gcc -o mno-isel --description 'This switch enables or disables the generation of SPE simd instructions' complete -c gcc -o mspe --description '=yes/no This option has been deprecated' complete -c gcc -o mfloat-gprs --description 'This switch enables or disables the generation of floating point operations on the general purpose registers for architectures that support it' complete -c gcc -o mfloat-gprs --description 'This switch enables or disables the generation of floating point operations on the general purpose registers for architectures that support it' complete -c gcc -o m32 --description 'Generate code for 32-bit or 64-bit environments of Darwin and SVR4 targets (including GNU/Linux)' complete -c gcc -o m64 --description 'Generate code for 32-bit or 64-bit environments of Darwin and SVR4 targets (including GNU/Linux)' complete -c gcc -o mfull-toc --description 'Modify generation of the TOC (Table Of Contents), which is created for every executable file' complete -c gcc -o mno-fp-in-toc --description 'Modify generation of the TOC (Table Of Contents), which is created for every executable file' complete -c gcc -o mno-sum-in-toc --description 'Modify generation of the TOC (Table Of Contents), which is created for every executable file' complete -c gcc -o mminimal-toc --description 'Modify generation of the TOC (Table Of Contents), which is created for every executable file' complete -c gcc -o maix64 --description 'Enable 64-bit AIX ABI and calling convention: 64-bit pointers, 64-bit "long" type, and the infrastructure needed to support them' complete -c gcc -o maix32 --description 'Enable 64-bit AIX ABI and calling convention: 64-bit pointers, 64-bit "long" type, and the infrastructure needed to support them' complete -c gcc -o mxl-compat --description 'Produce code that conforms more closely to IBM XL compiler semantics when using AIX-compatible ABI' complete -c gcc -o mno-xl-compat --description 'Produce code that conforms more closely to IBM XL compiler semantics when using AIX-compatible ABI' complete -c gcc -o mpe --description 'Support IBM RS/6000 SP Parallel Environment (PE)' complete -c gcc -o malign-natural --description 'On AIX, 32-bit Darwin, and 64-bit PowerPC GNU/Linux, the option -malign-natural overrides the ABI-defined alignment of larger types, such as floating-point doubles, on their natural size-based boundary' complete -c gcc -o malign-power --description 'On AIX, 32-bit Darwin, and 64-bit PowerPC GNU/Linux, the option -malign-natural overrides the ABI-defined alignment of larger types, such as floating-point doubles, on their natural size-based boundary' complete -c gcc -o msoft-float --description 'Generate code that does not use (uses) the floating-point register set' complete -c gcc -o mhard-float --description 'Generate code that does not use (uses) the floating-point register set' complete -c gcc -o mmultiple --description 'Generate code that uses (does not use) the load multiple word instructions and the store multiple word instructions' complete -c gcc -o mno-multiple --description 'Generate code that uses (does not use) the load multiple word instructions and the store multiple word instructions' complete -c gcc -o mstring --description 'Generate code that uses (does not use) the load string instructions and the store string word instructions to save multiple registers and do small block moves' complete -c gcc -o mno-string --description 'Generate code that uses (does not use) the load string instructions and the store string word instructions to save multiple registers and do small block moves' complete -c gcc -o mupdate --description 'Generate code that uses (does not use) the load or store instructions that update the base register to the address of the calculated memory location' complete -c gcc -o mno-update --description 'Generate code that uses (does not use) the load or store instructions that update the base register to the address of the calculated memory location' complete -c gcc -o mfused-madd --description 'Generate code that uses (does not use) the floating point multiply and accumulate instructions' complete -c gcc -o mno-fused-madd --description 'Generate code that uses (does not use) the floating point multiply and accumulate instructions' complete -c gcc -o mno-bit-align --description 'On System V' complete -c gcc -o mbit-align --description 'On System V' complete -c gcc -o mno-strict-align --description 'On System V' complete -c gcc -o mstrict-align --description 'On System V' complete -c gcc -o mrelocatable --description 'On embedded PowerPC systems generate code that allows (does not allow) the program to be relocated to a different address at runtime' complete -c gcc -o mno-relocatable --description 'On embedded PowerPC systems generate code that allows (does not allow) the program to be relocated to a different address at runtime' complete -c gcc -o mrelocatable-lib --description 'On embedded PowerPC systems generate code that allows (does not allow) the program to be relocated to a different address at runtime' complete -c gcc -o mno-relocatable-lib --description 'On embedded PowerPC systems generate code that allows (does not allow) the program to be relocated to a different address at runtime' complete -c gcc -o mno-toc --description 'On System V' complete -c gcc -o mtoc --description 'On System V' complete -c gcc -o mlittle --description 'On System V' complete -c gcc -o mlittle-endian --description 'On System V' complete -c gcc -o mbig --description 'On System V' complete -c gcc -o mbig-endian --description 'On System V' complete -c gcc -o mdynamic-no-pic --description 'On Darwin and Mac OS X systems, compile code so that it is not relocatable, but that its external references are relocatable' complete -c gcc -o mprioritize-restricted-insns --description '=priority This option controls the priority that is assigned to dispatch-slot restricted instructions during the second scheduling pass' complete -c gcc -o msched-costly-dep --description '=dependence_type This option controls which dependences are considered costly by the target during instruction scheduling' complete -c gcc -o minsert-sched-nops --description '=scheme This option controls which nop insertion scheme will be used during the second scheduling pass' complete -c gcc -o mcall-sysv --description 'On System V' complete -c gcc -o mcall-sysv-eabi --description 'Specify both -mcall-sysv and -meabi options' complete -c gcc -o mcall-sysv-noeabi --description 'Specify both -mcall-sysv and -mno-eabi options' complete -c gcc -o mcall-solaris --description 'On System V' complete -c gcc -o mcall-linux --description 'On System V' complete -c gcc -o mcall-gnu --description 'On System V' complete -c gcc -o mcall-netbsd --description 'On System V' complete -c gcc -o maix-struct-return --description 'Return all structures in memory (as specified by the AIX ABI)' complete -c gcc -o msvr4-struct-return --description 'Return structures smaller than 8 bytes in registers (as specified by the SVR4 ABI)' complete -c gcc -o mabi --description 'Extend the current ABI with a particular extension, or remove such extension' complete -c gcc -o type --description 'Extend the current ABI with a particular extension, or remove such extension' complete -c gcc -o mabi --description '=spe Extend the current ABI with SPE ABI extensions' complete -c gcc -o mabi --description 'Disable Booke SPE ABI extensions for the current ABI' complete -c gcc -o spe --description 'Disable Booke SPE ABI extensions for the current ABI' complete -c gcc -o mabi --description '=ibmlongdouble Change the current ABI to use IBM extended precision long double' complete -c gcc -o mabi --description '=ieeelongdouble Change the current ABI to use IEEE extended precision long double' complete -c gcc -o mprototype --description 'On System V' complete -c gcc -o mno-prototype --description 'On System V' complete -c gcc -o msim --description 'On embedded PowerPC systems, assume that the startup module is called sim-crt0' complete -c gcc -o mmvme --description 'On embedded PowerPC systems, assume that the startup module is called crt0' complete -c gcc -o mads --description 'On embedded PowerPC systems, assume that the startup module is called crt0' complete -c gcc -o myellowknife --description 'On embedded PowerPC systems, assume that the startup module is called crt0' complete -c gcc -o mvxworks --description 'On System V' complete -c gcc -o mwindiss --description 'Specify that you are compiling for the WindISS simulation environment' complete -c gcc -o memb --description 'On embedded PowerPC systems, set the PPC_EMB bit in the ELF flags header to indicate that eabi extended relocations are used' complete -c gcc -o meabi --description 'On System V' complete -c gcc -o mno-eabi --description 'On System V' complete -c gcc -o msdata --description '=eabi On System V' complete -c gcc -o msdata --description '=sysv On System V' complete -c gcc -o msdata --description 'On System V' complete -c gcc -o msdata --description 'On System V' complete -c gcc -o msdata-data --description 'On System V' complete -c gcc -o msdata --description 'On embedded PowerPC systems, put all initialized global and static data in the ' complete -c gcc -o mno-sdata --description 'On embedded PowerPC systems, put all initialized global and static data in the ' complete -c gcc -s G --description 'On embedded PowerPC systems, put global and static items less than or equal to num bytes into the small data or bss sections instead of the normal data or bss section' complete -c gcc -o mregnames --description 'On System V' complete -c gcc -o mno-regnames --description 'On System V' complete -c gcc -o mlongcall --description 'Default to making all function calls indirectly, using a register, so that functions which reside further than 32 megabytes (33,554,432 bytes) from the current location can be called' complete -c gcc -o mno-longcall --description 'Default to making all function calls indirectly, using a register, so that functions which reside further than 32 megabytes (33,554,432 bytes) from the current location can be called' complete -c gcc -o pthread --description 'Adds support for multithreading with the pthreads library' complete -c gcc -o mhard-float --description 'Use (do not use) the hardware floating-point instructions and registers for floating-point operations' complete -c gcc -o msoft-float --description 'Use (do not use) the hardware floating-point instructions and registers for floating-point operations' complete -c gcc -o mlong-double-64 --description 'These switches control the size of "long double" type' complete -c gcc -o mlong-double-128 --description 'These switches control the size of "long double" type' complete -c gcc -o mbackchain --description 'Store (do not store) the address of the caller’s frame as backchain pointer into the callee’s stack frame' complete -c gcc -o mno-backchain --description 'Store (do not store) the address of the caller’s frame as backchain pointer into the callee’s stack frame' complete -c gcc -o mpacked-stack --description 'Use (do not use) the packed stack layout' complete -c gcc -o mno-packed-stack --description 'Use (do not use) the packed stack layout' complete -c gcc -o msmall-exec --description 'Generate (or do not generate) code using the "bras" instruction to do subroutine calls' complete -c gcc -o mno-small-exec --description 'Generate (or do not generate) code using the "bras" instruction to do subroutine calls' complete -c gcc -o m64 --description 'When -m31 is specified, generate code compliant to the GNU/Linux for S/390 ABI' complete -c gcc -o m31 --description 'When -m31 is specified, generate code compliant to the GNU/Linux for S/390 ABI' complete -c gcc -o mzarch --description 'When -mzarch is specified, generate code using the instructions available on z/Architecture' complete -c gcc -o mesa --description 'When -mzarch is specified, generate code using the instructions available on z/Architecture' complete -c gcc -o mmvcle --description 'Generate (or do not generate) code using the "mvcle" instruction to perform block moves' complete -c gcc -o mno-mvcle --description 'Generate (or do not generate) code using the "mvcle" instruction to perform block moves' complete -c gcc -o mdebug --description 'Print (or do not print) additional debug information when compiling' complete -c gcc -o mno-debug --description 'Print (or do not print) additional debug information when compiling' complete -c gcc -o march --description 'Generate code that will run on cpu-type, which is the name of a system representing a certain processor type' complete -c gcc -o type --description 'Generate code that will run on cpu-type, which is the name of a system representing a certain processor type' complete -c gcc -o mtune --description 'Tune to cpu-type everything applicable about the generated code, except for the ABI and the set of available instructions' complete -c gcc -o type --description 'Tune to cpu-type everything applicable about the generated code, except for the ABI and the set of available instructions' complete -c gcc -o mtpf-trace --description 'Generate code that adds (does not add) in TPF OS specific branches to trace routines in the operating system' complete -c gcc -o mno-tpf-trace --description 'Generate code that adds (does not add) in TPF OS specific branches to trace routines in the operating system' complete -c gcc -o mfused-madd --description 'Generate code that uses (does not use) the floating point multiply and accumulate instructions' complete -c gcc -o mno-fused-madd --description 'Generate code that uses (does not use) the floating point multiply and accumulate instructions' complete -c gcc -o mwarn-framesize --description '=framesize Emit a warning if the current function exceeds the given frame size' complete -c gcc -o mwarn-dynamicstack --description 'Emit a warning if the function calls alloca or uses dynamically sized arrays' complete -c gcc -o mstack-guard --description 'These arguments always have to be used in conjunction' complete -c gcc -o mstack-size --description 'These arguments always have to be used in conjunction' complete -c gcc -o size --description 'These arguments always have to be used in conjunction' complete -c gcc -o m1 --description 'Generate code for the SH1' complete -c gcc -o m2 --description 'Generate code for the SH2' complete -c gcc -o m2e --description 'Generate code for the SH2e' complete -c gcc -o m3 --description 'Generate code for the SH3' complete -c gcc -o m3e --description 'Generate code for the SH3e' complete -c gcc -o m4-nofpu --description 'Generate code for the SH4 without a floating-point unit' complete -c gcc -o m4-single-only --description 'Generate code for the SH4 with a floating-point unit that only supports single-precision arithmetic' complete -c gcc -o m4-single --description 'Generate code for the SH4 assuming the floating-point unit is in single-precision mode by default' complete -c gcc -o m4 --description 'Generate code for the SH4' complete -c gcc -o m4a-nofpu --description 'Generate code for the SH4al-dsp, or for a SH4a in such a way that the floating-point unit is not used' complete -c gcc -o m4a-single-only --description 'Generate code for the SH4a, in such a way that no double-precision floating point operations are used' complete -c gcc -o m4a-single --description 'Generate code for the SH4a assuming the floating-point unit is in single-precision mode by default' complete -c gcc -o m4a --description 'Generate code for the SH4a' complete -c gcc -o m4al --description 'Same as -m4a-nofpu, except that it implicitly passes -dsp to the assembler' complete -c gcc -o mb --description 'Compile code for the processor in big endian mode' complete -c gcc -o ml --description 'Compile code for the processor in little endian mode' complete -c gcc -o mdalign --description 'Align doubles at 64-bit boundaries' complete -c gcc -o mrelax --description 'Shorten some address references at link time, when possible; uses the linker option -relax' complete -c gcc -o mbigtable --description 'Use 32-bit offsets in "switch" tables' complete -c gcc -o mfmovd --description 'Enable the use of the instruction "fmovd"' complete -c gcc -o mhitachi --description 'Comply with the calling conventions defined by Renesas' complete -c gcc -o mrenesas --description 'Comply with the calling conventions defined by Renesas' complete -c gcc -o mno-renesas --description 'Comply with the calling conventions defined for GCC before the Renesas conventions were available' complete -c gcc -o mnomacsave --description 'Mark the "MAC" register as call-clobbered, even if -mhitachi is given' complete -c gcc -o mieee --description 'Increase IEEE-compliance of floating-point code' complete -c gcc -o misize --description 'Dump instruction size and location in the assembly code' complete -c gcc -o mpadstruct --description 'This option is deprecated' complete -c gcc -o mspace --description 'Optimize for space instead of speed' complete -c gcc -o mprefergot --description 'When generating position-independent code, emit function calls using the Global Offset Table instead of the Procedure Linkage Table' complete -c gcc -o musermode --description 'Generate a library function call to invalidate instruction cache entries, after fixing up a trampoline' complete -c gcc -o multcost --description '=number Set the cost to assume for a multiply insn' complete -c gcc -o mdiv --description '=strategy Set the division strategy to use for SHmedia code' complete -c gcc -o mdivsi3_libfunc --description '=name Set the name of the library function used for 32 bit signed division to name' complete -c gcc -o madjust-unroll --description 'Throttle unrolling to avoid thrashing target registers' complete -c gcc -o mindexed-addressing --description 'Enable the use of the indexed addressing mode for SHmedia32/SHcompact' complete -c gcc -o mgettrcost --description '=number Set the cost assumed for the gettr instruction to number' complete -c gcc -o mpt-fixed --description 'Assume pt* instructions won’t trap' complete -c gcc -o minvalid-symbols --description 'Assume symbols might be invalid' complete -c gcc -o mno-app-regs --description 'Specify -mapp-regs to generate output using the global registers 2 through 4, which the SPARC SVR4 ABI reserves for applications' complete -c gcc -o mapp-regs --description 'Specify -mapp-regs to generate output using the global registers 2 through 4, which the SPARC SVR4 ABI reserves for applications' complete -c gcc -o mfpu --description 'Generate output containing floating point instructions' complete -c gcc -o mhard-float --description 'Generate output containing floating point instructions' complete -c gcc -o mno-fpu --description 'Generate output containing library calls for floating point' complete -c gcc -o msoft-float --description 'Generate output containing library calls for floating point' complete -c gcc -o mhard-quad-float --description 'Generate output containing quad-word (long double) floating point instructions' complete -c gcc -o msoft-quad-float --description 'Generate output containing library calls for quad-word (long double) floating point instructions' complete -c gcc -o mno-unaligned-doubles --description 'Assume that doubles have 8 byte alignment' complete -c gcc -o munaligned-doubles --description 'Assume that doubles have 8 byte alignment' complete -c gcc -o mno-faster-structs --description 'With -mfaster-structs, the compiler assumes that structures should have 8 byte alignment' complete -c gcc -o mfaster-structs --description 'With -mfaster-structs, the compiler assumes that structures should have 8 byte alignment' complete -c gcc -o mimpure-text --description '-mimpure-text, used in addition to -shared, tells the compiler to not pass -z text to the linker when linking a shared object' complete -c gcc -o mcpu --description '=cpu_type Set the instruction set, register set, and instruction scheduling parameters for machine type cpu_type' complete -c gcc -o mtune --description '=cpu_type Set the instruction scheduling parameters for machine type cpu_type, but do not set the instruction set or register set that the option -mcpu=cpu_type would' complete -c gcc -o mv8plus --description 'With -mv8plus, GCC generates code for the SPARC-V8+ ABI' complete -c gcc -o mno-v8plus --description 'With -mv8plus, GCC generates code for the SPARC-V8+ ABI' complete -c gcc -o mvis --description 'With -mvis, GCC generates code that takes advantage of the UltraSPARC Visual Instruction Set extensions' complete -c gcc -o mno-vis --description 'With -mvis, GCC generates code that takes advantage of the UltraSPARC Visual Instruction Set extensions' complete -c gcc -o mlittle-endian --description 'Generate code for a processor running in little-endian mode' complete -c gcc -o m32 --description 'Generate code for a 32-bit or 64-bit environment' complete -c gcc -o m64 --description 'Generate code for a 32-bit or 64-bit environment' complete -c gcc -o mcmodel --description '=medlow Generate code for the Medium/Low code model: 64-bit addresses, programs must be linked in the low 32 bits of memory' complete -c gcc -o mcmodel --description '=medmid Generate code for the Medium/Middle code model: 64-bit addresses, programs must be linked in the low 44 bits of memory, the text and data segments must be less than 2GB in size and the data segment must be located within 2GB of the text segment' complete -c gcc -o mcmodel --description '=medany Generate code for the Medium/Anywhere code model: 64-bit addresses, programs may be linked anywhere in memory, the text and data segments must be less than 2GB in size and the data segment must be located within 2GB of the text segment' complete -c gcc -o mcmodel --description '=embmedany Generate code for the Medium/Anywhere code model for embedded systems: 64-bit addresses, the text and data segments must be less than 2GB in size, both starting anywhere in memory (determined at link time)' complete -c gcc -o mstack-bias --description 'With -mstack-bias, GCC assumes that the stack pointer, and frame pointer if present, are offset by -2047 which must be added back when making stack frame references' complete -c gcc -o mno-stack-bias --description 'With -mstack-bias, GCC assumes that the stack pointer, and frame pointer if present, are offset by -2047 which must be added back when making stack frame references' complete -c gcc -o threads --description 'Add support for multithreading using the Solaris threads library' complete -c gcc -o pthreads --description 'Add support for multithreading using the POSIX threads library' complete -c gcc -o pthread --description 'This is a synonym for -pthreads' complete -c gcc -s G --description 'Create a shared object' complete -c gcc -o Qy --description 'Identify the versions of each tool used by the compiler, in a "' complete -c gcc -o Qn --description 'Refrain from adding "' complete -c gcc -o mcpu --description '=cpu_type Set the instruction set, register set, and instruction scheduling parameters for machine type cpu_type' complete -c gcc -o mbig-memory --description 'Generates code for the big or small memory model' complete -c gcc -o mbig --description 'Generates code for the big or small memory model' complete -c gcc -o msmall-memory --description 'Generates code for the big or small memory model' complete -c gcc -o msmall --description 'Generates code for the big or small memory model' complete -c gcc -o mbk --description 'Allow (disallow) allocation of general integer operands into the block count register BK' complete -c gcc -o mno-bk --description 'Allow (disallow) allocation of general integer operands into the block count register BK' complete -c gcc -o mdb --description 'Enable (disable) generation of code using decrement and branch, DBcond(D), instructions' complete -c gcc -o mno-db --description 'Enable (disable) generation of code using decrement and branch, DBcond(D), instructions' complete -c gcc -o mdp-isr-reload --description 'Force the DP register to be saved on entry to an interrupt service routine (ISR), reloaded to point to the data section, and restored on exit from the ISR' complete -c gcc -o mparanoid --description 'Force the DP register to be saved on entry to an interrupt service routine (ISR), reloaded to point to the data section, and restored on exit from the ISR' complete -c gcc -o mmpyi --description 'For the C3x use the 24-bit MPYI instruction for integer multiplies instead of a library call to guarantee 32-bit results' complete -c gcc -o mno-mpyi --description 'For the C3x use the 24-bit MPYI instruction for integer multiplies instead of a library call to guarantee 32-bit results' complete -c gcc -o mfast-fix --description 'The C3x/C4x FIX instruction to convert a floating point value to an integer value chooses the nearest integer less than or equal to the floating point value rather than to the nearest integer' complete -c gcc -o mno-fast-fix --description 'The C3x/C4x FIX instruction to convert a floating point value to an integer value chooses the nearest integer less than or equal to the floating point value rather than to the nearest integer' complete -c gcc -o mrptb --description 'Enable (disable) generation of repeat block sequences using the RPTB instruction for zero overhead looping' complete -c gcc -o mno-rptb --description 'Enable (disable) generation of repeat block sequences using the RPTB instruction for zero overhead looping' complete -c gcc -o mrpts --description 'Enable (disable) the use of the single instruction repeat instruction RPTS' complete -c gcc -o mno-rpts --description 'Enable (disable) the use of the single instruction repeat instruction RPTS' complete -c gcc -o mloop-unsigned --description 'The maximum iteration count when using RPTS and RPTB (and DB on the C40) is 2^{31 + 1} since these instructions test if the iteration count is negative to terminate the loop' complete -c gcc -o mno-loop-unsigned --description 'The maximum iteration count when using RPTS and RPTB (and DB on the C40) is 2^{31 + 1} since these instructions test if the iteration count is negative to terminate the loop' complete -c gcc -o mti --description 'Try to emit an assembler syntax that the TI assembler (asm30) is happy with' complete -c gcc -o mregparm --description 'Generate code that uses registers (stack) for passing arguments to functions' complete -c gcc -o mmemparm --description 'Generate code that uses registers (stack) for passing arguments to functions' complete -c gcc -o mparallel-insns --description 'Allow the generation of parallel instructions' complete -c gcc -o mno-parallel-insns --description 'Allow the generation of parallel instructions' complete -c gcc -o mparallel-mpy --description 'Allow the generation of MPY││ADD and MPY││SUB parallel instructions, provided -mparallel-insns is also specified' complete -c gcc -o mno-parallel-mpy --description 'Allow the generation of MPY││ADD and MPY││SUB parallel instructions, provided -mparallel-insns is also specified' complete -c gcc -o mlong-calls --description 'Treat all calls as being far away (near)' complete -c gcc -o mno-long-calls --description 'Treat all calls as being far away (near)' complete -c gcc -o mno-ep --description 'Do not optimize (do optimize) basic blocks that use the same index pointer 4 or more times to copy pointer into the "ep" register, and use the shorter "sld" and "sst" instructions' complete -c gcc -o mep --description 'Do not optimize (do optimize) basic blocks that use the same index pointer 4 or more times to copy pointer into the "ep" register, and use the shorter "sld" and "sst" instructions' complete -c gcc -o mno-prolog-function --description 'Do not use (do use) external functions to save and restore registers at the prologue and epilogue of a function' complete -c gcc -o mprolog-function --description 'Do not use (do use) external functions to save and restore registers at the prologue and epilogue of a function' complete -c gcc -o mspace --description 'Try to make the code as small as possible' complete -c gcc -o mtda --description '=n Put static or global variables whose size is n bytes or less into the tiny data area that register "ep" points to' complete -c gcc -o msda --description '=n Put static or global variables whose size is n bytes or less into the small data area that register "gp" points to' complete -c gcc -o mzda --description '=n Put static or global variables whose size is n bytes or less into the first 32 kilobytes of memory' complete -c gcc -o mv850 --description 'Specify that the target processor is the V850' complete -c gcc -o mbig-switch --description 'Generate code suitable for big switch tables' complete -c gcc -o mapp-regs --description 'This option will cause r2 and r5 to be used in the code generated by the compiler' complete -c gcc -o mno-app-regs --description 'This option will cause r2 and r5 to be treated as fixed registers' complete -c gcc -o mv850e1 --description 'Specify that the target processor is the V850E1' complete -c gcc -o mv850e --description 'Specify that the target processor is the V850E' complete -c gcc -o mdisable-callt --description 'This option will suppress generation of the CALLT instruction for the v850e and v850e1 flavors of the v850 architecture' complete -c gcc -o munix --description 'Do not output certain jump instructions ("aobleq" and so on) that the Unix assembler for the VAX cannot handle across long ranges' complete -c gcc -o mgnu --description 'Do output those jump instructions, on the assumption that you will assemble with the GNU assembler' complete -c gcc -o mg --description 'Output code for g-format floating point numbers instead of d-format' complete -c gcc -o msim --description 'Choose startup files and linker script suitable for the simulator' complete -c gcc -o mconst16 --description 'Enable or disable use of "CONST16" instructions for loading constant values' complete -c gcc -o mno-const16 --description 'Enable or disable use of "CONST16" instructions for loading constant values' complete -c gcc -o mfused-madd --description 'Enable or disable use of fused multiply/add and multiply/subtract instructions in the floating-point option' complete -c gcc -o mno-fused-madd --description 'Enable or disable use of fused multiply/add and multiply/subtract instructions in the floating-point option' complete -c gcc -o mtext-section-literals --description 'Control the treatment of literal pools' complete -c gcc -o mno-text-section-literals --description 'Control the treatment of literal pools' complete -c gcc -o mtarget-align --description 'When this option is enabled, GCC instructs the assembler to automatically align instructions to reduce branch penalties at the expense of some code density' complete -c gcc -o mno-target-align --description 'When this option is enabled, GCC instructs the assembler to automatically align instructions to reduce branch penalties at the expense of some code density' complete -c gcc -o mlongcalls --description 'When this option is enabled, GCC instructs the assembler to translate direct calls to indirect calls unless it can determine that the target of a direct call is in the range allowed by the call instruction' complete -c gcc -o mno-longcalls --description 'When this option is enabled, GCC instructs the assembler to translate direct calls to indirect calls unless it can determine that the target of a direct call is in the range allowed by the call instruction' complete -c gcc -o fbounds-check --description 'For front-ends that support it, generate additional code to check that indices used to access arrays are within the declared range' complete -c gcc -o ftrapv --description 'This option generates traps for signed overflow on addition, subtraction, multiplication operations' complete -c gcc -o fwrapv --description 'This option instructs the compiler to assume that signed arithmetic overflow of addition, subtraction and multiplication wraps around using twos-complement representation' complete -c gcc -o fexceptions --description 'Enable exception handling' complete -c gcc -o fnon-call-exceptions --description 'Generate code that allows trapping instructions to throw exceptions' complete -c gcc -o funwind-tables --description 'Similar to -fexceptions, except that it will just generate any needed static data, but will not affect the generated code in any other way' complete -c gcc -o fasynchronous-unwind-tables --description 'Generate unwind table in dwarf2 format, if supported by target machine' complete -c gcc -o fpcc-struct-return --description 'Return "short" "struct" and "union" values in memory like longer ones, rather than in registers' complete -c gcc -o freg-struct-return --description 'Return "struct" and "union" values in registers when possible' complete -c gcc -o fshort-enums --description 'Allocate to an "enum" type only as many bytes as it needs for the declared range of possible values' complete -c gcc -o fshort-double --description 'Use the same size for "double" as for "float"' complete -c gcc -o fshort-wchar --description 'Override the underlying type for wchar_t to be short unsigned int instead of the default for the target' complete -c gcc -o fshared-data --description 'Requests that the data and non-"const" variables of this compilation be shared data rather than private data' complete -c gcc -o fno-common --description 'In C, allocate even uninitialized global variables in the data section of the object file, rather than generating them as common blocks' complete -c gcc -o fno-ident --description 'Ignore the #ident directive' complete -c gcc -o finhibit-size-directive --description 'Don’t output a "' complete -c gcc -o fverbose-asm --description 'Put extra commentary information in the generated assembly code to make it more readable' complete -c gcc -o fpic --description 'Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine' complete -c gcc -o fPIC --description 'If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table' complete -c gcc -o fpie --description 'These options are similar to -fpic and -fPIC, but generated position independent code can be only linked into executables' complete -c gcc -o fPIE --description 'These options are similar to -fpic and -fPIC, but generated position independent code can be only linked into executables' complete -c gcc -o fno-jump-tables --description 'Do not use jump tables for switch statements even where it would be more efficient than other code generation strategies' complete -c gcc -o ffixed-reg --description 'Treat the register named reg as a fixed register; generated code should never refer to it (except perhaps as a stack pointer, frame pointer or in some other fixed role)' complete -c gcc -o fcall-used-reg --description 'Treat the register named reg as an allocable register that is clobbered by function calls' complete -c gcc -o fcall-saved-reg --description 'Treat the register named reg as an allocable register saved by functions' complete -c gcc -o fpack-struct --description 'Without a value specified, pack all structure members together without holes' -x complete -c gcc -o finstrument-functions --description 'Generate instrumentation calls for entry and exit to functions' complete -c gcc -o fstack-check --description 'Generate code to verify that you do not go beyond the boundary of the stack' complete -c gcc -o fstack-limit-register --description 'Generate code to ensure that the stack does not grow beyond a certain value, either the value of a register or the address of a symbol' complete -c gcc -o fstack-limit-symbol --description 'Generate code to ensure that the stack does not grow beyond a certain value, either the value of a register or the address of a symbol' complete -c gcc -o fno-stack-limit --description 'Generate code to ensure that the stack does not grow beyond a certain value, either the value of a register or the address of a symbol' complete -c gcc -o fargument-alias --description 'Specify the possible relationships among parameters and between parameters and global data' complete -c gcc -o fargument-noalias --description 'Specify the possible relationships among parameters and between parameters and global data' complete -c gcc -o fargument-noalias-global --description 'Specify the possible relationships among parameters and between parameters and global data' complete -c gcc -o fleading-underscore --description 'This option and its counterpart, -fno-leading-underscore, forcibly change the way C symbols are represented in the object file' complete -c gcc -o ftls-model --description '=model Alter the thread-local storage model to be used' complete -c gcc -o fvisibility --description '=default│internal│hidden│protected Set the default ELF image symbol visibility to the specified option---all symbols will be marked with this unless overridden within the code' complete -c gcc -o fopenmp --description 'Enable handling of OpenMP directives "#pragma omp" in C/C++ and "!$omp" in Fortran' fish/share/completions/gdb.fish000066400000000000000000000037171214535744100170720ustar00rootroot00000000000000# # Command specific completions for the gdb command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c gdb -o help -s h --description 'List all options, with brief explanations' complete -c gdb -o symbols -s s --description 'Read symbol table from file file' -r complete -c gdb -o write --description 'Enable writing into executable and core files' complete -c gdb -o exec -s e --description 'Use file file as the executable file to execute when appropri ate, and for examining pure data in conjunction with a core dump' -r complete -c gdb -o se --description 'Read symbol table from file file and use it as the executable file' -r complete -c gdb -o core -s c --description 'Use file file as a core dump to examine' -r complete -c gdb -o command -s x --description 'Execute GDB commands from file file' -r complete -c gdb -o directory -s d --description 'Add directory to the path to search for source files' -x -a '(__fish_complete_directories (commandline -ct))' complete -c gdb -o nx -s n --description 'Do not execute commands from any .gdbinit files' complete -c gdb -o quiet -s q --description 'Quiet' complete -c gdb -o batch --description 'Run in batch mode' complete -c gdb -o cd --description 'Run GDB using directory as its working directory, instead of the current directory' -x -a '(__fish_complete_directories (commandline -ct))' complete -c gdb -o fullname -s f --description 'Emacs sets this option when it runs GDB as a subprocess' complete -c gdb -s b --description 'Bps Set the line speed (baud rate or bits per second) of any serial interface used by GDB for remote debugging' complete -c gdb -o tty --description 'Run using device for your programs standard input and output' -r complete -c gdb -l args --description 'Pass arguments after the program name to the program when it is run' complete -c gdb -o tui --description 'Run GDB using a text (console) user interface' fish/share/completions/gem.fish000066400000000000000000000315721214535744100171060ustar00rootroot00000000000000# Completions for rubygem's `gem' command # Author: Tassilo Horn ##### # Global options complete -c gem -n 'not __fish_use_subcommand' -s h -l help -d "Print usage informations and quit" complete -c gem -n 'not __fish_use_subcommand' -s v -l version -d "Print the version and quit" ##### # Subcommands complete -c gem -n '__fish_use_subcommand' -xa 'build\t"'(_ "Build a gem from a gemspec")'"' complete -c gem -n '__fish_use_subcommand' -xa 'cert\t"'(_ "Adjust RubyGems certificate settings")'"' complete -c gem -n '__fish_use_subcommand' -xa 'check\t"'(_ "Check installed gems")'"' complete -c gem -n '__fish_use_subcommand' -xa 'cleanup\t"'(_ "Cleanup old versions of installed gems in the local repository")'"' complete -c gem -n '__fish_use_subcommand' -xa 'contents\t"'(_ "Display the contents of the installed gems")'"' complete -c gem -n '__fish_use_subcommand' -xa 'dependency\t"'(_ "Show the dependencies of an installed gem")'"' complete -c gem -n '__fish_use_subcommand' -xa 'environment\t"'(_ "Display RubyGems environmental information")'"' complete -c gem -n '__fish_use_subcommand' -xa 'help\t"'(_ "Provide help on the 'gem' command")'"' complete -c gem -n '__fish_use_subcommand' -xa 'install\t"'(_ "Install a gem into the local repository")'"' complete -c gem -n '__fish_use_subcommand' -xa 'list\t"'(_ "Display all gems whose name starts with STRING")'"' complete -c gem -n '__fish_use_subcommand' -xa 'query\t"'(_ "Query gem information in local or remote repositories")'"' complete -c gem -n '__fish_use_subcommand' -xa 'rdoc\t"'(_ "Generates RDoc for pre-installed gems")'"' complete -c gem -n '__fish_use_subcommand' -xa 'search\t"'(_ "Display all gems whose name contains STRING")'"' complete -c gem -n '__fish_use_subcommand' -xa 'specification\t"'(_ "Display gem specification (in yaml)")'"' complete -c gem -n '__fish_use_subcommand' -xa 'uninstall\t"'(_ "Uninstall a gem from the local repository")'"' complete -c gem -n '__fish_use_subcommand' -xa 'unpack\t"'(_ "Unpack an installed gem to the current directory")'"' complete -c gem -n '__fish_use_subcommand' -xa 'update\t"'(_ "Update the named gem (or all installed gems) in the local repository")'"' ##### # Subcommand switches # common opts set -l common_opt -c gem -n 'not __fish_use_subcommand' complete $common_opt -l source --description "Use URL as the remote source for gems" -x complete $common_opt -s p -l http-proxy --description "Use the given HTTP proxy for remote operations" -x complete $common_opt -l no-http-proxy --description "Use no HTTP proxy for remote operations" complete $common_opt -s h -l help --description "Get help on this command" complete $common_opt -s v -l verbose --description "Set the verbose level of output" complete $common_opt -l config-file --description "Use this config file instead of default" -x complete $common_opt -l backtrace --description "Show stack backtrace on errors" complete $common_opt -l debug --description "Turn on Ruby debugging" ## # cert set -l cert_opt -c gem -n 'contains cert (commandline -poc)' complete $cert_opt -s a -l add --description "Add a trusted certificate" -x complete $cert_opt -s l -l list --description "List trusted certificates" complete $cert_opt -s r -l remove --description "Remove trusted certificates containing STRING" -x complete $cert_opt -s b -l build --description "Build private key and self-signed certificate for EMAIL_ADDR" -x complete $cert_opt -s C -l certificate --description "Certificate for --sign command" -x complete $cert_opt -s K -l private-key --description "Private key for --sign command" -x complete $cert_opt -s s -l sign --description "Sign a certificate with my key and certificate" -x ## # check set -l check_opt -c gem -n 'contains check (commandline -poc)' complete $check_opt -s v -l verify --description "Verify gem file against its internal checksum" -x complete $check_opt -s a -l alien --description "Report 'unmanaged' or rogue files in the gem repository" complete $check_opt -s t -l test --description "Run unit tests for gem" complete $check_opt -s V -l version --description "Specify version for which to run unit tests" ## # cleanup set -l cleanup_opt -c gem -n 'contains cleanup (commandline -poc)' complete $cleanup_opt -s d -l dryrun --description "Don't really cleanup" ## # contents set -l contents_opt -c gem -n 'contains contents (commandline -poc)' complete $contents_opt -s l -l list --description "List the files inside a Gem" complete $contents_opt -s V -l version --description "Specify version for gem to view" complete $contents_opt -s s -l spec-dir --description "Search for gems under specific paths" -x complete $contents_opt -s v -l verbose --description "Be verbose when showing status" ## # dependency set -l dep_opt -c gem -n 'contains dependency (commandline -poc)' complete $dep_opt -s v -l version --description "Specify version of gem to uninstall" -x complete $dep_opt -s r -l reverse-dependencies --description "Include reverse dependencies in the output" complete $dep_opt -l no-reverse-dependencies --description "Don't include reverse dependencies in the output" complete $dep_opt -s p -l pipe --description "Pipe Format (name --version ver)" ## # environment set -l env_opt -c gem -n 'contains environment (commandline -poc)' complete $env_opt -xa 'packageversion\t"'(_ "display the package version")'" gemdir\t"'(_ "display the path where gems are installed")'" gempath\t"'(_ "display path used to search for gems")'" version\t"'(_ "display the gem format version")'" remotesources\t"'(_ "display the remote gem servers")'"' ## # help set -l help_opt -c gem -n 'contains help (commandline -poc)' complete $help_opt -xa 'commands\t"'(_ "list all 'gem' commands")'" examples\t"'(_ "show some examples of usage")'" build cert check cleanup contents dependency environment help install list query rdoc search specification uninstall unpack update' ## # install set -l install_opt -c gem -n 'contains install (commandline -poc)' complete $install_opt -s v -l version --description "Specify version of gem to install" -x complete $install_opt -s l -l local --description "Restrict operations to the LOCAL domain (default)" complete $install_opt -s r -l remote --description "Restrict operations to the REMOTE domain" complete $install_opt -s b -l both --description "Allow LOCAL and REMOTE operations" complete $install_opt -s i -l install-dir --description "Gem repository directory to get installed gems" -x complete $install_opt -s d -l rdoc --description "Generate RDoc documentation for the gem on install" complete $install_opt -l no-rdoc --description "Don't generate RDoc documentation for the gem on install" complete $install_opt -l ri --description "Generate RI documentation for the gem on install" complete $install_opt -l no-ri --description "Don't generate RI documentation for the gem on install" complete $install_opt -s f -l force --description "Force gem to install, bypassing dependency checks" complete $install_opt -l no-force --description "Don't force gem to install, bypassing dependency checks" complete $install_opt -s t -l test --description "Run unit tests prior to installation" complete $install_opt -l no-test --description "Don't run unit tests prior to installation" complete $install_opt -s w -l wrappers --description "Use bin wrappers for executables" complete $install_opt -l no-wrappers --description "Don't use bin wrappers for executables" complete $install_opt -s P -l trust-policy --description "Specify gem trust policy" -x complete $install_opt -l ignore-dependencies --description "Do not install any required dependent gems" complete $install_opt -s y -l include-dependencies --description "Unconditionally install the required dependent gems" ## # list set -l list_opt -c gem -n 'contains list (commandline -poc)' complete $list_opt -s d -l details --description "Display detailed information of gem(s)" complete $list_opt -l no-details --description "Don't display detailed information of gem(s)" complete $list_opt -s l -l local --description "Restrict operations to the LOCAL domain (default)" complete $list_opt -s r -l remote --description "Restrict operations to the REMOTE domain" complete $list_opt -s b -l both --description "Allow LOCAL and REMOTE operations" ## # query set -l query_opt -c gem -n 'contains query (commandline -poc)' complete $query_opt -s n -l name-matches --description "Name of gem(s) to query on matches the provided REGEXP" -x complete $query_opt -s d -l details --description "Display detailed information of gem(s)" complete $query_opt -l no-details --description "Don't display detailed information of gem(s)" complete $query_opt -s l -l local --description "Restrict operations to the LOCAL domain (default)" complete $query_opt -s r -l remote --description "Restrict operations to the REMOTE domain" complete $query_opt -s b -l both --description "Allow LOCAL and REMOTE operations" ## # rdoc set -l rdoc_opt -c gem -n 'contains rdoc (commandline -poc)' complete $rdoc_opt -l all --description "Generate RDoc/RI documentation for all installed gems" complete $rdoc_opt -l rdoc --description "Include RDoc generated documents" complete $rdoc_opt -l no-rdoc --description "Don't include RDoc generated documents" complete $rdoc_opt -l ri --description "Include RI generated documents" complete $rdoc_opt -l no-ri --description "Don't include RI generated documents" complete $rdoc_opt -s v -l version --description "Specify version of gem to rdoc" -x ## # search set -l search_opt -c gem -n 'contains search (commandline -poc)' complete $search_opt -s d -l details --description "Display detailed information of gem(s)" complete $search_opt -l no-details --description "Don't display detailed information of gem(s)" complete $search_opt -s l -l local --description "Restrict operations to the LOCAL domain (default)" complete $search_opt -s r -l remote --description "Restrict operations to the REMOTE domain" complete $search_opt -s b -l both --description "Allow LOCAL and REMOTE operations" ## # specification set -l specification_opt -c gem -n 'contains specification (commandline -poc)' complete $specification_opt -s v -l version --description "Specify version of gem to examine" -x complete $specification_opt -s l -l local --description "Restrict operations to the LOCAL domain (default)" complete $specification_opt -s r -l remote --description "Restrict operations to the REMOTE domain" complete $specification_opt -s b -l both --description "Allow LOCAL and REMOTE operations" complete $specification_opt -l all --description "Output specifications for all versions of the gem" ## # uninstall set -l uninstall_opt -c gem -n 'contains uninstall (commandline -poc)' complete $uninstall_opt -s a -l all --description "Uninstall all matching versions" complete $uninstall_opt -l no-all --description "Don't uninstall all matching versions" complete $uninstall_opt -s i -l ignore-dependencies --description "Ignore dependency requirements while uninstalling" complete $uninstall_opt -l no-ignore-dependencies --description "Don't ignore dependency requirements while uninstalling" complete $uninstall_opt -s x -l executables --description "Uninstall applicable executables without confirmation" complete $uninstall_opt -l no-executables --description "Don't uninstall applicable executables without confirmation" complete $uninstall_opt -s v -l version --description "Specify version of gem to uninstall" -x ## # unpack set -l unpack_opt -c gem -n 'contains unpack (commandline -poc)' complete $unpack_opt -s v -l version --description "Specify version of gem to unpack" -x ## # update set -l update_opt -c gem -n 'contains update (commandline -poc)' complete $update_opt -s i -l install-dir --description "Gem repository directory to get installed gems" complete $update_opt -s d -l rdoc --description "Generate RDoc documentation for the gem on install" complete $update_opt -l no-rdoc --description "Don't generate RDoc documentation for the gem on install" complete $update_opt -l ri --description "Generate RI documentation for the gem on install" complete $update_opt -l no-ri --description "Don't generate RI documentation for the gem on install" complete $update_opt -s f -l force --description "Force gem to install, bypassing dependency checks" complete $update_opt -l no-force --description "Don't force gem to install, bypassing dependency checks" complete $update_opt -s t -l test --description "Run unit tests prior to installation" complete $update_opt -l no-test --description "Don't run unit tests prior to installation" complete $update_opt -s w -l wrappers --description "Use bin wrappers for executables" complete $update_opt -l no-wrappers --description "Don't use bin wrappers for executables" complete $update_opt -s P -l trust-policy --description "Specify gem trust policy" -x complete $update_opt -l ignore-dependencies --description "Do not install any required dependent gems" complete $update_opt -s y -l include-dependencies --description "Unconditionally install the required dependent gems" complete $update_opt -l system --description "Update the RubyGems system software" fish/share/completions/git.fish000066400000000000000000000323741214535744100171220ustar00rootroot00000000000000# fish completion for git # Use 'command git' to avoid interactions for aliases from git to (e.g.) hub function __fish_git_branches command git branch --no-color -a ^/dev/null | sgrep -v ' -> ' | sed -e 's/^..//' -e 's/^remotes\///' end function __fish_git_tags command git tag end function __fish_git_heads __fish_git_branches __fish_git_tags end function __fish_git_remotes command git remote end function __fish_git_ranges set -l from (commandline -ot | perl -ne 'if (index($_, "..") > 0) { my @parts = split(/\.\./); print $parts[0]; }') if test -z "$from" __fish_git_branches return 0 end set -l to (commandline -ot | perl -ne 'if (index($_, "..") > 0) { my @parts = split(/\.\./); print $parts[1]; }') for from_ref in (__fish_git_heads | sgrep -e "$from") for to_ref in (__fish_git_heads | sgrep -e "$to") printf "%s..%s\n" $from_ref $to_ref end end end function __fish_git_needs_command set cmd (commandline -opc) if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ] return 0 end return 1 end function __fish_git_using_command set cmd (commandline -opc) if [ (count $cmd) -gt 1 ] if [ $argv[1] = $cmd[2] ] return 0 end # aliased command set -l aliased (command git config --get "alias.$cmd[2]" | sed 's/ .*$//') if [ $argv[1] = "$aliased" ] return 0 end end return 1 end # general options complete -f -c git -n 'not __fish_git_needs_command' -l help -d 'Display the manual of a git command' #### fetch complete -f -c git -n '__fish_git_needs_command' -a fetch -d 'Download objects and refs from another repository' complete -f -c git -n '__fish_git_using_command fetch' -a '(__fish_git_remotes)' -d 'Remote' complete -f -c git -n '__fish_git_using_command fetch' -s q -l quiet -d 'Be quiet' complete -f -c git -n '__fish_git_using_command fetch' -s v -l verbose -d 'Be verbose' complete -f -c git -n '__fish_git_using_command fetch' -s a -l append -d 'Append ref names and object names' # TODO --upload-pack complete -f -c git -n '__fish_git_using_command fetch' -s f -l force -d 'Force update of local branches' # TODO other options ### remote complete -f -c git -n '__fish_git_needs_command' -a remote -d 'Manage set of tracked repositories' complete -f -c git -n '__fish_git_using_command remote' -a '(__fish_git_remotes)' complete -f -c git -n '__fish_git_using_command remote' -s v -l verbose -d 'Be verbose' complete -f -c git -n '__fish_git_using_command remote' -a add -d 'Adds a new remote' complete -f -c git -n '__fish_git_using_command remote' -a rm -d 'Removes a remote' complete -f -c git -n '__fish_git_using_command remote' -a show -d 'Shows a remote' complete -f -c git -n '__fish_git_using_command remote' -a prune -d 'Deletes all stale tracking branches' complete -f -c git -n '__fish_git_using_command remote' -a update -d 'Fetches updates' # TODO options ### show complete -f -c git -n '__fish_git_needs_command' -a show -d 'Shows the last commit of a branch' complete -f -c git -n '__fish_git_using_command show' -a '(__fish_git_branches)' -d 'Branch' # TODO options ### show-branch complete -f -c git -n '__fish_git_needs_command' -a show-branch -d 'Shows the commits on branches' complete -f -c git -n '__fish_git_using_command show-branch' -a '(__fish_git_heads)' --description 'Branch' # TODO options ### add complete -c git -n '__fish_git_needs_command' -a add -d 'Add file contents to the index' # TODO options ### checkout complete -f -c git -n '__fish_git_needs_command' -a checkout -d 'Checkout and switch to a branch' complete -f -c git -n '__fish_git_using_command checkout' -a '(__fish_git_branches)' --description 'Branch' complete -f -c git -n '__fish_git_using_command checkout' -a '(__fish_git_tags)' --description 'Tag' complete -f -c git -n '__fish_git_using_command checkout' -s b -d 'Create a new branch' complete -f -c git -n '__fish_git_using_command checkout' -s t -l track -d 'Track a new branch' # TODO options ### apply complete -f -c git -n '__fish_git_needs_command' -a apply -d 'Apply a patch on a git index file and a working tree' # TODO options ### archive complete -f -c git -n '__fish_git_needs_command' -a archive -d 'Create an archive of files from a named tree' # TODO options ### bisect complete -f -c git -n '__fish_git_needs_command' -a bisect -d 'Find the change that introduced a bug by binary search' # TODO options ### branch complete -f -c git -n '__fish_git_needs_command' -a branch -d 'List, create, or delete branches' complete -f -c git -n '__fish_git_using_command branch' -a '(__fish_git_branches)' -d 'Branch' complete -f -c git -n '__fish_git_using_command branch' -s d -d 'Delete branch' complete -f -c git -n '__fish_git_using_command branch' -s D -d 'Force deletion of branch' complete -f -c git -n '__fish_git_using_command branch' -s m -d 'Rename branch' complete -f -c git -n '__fish_git_using_command branch' -s M -d 'Force renaming branch' complete -f -c git -n '__fish_git_using_command branch' -s a -d 'Lists both local and remote branches' complete -f -c git -n '__fish_git_using_command branch' -s t -l track -d 'Track remote branch' complete -f -c git -n '__fish_git_using_command branch' -l no-track -d 'Do not track remote branch' complete -f -c git -n '__fish_git_using_command branch' -l set-upstream -d 'Set remote branch to track' ### cherry-pick complete -f -c git -n '__fish_git_needs_command' -a cherry-pick -d 'Apply the change introduced by an existing commit' complete -f -c git -n '__fish_git_using_command cherry-pick' -a '(__fish_git_branches)' -d 'Branch' # TODO options ### clone complete -f -c git -n '__fish_git_needs_command' -a clone -d 'Clone a repository into a new directory' # TODO options ### commit complete -c git -n '__fish_git_needs_command' -a commit -d 'Record changes to the repository' complete -c git -n '__fish_git_using_command commit' -l amend -d 'Amend the log message of the last commit' # TODO options ### diff complete -c git -n '__fish_git_needs_command' -a diff -d 'Show changes between commits, commit and working tree, etc' complete -c git -n '__fish_git_using_command diff' -a '(__fish_git_ranges)' -d 'Branch' complete -c git -n '__fish_git_using_command diff' -l cached -d 'Show diff of changes in the index' # TODO options ### difftool complete -c git -n '__fish_git_needs_command' -a difftool -d 'Open diffs in a visual tool' complete -c git -n '__fish_git_using_command difftool' -a '(__fish_git_ranges)' -d 'Branch' complete -c git -n '__fish_git_using_command difftool' -l cached -d 'Visually show diff of changes in the index' # TODO options ### grep complete -c git -n '__fish_git_needs_command' -a grep -d 'Print lines matching a pattern' # TODO options ### init complete -f -c git -n '__fish_git_needs_command' -a init -d 'Create an empty git repository or reinitialize an existing one' # TODO options ### log complete -c git -n '__fish_git_needs_command' -a log -d 'Show commit logs' complete -c git -n '__fish_git_using_command log' -a '(__fish_git_heads) (__fish_git_ranges)' -d 'Branch' complete -f -c git -n '__fish_git_using_command log' -l pretty -a 'oneline short medium full fuller email raw format:' # TODO options ### merge complete -f -c git -n '__fish_git_needs_command' -a merge -d 'Join two or more development histories together' complete -f -c git -n '__fish_git_using_command merge' -a '(__fish_git_branches)' -d 'Branch' complete -f -c git -n '__fish_git_using_command merge' -l commit -d "Autocommit the merge" complete -f -c git -n '__fish_git_using_command merge' -l no-commit -d "Don't autocommit the merge" complete -f -c git -n '__fish_git_using_command merge' -l stat -d "Show diffstat of the merge" complete -f -c git -n '__fish_git_using_command merge' -s n -l no-stat -d "Don't show diffstat of the merge" complete -f -c git -n '__fish_git_using_command merge' -l squash -d "Squash changes from other branch as a single commit" complete -f -c git -n '__fish_git_using_command merge' -l no-squash -d "Don't squash changes" complete -f -c git -n '__fish_git_using_command merge' -l ff -d "Don't generate a merge commit if merge is fast forward" complete -f -c git -n '__fish_git_using_command merge' -l no-ff -d "Generate a merge commit even if merge is fast forward" # TODO options ### mv complete -c git -n '__fish_git_needs_command' -a mv -d 'Move or rename a file, a directory, or a symlink' # TODO options ### prune complete -f -c git -n '__fish_git_needs_command' -a prune -d 'Prune all unreachable objects from the object database' # TODO options ### pull complete -f -c git -n '__fish_git_needs_command' -a pull -d 'Fetch from and merge with another repository or a local branch' # TODO options ### push complete -f -c git -n '__fish_git_needs_command' -a push -d 'Update remote refs along with associated objects' # TODO options ### rebase complete -f -c git -n '__fish_git_needs_command' -a rebase -d 'Forward-port local commits to the updated upstream head' complete -f -c git -n '__fish_git_using_command rebase' -a '(__fish_git_branches)' -d 'Branch' # TODO options ### reset complete -c git -n '__fish_git_needs_command' -a reset -d 'Reset current HEAD to the specified state' complete -f -c git -n '__fish_git_using_command reset' -l hard -d 'Reset files in working directory' complete -c git -n '__fish_git_using_command reset' -a '(__fish_git_branches)' # TODO options ### revert complete -f -c git -n '__fish_git_needs_command' -a revert -d 'Revert an existing commit' # TODO options ### rm complete -c git -n '__fish_git_needs_command' -a rm -d 'Remove files from the working tree and from the index' complete -c git -n '__fish_git_using_command rm' -f complete -c git -n '__fish_git_using_command rm' -l cached -d 'Keep local copies' complete -c git -n '__fish_git_using_command rm' -l ignore-unmatch -d 'Exit with a zero status even if no files matched' complete -c git -n '__fish_git_using_command rm' -s r -d 'Allow recursive removal' complete -c git -n '__fish_git_using_command rm' -s q -l quiet -d 'Suppress the output' complete -c git -n '__fish_git_using_command rm' -s f -l force -d 'Override the up-to-date check' complete -c git -n '__fish_git_using_command rm' -s n -l dry-run -d 'Dry run' # TODO options ### status complete -f -c git -n '__fish_git_needs_command' -a status -d 'Show the working tree status' complete -f -c git -n '__fish_git_using_command status' -s s -l short -d 'Give the output in the short-format' complete -f -c git -n '__fish_git_using_command status' -s b -l branch -d 'Show the branch and tracking info even in short-format' complete -f -c git -n '__fish_git_using_command status' -l porcelain -d 'Give the output in a stable, easy-to-parse format' complete -f -c git -n '__fish_git_using_command status' -s z -d 'Terminate entries with null character' complete -f -c git -n '__fish_git_using_command status' -s u -l untracked-files -x -a 'no normal all' -d 'The untracked files handling mode' complete -f -c git -n '__fish_git_using_command status' -l ignore-submodules -x -a 'none untracked dirty all' -d 'Ignore changes to submodules' # TODO options ### tag complete -f -c git -n '__fish_git_needs_command' -a tag -d 'Create, list, delete or verify a tag object signed with GPG' complete -f -c git -n '__fish_git_using_command tag; and __fish_not_contain_opt -s d; and __fish_not_contain_opt -s v; and test (count (commandline -opc | sgrep -v -e \'^-\')) -eq 3' -a '(__fish_git_branches)' -d 'Branch' complete -f -c git -n '__fish_git_using_command tag' -s d -d 'Remove a tag' complete -f -c git -n '__fish_git_using_command tag' -s v -d 'Verify signature of a tag' complete -f -c git -n '__fish_git_using_command tag' -s f -d 'Force overwriting exising tag' complete -f -c git -n '__fish_git_using_command tag' -s s -d 'Make a GPG-signed tag' complete -f -c git -n '__fish_contains_opt -s d' -a '(__fish_git_tags)' -d 'Tag' complete -f -c git -n '__fish_contains_opt -s v' -a '(__fish_git_tags)' -d 'Tag' # TODO options ### config complete -f -c git -n '__fish_git_needs_command' -a config -d 'Set and read git configuration variables' # TODO options ### format-patch complete -f -c git -n '__fish_git_needs_command' -a format-patch -d 'Generate patch series to send upstream' complete -f -c git -n '__fish_git_using_command format-patch' -a '(__fish_git_branches)' -d 'Branch' ## git submodule complete -f -c git -n '__fish_git_needs_command' -a submodule -d 'Initialize, update or inspect submodules' complete -f -c git -n '__fish_git_using_command submodule' -a 'add' -d 'Add a submodule' complete -f -c git -n '__fish_git_using_command submodule' -a 'status' -d 'Show submodule status' complete -f -c git -n '__fish_git_using_command submodule' -a 'init' -d 'Initialize all submodules' complete -f -c git -n '__fish_git_using_command submodule' -a 'update' -d 'Update all submodules' complete -f -c git -n '__fish_git_using_command submodule' -a 'summary' -d 'Show commit summary' complete -f -c git -n '__fish_git_using_command submodule' -a 'foreach' -d 'Run command on each submodule' complete -f -c git -n '__fish_git_using_command submodule' -a 'sync' -d 'Sync submodules\' URL with .gitmodules' ## git whatchanged complete -f -c git -n '__fish_git_needs_command' -a whatchanged -d 'Show logs with difference each commit introduces' ## Aliases (custom user-defined commands) complete -c git -n '__fish_git_needs_command' -a '(command git config --get-regexp alias | sed "s/^alias\.\([^ ]*\).*/\1/")' -d 'Alias (user-defined command)' fish/share/completions/go.fish000066400000000000000000000135761214535744100167470ustar00rootroot00000000000000function __fish__go_buildflags_completions -d 'Complete go build commands' --argument-names cmd complete -c go -n "__fish_seen_subcommand_from $cmd" -s a -d 'force rebuild' complete -c go -n "__fish_seen_subcommand_from $cmd" -s n -d 'print the commands but do not run them' complete -c go -n "__fish_seen_subcommand_from $cmd" -s p -r -d 'number parallel builds (default=#cpus)' complete -c go -n "__fish_seen_subcommand_from $cmd" -o race -d 'enable data race detection' complete -c go -n "__fish_seen_subcommand_from $cmd" -s v -d 'print packages being built' complete -c go -n "__fish_seen_subcommand_from $cmd" -o work -d 'print and preserve work directory' complete -c go -n "__fish_seen_subcommand_from $cmd" -s x -d 'print the commands' complete -c go -n "__fish_seen_subcommand_from $cmd" -o ccflags -r -d 'c compiler flags' complete -c go -n "__fish_seen_subcommand_from $cmd" -o compiler -r -d 'name of compiler to use, as in runtime.Compiler (gccgo or gc)' complete -c go -n "__fish_seen_subcommand_from $cmd" -o gccgoflags -r -d 'gccgo compiler/linker flags' complete -c go -n "__fish_seen_subcommand_from $cmd" -o gcflags -r -d 'go compiler flags' complete -c go -n "__fish_seen_subcommand_from $cmd" -o installsuffix -r -d 'suffix for installation directory' complete -c go -n "__fish_seen_subcommand_from $cmd" -o ldflags -r -d 'linker flags' complete -c go -n "__fish_seen_subcommand_from $cmd" -o tags -r -d 'build tags ' end function __fish_complete_go_files -d 'Complete go' --argument-names cmd complete -c go -n "__fish_seen_subcommand_from $cmd" -x -a "( __fish_complete_suffix .go ) " end # build complete -c go -n '__fish_use_subcommand' -a build -d 'compile packages and dependencies' __fish__go_buildflags_completions build __fish_complete_go_files build # clean complete -c go -n '__fish_use_subcommand' -a clean -d 'remove object files' complete -c go -n '__fish_seen_subcommand_from clean' -s i -d "remove the corresponding installed archive or binary (what 'go install' would create)" complete -c go -n '__fish_seen_subcommand_from clean' -s n -d "print the remove commands it would execute, but not run them" complete -c go -n '__fish_seen_subcommand_from clean' -s r -d "clean to be applied recursively to all the dependencies of the packages named by the import paths" complete -c go -n '__fish_seen_subcommand_from clean' -s x -d "clean to print remove commands as it executes them" # doc complete -c go -n '__fish_use_subcommand' -a doc -d 'run godoc on package sources' complete -c go -n '__fish_seen_subcommand_from doc' -s n -d "prints commands that would be executed" complete -c go -n '__fish_seen_subcommand_from doc' -s x -d "prints commands as they are executed" # env complete -c go -n '__fish_use_subcommand' -a env -d 'print Go environment information' # fix complete -c go -n '__fish_use_subcommand' -a fix -d 'run go tool fix on packages' # fmt complete -c go -n '__fish_use_subcommand' -a fmt -d 'run gofmt on package sources' complete -c go -n '__fish_seen_subcommand_from fmt' -s n -d "prints commands that would be executed" complete -c go -n '__fish_seen_subcommand_from fmt' -s x -d "prints commands as they are executed" # get complete -c go -n '__fish_use_subcommand' -a get -d 'download and install packages and dependencies' complete -c go -n '__fish_seen_subcommand_from get' -s d -d "stop after downloading the packages; don\'t install" complete -c go -n '__fish_seen_subcommand_from get' -o fix -d "run fix tool on packages before resolving dependencies or building" complete -c go -n '__fish_seen_subcommand_from get' -s u -d "update remote packages" __fish__go_buildflags_completions get # help complete -c go -n '__fish_use_subcommand' -a help -d 'get help on topic' complete -c go -n '__fish_seen_subcommand_from help' -xa 'build clean doc env fix fmt get install list run test tool version vet gopath packages remote testflag testfunc' -d "target tool" # install complete -c go -n '__fish_use_subcommand' -a install -d 'compile and install packages and dependencies' __fish__go_buildflags_completions install # list complete -c go -n '__fish_use_subcommand' -a list -d 'list packages' complete -c go -n '__fish_seen_subcommand_from list' -s e -d "tolerate erroneous packages" complete -c go -n '__fish_seen_subcommand_from list' -s f -r -d "pass in template for formatting" complete -c go -n '__fish_seen_subcommand_from list' -o json -d "print in JSON format" complete -c go -n '__fish_seen_subcommand_from list' -o tags -r -d 'list of build tags' # run complete -c go -n '__fish_use_subcommand' -a run -d 'compile and run Go program' __fish__go_buildflags_completions run __fish_complete_go_files run # test complete -c go -n '__fish_use_subcommand' -a test -d 'test packages' complete -c go -n '__fish_seen_subcommand_from test' -s c -r -d "compile the test binary to pkg.test but do not run it" complete -c go -n '__fish_seen_subcommand_from test' -s i -d "install dependent packages, but don\'t run tests" __fish__go_buildflags_completions test __fish_complete_go_files test # tool complete -c go -n '__fish_use_subcommand' -a tool -d 'run specified go tool' complete -c go -f -n '__fish_seen_subcommand_from tool' -a '5a 5c 5g 5l 6a 6c 6g 6l addr2line api cgo cov dist fix nm objdump pack pprof prof vet yacc' -d "target tool" complete -c go -n '__fish_seen_subcommand_from tool' -s n -d "print the command that would be executed but not execute it" # version complete -c go -f -n '__fish_use_subcommand' -a version -d 'print Go version' complete -c go -f -n '__fish_seen_subcommand_from version' # vet complete -c go -n '__fish_use_subcommand' -a vet -d 'vet packages' complete -c go -n '__fish_seen_subcommand_from vet' -s n -d "print the command that would be executed" complete -c go -n '__fish_seen_subcommand_from vet' -s x -d "prints commands as they are executed" fish/share/completions/gpasswd.fish000066400000000000000000000013061214535744100177760ustar00rootroot00000000000000 complete -c gpasswd -xa '(__fish_complete_groups)' complete -c gpasswd -s a -l add -d 'Add user to group' -xa '(__fish_complete_users)' complete -c gpasswd -s d -l delete -d 'Remove user from group' -xa '(__fish_complete_users)' complete -c gpasswd -s h -l help -d 'Print help' complete -c gpasswd -s r -l remove-password -d 'Remove the GROUP\'s password' complete -c gpasswd -s R -l restrict -d 'Restrict access to GROUP to its members' complete -c gpasswd -s M -l members -d 'Set the list of members of GROUP' -xa '(__fish_complete_list , __fish_complete_users)' complete -c gpasswd -s A -l administrators -d 'set the list of administrators for GROUP' -xa '(__fish_complete_list , __fish_complete_users)' fish/share/completions/gpg.fish000066400000000000000000000574131214535744100171150ustar00rootroot00000000000000# # Completions for the gpg command. # # This program accepts an rather large number of switches. It allows # you to do things like changing what file descriptor errors should be # written to, to make gpg use a different locale than the one # specified in the environment or to specify an alternative home # directory. # Switches related to debugging, switches whose use is not # recommended, switches whose behaviour is as of yet undefined, # switches for experimental features, switches to make gpg compliant # to legacy pgp-versions, dos-specific switches, switches meant for # the options file and deprecated or obsolete switches have all been # removed. The remaining list of completions is still quite # impressive. # # Various functions used for dynamic completions # function __fish_complete_gpg_user_id -d "Complete using gpg user ids" # gpg doesn't seem to like it when you use the whole key name as a # completion, so we skip the part and use it a s a # description. gpg --list-keys --with-colon|cut -d : -f 10|sed -ne 's/\(.*\) <\(.*\)>/\1'\t'\2/p' end function __fish_complete_gpg_key_id -d 'Complete using gpg key ids' # Use user_id as the description gpg --list-keys --with-colons|cut -d : -f 5,10|sed -ne "s/\(.*\):\(.*\)/\1'\t'\2/p" end function __fish_print_gpg_algo -d "Complete using all algorithms of the type specified in argv[1] supported by gpg. argv[1] is a regexp" # Set a known locale, so that the output format of 'gpg --version' # is at least somewhat predictable. The locale will automatically # expire when the function goes out of scope, and the original locale # will take effect again. set -lx LC_ALL C gpg --version | sgrep "$argv:"| sgrep -v "Home:"|cut -d : -f 2 |tr , \n|tr -d " " end # # gpg subcommands # complete -c gpg -s s -l sign --description "Make a signature" complete -c gpg -l clearsign --description "Make a clear text signature" complete -c gpg -s b -l detach-sign --description "Make a detached signature" complete -c gpg -s e -l encrypt --description "Encrypt data" complete -c gpg -s c -l symmetric --description "Encrypt with a symmetric cipher using a passphrase" complete -c gpg -l store --description "Store only (make a simple RFC1991 packet)" complete -c gpg -l decrypt --description "Decrypt specified file or stdin" complete -c gpg -l verify --description "Assume specified file or stdin is sigfile and verify it" complete -c gpg -l multifile --description "Modify certain other commands to accept multiple files for processing" complete -c gpg -l verify-files --description "Identical to '--multifile --verify'" complete -c gpg -l encrypt-files --description "Identical to '--multifile --encrypt'" complete -c gpg -l decrypt-files --description "Identical to --multifile --decrypt" complete -c gpg -l list-keys -xa "(__fish_append , (__fish_complete_gpg_user_id) )" --description "List all keys from the public keyrings, or just the ones given on the command line" complete -c gpg -l list-public-keys -xa "(__fish_append , (__fish_complete_gpg_user_id) )" --description "List all keys from the public keyrings, or just the ones given on the command line" complete -c gpg -s K -l list-secret-keys -xa "(__fish_append , (__fish_complete_gpg_user_id) )" --description "List all keys from the secret keyrings, or just the ones given on the command line" complete -c gpg -l list-sigs -xa "(__fish_append , (__fish_complete_gpg_user_id))" --description "Same as --list-keys, but the signatures are listed too" complete -c gpg -l check-sigs -xa "(__fish_append , (__fish_complete_gpg_user_id))" --description "Same as --list-keys, but the signatures are listed and verified" complete -c gpg -l fingerprint -xa "(__fish_append , (__fish_complete_gpg_user_id))" --description "List all keys with their fingerprints" complete -c gpg -l gen-key --description "Generate a new key pair" complete -c gpg -l edit-key --description "Present a menu which enables you to do all key related tasks" -xa "(__fish_complete_gpg_user_id)" complete -c gpg -l sign-key -xa "(__fish_complete_gpg_user_id)" --description "Sign a public key with your secret key" complete -c gpg -l lsign-key -xa "(__fish_complete_gpg_user_id)" --description "Sign a public key with your secret key but mark it as non exportable" complete -c gpg -l delete-key -xa "(__fish_complete_gpg_user_id)" --description "Remove key from the public keyring" complete -c gpg -l delete-secret-key -xa "(__fish_complete_gpg_user_id)" --description "Remove key from the secret and public keyring" complete -c gpg -l delete-secret-and-public-key -xa "(__fish_complete_gpg_user_id)" --description "Same as --delete-key, but if a secret key exists, it will be removed first" complete -c gpg -l gen-revoke -xa "(__fish_complete_gpg_user_id)" --description "Generate a revocation certificate for the complete key" complete -c gpg -l desig-revoke -xa "(__fish_complete_gpg_user_id)" --description "Generate a designated revocation certificate for a key" complete -c gpg -l export -xa "(__fish_append , (__fish_complete_gpg_user_id))" --description 'Export all or the given keys from all keyrings' complete -c gpg -l send-keys -xa "(__fish_append , (__fish_complete_gpg_user_id))" --description "Same as --export but sends the keys to a keyserver" complete -c gpg -l export-secret-keys -xa "(__fish_complete_gpg_user_id)" --description "Same as --export, but exports the secret keys instead" complete -c gpg -l export-secret-subkeys -xa "(__fish_complete_gpg_user_id)" --description "Same as --export, but exports the secret keys instead" complete -c gpg -l import -xa "(__fish_complete_gpg_user_id)" --description 'Import/merge keys' complete -c gpg -l fast-import -xa "(__fish_complete_gpg_user_id)" --description 'Import/merge keys' complete -c gpg -l recv-keys -xa "(__fish_complete_gpg_key_id)" --description "Import the keys with the given key IDs from a keyserver" complete -c gpg -l refresh-keys -xa "(__fish_complete_gpg_key_id)" --description "Request updates from a keyserver for keys that already exist on the local keyring" complete -c gpg -l search-keys -xa "(__fish_append , (__fish_complete_gpg_user_id) )" --description "Search the keyserver for the given names" complete -c gpg -l update-trustdb --description "Do trust database maintenance" complete -c gpg -l check-trustdb --description "Do trust database maintenance without user interaction" complete -c gpg -l export-ownertrust --description "Send the ownertrust values to stdout" complete -c gpg -l import-ownertrust --description "Update the trustdb with the ownertrust values stored in specified files or stdin" complete -c gpg -l rebuild-keydb-caches --description "Create signature caches in the keyring" complete -c gpg -l print-md -xa "(__fish_print_gpg_algo Hash)" --description "Print message digest of specified algorithm for all given files or stdin" complete -c gpg -l print-mds --description "Print message digest of all algorithms for all given files or stdin" complete -c gpg -l gen-random -xa "0 1 2" --description "Emit specified number of random bytes of the given quality level" complete -c gpg -l version --description "Display version and supported algorithms, and exit" complete -c gpg -l warranty --description "Display warranty and exit" complete -c gpg -s h -l help --description "Display help and exit" # # gpg options # complete -c gpg -s a -l armor --description "Create ASCII armored output" complete -c gpg -s o -l output -r --description "Write output to specified file" complete -c gpg -l max-output --description "Sets a limit on the number of bytes that will be generated when processing a file" -x complete -c gpg -s u -l local-user -xa "(__fish_complete_gpg_user_id)" --description "Use specified key as the key to sign with" complete -c gpg -l default-key -xa "(__fish_complete_gpg_user_id)" --description "Use specified key as the default key to sign with" complete -c gpg -s r -l recipient -xa "(__fish_complete_gpg_user_id)" --description "Encrypt for specified user id" complete -c gpg -s R -l hidden-recipient -xa "(__fish_complete_gpg_user_id)" --description "Encrypt for specified user id, but hide the keyid of the key" complete -c gpg -l default-recipient -xa "(__fish_complete_gpg_user_id)" --description "Use specified user id as default recipient" complete -c gpg -l default-recipient-self --description "Use the default key as default recipient" complete -c gpg -l no-default-recipient --description "Reset --default-recipient and --default-recipient-self" complete -c gpg -s v -l verbose --description "Give more information during processing" complete -c gpg -s q -l quiet --description "Quiet mode" complete -c gpg -s z --description "Compression level" -xa "(seq 1 9)" complete -c gpg -l compress-level --description "Compression level" -xa "(seq 1 9)" complete -c gpg -l bzip2-compress-level --description "Compression level" -xa "(seq 1 9)" complete -c gpg -l bzip2-decompress-lowmem --description "Use a different decompression method for BZIP2 compressed files" complete -c gpg -s t -l textmode --description "Treat input files as text and store them in the OpenPGP canonical text form with standard 'CRLF' line endings" complete -c gpg -l no-textmode --description "Don't treat input files as text and store them in the OpenPGP canonical text form with standard 'CRLF' line endings" complete -c gpg -s n -l dry-run --description "Don't make any changes (this is not completely implemented)" complete -c gpg -s i -l interactive --description "Prompt before overwrite" complete -c gpg -l batch --description "Batch mode" complete -c gpg -l no-batch --description "Don't use batch mode" complete -c gpg -l no-tty --description "Never write output to terminal" complete -c gpg -l yes --description "Assume yes on most questions" complete -c gpg -l no --description "Assume no on most questions" complete -c gpg -l ask-cert-level --description "Prompt for a certification level when making a key signature" complete -c gpg -l no-ask-cert-level --description "Don't prompt for a certification level when making a key signature" complete -c gpg -l default-cert-level -xa "0\t'Not verified' 1\t'Not verified' 2\t'Caual verification' 3\t'Extensive verification'" --description "The default certification level to use for the level check when signing a key" complete -c gpg -l min-cert-level -xa "0 1 2 3" --description "Disregard any signatures with a certification level below specified level when building the trust database" complete -c gpg -l trusted-key -xa "(__fish_complete_gpg_key_id)" --description "Assume that the specified key is as trustworthy as one of your own secret keys" complete -c gpg -l trust-model -xa "pgp classic direct always" --description "Specify trust model" complete -c gpg -l keyid-format -xa "short 0xshort long 0xlong" --description "Select how to display key IDs" complete -c gpg -l keyserver -x --description "Use specified keyserver" complete -c gpg -l keyserver-options -xa "(__fish_append , include-revoked include-disabled honor-keyserver-url include-subkeys use-temp-files keep-temp-files verbose timeout http-proxy auto-key-retrieve)" --description "Options for the keyserver" complete -c gpg -l import-options -xa "(__fish_append , import-local-sigs repair-pks-subkey-bug merge-only)" --description "Options for importing keys" complete -c gpg -l export-options -xa "(__fish_append , export-local-sigs export-attributes export-sensitive-revkeys export-minimal)" --description "Options for exporting keys" complete -c gpg -l list-options -xa "(__fish_append , show-photos show-policy-urls show-notations show-std-notations show-user-notations show-keyserver-urls show-uid-validity show-unusable-uids show-unusable-subkeys show-keyring show-sig-expire show-sig-subpackets )" --description "Options for listing keys and signatures" complete -c gpg -l verify-options -xa "(__fish_append , show-photos show-policy-urls show-notations show-std-notations show-user-notations show-keyserver-urls show-uid-validity show-unusable-uids)" --description "Options for verifying signatures" complete -c gpg -l photo-viewer -r --description "The command line that should be run to view a photo ID" complete -c gpg -l exec-path -r --description "Sets a list of directories to search for photo viewers and keyserver helpers" complete -c gpg -l show-keyring --description "Display the keyring name at the head of key listings to show which keyring a given key resides on" complete -c gpg -l keyring -r --description "Add specified file to the current list of keyrings" complete -c gpg -l secret-keyring -r --description "Add specified file to the current list of secret keyrings" complete -c gpg -l primary-keyring -r --description "Designate specified file as the primary public keyring" complete -c gpg -l trustdb-name -r --description "Use specified file instead of the default trustdb" complete -c gpg -l homedir -xa "(__fish_complete_directories (commandline -ct))" --description "Set the home directory" complete -c gpg -l display-charset -xa " iso-8859-1 iso-8859-2 iso-8859-15 koi8-r utf-8 " --description "Set the native character set" complete -c gpg -l utf8-strings --description "Assume that following command line arguments are given in UTF8" complete -c gpg -l no-utf8-strings --description "Assume that following arguments are encoded in the character set specified by --display-charset" complete -c gpg -l options -r --description "Read options from specified file, do not read the default options file" complete -c gpg -l no-options --description "Shortcut for '--options /dev/null'" complete -c gpg -l load-extension -x --description "Load an extension module" complete -c gpg -l status-fd -x --description "Write special status strings to the specified file descriptor" complete -c gpg -l logger-fd -x --description "Write log output to the specified file descriptor" complete -c gpg -l attribute-fd --description "Write attribute subpackets to the specified file descriptor" complete -c gpg -l sk-comments --description "Include secret key comment packets when exporting secret keys" complete -c gpg -l no-sk-comments --description "Don't include secret key comment packets when exporting secret keys" complete -c gpg -l comment -x --description "Use specified string as comment string" complete -c gpg -l no-comments --description "Don't use a comment string" complete -c gpg -l emit-version --description "Include the version string in ASCII armored output" complete -c gpg -l no-emit-version --description "Don't include the version string in ASCII armored output" complete -c gpg -l sig-notation -x complete -c gpg -l cert-notation -x complete -c gpg -s N -l set-notation -x --description "Put the specified name value pair into the signature as notation data" complete -c gpg -l sig-policy-url -x --description "Set signature policy" complete -c gpg -l cert-policy-url -x --description "Set certificate policy" complete -c gpg -l set-policy-url -x --description "Set signature and certificate policy" complete -c gpg -l sig-keyserver-url -x --description "Use specified URL as a preferred keyserver for data signatures" complete -c gpg -l set-filename -x --description "Use specified string as the filename which is stored inside messages" complete -c gpg -l for-your-eyes-only --description "Set the 'for your eyes only' flag in the message" complete -c gpg -l no-for-your-eyes-only --description "Clear the 'for your eyes only' flag in the message" complete -c gpg -l use-embedded-filename --description "Create file with name as given in data" complete -c gpg -l no-use-embedded-filename --description "Don't create file with name as given in data" complete -c gpg -l completes-needed -x --description "Number of completely trusted users to introduce a new key signer (defaults to 1)" complete -c gpg -l marginals-needed -x --description "Number of marginally trusted users to introduce a new key signer (defaults to 3)" complete -c gpg -l max-cert-depth -x --description "Maximum depth of a certification chain (default is 5)" complete -c gpg -l cipher-algo -xa "(__fish_print_gpg_algo Cipher)" --description "Use specified cipher algorithm" complete -c gpg -l digest-algo -xa "(__fish_print_gpg_algo Hash)" --description "Use specified message digest algorithm" complete -c gpg -l compress-algo -xa "(__fish_print_gpg_algo Compression)" --description "Use specified compression algorithm" complete -c gpg -l cert-digest-algo -xa "(__fish_print_gpg_algo Hash)" --description "Use specified message digest algorithm when signing a key" complete -c gpg -l s2k-cipher-algo -xa "(__fish_print_gpg_algo Cipher)" --description "Use specified cipher algorithm to protect secret keys" complete -c gpg -l s2k-digest-algo -xa "(__fish_print_gpg_algo Hash)" --description "Use specified digest algorithm to mangle the passphrases" complete -c gpg -l s2k-mode -xa "0\t'Plain passphrase' 1\t'Salted passphrase' 3\t'Repeated salted mangling'" --description "Selects how passphrases are mangled" complete -c gpg -l simple-sk-checksum --description 'Integrity protect secret keys by using a SHA-1 checksum' complete -c gpg -l disable-cipher-algo -xa "(__fish_print_gpg_algo Cipher)" --description "Never allow the use of specified cipher algorithm" complete -c gpg -l disable-pubkey-algo -xa "(__fish_print_gpg_algo Pubkey)" --description "Never allow the use of specified public key algorithm" complete -c gpg -l no-sig-cache --description "Do not cache the verification status of key signatures" complete -c gpg -l no-sig-create-check --description "Do not verify each signature right after creation" complete -c gpg -l auto-check-trustdb --description "Automatically run the --check-trustdb command internally when needed" complete -c gpg -l no-auto-check-trustdb --description "Never automatically run the --check-trustdb" complete -c gpg -l throw-keyids --description "Do not put the recipient keyid into encrypted packets" complete -c gpg -l no-throw-keyids --description "Put the recipient keyid into encrypted packets" complete -c gpg -l not-dash-escaped --description "Change the behavior of cleartext signatures so that they can be used for patch files" complete -c gpg -l escape-from-lines --description "Mangle From-field of email headers (default)" complete -c gpg -l no-escape-from-lines --description "Do not mangle From-field of email headers" complete -c gpg -l passphrase-fd -x --description "Read passphrase from specified file descriptor" complete -c gpg -l command-fd -x --description "Read user input from specified file descriptor" complete -c gpg -l use-agent --description "Try to use the GnuPG-Agent" complete -c gpg -l no-use-agent --description "Do not try to use the GnuPG-Agent" complete -c gpg -l gpg-agent-info -x --description "Override value of GPG_AGENT_INFO environment variable" complete -c gpg -l force-v3-sigs --description "Force v3 signatures for signatures on data" complete -c gpg -l no-force-v3-sigs --description "Do not force v3 signatures for signatures on data" complete -c gpg -l force-v4-certs --description "Always use v4 key signatures even on v3 keys" complete -c gpg -l no-force-v4-certs --description "Don't use v4 key signatures on v3 keys" complete -c gpg -l force-mdc --description "Force the use of encryption with a modification detection code" complete -c gpg -l disable-mdc --description "Disable the use of the modification detection code" complete -c gpg -l allow-non-selfsigned-uid --description "Allow the import and use of keys with user IDs which are not self-signed" complete -c gpg -l no-allow-non-selfsigned-uid --description "Do not allow the import and use of keys with user IDs which are not self-signed" complete -c gpg -l allow-freeform-uid --description "Disable all checks on the form of the user ID while generating a new one" complete -c gpg -l ignore-time-conflict --description "Do not fail if signature is older than key" complete -c gpg -l ignore-valid-from --description "Allow subkeys that have a timestamp from the future" complete -c gpg -l ignore-crc-error --description "Ignore CRC errors" complete -c gpg -l ignore-mdc-error --description "Do not fail on MDC integrity protection failure" complete -c gpg -l lock-once --description "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 --description "Release the locks every time a lock is no longer needed" complete -c gpg -l no-random-seed-file --description "Do not create an internal pool file for quicker generation of random numbers" complete -c gpg -l no-verbose --description "Reset verbose level to 0" complete -c gpg -l no-greeting --description "Suppress the initial copyright message" complete -c gpg -l no-secmem-warning --description "Suppress the warning about 'using insecure memory'" complete -c gpg -l no-permission-warning --description "Suppress the warning about unsafe file and home directory (--homedir) permissions" complete -c gpg -l no-mdc-warning --description "Suppress the warning about missing MDC integrity protection" complete -c gpg -l require-secmem --description "Refuse to run if GnuPG cannot get secure memory" complete -c gpg -l no-require-secmem --description "Do not refuse to run if GnuPG cannot get secure memory (default)" complete -c gpg -l no-armor --description "Assume the input data is not in ASCII armored format" complete -c gpg -l no-default-keyring --description "Do not add the default keyrings to the list of keyrings" complete -c gpg -l skip-verify --description "Skip the signature verification step" complete -c gpg -l with-colons --description "Print key listings delimited by colons" complete -c gpg -l with-key-data --description "Print key listings delimited by colons (like --with-colons) and print the public key data" complete -c gpg -l with-fingerprint --description "Same as the command --fingerprint but changes only the format of the output and may be used together with another command" complete -c gpg -l fast-list-mode --description "Changes the output of the list commands to work faster" complete -c gpg -l fixed-list-mode --description "Do not merge primary user ID and primary key in --with-colon listing mode and print all timestamps as UNIX timestamps" complete -c gpg -l list-only --description "Changes the behaviour of some commands. This is like --dry-run but different" complete -c gpg -l show-session-key --description "Display the session key used for one message" complete -c gpg -l override-session-key -x --description "Don't use the public key but the specified session key" complete -c gpg -l ask-sig-expire --description "Prompt for an expiration time" complete -c gpg -l no-ask-sig-expire --description "Do not prompt for an expiration time" complete -c gpg -l ask-cert-expire --description "Prompt for an expiration time" complete -c gpg -l no-ask-cert-expire --description "Do not prompt for an expiration time" complete -c gpg -l try-all-secrets --description "Don't look at the key ID as stored in the message but try all secret keys in turn to find the right decryption key" complete -c gpg -l enable-special-filenames --description "Enable a mode in which filenames of the form -&n, where n is a non-negative decimal number, refer to the file descriptor n and not to a file with that name" complete -c gpg -l group -x --description "Sets up a named group, which is similar to aliases in email programs" complete -c gpg -l ungroup --description "Remove a given entry from the --group list" complete -c gpg -l no-groups --description "Remove all entries from the --group list" complete -c gpg -l preserve-permissions --description "Don't change the permissions of a secret keyring back to user read/write only" complete -c gpg -l personal-cipher-preferences -x --description "Set the list of personal cipher preferences to the specified string" complete -c gpg -l personal-digest-preferences -x --description "Set the list of personal digest preferences to the specified string" complete -c gpg -l personal-compress-preferences -x --description "Set the list of personal compression preferences to the specified string" complete -c gpg -l default-preference-list -x --description "Set the list of default preferences to the specified string" fish/share/completions/gphoto2.fish000066400000000000000000000157521214535744100177220ustar00rootroot00000000000000# Command specific completions for gphoto2 # Written by SanskritFritz (gmail) #Common options complete -c gphoto2 -s '?'-l 'help' -d 'Print complete help message on program usage' complete -c gphoto2 -l 'usage' -d 'Print short message on program usage' complete -c gphoto2 -l 'debug' -d 'Turn on debugging' complete -c gphoto2 -l 'debug-logfile' -r -d 'Name of file to write debug info to' complete -c gphoto2 -l 'quiet' -d 'Quiet output (default=verbose)' complete -c gphoto2 -l 'hook-script' -r -d 'Hook script to call after downloads, captures, etc.' #Miscellaneous options (unsorted) complete -c gphoto2 -l 'stdout' -d 'Send file to stdout' complete -c gphoto2 -l 'stdout-size' -d 'Print filesize before data' complete -c gphoto2 -l 'auto-detect' -d 'List auto-detected cameras' complete -c gphoto2 -l 'show-exif' -r -d 'Show EXIF information' complete -c gphoto2 -l 'show-info' -r -d 'Show info' complete -c gphoto2 -l 'summary' -d 'Show summary' complete -c gphoto2 -l 'manual' -d 'Show camera driver manual' complete -c gphoto2 -l 'about' -d 'About the camera driver manual' complete -c gphoto2 -l 'storage-info' -d 'Show storage information' complete -c gphoto2 -l 'shell' -d 'gPhoto shell' #Get information on software and host system (not from the camera) complete -c gphoto2 -s v -l 'version' -d 'Display version and exit' complete -c gphoto2 -l 'list-cameras' -d 'List supported camera models' complete -c gphoto2 -l 'list-ports' -d 'List supported port devices' complete -c gphoto2 -s a -l 'abilities' -d 'Display camera/driver abilities' #Specify the camera to use complete -c gphoto2 -l 'port' -r -d 'Specify device port' complete -c gphoto2 -l 'speed' -r -d 'Specify serial transfer speed' complete -c gphoto2 -l 'camera' -r -d 'Specify camera model' complete -c gphoto2 -l 'usbid' -r -d '(expert only) Override USB IDs' #Camera and software configuration complete -c gphoto2 -l 'list-config' -d 'List configuration tree' complete -c gphoto2 -l 'list-all-config' -d 'Dump full configuration tree' complete -c gphoto2 -l 'get-config' -r -d 'Get configuration value' complete -c gphoto2 -l 'set-config' -r -d 'Set configuration value or index in choices' complete -c gphoto2 -l 'set-config-index' -r -d 'Set configuration value index in choices' complete -c gphoto2 -l 'set-config-value' -r -d 'Set configuration value' #Capture an image from or on the camera complete -c gphoto2 -l 'wait-event' -d 'Wait for event(s) from camera' complete -c gphoto2 -l 'wait-event-and-download' -d 'Wait for event(s) from the camera and download new images' complete -c gphoto2 -l 'capture-preview' -d 'Capture a quick preview' complete -c gphoto2 -s B -l 'bulb' -r -d 'Set bulb exposure time in seconds' complete -c gphoto2 -s F -l 'frames' -r -d 'Set number of frames to capture (default=infinite)' complete -c gphoto2 -s I -l 'interval' -r -d 'Set capture interval in seconds' complete -c gphoto2 -l 'reset-interval' -d 'Reset capture interval on signal (default=no)' complete -c gphoto2 -l 'capture-image' -d 'Capture an image' complete -c gphoto2 -l 'capture-image-and-download' -d 'Capture an image and download it' complete -c gphoto2 -l 'capture-movie' -d 'Capture a movie' complete -c gphoto2 -l 'capture-sound' -d 'Capture an audio clip' complete -c gphoto2 -l 'capture-tethered' -d 'Wait for shutter release on the camera and download' #Downloading, uploading and manipulating files complete -c gphoto2 -s l -l 'list-folders' -d 'List folders in folder' complete -c gphoto2 -s L -l 'list-files' -d 'List files in folder' complete -c gphoto2 -s m -l 'mkdir' -r -d 'Create a directory' complete -c gphoto2 -s r -l 'rmdir' -r -d 'Remove a directory' complete -c gphoto2 -s n -l 'num-files' -d 'Display number of files' complete -c gphoto2 -s p -l 'get-file' -r -d 'Get files given in range' complete -c gphoto2 -s P -l 'get-all-files' -d 'Get all files from folder' complete -c gphoto2 -s t -l 'get-thumbnail' -r -d 'Get thumbnails given in range' complete -c gphoto2 -s T -l 'get-all-thumbnails' -d 'Get all thumbnails from folder' complete -c gphoto2 -l 'get-metadata' -r -d 'Get metadata given in range' complete -c gphoto2 -l 'get-all-metadata' -d 'Get all metadata from folder' complete -c gphoto2 -l 'upload-metadata' -r -d 'Upload metadata for file' complete -c gphoto2 -l 'get-raw-data' -r -d 'Get raw data given in range' complete -c gphoto2 -l 'get-all-raw-data' -d 'Get all raw data from folder' complete -c gphoto2 -l 'get-audio-data' -r -d 'Get audio data given in range' complete -c gphoto2 -l 'get-all-audio-data' -d 'Get all audio data from folder' complete -c gphoto2 -s d -l 'delete-file' -r -d 'Delete files given in range' complete -c gphoto2 -s D -l 'delete-all-files' -d 'Delete all files in folder (--no-recurse by default)' complete -c gphoto2 -s u -l 'upload-file' -r -d 'Upload a file to camera' complete -c gphoto2 -l 'filename' -r -d 'Specify a filename or filename pattern' complete -c gphoto2 -s f -l 'folder' -r -d 'Specify camera folder (default="/")' complete -c gphoto2 -s R -l 'recurse' -d 'Recursion (default for download)' complete -c gphoto2 -l 'no-recurse' -d 'No recursion (default for deletion)' complete -c gphoto2 -l 'new' -d 'Process new files only' complete -c gphoto2 -l 'force-overwrite' -d 'Overwrite files without asking' fish/share/completions/gprof.fish000066400000000000000000000050771214535744100174540ustar00rootroot00000000000000complete -c gprof -s A -l annoted-source --description "Print annotated source" complete -c gprof -s b -l brief --description "Do not print explanations" complete -c gprof -s C -l exec-counts --description "Print tally" complete -c gprof -s i -l file-info --description "Display summary" complete -c gprof -s I -l directory-path --description "Search directories for source" complete -c gprof -s J -l no-annotated-source --description "No annotated source" complete -c gprof -s L -l print-path --description "Print full path of source" complete -c gprof -s p -l flat-profile --description "Print flat profile" complete -c gprof -s P -l no-flat-profile --description "No flat profile" complete -c gprof -s q -l graph --description "Print call graph" complete -c gprof -s Q -l no-graph --description "No call graph" complete -c gprof -s y -l separate-files --description "Annotate to file" complete -c gprof -s Z -l no-exec-counts --description "No tally" complete -c gprof -l function-ordering --description "Suggest function ordering" complete -rc gprof -l file-ordering --description "Suggest file ordering" complete -c gprof -s T -l traditional --description "Traditional mode" complete -xc gprof -s w -l width --description "Set width of output" complete -c gprof -s x -l all-lines --description "Annotate every line" complete -xc gprof -l demangle --description "Set demangling style" complete -c gprof -l no-demangle --description "Turn of demangling" complete -xc gprof -s a -l no-static --description "Supress static functions" complete -xc gprof -s c -l static-call-graph complete -xc gprof -s D -l ignore-non-functions --description "Ignore symbols not known to be functions" complete -xc gprof -s k -r --description "Delete arcs from callgraph" complete -xc gprof -s l -l line --description "Line by line profiling" complete -xc gprof -s m -l min-count -r --description "Supress output when executed less than specified times" complete -xc gprof -s n -l time --description "Only propagate times for matching symbols" complete -xc gprof -s N -l no-time --description "Do not propagate times for matching symbols" complete -xc gprof -s z -l display-unused-functions --description "Mention unused functions in flat profile" complete -xc gprof -s d -l debug --description "Specify debugging options" complete -xc gprof -s h -l help --description "Display help and exit" complete -xc gprof -s v -l version --description "Display version and exit" complete -xc gprof -s O -l file-format -x -a "auto bsd 4.4bsd magic prof" --description "Profile data format" complete -xc gprof -s s -l sum --description "Print summary" fish/share/completions/grep.fish000066400000000000000000000000321214535744100172560ustar00rootroot00000000000000__fish_complete_grep grep fish/share/completions/groupadd.fish000066400000000000000000000012161214535744100201330ustar00rootroot00000000000000# # Command specific completions for the groupadd command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c groupadd -s f --description 'Exit with success status if the specified group already exists' complete -c groupadd -s g --description 'The numerical value of the group\'s ID' complete -c groupadd -s h -l help --description 'Display help message and exit' complete -c groupadd -s K --description 'Overrides default key/value pairs from /etc/login' complete -c groupadd -s o --description 'This option permits to add group with non-unique GID' fish/share/completions/gunzip.fish000066400000000000000000000017461214535744100176520ustar00rootroot00000000000000complete -c gunzip -s c -l stdout --description "Compress to stdout" complete -c gunzip -x -a "( __fish_complete_suffix .gz __fish_complete_suffix .tgz ) " complete -c gunzip -s f -l force --description "Overwrite" complete -c gunzip -s h -l help --description "Display help and exit" complete -c gunzip -s l -l list --description "List compression information" complete -c gunzip -s L -l license --description "Print license" complete -c gunzip -s n -l no-name --description "Do not save/restore filename" complete -c gunzip -s N -l name --description "Save/restore filename" complete -c gunzip -s q -l quiet --description "Suppress warnings" complete -c gunzip -s r -l recursive --description "Recurse directories" complete -c gunzip -s S -l suffix -r --description "Suffix" complete -c gunzip -s t -l test --description "Check integrity" complete -c gunzip -s v -l verbose --description "Display compression ratios" complete -c gunzip -s V -l version --description "Display version and exit" fish/share/completions/gv.fish000066400000000000000000000073251214535744100167510ustar00rootroot00000000000000complete -c gv -xa "(__fish_complete_suffix .ps)" complete -c gv -xa "(__fish_complete_suffix .ps.gz)" complete -c gv -xa "(__fish_complete_suffix .eps)" complete -c gv -xa "(__fish_complete_suffix .pdf)" complete -c gv -l monochrome -d 'Display document using only black and white' complete -c gv -l grayscale -d 'Display document without colors' complete -c gv -l color -d 'Display document as usual' complete -c gv -l safer -d 'Start ghostscript in safe mode' complete -c gv -l nosafer -d 'Do not start ghostscript in safe mode' complete -c gv -l safedir -d 'Start ghostscript from a safe diretory' complete -c gv -l nosafedir -d 'Do not start ghostscript from a safe diretory' complete -c gv -l quiet -d 'Start ghostscript with the -dQUIET option' complete -c gv -l noquiet -d 'Do not start ghostscript with the -dQUIET option' complete -c gv -l infoSilent -d 'Do not show any messages in the info popup window' complete -c gv -l infoErrors -d 'Do not show warning messages in the info popup window' complete -c gv -l infoAll -d 'Do show all messages in the info popup window' complete -c gv -l arguments -d 'Start ghostscript with additional options as specified by the string ARGS' -x complete -c gv -l page -d 'Display the page with label LABEL first' -x complete -c gv -l center -d 'The page should be centered automatically' complete -c gv -l nocenter -d 'The page should not be centered automatically' complete -c gv -l media -d 'Selects the paper size to be used' complete -c gv -l orientation -d 'Sets the orientation of the page' -xa 'automatic bbox letter legal statement tabloid ledger folio quatro 10x14 executive a3 a4 a5 b4 b5' complete -c gv -l scale -d 'Selects the scale N, or arbitrary scale f.f' -x complete -c gv -l scalebase -d 'Selects the scale base N' -x complete -c gv -l swap -d 'Interchange the meaning of the orientations landscape and seascape' complete -c gv -l noswap -d 'Do not interchange the meaning of the orientation landscape and seascape' complete -c gv -l antialias -d 'Use antialiasing' complete -c gv -l noantialias -d 'Do not use antialiasing' complete -c gv -l dsc -d 'Dsc comments are respected' complete -c gv -l nodsc -d 'Dsc comments are not respected' complete -c gv -l eof -d 'Ignore the postscript EOF comment while scanning documents' complete -c gv -l noeof -d 'Do not ignore the postscript EOF comment while scanning documents' complete -c gv -l pixmap -d 'Use backing pixmap' complete -c gv -l nopixmap -d 'Do not use backing pixmap' complete -c gv -l watch -d 'Watch the document file for changes' complete -c gv -l nowatch -d 'Do not watch the document file for changes' complete -c gv -l help -d 'Print a help message and exit' complete -c gv -l usage -d 'Print a usage message and exit' complete -c gv -l resize -d 'Fit the size of the window to the size of the page' complete -c gv -l noresize -d 'Do not fit the size of the window to the size of the page' complete -c gv -o geometry -d 'Set geometry' complete -c gv -l ad -d 'Read and use additional resources from FILE (higher priority)' -r complete -c gv -l style -d 'Read and use additional resources from FILE (lower priority)' -r complete -c gv -l password -d 'Sets the password for opening encrypted PDF files' -x complete -c gv -l spartan -d 'Shortcut for --style=gv_spartan.dat' complete -c gv -l widgetless -d 'Shortcut for --style=gv_widgetless.dat' complete -c gv -l fullscreen -d 'Start in fullscreen mode (needs support from WM)' complete -c gv -l presentation -d 'Presentation mode ' complete -c gv -l version -d 'Show gv version and exit' fish/share/completions/gvim.fish000066400000000000000000000000311214535744100172620ustar00rootroot00000000000000__fish_complete_vi gvim fish/share/completions/gvimdiff.fish000066400000000000000000000000671214535744100201240ustar00rootroot00000000000000# completion for gvimdiff __fish_complete_vi gvimdiff fish/share/completions/gzip.fish000066400000000000000000000021511214535744100172760ustar00rootroot00000000000000complete -c gzip -s c -l stdout --description "Compress to stdout" complete -c gzip -s d -l decompress -x -a " ( __fish_complete_suffix .gz __fish_complete_suffix .tgz ) " complete -c gzip -s f -l force --description "Overwrite" complete -c gzip -s h -l help --description "Display help and exit" complete -c gzip -s l -l list --description "List compression information" complete -c gzip -s L -l license --description "Print license" complete -c gzip -s n -l no-name --description "Do not save/restore filename" complete -c gzip -s N -l name --description "Save/restore filename" complete -c gzip -s q -l quiet --description "Suppress warnings" complete -c gzip -s r -l recursive --description "Recurse directories" complete -c gzip -s S -l suffix -r --description "Suffix" complete -c gzip -s t -l test --description "Check integrity" complete -c gzip -s v -l verbose --description "Display compression ratios" complete -c gzip -s V -l version --description "Display version and exit" complete -c gzip -s 1 -l fast --description "Use fast setting" complete -c gzip -s 9 -l best --description "Use high compression setting" fish/share/completions/help.fish000066400000000000000000000036171214535744100172650ustar00rootroot00000000000000# # Completions for the help command # if test -d "$__fish_datadir/man/man1/" complete -c help -x -a '(__fish_print_commands)' --description "Help for this command" end complete -c help -x -a syntax --description 'Introduction to the fish syntax' complete -c help -x -a todo --description 'Incomplete aspects of fish' complete -c help -x -a bugs --description 'Known fish bugs' complete -c help -x -a history --description 'Help on how to reuse previously entered commands' complete -c help -x -a completion --description "Help on how tab-completion works" complete -c help -x -a job-control --description "Help on how job control works" complete -c help -x -a difference --description "Summary on how fish differs from other shells" complete -c help -x -a prompt --description "Help on how to set the prompt" complete -c help -x -a title --description "Help on how to set the titlebar message" complete -c help -x -a killring --description "Help on how to copy and paste" complete -c help -x -a editor --description "Help on editor shortcuts" complete -c help -x -a variables --description "Help on environment variables" complete -c help -x -a color --description "Help on setting syntax highlighting colors" complete -c help -x -a globbing --description "Help on parameter expansion (Globbing)" complete -c help -x -a expand --description "Help on parameter expansion (Globbing)" complete -c help -x -a expand-variable --description "Help on variable expansion \$VARNAME" complete -c help -x -a expand-home --description "Help on home directory expansion ~USER" complete -c help -x -a expand-brace --description "Help on brace expansion {a,b,c}" complete -c help -x -a expand-wildcard --description "Help on wildcard expansion *.*" complete -c help -x -a expand-command-substitution --description "Help on command substitution (SUBCOMMAND)" complete -c help -x -a expand-process --description "Help on process expansion %JOB" fish/share/completions/hg.fish000066400000000000000000001501461214535744100167330ustar00rootroot00000000000000 # # Completions for the hg command # This file was autogenerated by the file make_vcs_completions.fish # which is shipped with the fish source code. # # # Completions from commandline # # # subcommands # complete -c hg -n '__fish_use_subcommand' -x -a add --description 'add the specified files on the next commit' complete -c hg -n '__fish_use_subcommand' -x -a addremove --description 'add all new files, delete all missing files' complete -c hg -n '__fish_use_subcommand' -x -a annotate --description 'show changeset information by line for each file' complete -c hg -n '__fish_use_subcommand' -x -a archive --description 'create an unversioned archive of a repository revision' complete -c hg -n '__fish_use_subcommand' -x -a backout --description 'reverse effect of earlier changeset' complete -c hg -n '__fish_use_subcommand' -x -a bisect --description 'subdivision search of changesets' complete -c hg -n '__fish_use_subcommand' -x -a bookmarks --description 'track a line of development with movable markers' complete -c hg -n '__fish_use_subcommand' -x -a branch --description 'set or show the current branch name' complete -c hg -n '__fish_use_subcommand' -x -a branches --description 'list repository named branches' complete -c hg -n '__fish_use_subcommand' -x -a bundle --description 'create a changegroup file' complete -c hg -n '__fish_use_subcommand' -x -a cat --description 'output the current or given revision of files' complete -c hg -n '__fish_use_subcommand' -x -a clone --description 'make a copy of an existing repository' complete -c hg -n '__fish_use_subcommand' -x -a commit --description 'commit the specified files or all outstanding changes' complete -c hg -n '__fish_use_subcommand' -x -a copy --description 'mark files as copied for the next commit' complete -c hg -n '__fish_use_subcommand' -x -a diff --description 'diff repository (or selected files)' complete -c hg -n '__fish_use_subcommand' -x -a export --description 'dump the header and diffs for one or more changesets' complete -c hg -n '__fish_use_subcommand' -x -a forget --description 'forget the specified files on the next commit' complete -c hg -n '__fish_use_subcommand' -x -a graft --description 'copy changes from other branches onto the current branch' complete -c hg -n '__fish_use_subcommand' -x -a grep --description 'search for a pattern in specified files and revisions' complete -c hg -n '__fish_use_subcommand' -x -a heads --description 'show current repository heads or show branch heads' complete -c hg -n '__fish_use_subcommand' -x -a help --description 'show help for a given topic or a help overview' complete -c hg -n '__fish_use_subcommand' -x -a identify --description 'identify the working copy or specified revision' complete -c hg -n '__fish_use_subcommand' -x -a import --description 'import an ordered set of patches' complete -c hg -n '__fish_use_subcommand' -x -a incoming --description 'show new changesets found in source' complete -c hg -n '__fish_use_subcommand' -x -a init --description 'create a new repository in the given directory' complete -c hg -n '__fish_use_subcommand' -x -a locate --description 'locate files matching specific patterns' complete -c hg -n '__fish_use_subcommand' -x -a log --description 'show revision history of entire repository or files' complete -c hg -n '__fish_use_subcommand' -x -a manifest --description 'output the current or given revision of the project manifest' complete -c hg -n '__fish_use_subcommand' -x -a merge --description 'merge working directory with another revision' complete -c hg -n '__fish_use_subcommand' -x -a outgoing --description 'show changesets not found in the destination' complete -c hg -n '__fish_use_subcommand' -x -a parents --description 'show the parents of the working directory or revision' complete -c hg -n '__fish_use_subcommand' -x -a paths --description 'show aliases for remote repositories' complete -c hg -n '__fish_use_subcommand' -x -a phase --description 'set or show the current phase name' complete -c hg -n '__fish_use_subcommand' -x -a pull --description 'pull changes from the specified source' complete -c hg -n '__fish_use_subcommand' -x -a push --description 'push changes to the specified destination' complete -c hg -n '__fish_use_subcommand' -x -a recover --description 'roll back an interrupted transaction' complete -c hg -n '__fish_use_subcommand' -x -a remove --description 'remove the specified files on the next commit' complete -c hg -n '__fish_use_subcommand' -x -a rename --description 'rename files; equivalent of copy + remove' complete -c hg -n '__fish_use_subcommand' -x -a resolve --description 'redo merges or set/view the merge status of files' complete -c hg -n '__fish_use_subcommand' -x -a revert --description 'restore files to their checkout state' complete -c hg -n '__fish_use_subcommand' -x -a rollback --description 'roll back the last transaction (dangerous)' complete -c hg -n '__fish_use_subcommand' -x -a root --description 'print the root (top) of the current working directory' complete -c hg -n '__fish_use_subcommand' -x -a serve --description 'start stand-alone webserver' complete -c hg -n '__fish_use_subcommand' -x -a showconfig --description 'show combined config settings from all hgrc files' complete -c hg -n '__fish_use_subcommand' -x -a status --description 'show changed files in the working directory' complete -c hg -n '__fish_use_subcommand' -x -a summary --description 'summarize working directory state' complete -c hg -n '__fish_use_subcommand' -x -a tag --description 'add one or more tags for the current or given revision' complete -c hg -n '__fish_use_subcommand' -x -a tags --description 'list repository tags' complete -c hg -n '__fish_use_subcommand' -x -a tip --description 'show the tip revision' complete -c hg -n '__fish_use_subcommand' -x -a unbundle --description 'apply one or more changegroup files' complete -c hg -n '__fish_use_subcommand' -x -a update --description 'update working directory (or switch revisions)' complete -c hg -n '__fish_use_subcommand' -x -a verify --description 'verify the integrity of the repository' complete -c hg -n '__fish_use_subcommand' -x -a version --description 'output version and copyright information' complete -c hg -n '__fish_use_subcommand' -x -a config --description 'Configuration Files' complete -c hg -n '__fish_use_subcommand' -x -a dates --description 'Date Formats' complete -c hg -n '__fish_use_subcommand' -x -a diffs --description 'Diff Formats' complete -c hg -n '__fish_use_subcommand' -x -a environment --description 'Environment Variables' complete -c hg -n '__fish_use_subcommand' -x -a extensions --description 'Using Additional Features' complete -c hg -n '__fish_use_subcommand' -x -a filesets --description 'Specifying File Sets' complete -c hg -n '__fish_use_subcommand' -x -a glossary --description 'Glossary' complete -c hg -n '__fish_use_subcommand' -x -a hgignore --description 'Syntax for Mercurial Ignore Files' complete -c hg -n '__fish_use_subcommand' -x -a hgweb --description 'Configuring hgweb' complete -c hg -n '__fish_use_subcommand' -x -a merge-tools --description 'Merge Tools' complete -c hg -n '__fish_use_subcommand' -x -a multirevs --description 'Specifying Multiple Revisions' complete -c hg -n '__fish_use_subcommand' -x -a patterns --description 'File Name Patterns' complete -c hg -n '__fish_use_subcommand' -x -a phases --description 'Working with Phases' complete -c hg -n '__fish_use_subcommand' -x -a revisions --description 'Specifying Single Revisions' complete -c hg -n '__fish_use_subcommand' -x -a revsets --description 'Specifying Revision Sets' complete -c hg -n '__fish_use_subcommand' -x -a subrepos --description 'Subrepositories' complete -c hg -n '__fish_use_subcommand' -x -a templating --description 'Template Usage' complete -c hg -n '__fish_use_subcommand' -x -a urls --description 'URL Paths' # # Completions for the 'add' subcommand # complete -c hg -n 'contains \'add\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'add\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'add\' (commandline -poc)' -s S -l subrepos --description 'Recurse into subrepositories' complete -c hg -n 'contains \'add\' (commandline -poc)' -s n -l dry-run --description 'Do not perform actions, just print output' # # Completions for the 'addremove' subcommand # complete -c hg -n 'contains \'addremove\' (commandline -poc)' -s s -l similarity -x --description 'Guess renamed files by similarity (0<=s<=100)' complete -c hg -n 'contains \'addremove\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'addremove\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'addremove\' (commandline -poc)' -s n -l dry-run --description 'Do not perform actions, just print output' # # Completions for the 'annotate' subcommand # complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s r -l rev -x --description 'Annotate the specified revision' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -l no-follow --description 'Don\'t follow copies and renames' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s a -l text --description 'Treat all files as text' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s u -l user --description 'List the author (long with -v)' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s f -l file --description 'List the filename' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s d -l date --description 'List the date (short with -q)' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s n -l number --description 'List the revision number (default)' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s c -l changeset --description 'List the changeset' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s l -l line-number --description 'Show line number at the first appearance' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s w -l ignore-all-space --description 'Ignore white space when comparing lines' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s b -l ignore-space-change -x --description 'Changes in the amount of white space' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s B -l ignore-blank-lines --description 'Ignore changes whose lines are all blank' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'annotate\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'archive' subcommand # complete -c hg -n 'contains \'archive\' (commandline -poc)' -l no-decode --description 'Do not pass files through decoders' complete -c hg -n 'contains \'archive\' (commandline -poc)' -s p -l prefix -x --description 'Directory prefix for files in archive' complete -c hg -n 'contains \'archive\' (commandline -poc)' -s r -l rev -x --description 'Revision to distribute' complete -c hg -n 'contains \'archive\' (commandline -poc)' -s t -l type -x --description 'Type of distribution to create' complete -c hg -n 'contains \'archive\' (commandline -poc)' -s S -l subrepos --description 'Recurse into subrepositories' complete -c hg -n 'contains \'archive\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'archive\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'backout' subcommand # complete -c hg -n 'contains \'backout\' (commandline -poc)' -l merge --description 'Merge with old dirstate parent after backout' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s r -l rev -x --description 'Revision to backout' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s t -l tool -x --description 'Specify merge tool' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s m -l message -x --description 'Use text as commit message' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s l -l logfile -x --description 'Read commit message from file' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s d -l date -x --description 'Record the specified date as commit date' complete -c hg -n 'contains \'backout\' (commandline -poc)' -s u -l user -x --description 'Record the specified user as committer' # # Completions for the 'bisect' subcommand # complete -c hg -n 'contains \'bisect\' (commandline -poc)' -s r -l reset --description 'Reset bisect state' complete -c hg -n 'contains \'bisect\' (commandline -poc)' -s g -l good --description 'Mark changeset good' complete -c hg -n 'contains \'bisect\' (commandline -poc)' -s b -l bad --description 'Mark changeset bad' complete -c hg -n 'contains \'bisect\' (commandline -poc)' -s s -l skip --description 'Skip testing changeset' complete -c hg -n 'contains \'bisect\' (commandline -poc)' -s e -l extend --description 'Extend the bisect range' complete -c hg -n 'contains \'bisect\' (commandline -poc)' -s c -l command -x --description 'Use command to check changeset state' complete -c hg -n 'contains \'bisect\' (commandline -poc)' -s U -l noupdate --description 'Do not update to target' # # Completions for the 'bookmarks' subcommand # complete -c hg -n 'contains \'bookmarks\' (commandline -poc)' -s f -l force --description 'Force' complete -c hg -n 'contains \'bookmarks\' (commandline -poc)' -s r -l rev -x --description 'Revision' complete -c hg -n 'contains \'bookmarks\' (commandline -poc)' -s d -l delete --description 'Delete a given bookmark' complete -c hg -n 'contains \'bookmarks\' (commandline -poc)' -s m -l rename -x --description 'Rename a given bookmark' complete -c hg -n 'contains \'bookmarks\' (commandline -poc)' -s i -l inactive --description 'Mark a bookmark inactive' # # Completions for the 'branch' subcommand # complete -c hg -n 'contains \'branch\' (commandline -poc)' -s f -l force -x --description 'Branch name even if it shadows an existing branch' complete -c hg -n 'contains \'branch\' (commandline -poc)' -s C -l clean -x --description 'Branch name to parent branch name' # # Completions for the 'branches' subcommand # complete -c hg -n 'contains \'branches\' (commandline -poc)' -s a -l active -x --description 'Only branches that have unmerged heads' complete -c hg -n 'contains \'branches\' (commandline -poc)' -s c -l closed -x --description 'Normal and closed branches' # # Completions for the 'bundle' subcommand # complete -c hg -n 'contains \'bundle\' (commandline -poc)' -s f -l force --description 'Run even when the destination is unrelated' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -s b -l branch -x --description '[+] a specific branch you would like to bundle' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -l base -x --description '[+]' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -s a -l all --description 'Bundle all changesets in the repository' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -s t -l type -x --description 'Bundle compression type to use (default: bzip2)' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'bundle\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring web.cacerts' # # Completions for the 'cat' subcommand # complete -c hg -n 'contains \'cat\' (commandline -poc)' -s o -l output -x --description 'Print output to file with formatted name' complete -c hg -n 'contains \'cat\' (commandline -poc)' -s r -l rev -x --description 'Print the given revision' complete -c hg -n 'contains \'cat\' (commandline -poc)' -l decode --description 'Apply any matching decode filter' complete -c hg -n 'contains \'cat\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'cat\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'clone' subcommand # complete -c hg -n 'contains \'clone\' (commandline -poc)' -s U -l noupdate --description 'The clone will include an empty working copy (only a' complete -c hg -n 'contains \'clone\' (commandline -poc)' -s u -l updaterev -x --description 'Revision, tag or branch to check out' complete -c hg -n 'contains \'clone\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'clone\' (commandline -poc)' -s b -l branch -x --description '[+] clone only the specified branch' complete -c hg -n 'contains \'clone\' (commandline -poc)' -l pull --description 'Use pull protocol to copy metadata' complete -c hg -n 'contains \'clone\' (commandline -poc)' -l uncompressed --description 'Use uncompressed transfer (fast over LAN)' complete -c hg -n 'contains \'clone\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'clone\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'clone\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring web.cacerts' # # Completions for the 'commit' subcommand # complete -c hg -n 'contains \'commit\' (commandline -poc)' -l amend -x --description 'Can be used to amend the parent of the working directory' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s A -l addremove --description 'Mark new/missing files as added/removed before' complete -c hg -n 'contains \'commit\' (commandline -poc)' -l close-branch --description 'Mark a branch as closed, hiding it from the branch' complete -c hg -n 'contains \'commit\' (commandline -poc)' -l amend --description 'Amend the parent of the working dir' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s m -l message -x --description 'Use text as commit message' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s l -l logfile -x --description 'Read commit message from file' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s d -l date -x --description 'Record the specified date as commit date' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s u -l user -x --description 'Record the specified user as committer' complete -c hg -n 'contains \'commit\' (commandline -poc)' -s S -l subrepos --description 'Recurse into subrepositories' # # Completions for the 'copy' subcommand # complete -c hg -n 'contains \'copy\' (commandline -poc)' -s A -l after --description 'Record a copy that has already occurred' complete -c hg -n 'contains \'copy\' (commandline -poc)' -s f -l force --description 'Forcibly copy over an existing managed file' complete -c hg -n 'contains \'copy\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'copy\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'copy\' (commandline -poc)' -s n -l dry-run --description 'Do not perform actions, just print output' # # Completions for the 'diff' subcommand # complete -c hg -n 'contains \'diff\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s c -l change -x --description 'Change made by revision' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s a -l text --description 'Treat all files as text' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s g -l git --description 'Use git extended diff format' complete -c hg -n 'contains \'diff\' (commandline -poc)' -l nodates --description 'Omit dates from diff headers' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s p -l show-function --description 'Show which function each change is in' complete -c hg -n 'contains \'diff\' (commandline -poc)' -l reverse --description 'Produce a diff that undoes the changes' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s w -l ignore-all-space --description 'Ignore white space when comparing lines' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s b -l ignore-space-change -x --description 'Changes in the amount of white space' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s B -l ignore-blank-lines --description 'Ignore changes whose lines are all blank' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s U -l unified -x --description 'Number of lines of context to show' complete -c hg -n 'contains \'diff\' (commandline -poc)' -l stat --description 'Output diffstat-style summary of changes' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'diff\' (commandline -poc)' -s S -l subrepos --description 'Recurse into subrepositories' # # Completions for the 'export' subcommand # complete -c hg -n 'contains \'export\' (commandline -poc)' -s o -l output -x --description 'Print output to file with formatted name' complete -c hg -n 'contains \'export\' (commandline -poc)' -l switch-parent -x --description 'Against the second parent' complete -c hg -n 'contains \'export\' (commandline -poc)' -s r -l rev -x --description '[+] revisions to export' complete -c hg -n 'contains \'export\' (commandline -poc)' -s a -l text --description 'Treat all files as text' complete -c hg -n 'contains \'export\' (commandline -poc)' -s g -l git --description 'Use git extended diff format' complete -c hg -n 'contains \'export\' (commandline -poc)' -l nodates --description 'Omit dates from diff headers' # # Completions for the 'forget' subcommand # complete -c hg -n 'contains \'forget\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'forget\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'graft' subcommand # complete -c hg -n 'contains \'graft\' (commandline -poc)' -s c -l continue --description 'Resume interrupted graft' complete -c hg -n 'contains \'graft\' (commandline -poc)' -s e -l edit --description 'Invoke editor on commit messages' complete -c hg -n 'contains \'graft\' (commandline -poc)' -s D -l currentdate -x --description 'The current date as commit date' complete -c hg -n 'contains \'graft\' (commandline -poc)' -s U -l currentuser -x --description 'The current user as committer' complete -c hg -n 'contains \'graft\' (commandline -poc)' -s d -l date -x --description 'Record the specified date as commit date' complete -c hg -n 'contains \'graft\' (commandline -poc)' -s u -l user -x --description 'Record the specified user as committer' complete -c hg -n 'contains \'graft\' (commandline -poc)' -s t -l tool -x --description 'Specify merge tool' complete -c hg -n 'contains \'graft\' (commandline -poc)' -s n -l dry-run --description 'Do not perform actions, just print output' # # Completions for the 'grep' subcommand # complete -c hg -n 'contains \'grep\' (commandline -poc)' -s 0 -l print0 --description 'End fields with NUL' complete -c hg -n 'contains \'grep\' (commandline -poc)' -l all --description 'Print all revisions that match' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s a -l text --description 'Treat all files as text' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s f -l follow --description 'Follow changeset history, or file history across' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s i -l ignore-case --description 'Ignore case when matching' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s l -l files-with-matches --description 'Print only filenames and revisions that match' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s n -l line-number --description 'Print matching line numbers' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s u -l user --description 'List the author (long with -v)' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s d -l date --description 'List the date (short with -q)' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'grep\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'heads' subcommand # complete -c hg -n 'contains \'heads\' (commandline -poc)' -s r -l rev -x --description 'Show only heads which are descendants of STARTREV' complete -c hg -n 'contains \'heads\' (commandline -poc)' -s t -l topo --description 'Show topological heads only' complete -c hg -n 'contains \'heads\' (commandline -poc)' -s c -l closed --description 'Show normal and closed branch heads' complete -c hg -n 'contains \'heads\' (commandline -poc)' -l style -x --description 'Display using template map file' complete -c hg -n 'contains \'heads\' (commandline -poc)' -l template -x --description 'Display with template' # # Completions for the 'help' subcommand # complete -c hg -n 'contains \'help\' (commandline -poc)' -s e -l extension -x --description 'Only help for extensions' complete -c hg -n 'contains \'help\' (commandline -poc)' -s c -l command --description 'Show only help for commands' # # Completions for the 'identify' subcommand # complete -c hg -n 'contains \'identify\' (commandline -poc)' -s r -l rev -x --description 'Identify the specified revision' complete -c hg -n 'contains \'identify\' (commandline -poc)' -s n -l num --description 'Show local revision number' complete -c hg -n 'contains \'identify\' (commandline -poc)' -s i -l id --description 'Show global revision id' complete -c hg -n 'contains \'identify\' (commandline -poc)' -s b -l branch --description 'Show branch' complete -c hg -n 'contains \'identify\' (commandline -poc)' -s t -l tags --description 'Show tags' complete -c hg -n 'contains \'identify\' (commandline -poc)' -s B -l bookmarks --description 'Show bookmarks' complete -c hg -n 'contains \'identify\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'identify\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'identify\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring web.cacerts' # # Completions for the 'import' subcommand # complete -c hg -n 'contains \'import\' (commandline -poc)' -l exact -x --description 'Specified, import will set the working directory to the' complete -c hg -n 'contains \'import\' (commandline -poc)' -l bypass -x --description 'Apply and commit patches directly to the repository, not' complete -c hg -n 'contains \'import\' (commandline -poc)' -s p -l strip -x --description 'Directory strip option for patch. This has the' complete -c hg -n 'contains \'import\' (commandline -poc)' -s e -l edit --description 'Invoke editor on commit messages' complete -c hg -n 'contains \'import\' (commandline -poc)' -s f -l force --description 'Skip check for outstanding uncommitted changes' complete -c hg -n 'contains \'import\' (commandline -poc)' -l no-commit --description 'Don\'t commit, just update the working directory' complete -c hg -n 'contains \'import\' (commandline -poc)' -l bypass --description 'Apply patch without touching the working directory' complete -c hg -n 'contains \'import\' (commandline -poc)' -l exact --description 'Apply patch to the nodes from which it was' complete -c hg -n 'contains \'import\' (commandline -poc)' -l import-branch --description 'Use any branch information in patch (implied by' complete -c hg -n 'contains \'import\' (commandline -poc)' -s m -l message -x --description 'Use text as commit message' complete -c hg -n 'contains \'import\' (commandline -poc)' -s l -l logfile -x --description 'Read commit message from file' complete -c hg -n 'contains \'import\' (commandline -poc)' -s d -l date -x --description 'Record the specified date as commit date' complete -c hg -n 'contains \'import\' (commandline -poc)' -s u -l user -x --description 'Record the specified user as committer' complete -c hg -n 'contains \'import\' (commandline -poc)' -s s -l similarity -x --description 'Guess renamed files by similarity (0<=s<=100)' # # Completions for the 'incoming' subcommand # complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s f -l force --description 'Run even if remote repository is unrelated' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s n -l newest-first --description 'Show newest record first' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -l bundle -x --description 'File to store the bundles into' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s B -l bookmarks --description 'Compare bookmarks' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s b -l branch -x --description '[+] a specific branch you would like to pull' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s p -l patch --description 'Show patch' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s g -l git --description 'Use git extended diff format' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s l -l limit -x --description 'Limit number of changes displayed' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s M -l no-merges --description 'Do not show merges' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -l stat --description 'Output diffstat-style summary of changes' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -l style -x --description 'Display using template map file' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -l template -x --description 'Display with template' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring web.cacerts' complete -c hg -n 'contains \'incoming\' (commandline -poc)' -s S -l subrepos --description 'Recurse into subrepositories' # # Completions for the 'init' subcommand # complete -c hg -n 'contains \'init\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'init\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'init\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring web.cacerts' # # Completions for the 'locate' subcommand # complete -c hg -n 'contains \'locate\' (commandline -poc)' -s r -l rev -x --description 'Search the repository as it is in REV' complete -c hg -n 'contains \'locate\' (commandline -poc)' -s 0 -l print0 --description 'End filenames with NUL, for use with xargs' complete -c hg -n 'contains \'locate\' (commandline -poc)' -s f -l fullpath --description 'Print complete paths from the filesystem root' complete -c hg -n 'contains \'locate\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'locate\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'log' subcommand # complete -c hg -n 'contains \'log\' (commandline -poc)' -l follow -x --description 'A filename will only show ancestors or' complete -c hg -n 'contains \'log\' (commandline -poc)' -s f -l follow --description 'Follow changeset history, or file history across' complete -c hg -n 'contains \'log\' (commandline -poc)' -s d -l date -x --description 'Show revisions matching date spec' complete -c hg -n 'contains \'log\' (commandline -poc)' -s C -l copies --description 'Show copied files' complete -c hg -n 'contains \'log\' (commandline -poc)' -s k -l keyword -x --description '[+] do case-insensitive search for a given text' complete -c hg -n 'contains \'log\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'log\' (commandline -poc)' -l removed --description 'Include revisions where files were removed' complete -c hg -n 'contains \'log\' (commandline -poc)' -s u -l user -x --description '[+]' complete -c hg -n 'contains \'log\' (commandline -poc)' -s b -l branch -x --description '[+] show changesets within the given named branch' complete -c hg -n 'contains \'log\' (commandline -poc)' -s P -l prune -x --description '[+]' complete -c hg -n 'contains \'log\' (commandline -poc)' -s p -l patch --description 'Show patch' complete -c hg -n 'contains \'log\' (commandline -poc)' -s g -l git --description 'Use git extended diff format' complete -c hg -n 'contains \'log\' (commandline -poc)' -s l -l limit -x --description 'Limit number of changes displayed' complete -c hg -n 'contains \'log\' (commandline -poc)' -s M -l no-merges --description 'Do not show merges' complete -c hg -n 'contains \'log\' (commandline -poc)' -l stat --description 'Output diffstat-style summary of changes' complete -c hg -n 'contains \'log\' (commandline -poc)' -l style -x --description 'Display using template map file' complete -c hg -n 'contains \'log\' (commandline -poc)' -l template -x --description 'Display with template' complete -c hg -n 'contains \'log\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'log\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'manifest' subcommand # complete -c hg -n 'contains \'manifest\' (commandline -poc)' -s r -l rev -x --description 'Revision to display' complete -c hg -n 'contains \'manifest\' (commandline -poc)' -l all --description 'List files from all revisions' # # Completions for the 'merge' subcommand # complete -c hg -n 'contains \'merge\' (commandline -poc)' -s f -l force --description 'Force a merge with outstanding changes' complete -c hg -n 'contains \'merge\' (commandline -poc)' -s r -l rev -x --description 'Revision to merge' complete -c hg -n 'contains \'merge\' (commandline -poc)' -s P -l preview --description 'Review revisions to merge (no merge is performed)' complete -c hg -n 'contains \'merge\' (commandline -poc)' -s t -l tool -x --description 'Specify merge tool' # # Completions for the 'outgoing' subcommand # complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s f -l force --description 'Run even when the destination is unrelated' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s n -l newest-first --description 'Show newest record first' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s B -l bookmarks --description 'Compare bookmarks' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s b -l branch -x --description '[+] a specific branch you would like to push' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s p -l patch --description 'Show patch' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s g -l git --description 'Use git extended diff format' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s l -l limit -x --description 'Limit number of changes displayed' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s M -l no-merges --description 'Do not show merges' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -l stat --description 'Output diffstat-style summary of changes' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -l style -x --description 'Display using template map file' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -l template -x --description 'Display with template' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring web.cacerts' complete -c hg -n 'contains \'outgoing\' (commandline -poc)' -s S -l subrepos --description 'Recurse into subrepositories' # # Completions for the 'parents' subcommand # complete -c hg -n 'contains \'parents\' (commandline -poc)' -s r -l rev -x --description 'Show parents of the specified revision' complete -c hg -n 'contains \'parents\' (commandline -poc)' -l style -x --description 'Display using template map file' complete -c hg -n 'contains \'parents\' (commandline -poc)' -l template -x --description 'Display with template' # # Completions for the 'paths' subcommand # # # Completions for the 'phase' subcommand # complete -c hg -n 'contains \'phase\' (commandline -poc)' -s p -l public --description 'Set changeset phase to public' complete -c hg -n 'contains \'phase\' (commandline -poc)' -s d -l draft --description 'Set changeset phase to draft' complete -c hg -n 'contains \'phase\' (commandline -poc)' -s s -l secret --description 'Set changeset phase to secret' complete -c hg -n 'contains \'phase\' (commandline -poc)' -s f -l force --description 'Allow to move boundary backward' complete -c hg -n 'contains \'phase\' (commandline -poc)' -s r -l rev -x --description '[+] target revision' # # Completions for the 'pull' subcommand # complete -c hg -n 'contains \'pull\' (commandline -poc)' -s u -l update --description 'Update to new branch head if changesets were' complete -c hg -n 'contains \'pull\' (commandline -poc)' -s f -l force --description 'Run even when remote repository is unrelated' complete -c hg -n 'contains \'pull\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'pull\' (commandline -poc)' -s B -l bookmark -x --description '[+] bookmark to pull' complete -c hg -n 'contains \'pull\' (commandline -poc)' -s b -l branch -x --description '[+]' complete -c hg -n 'contains \'pull\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'pull\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'pull\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring' # # Completions for the 'push' subcommand # complete -c hg -n 'contains \'push\' (commandline -poc)' -l new-branch -x --description 'You want to allow push to create a new named branch' complete -c hg -n 'contains \'push\' (commandline -poc)' -s f -l force --description 'Force push' complete -c hg -n 'contains \'push\' (commandline -poc)' -s r -l rev -x --description '[+]' complete -c hg -n 'contains \'push\' (commandline -poc)' -s B -l bookmark -x --description '[+] bookmark to push' complete -c hg -n 'contains \'push\' (commandline -poc)' -s b -l branch -x --description '[+]' complete -c hg -n 'contains \'push\' (commandline -poc)' -l new-branch --description 'Allow pushing a new branch' complete -c hg -n 'contains \'push\' (commandline -poc)' -s e -l ssh -x --description 'Specify ssh command to use' complete -c hg -n 'contains \'push\' (commandline -poc)' -l remotecmd -x --description 'Specify hg command to run on the remote side' complete -c hg -n 'contains \'push\' (commandline -poc)' -l insecure --description 'Do not verify server certificate (ignoring' # # Completions for the 'recover' subcommand # # # Completions for the 'remove' subcommand # complete -c hg -n 'contains \'remove\' (commandline -poc)' -s A -l after --description 'Record delete for missing files' complete -c hg -n 'contains \'remove\' (commandline -poc)' -s f -l force --description 'Remove (and delete) file even if added or modified' complete -c hg -n 'contains \'remove\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'remove\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'rename' subcommand # complete -c hg -n 'contains \'rename\' (commandline -poc)' -s A -l after --description 'Record a rename that has already occurred' complete -c hg -n 'contains \'rename\' (commandline -poc)' -s f -l force --description 'Forcibly copy over an existing managed file' complete -c hg -n 'contains \'rename\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'rename\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'rename\' (commandline -poc)' -s n -l dry-run --description 'Do not perform actions, just print output' # # Completions for the 'resolve' subcommand # complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s a -l all --description 'Select all unresolved files' complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s l -l list --description 'List state of files needing merge' complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s m -l mark --description 'Mark files as resolved' complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s u -l unmark --description 'Mark files as unresolved' complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s n -l no-status --description 'Hide status prefix' complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s t -l tool -x --description 'Specify merge tool' complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'resolve\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' # # Completions for the 'revert' subcommand # complete -c hg -n 'contains \'revert\' (commandline -poc)' -s a -l all --description 'Revert all changes when no arguments given' complete -c hg -n 'contains \'revert\' (commandline -poc)' -s d -l date -x --description 'Tipmost revision matching date' complete -c hg -n 'contains \'revert\' (commandline -poc)' -s r -l rev -x --description 'Revert to the specified revision' complete -c hg -n 'contains \'revert\' (commandline -poc)' -s C -l no-backup --description 'Do not save backup copies of files' complete -c hg -n 'contains \'revert\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'revert\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'revert\' (commandline -poc)' -s n -l dry-run --description 'Do not perform actions, just print output' # # Completions for the 'rollback' subcommand # complete -c hg -n 'contains \'rollback\' (commandline -poc)' -s n -l dry-run -x --description 'Not perform actions, just print output' complete -c hg -n 'contains \'rollback\' (commandline -poc)' -s f -l force --description 'Ignore safety measures' # # Completions for the 'root' subcommand # # # Completions for the 'serve' subcommand # complete -c hg -n 'contains \'serve\' (commandline -poc)' -s A -l accesslog -x --description 'Name of access log file to write to' complete -c hg -n 'contains \'serve\' (commandline -poc)' -s d -l daemon --description 'Run server in background' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l daemon-pipefds -x --description 'Used internally by daemon mode' complete -c hg -n 'contains \'serve\' (commandline -poc)' -s E -l errorlog -x --description 'Name of error log file to write to' complete -c hg -n 'contains \'serve\' (commandline -poc)' -s p -l port -x --description 'Port to listen on (default: 8000)' complete -c hg -n 'contains \'serve\' (commandline -poc)' -s a -l address -x --description 'Address to listen on (default: all interfaces)' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l prefix -x --description 'Prefix path to serve from (default: server root)' complete -c hg -n 'contains \'serve\' (commandline -poc)' -s n -l name -x --description 'Name to show in web pages (default: working' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l web-conf -x --description 'Name of the hgweb config file (see "hg help hgweb")' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l pid-file -x --description 'Name of file to write process ID to' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l stdio --description 'For remote clients' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l cmdserver -x --description 'For remote clients' complete -c hg -n 'contains \'serve\' (commandline -poc)' -s t -l templates -x --description 'Web templates to use' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l style -x --description 'Template style to use' complete -c hg -n 'contains \'serve\' (commandline -poc)' -s 6 -l ipv6 --description 'Use IPv6 in addition to IPv4' complete -c hg -n 'contains \'serve\' (commandline -poc)' -l certificate -x --description 'SSL certificate file' # # Completions for the 'showconfig' subcommand # complete -c hg -n 'contains \'showconfig\' (commandline -poc)' -s u -l untrusted -x --description 'Untrusted configuration options' # # Completions for the 'status' subcommand # complete -c hg -n 'contains \'status\' (commandline -poc)' -s A -l all --description 'Show status of all files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s m -l modified --description 'Show only modified files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s a -l added --description 'Show only added files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s r -l removed --description 'Show only removed files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s d -l deleted --description 'Show only deleted (but tracked) files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s c -l clean --description 'Show only files without changes' complete -c hg -n 'contains \'status\' (commandline -poc)' -s u -l unknown --description 'Show only unknown (not tracked) files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s i -l ignored --description 'Show only ignored files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s n -l no-status --description 'Hide status prefix' complete -c hg -n 'contains \'status\' (commandline -poc)' -s C -l copies --description 'Show source of copied files' complete -c hg -n 'contains \'status\' (commandline -poc)' -s 0 -l print0 --description 'End filenames with NUL, for use with xargs' complete -c hg -n 'contains \'status\' (commandline -poc)' -l rev -x --description '[+]' complete -c hg -n 'contains \'status\' (commandline -poc)' -l change -x --description 'List the changed files of a revision' complete -c hg -n 'contains \'status\' (commandline -poc)' -s I -l include -x --description '[+] include names matching the given patterns' complete -c hg -n 'contains \'status\' (commandline -poc)' -s X -l exclude -x --description '[+] exclude names matching the given patterns' complete -c hg -n 'contains \'status\' (commandline -poc)' -s S -l subrepos --description 'Recurse into subrepositories' # # Completions for the 'summary' subcommand # complete -c hg -n 'contains \'summary\' (commandline -poc)' -l remote -x --description 'For push and pull' # # Completions for the 'tag' subcommand # complete -c hg -n 'contains \'tag\' (commandline -poc)' -s f -l force --description 'Force tag' complete -c hg -n 'contains \'tag\' (commandline -poc)' -s l -l local --description 'Make the tag local' complete -c hg -n 'contains \'tag\' (commandline -poc)' -s r -l rev -x --description 'Revision to tag' complete -c hg -n 'contains \'tag\' (commandline -poc)' -l remove --description 'Remove a tag' complete -c hg -n 'contains \'tag\' (commandline -poc)' -s e -l edit --description 'Edit commit message' complete -c hg -n 'contains \'tag\' (commandline -poc)' -s m -l message -x --description 'Use as commit message' complete -c hg -n 'contains \'tag\' (commandline -poc)' -s d -l date -x --description 'Record the specified date as commit date' complete -c hg -n 'contains \'tag\' (commandline -poc)' -s u -l user -x --description 'Record the specified user as committer' # # Completions for the 'tags' subcommand # # # Completions for the 'tip' subcommand # complete -c hg -n 'contains \'tip\' (commandline -poc)' -s p -l patch --description 'Show patch' complete -c hg -n 'contains \'tip\' (commandline -poc)' -s g -l git --description 'Use git extended diff format' complete -c hg -n 'contains \'tip\' (commandline -poc)' -l style -x --description 'Display using template map file' complete -c hg -n 'contains \'tip\' (commandline -poc)' -l template -x --description 'Display with template' # # Completions for the 'unbundle' subcommand # complete -c hg -n 'contains \'unbundle\' (commandline -poc)' -s u -l update -x --description 'To new branch head if changesets were unbundled' # # Completions for the 'update' subcommand # complete -c hg -n 'contains \'update\' (commandline -poc)' -s C -l clean --description 'Discard uncommitted changes (no backup)' complete -c hg -n 'contains \'update\' (commandline -poc)' -s c -l check --description 'Update across branches if no uncommitted changes' complete -c hg -n 'contains \'update\' (commandline -poc)' -s d -l date -x --description 'Tipmost revision matching date' complete -c hg -n 'contains \'update\' (commandline -poc)' -s r -l rev -x --description 'Revision' # # Completions for the 'verify' subcommand # # # Completions for the 'version' subcommand # # # Completions for the 'config' subcommand # complete -c hg -n 'contains \'config\' (commandline -poc)' -l ---BEGIN --description 'CERTIFICATE-----' complete -c hg -n 'contains \'config\' (commandline -poc)' -l ---END --description 'CERTIFICATE-----' complete -c hg -n 'contains \'config\' (commandline -poc)' -l ---BEGIN --description 'CERTIFICATE-----' complete -c hg -n 'contains \'config\' (commandline -poc)' -l ---END --description 'CERTIFICATE-----' # # Completions for the 'dates' subcommand # # # Completions for the 'diffs' subcommand # # # Completions for the 'environment' subcommand # # # Completions for the 'extensions' subcommand # # # Completions for the 'filesets' subcommand # # # Completions for the 'glossary' subcommand # # # Completions for the 'hgignore' subcommand # # # Completions for the 'hgweb' subcommand # # # Completions for the 'merge-tools' subcommand # # # Completions for the 'multirevs' subcommand # # # Completions for the 'patterns' subcommand # # # Completions for the 'phases' subcommand # # # Completions for the 'revisions' subcommand # # # Completions for the 'revsets' subcommand # # # Completions for the 'subrepos' subcommand # # # Completions for the 'templating' subcommand # complete -c hg -n 'contains \'templating\' (commandline -poc)' -l template -x --description 'Or select an existing template-style (--style)' complete -c hg -n 'contains \'templating\' (commandline -poc)' -l copied -x --description 'Is set' # # Completions for the 'urls' subcommand # fish/share/completions/highlight.fish000066400000000000000000000012361214535744100202770ustar00rootroot00000000000000 complete -c highlight -s O -l out-format -d 'Output file in given format' -xa 'xterm256 latex tex rtf html xhtml ansi bbcode svg' complete -c highlight -s t -l tab -d 'Specify tab length' -x complete -c highlight -s i -l input -d 'Name of the input file' -r complete -c highlight -s o -l output -d 'Name of the output file' -r complete -c highlight -s d -l outdir -d 'Output directory' -r complete -c highlight -s S -l syntax -d 'Set type of the source code' -xa "(highlight -p | sed -r 's/^(.*\S)\s+:\s*(\S+).*\$/\2\t\1/; /^\$/d')" complete -c highlight -s s -l style -d 'Highlight style' -xa "(highlight --list-themes | sed '/^\$\| /d')" fish/share/completions/history.fish000066400000000000000000000007261214535744100200340ustar00rootroot00000000000000complete -c history -r -l prefix --description "Match history items that start with the given prefix" complete -c history -r -l contains --description "Match history items that contain the given string" complete -c history -l search --description "Print matching history items, which is the default behavior" complete -c history -l delete --description "Interactively delete matching history items" complete -c history -l clear --description "Clear your entire history" fish/share/completions/htop.fish000066400000000000000000000003651214535744100173040ustar00rootroot00000000000000# Completions for top complete -c htop -s d --description "Update interval" -x complete -c htop -s u --description "Monitor effective UID" -x -a "(__fish_complete_users)" complete -c htop -l sort-key -d 'Sort column' -xa "(htop --sort-key '')" fish/share/completions/iconv.fish000066400000000000000000000011011214535744100174350ustar00rootroot00000000000000 complete -c iconv -s f -l from-code --description "Convert from specified encoding" -x -a "(__fish_print_encodings)" complete -c iconv -s t -l to-code --description "Convert to specified encoding" -x -a "(__fish_print_encodings)" complete -c iconv -l list --description "List known coded character sets" complete -c iconv -s o -l output --description "Output file" -r complete -c iconv -l verbose --description "Print progress information" complete -c iconv -l help --description "Display version and exit" complete -c iconv -l version --description "Display help and exit" fish/share/completions/id.fish000066400000000000000000000007311214535744100167230ustar00rootroot00000000000000complete -c id -s g -l group --description "Print effective group id" complete -c id -s G -l groups --description "Print all group ids" complete -c id -s n -l name --description "Print name, not number" complete -c id -s r -l real --description "Print real ID, not effective" complete -c id -s u -l user --description "Print effective user ID" complete -c id -l help --description "Display help and exit" complete -c id -l version --description "Display version and exit" fish/share/completions/identify.fish000066400000000000000000000067531214535744100201540ustar00rootroot00000000000000complete -c identify -o antialias -d 'Remove pixel-aliasing ' complete -c identify -o authenticate -d 'Decrypt image with this password [value]' complete -c identify -o channel -d 'Apply option to select image channels [type]' -xa '(identify -list channel)' complete -c identify -o crop -d 'Cut out a rectangular region of the image [geometry]' complete -c identify -o define -d 'Define one or more image format options [format:option]' complete -c identify -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c identify -o depth -d 'Image depth [value]' complete -c identify -o extract -d 'Extract area from image [geometry]' complete -c identify -o features -d 'Display image features (e.g. contrast, correlation) [distance]' complete -c identify -o format -d 'Output formatted image characteristics ["string"]' complete -c identify -o fuzz -d 'Colors within this distance are considered equal [distance]' complete -c identify -o interlace -d 'Type of image interlacing scheme [type]' -xa '(identify -list interlace)' complete -c identify -o interpolate -d 'Pixel color interpolation method [method]' -xa '(identify -list interpolate)' complete -c identify -o limit -d 'Pixel cache resource limit [type value]' -x complete -c identify -o list -d 'Color, Configure, Delegate, Format, Magic, Module, Resource, or Type [type]' -xa '(identify -list list)' complete -c identify -o matte -d 'Store matte channel if the image has one' complete -c identify -o monitor -d 'Monitor progress ' complete -c identify -o ping -d 'Efficiently determine image attributes' complete -c identify -o quiet -d 'Suppress all warning messages' complete -c identify -o regard-warnings -d 'Pay attention to warning messages' complete -c identify -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c identify -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c identify -o set -d 'Attribute set an image attribute [ value]' complete -c identify -o size -d 'Width and height of image [geometry]' complete -c identify -o strip -d 'Strip image of all profiles and comments' complete -c identify -o unique -d 'Display the number of unique colors in the image' complete -c identify -o units -d 'The units of image resolution [type]' -xa '(identify -list units)' complete -c identify -o verbose -d 'Print detailed information about the image' complete -c identify -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(identify -list virtual-pixel)' complete -c identify -o negate -d 'Replace each pixel with its complementary color' complete -c identify -o debug -d 'Display copious debugging information [events]' -xa '(identify -list debug)' complete -c identify -o help -d 'Print program options' complete -c identify -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' fish/share/completions/ifconfig.fish000066400000000000000000000006561214535744100201210ustar00rootroot00000000000000complete -x -c ifconfig -a down --description "Stop interface" complete -x -c ifconfig -a up --description "Start interface" complete -x -c ifconfig -a " {,-}arp {,-}promisc {,-}allmulti metric mtu dstaddr netmask add del tunnel irq io_addr mem_start media {,-}broadcast {,-}pointopoint hw multicast address txqueuelen " complete -x -c ifconfig -a "(__fish_print_interfaces)" --description "Network interface" fish/share/completions/ifdata.fish000066400000000000000000000033071214535744100175610ustar00rootroot00000000000000complete -c ifdata -xa '(__fish_print_interfaces)' complete -c ifdata -o e -d 'Reports interface existence via return code' complete -c ifdata -o p -d 'Print out the whole config of iface' complete -c ifdata -o pe -d 'Print out yes or no according to existence' complete -c ifdata -o pa -d 'Print out the address' complete -c ifdata -o pn -d 'Print netmask' complete -c ifdata -o pN -d 'Print network address' complete -c ifdata -o pb -d 'Print broadcast' complete -c ifdata -o pm -d 'Print mtu' complete -c ifdata -o ph -d 'Print out the hardware address' complete -c ifdata -o pf -d 'Print flags' complete -c ifdata -o si -d 'Print all statistics on input' complete -c ifdata -o sip -d 'Print # of in packets' complete -c ifdata -o sib -d 'Print # of in bytes' complete -c ifdata -o sie -d 'Print # of in errors' complete -c ifdata -o sid -d 'Print # of in drops' complete -c ifdata -o sif -d 'Print # of in fifo overruns' complete -c ifdata -o sic -d 'Print # of in compress' complete -c ifdata -o sim -d 'Print # of in multicast' complete -c ifdata -o so -d 'Print all statistics on output' complete -c ifdata -o sop -d 'Print # of out packets' complete -c ifdata -o sob -d 'Print # of out bytes' complete -c ifdata -o soe -d 'Print # of out errors' complete -c ifdata -o sod -d 'Print # of out drops' complete -c ifdata -o sof -d 'Print # of out fifo overruns' complete -c ifdata -o sox -d 'Print # of out collisions' complete -c ifdata -o soc -d 'Print # of out carrier loss' complete -c ifdata -o som -d 'Print # of out multicast' complete -c ifdata -o bips -d 'Print # of incoming bytes per second' complete -c ifdata -o bops -d 'Print # of outgoing bytes per second' fish/share/completions/ifdown.fish000066400000000000000000000002111214535744100176060ustar00rootroot00000000000000complete -x -c ifdown -a "(__fish_print_interfaces)" --description "Network interface" complete -c ifdown -l force --description "force" fish/share/completions/ifup.fish000066400000000000000000000002061214535744100172670ustar00rootroot00000000000000complete -x -c ifup -a "(__fish_print_interfaces)" --description "Network interface" complete -c ifup -l force --description "force" fish/share/completions/import.fish000066400000000000000000000162431214535744100176460ustar00rootroot00000000000000complete -c import -o adjoin -d 'Join images into a single multi-image file' complete -c import -o border -d 'Include window border in the output image' complete -c import -o channel -d 'Apply option to select image channels [type]' -xa '(import -list channel)' complete -c import -o colorspace -d 'Alternate image colorspace [type]' -xa '(import -list colorspace)' complete -c import -o comment -d 'Annotate image with comment [string]' complete -c import -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(import -list compress)' complete -c import -o define -d 'Define one or more image format options [format:option]' complete -c import -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c import -o depth -d 'Image depth [value]' complete -c import -o descend -d 'Obtain image by descending window hierarchy' complete -c import -o display -d 'X server to contact [server]' complete -c import -o dispose -d 'Layer disposal method [method]' -xa '(import -list dispose)' complete -c import -o dither -d 'Apply error diffusion to image [method]' -xa '(import -list dither)' complete -c import -o delay -d 'Display the next image after pausing [value]' complete -c import -o encipher -d 'Convert plain pixels to cipher pixels [filename]' -r complete -c import -o endian -d 'Endianness (MSB or LSB) of the image [type]' -xa '(import -list endian)' complete -c import -o encoding -d 'Encoding type [type text]' -xa '(__fish_print_encodings)' complete -c import -o filter -d 'Use this filter when resizing an image [type]' -xa '(import -list filter)' complete -c import -o format -d 'Output formatted image characteristics ["string"]' complete -c import -o frame -d 'Include window manager frame' complete -c import -o gravity -d 'Direction which direction to gravitate towards' complete -c import -o identify -d 'Identify the format and characteristics of the image' complete -c import -o interlace -d 'None, Line, Plane, or Partition [type]' -xa '(import -list interlace)' complete -c import -o interpolate -d 'Pixel color interpolation method [method]' -xa '(import -list interpolate)' complete -c import -o label -d 'Assign a label to an image [string]' complete -c import -o limit -d 'Area, Disk, Map, or Memory resource limit [type value]' -x complete -c import -o monitor -d 'Monitor progress ' complete -c import -o page -d 'Size and location of an image canvas [geometry]' complete -c import -o pause -d 'Seconds delay between snapshots [value]' complete -c import -o pointsize -d 'Font point size [value]' complete -c import -o quality -d 'JPEG/MIFF/PNG compression level [value]' complete -c import -o quiet -d 'Suppress all warning messages' complete -c import -o regard-warnings -d 'Pay attention to warning messages' complete -c import -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c import -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c import -o scene -d 'Image scene number [value]' complete -c import -o screen -d 'Select image from root window' complete -c import -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c import -o set -d 'Set an image property [property value]' complete -c import -o silent -d 'Operate silently, i.e. don\'t ring any bells ' complete -c import -o snaps -d 'Number of screen snapshots [value]' complete -c import -o synchronize -d 'Synchronize image to storage device' complete -c import -o taint -d 'Declare the image as modified' complete -c import -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c import -o treedepth -d 'Color tree depth [value]' complete -c import -o verbose -d 'Print detailed information about the image' complete -c import -o virtual-pixel -d 'Constant, Edge, Mirror, or Tile [method]' -xa '(import -list virtual-pixel)' complete -c import -o window -d 'Select window with this id or name [id]' -xa 'root (__fish_print_xwindows)' complete -c import -o annotate -d 'Annotate the image with text [geometry text]' complete -c import -o colors -d 'Preferred number of colors in the image [value]' complete -c import -o crop -d 'Preferred size and location of the cropped image [geometry]' complete -c import -o geometry -d 'Preferred size or location of the image [geometry]' complete -c import -o help -d 'Print program options' complete -c import -o monochrome -d 'Transform image to black and white' complete -c import -o negate -d 'Replace every pixel with its complementary color ' complete -c import -o repage -d 'Size and location of an image canvas [geometry]' complete -c import -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(import -list colorspace)' complete -c import -o resize -d 'Resize the image [geometry]' complete -c import -o rotate -d 'Apply Paeth rotation to the image [degrees]' complete -c import -o strip -d 'Strip image of all profiles and comments' complete -c import -o thumbnail -d 'Create a thumbnail of the image [geometry]' complete -c import -o transparent -d 'Make this color transparent within the image [color]' -xa '(__fish_complete_convert_options color)' complete -c import -o trim -d 'Trim image edges' complete -c import -o type -d 'Image type [type]' -xa '(import -list type)' complete -c import -o debug -d 'Display copious debugging information [events]' -xa '(import -list debug)' complete -c import -o list -d 'Print a list of supported option arguments [type]' -xa '(import -list list)' complete -c import -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c import -o version -d 'Print version information' complete -c import -o support -d 'Resize support: > 1.0 is blurry, < 1.0 is sharp [factor]' fish/share/completions/invoke-rc.d.fish000066400000000000000000000015421214535744100204470ustar00rootroot00000000000000 function __fish_invoke_rcd_has_service set tokens (commandline -opc) if [ (count $tokens) -eq 2 ] return 0 else return 1 end end complete -f -c invoke-rc.d -n 'not __fish_invoke_rcd_has_service' -a '(__fish_print_debian_services)' complete -f -c invoke-rc.d -n '__fish_invoke_rcd_has_service' -a 'start' -d 'Start the service' complete -f -c invoke-rc.d -n '__fish_invoke_rcd_has_service' -a 'stop' -d 'Stop the service' complete -f -c invoke-rc.d -n '__fish_invoke_rcd_has_service' -a 'restart' -d 'Restart the service' complete -f -c invoke-rc.d -n '__fish_invoke_rcd_has_service' -a 'reload' -d 'Reload Configuration' complete -f -c invoke-rc.d -n '__fish_invoke_rcd_has_service' -a 'force-reload' -d 'Force reloading configuration' complete -f -c invoke-rc.d -n '__fish_invoke_rcd_has_service' -a 'status' -d 'Print the status of the service' fish/share/completions/jobs.fish000066400000000000000000000006161214535744100172660ustar00rootroot00000000000000 complete -c jobs -s h -l help --description 'Display help and exit' complete -c jobs -s p -l pid --description "Show the process id of each process in the job" complete -c jobs -s g -l group --description "Show group id of job" complete -c jobs -s c -l command --description "Show commandname of each job" complete -c jobs -s l -l last --description "Only show status for last job to be started" fish/share/completions/kill.fish000066400000000000000000000005771214535744100172720ustar00rootroot00000000000000__fish_make_completion_signals for i in $__kill_signals set number (echo $i | cut -d " " -f 1) set name (echo $i | cut -d " " -f 2) complete -c kill -o $number -d $name complete -c kill -o $name -d $name complete -c kill -o s -x -a \"$number\tSend\ $name\ signal\" complete -c kill -o s -x -a \"$name\tSend\ $name\ signal\" end complete -c kill -xa '(__fish_complete_pids)' fish/share/completions/killall.fish000066400000000000000000000024171214535744100177560ustar00rootroot00000000000000__fish_make_completion_signals for i in $__kill_signals set number (echo $i | cut -d " " -f 1) set name (echo $i | cut -d " " -f 2) complete -c killall -o $number -d $name complete -c killall -o $name -d $name complete -c killall -o s -x -a \"$number\tSend\ $name\ signal\" complete -c killall -o s -x -a \"$name\tSend\ $name\ signal\" end complete -c killall -xa '(__fish_complete_proc)' complete -c killall -s e -l exact -d 'Require an exact match for very long names' complete -c killall -s I -l ignore-case -d 'Do case insensitive process name match' complete -c killall -s g -l process-group -d 'Kill the process group to which the process belongs. The kill signal is only sent once per group, even if multiple processes belonging to the same process group were found' complete -c killall -s i -l interactive -d 'Interactively ask for confirmation before killing' complete -c killall -s u -l user -d 'Kill only processes the specified user owns. Command names are optional' complete -c killall -s w -l wait -d 'Wait for all killed processes to die. killall checks once per second if any of the killed processes still exist and only returns if none are left. Note that killall may wait forever if the signal was ignored, had no effect, or if the process stays in zombie state' fish/share/completions/la.fish000066400000000000000000000000271214535744100167210ustar00rootroot00000000000000 __fish_complete_ls la fish/share/completions/latex.fish000066400000000000000000000000331214535744100174370ustar00rootroot00000000000000__fish_complete_tex latex fish/share/completions/latexmk.fish000066400000000000000000000125411214535744100177760ustar00rootroot00000000000000complete -c latexmk -x -a "(__fish_complete_suffix (commandline -ct) .tex '(La)TeX file')" complete -c latexmk -o bibtex -d 'use bibtex when needed (default)' complete -c latexmk -o bibtex- -d 'never use bibtex' complete -c latexmk -o bibtex-cond -d 'use bibtex when needed, but only if the bib files exist' complete -c latexmk -o bm -x -d 'Print message across the page when converting to postscript' complete -c latexmk -o bi -x -d 'Set contrast or intensity of banner' complete -c latexmk -o bs -x -d 'Set scale for banner' complete -c latexmk -o commands -d 'list commands used by latexmk for processing files' complete -c latexmk -o c -d 'clean up (remove) all nonessential files, except dvi, ps and pdf files' complete -c latexmk -o C -o CA -d 'clean up (remove) all nonessential files' complete -c latexmk -o CF -d 'Remove file of database of file information before doing other actions' complete -c latexmk -o cd -d 'Change to directory of source file when processing it' complete -c latexmk -o cd- -d 'Do NOT change to directory of source file when processing it' complete -c latexmk -o dependents -o -deps -d 'Show list of dependent files after processing' complete -c latexmk -o dependents- -o -deps- -d 'Do not show list of dependent files' complete -c latexmk -o deps-out= -r -d 'Set name of output file for dependency list, and turn on showing of dependency list' complete -c latexmk -o dF -x -d 'Filter to apply to dvi file' complete -c latexmk -o dvi -d 'generate dvi' complete -c latexmk -o dvi- -d 'turn off required dvi' complete -c latexmk -o e -x -d 'Execute specified Perl code (as part of latexmk start-up code)' complete -c latexmk -o f -d 'force continued processing past errors' complete -c latexmk -o f- -d 'turn off forced continuing processing past errors' complete -c latexmk -o gg -d 'Super go mode: clean out generated files before processing' complete -c latexmk -o g -d 'process regardless of file timestamps' complete -c latexmk -o g- -d 'Turn off -g' complete -c latexmk -o h -o help -d 'print help' complete -c latexmk -o jobname= -x -d 'set basename of output file(s) to STRING' complete -c latexmk -o l -d 'force landscape mode' complete -c latexmk -o l- -d 'turn off -l' complete -c latexmk -o latex= -d 'set program used for latex' -xa '(__fish_complete_command)' complete -c latexmk -o new-viewer -d 'in -pvc mode, always start a new viewer' complete -c latexmk -o new-viewer- -d 'in -pvc mode, start a new viewer only if needed' complete -c latexmk -o nobibtex -d 'never use bibtex' complete -c latexmk -o nodependents -d 'Do not show list of dependent files after processing' complete -c latexmk -o norc -d 'omit automatic reading of system, user and project rc files' complete -c latexmk -o output-directory= -o outdir= -d 'set name of directory for output files' -xa '(__fish_complete_directories)' complete -c latexmk -o pdf -d 'generate pdf by pdflatex' complete -c latexmk -o pdfdvi -d 'generate pdf by dvipdf' complete -c latexmk -o pdflatex= -d 'set program used for pdflatex' -xa '(__fish_complete_command)' complete -c latexmk -o pdfps -d 'generate pdf by ps2pdf' complete -c latexmk -o pdf- -d 'turn off pdf' complete -c latexmk -o ps -d 'generate postscript' complete -c latexmk -o ps- -d 'turn off postscript' complete -c latexmk -o pF -x -d 'Filter to apply to postscript file' complete -c latexmk -o p -d 'print document after generating postscript' complete -c latexmk -o print=dvi -d 'when file is to be printed, print the dvi file' complete -c latexmk -o print=ps -d 'when file is to be printed, print the ps file (default)' complete -c latexmk -o print=pdf -d 'when file is to be printed, print the pdf file' complete -c latexmk -o pv -d 'preview document' complete -c latexmk -o pv- -d 'turn off preview mode' complete -c latexmk -o pvc -d 'preview document and continuously update' complete -c latexmk -o pvc- -d 'turn off -pvc' complete -c latexmk -o quiet -d 'silence progress messages from called programs' complete -c latexmk -o r -r -d 'Read custom RC file' complete -c latexmk -o recorder -d 'Use -recorder option for (pdf)latex' complete -c latexmk -o recorder- -d 'Do not use -recorder option for (pdf)latex' complete -c latexmk -o rules -d 'Show list of rules after processing' complete -c latexmk -o rules- -d 'Do not show list of rules after processing' complete -c latexmk -o silent -d 'silence progress messages from called programs' complete -c latexmk -o time -d 'show CPU time used' complete -c latexmk -o time- -d 'don\'t show CPU time used' complete -c latexmk -o use-make -d 'use the make program to try to make missing files' complete -c latexmk -o use-make- -d 'don\'t use the make program to try to make missing files' complete -c latexmk -o v -d 'display program version' complete -c latexmk -o verbose -d 'display usual progress messages from called programs' complete -c latexmk -o version -d 'display program version' complete -c latexmk -o view=default -d 'viewer is default (dvi, ps, pdf)' complete -c latexmk -o view=dvi -d 'viewer is for dvi' complete -c latexmk -o view=none -d 'no viewer is used' complete -c latexmk -o view=ps -d 'viewer is for ps' complete -c latexmk -o view=pdf -d 'viewer is for pdf' fish/share/completions/lein.fish000066400000000000000000000063341214535744100172630ustar00rootroot00000000000000function __fish_lein_needs_command set cmd (commandline -opc) if [ (count $cmd) -eq 1 -a $cmd[1] = 'lein' ] return 0 end return 1 end complete -f -c lein -n '__fish_lein_needs_command' -a check -d "Check syntax and warn on reflection." complete -f -c lein -n '__fish_lein_needs_command' -a classpath -d "Write the classpath of the current project to output-file." complete -f -c lein -n '__fish_lein_needs_command' -a clean -d "Remove all files from project's target-path." complete -f -c lein -n '__fish_lein_needs_command' -a compile -d "Compile Clojure source into .class files." complete -f -c lein -n '__fish_lein_needs_command' -a deploy -d "Build jar and deploy to remote repository." complete -f -c lein -n '__fish_lein_needs_command' -a deps -d "Show details about dependencies." complete -f -c lein -n '__fish_lein_needs_command' -a do -d "Higher-order task to perform other tasks in succession." complete -f -c lein -n '__fish_lein_needs_command' -a help -d "Display a list of tasks or help for a given task or subtask." complete -f -c lein -n '__fish_lein_needs_command' -a install -d "Install current project to the local repository." complete -f -c lein -n '__fish_lein_needs_command' -a jar -d "Package up all the project's files into a jar file." complete -f -c lein -n '__fish_lein_needs_command' -a javac -d "Compile Java source files." complete -f -c lein -n '__fish_lein_needs_command' -a light -d "Start a Light Table client for this project" complete -f -c lein -n '__fish_lein_needs_command' -a new -d "Generate scaffolding for a new project based on a template." complete -f -c lein -n '__fish_lein_needs_command' -a plugin -d "DEPRECATED. Please use the :user profile instead." complete -f -c lein -n '__fish_lein_needs_command' -a pom -d "Write a pom.xml file to disk for Maven interoperability." complete -f -c lein -n '__fish_lein_needs_command' -a repl -d "Start a repl session either with the current project or standalone." complete -f -c lein -n '__fish_lein_needs_command' -a retest -d "Run only the test namespaces which failed last time around." complete -f -c lein -n '__fish_lein_needs_command' -a run -d "Run the project's -main function." complete -f -c lein -n '__fish_lein_needs_command' -a search -d "Search remote maven repositories for matching jars." complete -f -c lein -n '__fish_lein_needs_command' -a show-profiles -d "List all available profiles or display one if given an argument." complete -f -c lein -n '__fish_lein_needs_command' -a test -d "Run the project's tests." complete -f -c lein -n '__fish_lein_needs_command' -a trampoline -d "Run a task without nesting the project's JVM inside Leiningen's." complete -f -c lein -n '__fish_lein_needs_command' -a uberjar -d "Package up the project files and all dependencies into a jar file." complete -f -c lein -n '__fish_lein_needs_command' -a update-in -d "Perform arbitrary transformations on your project map." complete -f -c lein -n '__fish_lein_needs_command' -a upgrade -d "Upgrade Leiningen to specified version or latest stable." complete -f -c lein -n '__fish_lein_needs_command' -a version -d "Print version for Leiningen and the current JVM." complete -f -c lein -n '__fish_lein_needs_command' -a with-profile -d "Apply the given task with the profile(s) specified."fish/share/completions/less.fish000066400000000000000000000103131214535744100172720ustar00rootroot00000000000000complete -c less -s \? -l help --description "Display help and exit" complete -c less -s a -l search-skip-screen --description "Search after end of screen" complete -c less -s b -l buffers -r --description "Buffer space" complete -c less -s B -l auto-buffers --description "Disable automtic buffer allocation" complete -c less -s c -l clear-screen --description "Repaint from top" complete -c less -s C -l CLEAR-SCREEN --description "Clear and repaint from top" complete -c less -s d -l dumb --description "Supress error for lacking terminal capability" complete -c less -s e -l quit-at-eof --description "Exit on second EOF" complete -c less -s E -l QUIT-AT-EOF --description "Exit on EOF" complete -c less -s f -l force --description "Open non-regular files" complete -c less -s F -l quit-if-one-screen --description "Quit if file shorter than one screen" complete -c less -s g -l hilite-search --description "Hilight one search target" complete -c less -s G -l HILITE-SEARCH --description "No search highlighting" complete -c less -s h -l max-back-scroll --description "Maximum backward scroll" -r -a "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19" complete -c less -s i -l ignore-case --description "Search ignores lowercase case" complete -c less -s I -l IGNORE-CASE --description "Search ignores all case" complete -c less -s j -l jump-target --description "Target line" -r -a "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19" complete -c less -s J -l status-column --description "Display status column" complete -c less -s k -l lesskey-file --description "Specify key bindings file" -r complete -c less -s L -l no-lessopen -d 'Ignore $LESSOPEN' complete -c less -s m -l long-prompt --description "Prompt with percentage" complete -c less -s M -l LONG-PROMPT --description "Verbose prompt" complete -c less -s n -l line-numbers --description "Display line number" complete -c less -s N -l LINE-NUMBERS --description "Display line number for each line" complete -c less -s o -l log-file --description "Log input to file" -r complete -c less -s O -l LOG-FILE --description "Log to file, overwrite" -r complete -c less -s p -l pattern --description "Start at first occurrence of pattern" -r complete -c less -s P -l prompt --description "Prompt string" -r complete -c less -s q -l quiet --description "Silent mode" complete -c less -l silent --description "Silent mode" complete -c less -s Q -l QUIET --description "Completly silent mode" complete -c less -l SILENT --description "Completly silent mode" complete -c less -s r -l raw-control-chars --description "Display control chars" complete -c less -s R -l RAW-CONTROL-CHARS --description "Display control chars, guess screen appearance" complete -c less -s s -l squeeze-blank-lines --description "Multiple blank lines sqeezed" complete -c less -s S -l chop-long-lines --description "Do not fold long lines" complete -c less -s t -l tag --description "Edit tag" -r complete -c less -s T -l tag-file --description "Set tag file" -r complete -c less -s u -l underline-special --description "Allow backspace and carriage return" complete -c less -s U -l UNDERLINE-SPECIAL --description "Allow backspace, tab and carriage return" complete -c less -s V -l version --description "Display version and exit" complete -c less -s w -l hilite-unread --description "Highlight first unread line on new page" complete -c less -s W -l HILITE-UNREAD --description "Highlight first unread line on any movement" complete -c less -s x -l tabs --description "Set tab stops" -r -a "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16" complete -c less -s X -l no-init --description "No termcap init" complete -c less -l no-keypad --description "No keypad init" complete -c less -s y -l max-forw-scroll --description "Maximum forward scroll" -r -a "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19" complete -c less -s z -l window --description "Max scroll window" -r -a "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19" complete -c less -s \" -l quotes --description "Set quote char" -r complete -c less -s \~ -l tilde --description "Lines after EOF are blank" complete -c less -s \# -l shift --description "Characters to scroll on left/right arrows" -a "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19" fish/share/completions/ll.fish000066400000000000000000000000271214535744100167340ustar00rootroot00000000000000 __fish_complete_ls ll fish/share/completions/ln.fish000066400000000000000000000030611214535744100167370ustar00rootroot00000000000000# Completions for ln # Author: SanskritFritz (gmail) complete -c ln -f -s s -l symbolic -d 'Make symbolic links instead of hard links' complete -c ln -f -l backup -a "none off numbered t existing nil simple never" -d 'Make a backup of each existing destination file' complete -c ln -f -s b -d 'Make a backup of each existing destination file' complete -c ln -f -s d -l directory -d 'Allow superuser to attempt to hard link directories' complete -c ln -f -s f -l force -d 'Remove existing destination files' complete -c ln -f -s i -l interactive -d 'Prompt whether to remove destinations' complete -c ln -f -s L -l logical -d 'Dereference TARGETs that are symbolic links' complete -c ln -f -s n -l no-dereference -d 'Treat symlink to directory as if it were a file' complete -c ln -f -s P -l physical -d 'Make hard links directly to symbolic links' complete -c ln -f -s S -l suffix -d 'Override the usual ~ backup suffix' complete -c ln -f -s t -l target-directory -a '(__fish_complete_directories)' -d 'Specify the DIRECTORY in which to create the links' complete -c ln -f -s T -l no-target-directory -d 'Treat LINK_NAME as a normal file' complete -c ln -f -s v -l verbose -d 'Print name of each linked file' complete -c ln -f -l help -d 'Display help and exit' complete -c ln -f -l version -d 'Output version information and exit' fish/share/completions/locate.fish000066400000000000000000000026061214535744100176010ustar00rootroot00000000000000# Completions for locate # Author SanskritFritz (gmail) complete -c locate -s A -l 'all' -d 'Match all non-option arguments' complete -c locate -s b -l 'basename' -d 'Match against the base name of the file' complete -c locate -s c -l 'count' -d 'Print only the number of matches found' complete -c locate -s d -l 'database' -r -d 'Use different DATABASE file[s]' complete -c locate -s e -l 'existing' -d 'Match only existing files' complete -c locate -s L -l 'follow' -d 'Consider broken symbolic links to be non-existing files' complete -c locate -s P -l 'nofollow' -d 'Treat broken symbolic links as if they were existing' complete -c locate -s H -l 'nofollow' -d 'Treat broken symbolic links as if they were existing' complete -c locate -s i -l 'ignore-case' -d 'Ignore case distinctions' complete -c locate -s l -l 'limit' -r -d 'Limit the number of matches' complete -c locate -s 0 -l 'null' -d 'Use ASCII NUL as a separator' complete -c locate -s S -l 'statistics' -d 'Print statistics about databases and exit' complete -c locate -s w -l 'wholename' -d 'Match against the whole name of the file' complete -c locate -s r -l 'regex' -d 'The pattern is a regular expression' complete -c locate -s h -l 'help' -d 'Print a summary of the options and exit' complete -c locate -s V -l 'version' -d 'Print the version number and exit' fish/share/completions/logkeys.fish000066400000000000000000000016051214535744100200050ustar00rootroot00000000000000# Completions for the logkeys command. # Author: SanskritFritz (gmail) complete -c logkeys -s s -l start -d 'Starts the keylogging daemon' complete -c logkeys -s k -l kill -d 'Terminates the logkeys daemon' complete -c logkeys -s o -l output -d 'Set ouput LOGFILE' complete -c logkeys -s m -l keymap -n '__fish_not_contain_opt -s u' -d 'Use file as input KEYMAP' complete -c logkeys -s d -l device -d 'Use DEVICE as keyboard input' complete -c logkeys -s u -l us-keymap -n '__fish_not_contain_opt -s m' -d 'Treat keyboard as standard US keyboard' complete -c logkeys -l export-keymap -d 'Export dynamic KEYMAP to file' complete -c logkeys -l no-func-keys -d 'Log only character key presses' complete -c logkeys -l no-timestamps -d 'No timestamp to each line of log' complete -c logkeys -l post-size -d 'On SIZE, rotate current logfile' complete -c logkeys -l post-http -d 'POST the log file to URL' fish/share/completions/lp.fish000066400000000000000000000013231214535744100167400ustar00rootroot00000000000000__fish_complete_lpr lp complete -c lpr -xa "(__fish_complete_suffix .pdf)" complete -c lpr -xa "(__fish_complete_suffix .ps)" complete -c lp -s d -d 'Prints files to the named printer' -xa '(__fish_print_lpr_printers)' complete -c lp -s i -d 'Specifies an existing job to modify' -x complete -c lp -s n -d 'Sets the number of copies to print from 1 to 100' -x complete -c lp -s q -d 'Sets the job priority from 1 (lowest) to 100 (highest)' complete -c lp -s s -d 'Do not report the resulting job IDs (silent mode)' complete -c lp -s t -d 'Sets the job name' -x complete -c lp -s H -d 'Specifies when the job should be printed' -xa 'hold immediate restart resume HH:MM' complete -c lp -s P -d 'Specify the page ranges' -x fish/share/completions/lpadmin.fish000066400000000000000000000073471214535744100177650ustar00rootroot00000000000000complete -c lpadmin -s c -d 'Adds the named printer to class' -x complete -c lpadmin -s i -d 'Sets a System V style interface script for the printer' -x complete -c lpadmin -s m -d 'Sets a standard System V interface script or PPD file ' -x complete -c lpadmin -s R -d 'Deletes the named option from printer' -xa '(__fish_print_lpr_options)' complete -c lpadmin -s r -d 'Removes the named printer from class. If the resulting class becomes empty it is removed' -x complete -c lpadmin -s v -d 'Sets the device-uri attribute of the printer queue' -r complete -c lpadmin -s D -d 'Provides a textual description of the destination' -x complete -c lpadmin -s E -d 'Enables the destination and accepts jobs' complete -c lpadmin -s L -d 'Provides a textual location of the destination' -x complete -c lpadmin -s P -d 'Specifies a PostScript Printer Description file to use with the printer' -xa "(__fish_complete_suffix .ppd; __fish_complete_suffix .ppd.gz)" complete -c lpadmin -s o -xa cupsIPPSupplies=true -d 'Specifies whether IPP supply level values should be reported' complete -c lpadmin -s o -xa cupsIPPSupplies=false -d 'Specifies whether IPP supply level values should be reported' complete -c lpadmin -s o -xa cupsSNMPSupplies=true -d 'Specifies whether SNMP supply level (RFC 3805) values should be reported' complete -c lpadmin -s o -xa cupsSNMPSupplies=false -d 'Specifies whether SNMP supply level (RFC 3805) values should be reported' complete -c lpadmin -s o -xa job-k-limit= -d 'Sets the kilobyte limit for per-user quotas. The value is an integer number of kilobytes (1024)' complete -c lpadmin -s o -xa job-page-limit= -d 'Sets the page limit for per-user quotas (int) ' complete -c lpadmin -s o -xa job-quota-period= -d 'Sets the accounting period for per-user quotas (sec)' complete -c lpadmin -s o -xa job-sheets-default= -d 'Sets the default banner page(s) to use for print jobs' complete -c lpadmin -s o -d 'Sets a PPD option for the printer' -xa '(__fish_complete_lpr_option)' #complete -c lpadmin -s o -d 'Sets a default server-side option for the destination' -xa '(__fish_complete_lpr_option | sed "s/=/-default=/")' complete -c lpadmin -s o -d 'Sets the binary communications program to use when printing' -xa 'port-monitor=none port-monitor=bcp port-monitor=tbcp' complete -c lpadmin -s o -d 'Sets the error policy to be used when the printer backend is unable to send the job to the printer. ' -xa 'printer-error-policy=abort-job printer-error-policy=retry-job printer-error-policy=retry-current-job printer-error-policy=stop-printer' complete -c lpadmin -s o -xa printer-is-shared=true -d 'Sets the destination to shared/published or unshared/unpublished' complete -c lpadmin -s o -xa printer-is-shared=false -d 'Sets the destination to shared/published or unshared/unpublished' complete -c lpadmin -s o -d 'Sets the IPP operation policy associated with the destination' -xa "printer-policy=(cat /etc/cups/cupsd.conf | grep \/\1/')" complete -c lpadmin -s u -xa 'allow:all allow:none (__fish_complete_list , __fish_complete_users allow:)' -d 'Sets user-level access control on a destination. Names starting with "@" are interpreted as UNIX group' complete -c lpadmin -s u -xa '(__fish_complete_list , __fish_complete_groups allow: @)' -d 'Sets user-level access control on a destination. Names starting with "@" are interpreted as UNIX group' complete -c lpadmin -s u -xa 'deny:all deny:none (__fish_complete_list , __fish_complete_users deny:)' -d 'Sets user-level access control on a destination. Names starting with "@" are interpreted as UNIX group' complete -c lpadmin -s u -xa '(__fish_complete_list , __fish_complete_groups deny: @)' -d 'Sets user-level access control on a destination. Names starting with "@" are interpreted as UNIX group' fish/share/completions/lpinfo.fish000066400000000000000000000017121214535744100176160ustar00rootroot00000000000000__fish_complete_lpr lpinfo complete -c lpinfo -s l -d 'Shows a "long" listing of devices or drivers' complete -c lpinfo -l device-id -x -d 'Specifies the IEEE-1284 device ID to match when listing drivers with the -m option' complete -c lpinfo -l exclude-schemes -x -d 'Specifies a comma-separated list of device or PPD schemes that should be excluded from the results' complete -c lpinfo -l include-schemes -x -d 'Specifies a comma-separated list of device or PPD schemes that should be included in the results' complete -c lpinfo -l language -x -d 'Specifies the language to match when listing drivers with the -m option' complete -c lpinfo -l make-and-model -x -d 'Specifies the make and model to match when listing drivers with the -m option' complete -c lpinfo -l product -x -d 'Specifies the product to match when listing drivers with the -m option' complete -c lpinfo -l timeout -x -d 'Specifies the timeout when listing devices with the -v option (sec)' fish/share/completions/lpmove.fish000066400000000000000000000000341214535744100176250ustar00rootroot00000000000000__fish_complete_lpr lpmove fish/share/completions/lpoptions.fish000066400000000000000000000013061214535744100203550ustar00rootroot00000000000000__fish_complete_lpr lpoptions complete -c lpoptions -s d -d 'Sets the user default printer' -xa '(__fish_print_lpr_printers)' complete -c lpoptions -s l -d 'Lists the printer specific options and their current settings' complete -c lpoptions -s o -d 'Specifies a new option for the named destination' -xa '(__fish_complete_lpr_option)' complete -c lpoptions -s p -d 'Sets the destination and instance for any options that follow' -xa '(__fish_print_lpr_printers)' complete -c lpoptions -s r -d 'Removes the specified option for the named destination' -xa '(__fish_print_lpr_options)' complete -c lpoptions -s x -d 'Removes the options for the named destination and instance' -xa '(__fish_print_lpr_printers)' fish/share/completions/lppasswd.fish000066400000000000000000000004401214535744100201610ustar00rootroot00000000000000complete -c lppasswd -d 'Change CUPS digest password' -xa '(__fish_complete_users)' complete -c lppasswd -s a -d 'Add password' complete -c lppasswd -s x -d 'Remove password' complete -c lppasswd -s g -d 'Specify the group other, than default system group' -xa '(__fish_complete_groups)' fish/share/completions/lpq.fish000066400000000000000000000001431214535744100171200ustar00rootroot00000000000000 __fish_complete_lpr lpq complete -c lpq -s l -d 'Requests a more verbose (long) reporting format' fish/share/completions/lpr.fish000066400000000000000000000017201214535744100171230ustar00rootroot00000000000000__fish_complete_lpr lpr complete -c lpr -xa "(__fish_complete_suffix .pdf)" complete -c lpr -xa "(__fish_complete_suffix .ps)" complete -c lpr -s H -x -d 'Specifies an alternate server' -xa '(__fish_print_hostnames)' complete -c lpr -s C -s J -s T -x -d 'Sets the job name' #complete -c lpr -o '\\#' -d 'Sets the number of copies to print from 1 to 100' -xa complete -c lpr -s h -d 'Disables banner printing' complete -c lpr -s l -d 'Specifies that the print file is already formatted for the destination and should be sent without filtering. This option is equivalent to "-o raw"' complete -c lpr -s p -d 'Specifies that the print file should be formatted with a shaded header with the date, time, job name, and page number. This option is equivalent to "-o prettyprint" and is only useful when printing text files' complete -c lpr -s q -d 'Hold job for printing' complete -c lpr -s r -d 'Specifies that the named print files should be deleted after printing them' fish/share/completions/lprm.fish000066400000000000000000000000311214535744100172720ustar00rootroot00000000000000__fish_complete_lpr lprm fish/share/completions/lpstat.fish000066400000000000000000000025071214535744100176410ustar00rootroot00000000000000__fish_complete_lpr lpstat complete -c lpstat -s H -d 'Show the server hostname and port' complete -c lpstat -s R -d 'Shows the ranking of print jobs' complete -c lpstat -s W -d 'Specifies which jobs to show' -xa 'completed not-completed' complete -c lpstat -s a -d 'Shows the accepting state of selected printer queues' -xa '(__fish_print_lpr_printers)' complete -c lpstat -s c -x -d 'Shows the printer classes and the printers that belong to them. If no classes are specified then all classes are listed' complete -c lpstat -s d -d 'Shows the current default destination' complete -c lpstat -s l -d 'Shows a long listing of printers, classes, or jobs' complete -c lpstat -s o -d 'Shows the jobs queue on the specified destinations' -xa '(__fish_print_lpr_printers)' complete -c lpstat -s p -d 'Shows the printers and whether or not they are enabled for printing' -xa '(__fish_print_lpr_printers)' complete -c lpstat -s r -d 'Shows whether the CUPS server is running' complete -c lpstat -s s -d 'Shows a status summary, including the default destination' complete -c lpstat -s t -d 'Shows all status information' complete -c lpstat -s u -d 'Shows a list of print jobs queued by the specified users' -xa '(__fish_complete_users)' complete -c lpstat -s v -d 'Shows the printers and what device they are attached to' -xa '(__fish_print_lpr_printers)' fish/share/completions/ls.fish000066400000000000000000000000271214535744100167430ustar00rootroot00000000000000 __fish_complete_ls ls fish/share/completions/lsblk.fish000066400000000000000000000021631214535744100174370ustar00rootroot00000000000000complete -c lsblk -s a -l all -d "print all devices" complete -c lsblk -s b -l bytes -d "print SIZE in bytes rather than in human readable format" complete -c lsblk -s d -l nodeps -d "don't print slaves or holders" complete -c lsblk -s D -l discard -d "print discard capabilities" complete -c lsblk -s e -l exclude -d "exclude devices by major number (default: RAM disks)" complete -c lsblk -s f -l fs -d "output info about filesystems" complete -c lsblk -s h -l help -d "usage information (this)" complete -c lsblk -s i -l ascii -d "use ascii characters only" complete -c lsblk -s m -l perms -d "output info about permissions" complete -c lsblk -s n -l noheadings -d "don't print headings" complete -c lsblk -s o -l output -d "output columns" -xa '( __fish_complete_list , __fish_print_lsblk_columns )' complete -c lsblk -s P -l pairs -d "use key='value' output format" complete -c lsblk -s r -l raw -d "use raw output format" complete -c lsblk -s t -l topology -d "output info about topology" complete -c lsblk -s l -l list -d "use list format ouput" fish/share/completions/lsof.fish000066400000000000000000000025101214535744100172670ustar00rootroot00000000000000complete -c lsof -s '?' -s h -d 'Print help and exit' complete -c lsof -s a -d 'Causes list selections to be ANDed' complete -c lsof -s A -r -d 'Use alternative name list file' complete -c lsof -s b -d 'Avoid kernel functions that might block: lstat, readlink, stat' complete -c lsof -s c -d 'Select the listing for processes, whose command begins with string (^ - negate)' -xa '(__fish_complete_proc)' complete -c lsof -s C -d 'Do not report any pathname component from kernel\'s namecache' complete -c lsof -s d -r -d 'specifies a list of file descriptors (FDs) to exclude from or include in the output listing' complete -c lsof -s D -d 'use of device cache file' -xa '\?\t"report device cache file paths" b\t"build the device cache file" i\t"ignore the device cache file" r\t"read the device cache file" u\t"read and update the device cache file"' complete -c lsof -s g -d 'select by group (^ - negates)' -xa '(__fish_complete_list , __fish_complete_groups)' complete -c lsof -s l -d 'Convert UIDs to login names' complete -c lsof -s p -d 'Select or exclude processes by pid' -xa '(__fish_complete_list , __fish_complete_pids)' complete -c lsof -s R -d 'Print PPID' complete -c lsof -s t -d 'Produce terse output (pids only, no header)' complete -c lsof -s u -d 'select by user (^ - negates)' -xa '(__fish_complete_list , __fish_complete_users)' fish/share/completions/lua.fish000066400000000000000000000006731214535744100171150ustar00rootroot00000000000000 complete -c lua -s e -d 'Execute string' -x complete -c lua -s l -d 'Require library' -xa "( find /usr/lib/lua/ -name \*.so -printf '%f\n' | sed 's/.so//' )" complete -c lua -s i -d 'Enter interactive mode after executing script' complete -c lua -s v -d 'Show version' complete -c lua -s h -l help -d 'Print help and exit' complete -c lua -a "(__fish_complete_suffix .lua)" complete -c lua -a '-' -d 'Execute stdin and stop handling options' fish/share/completions/lualatex.fish000066400000000000000000000000361214535744100201440ustar00rootroot00000000000000__fish_complete_tex lualatex fish/share/completions/lxpanel.fish000066400000000000000000000005661214535744100200000ustar00rootroot00000000000000complete -c lxpanel -s h -l help -d 'print this help and exit' complete -c lxpanel -s v -l version -d 'print version and exit' complete -c lxpanel -s p -l profile -d 'use specified profile' -xa '(find ~/.config/lxpanel/ -maxdepth 1 -mindepth 1 -type d -printf "%f\n")' complete -c lxpanel -l log -r -d 'set log level 0-5. 0 - none 5 - chatty' fish/share/completions/m4.fish000066400000000000000000000036121214535744100166500ustar00rootroot00000000000000# # Command specific completions for the m4 command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c m4 -l help --description 'Display this help and exit' complete -c m4 -l version --description 'Output version information and exit' complete -c m4 -s E -l fatal-warnings --description 'Once: warnings become errors, twice: stop execution at first error' complete -c m4 -s i -l interactive --description 'Unbuffer output, ignore interrupts' complete -c m4 -s P -l prefix-builtins --description 'Force a \'m4_\' prefix to all builtins' complete -c m4 -s Q -l quiet -l silent --description 'Suppress some warnings for builtins' complete -c m4 -l warn-macro-sequence --description 'Warn if macro definition matches REGEXP, default \$\({[^}]*}\|[0-9][0-9]+\)' complete -c m4 -s D -l define --description 'Define NAME as having VALUE, or empty' complete -c m4 -s I -l include --description 'Append DIRECTORY to include path' complete -c m4 -s s -l synclines --description 'Generate \'#line NUM "FILE"\' lines' complete -c m4 -s U -l undefine --description 'Undefine NAME' complete -c m4 -s G -l traditional --description 'Suppress all GNU extensions' complete -c m4 -s H -l hashsize --description 'Set symbol lookup hash table size [509]' complete -c m4 -s L -l nesting-limit --description 'Change artificial nesting limit [1024]' complete -c m4 -s F -l freeze-state --description 'Produce a frozen state on FILE at end' complete -c m4 -s R -l reload-state --description 'Reload a frozen state from FILE at start' complete -c m4 -s d -l debug --description 'Set debug level (no FLAGS implies \'aeq\')' complete -c m4 -l debugfile --description 'Redirect debug and trace output' complete -c m4 -s l -l arglength --description 'Restrict macro tracing size' complete -c m4 -s t -l trace --description 'Trace NAME when it is defined' fish/share/completions/make.fish000066400000000000000000000035771214535744100172570ustar00rootroot00000000000000# Completions for make # This completion is a bit ugly. It reenables file completion on # assignments, so e.g. 'make foo FILES=' will recive standard # filename completion. Unfortunatly, this turns out to be a bit # complicated to do. set -l is_assignment "commandline -ct|sgrep '..*='" set -l complete_file_assignment '(commandline -ct)(complete --do-complete=this_command_does_not_exist\ (commandline -ct|sed -e \'s/.*=//\'))' complete -c make --condition $is_assignment -a $complete_file_assignment complete -x -c make -a "(__fish_print_make_targets)" --description "Target" complete -r -c make -s f --description "Use file as makefile" -r complete -x -c make -s C -x -a "(__fish_complete_directories (commandline -ct))" --description "Change directory" complete -c make -s d --description "Debug mode" complete -c make -s e --description "Environment before makefile" complete -c make -s i --description "Ignore errors" complete -x -c make -s I --description "Search directory for makefile" -a "(__fish_complete_directories (commandline -ct))" complete -x -c make -s j --description "Number of concurrent jobs" complete -c make -s k --description "Continue after an error" complete -c make -s l --description "Start when load drops" complete -c make -s n --description "Do not execute commands" complete -c make -s o -r --description "Ignore specified file" complete -c make -s p --description "Print database" complete -c make -s q --description "Question mode" complete -c make -s r --description "Eliminate implicit rules" complete -c make -s s --description "Quiet mode" complete -c make -s S --description "Don't continue after an error" complete -c make -s t --description "Touch files, don't run commands" complete -c make -s v --description "Display version and exit" complete -c make -s w --description "Print working directory" complete -c make -s W -r --description "Pretend file is modified" fish/share/completions/makedepend.fish000066400000000000000000000014441214535744100204260ustar00rootroot00000000000000complete -c makedepend -s D -r --description "Define" complete -c makedepend -s I -r --description "Include directory" complete -c makedepend -s Y -r --description "Replace include directories" complete -c makedepend -s a --description "Append dependencies to makefile" complete -c makedepend -s f -r --description "Specify makefile" complete -c makedepend -o include -r --description "Prepend file to input" complete -c makedepend -s o -r --description "Object file suffix" complete -c makedepend -s p -r --description "Object file prefix" complete -c makedepend -s s -r --description "Starting string delimiter" complete -c makedepend -s w -r --description "Line width" complete -c makedepend -s v --description "Verbose mode" complete -c makedepend -s m --description "Warn about multiple inclusion" fish/share/completions/makepkg.fish000066400000000000000000000052231214535744100177470ustar00rootroot00000000000000# Completions for makepkg 4, the Archlinux utility to build packages from source # Author: Giorgio Lando # SanskritFritz (gmail) complete -c makepkg -l 'asroot' -d 'Allow makepkg to run as root' complete -c makepkg -s A -l 'ignorearch' -d 'Ignore missing or incomplete arch field' complete -c makepkg -s c -l 'clean' -d 'Clean up work files after build' complete -c makepkg -l 'config' -d 'Use alternate config ' complete -c makepkg -s d -l 'nodeps' -d 'Do not perform dependency checks' complete -c makepkg -s e -l 'noextract' -d 'Do not extract source files' complete -c makepkg -s f -l 'force' -d 'Force rebuild of the package' complete -c makepkg -s g -l 'geninteg' -d 'Generate integrity checks' complete -c makepkg -l 'skipinteg' -d 'Do not perform integrity checks' complete -c makepkg -l 'skipchecksums' -d 'Do not verify checksums' complete -c makepkg -l 'skippgpcheck' -d 'Do not verify PGP signatures' complete -c makepkg -s h -l 'help' -d 'Display syntax and command line options' complete -c makepkg -l 'holdver' -d 'No automatic bump of pkgver' complete -c makepkg -s i -l 'install' -d 'Install the package after build' complete -c makepkg -s L -l 'log' -d 'Enable makepkg build logging' complete -c makepkg -s m -l 'nocolor' -d 'Disable color in output messages' complete -c makepkg -s o -l 'nobuild' -d 'Only download and extract files' complete -c makepkg -s p -d 'Use alternative ' complete -c makepkg -s r -l 'rmdeps' -d 'Remove installed deps after build' complete -c makepkg -s R -l 'repackage' -d 'Repackage without rebuilding' complete -c makepkg -s s -l 'syncdeps' -d 'Install missing dependencies' complete -c makepkg -s S -l 'source' -d 'Build a source-only tarball for AUR' complete -c makepkg -l 'allsource' -d 'Build a source-only GPL tarball for AUR' complete -c makepkg -l 'pkg' -d 'Only build from a split package' complete -c makepkg -l 'check' -d 'Run the check function in the PKGBUILD' complete -c makepkg -l 'nocheck' -d 'Do not run the check function in the PKGBUILD' complete -c makepkg -l 'sign' -d 'Sign the resulting package with gpg' complete -c makepkg -l 'nosign' -d 'Do not create a signature for the package' complete -c makepkg -l 'key' -d 'Specify a to use when signing' complete -c makepkg -l 'noconfirm' -d 'Passed to pacman: --noconfirm' complete -c makepkg -l 'noprogressbar' -d 'Passed to pacman: --noprogressbar' fish/share/completions/man.fish000066400000000000000000000034071214535744100171050ustar00rootroot00000000000000 complete -xc man -a "(__fish_complete_man)" complete -xc man -a 1 --description "Program section" complete -xc man -a 2 --description "Syscall section" complete -xc man -a 3 --description "Library section" complete -xc man -a 4 --description "Device section" complete -xc man -a 5 --description "File format section" complete -xc man -a 6 --description "Games section" complete -xc man -a 7 --description "Misc section" complete -xc man -a 8 --description "Admin section" complete -xc man -a 9 --description "Kernel section" complete -xc man -a tcl --description "Tcl section" complete -xc man -a n --description "New section" complete -xc man -a l --description "Local section" complete -xc man -a p complete -xc man -a o --description "Old section" complete -rc man -s C --description "Configuration file" complete -xc man -s M -a "(__fish_complete_directories (commandline -ct))" --description "Manpath" complete -rc man -s P --description "Pager" complete -xc man -s S --description "Manual sections" complete -c man -s a --description "Display all matches" complete -c man -s c --description "Always reformat" complete -c man -s d --description "Debug" complete -c man -s D --description "Debug and run" complete -c man -s f --description "Show whatis information" complete -c man -s F -l preformat --description "Format only" complete -c man -s h --description "Display help and exit" complete -c man -s k --description "Show apropos information" complete -c man -s K --description "Search in all man pages" complete -xc man -s m --description "Set system" complete -xc man -s p --description "Preprocessors" complete -c man -s t --description "Format for printing" complete -c man -s w -l path --description "Only print locations" complete -c man -s W --description "Only print locations" fish/share/completions/mc.fish000066400000000000000000000035071214535744100167320ustar00rootroot00000000000000# Completions for mc # Author: SanskritFritz (gmail) complete -c mc -s a -l stickchars -d 'No graphic chars for line drawing' complete -c mc -s b -l nocolor -d 'Force black and white display' complete -c mc -s c -l color -d 'Force color mode' complete -c mc -s C -l colors -d 'Specify a different color set' complete -c mc -s S -d 'Specify a name of skin' complete -c mc -s d -l nomouse -d 'Disable mouse support' complete -c mc -s e -l edit -d 'Start the internal editor with FILE' complete -c mc -s f -l datadir -d 'Display the compiled-in search paths' complete -c mc -s F -l datadir-info -d 'Display extended info about compiled-in paths' complete -c mc -l configure-options -d 'Display configure options' complete -c mc -s k -l resetsoft -d 'Reset softkeys to their default' complete -c mc -s K -d 'Specify a keymap FILE' complete -c mc -l nokeymap -d 'Use default hardcoded keys' complete -c mc -s l -l ftplog -d 'Save the ftpfs dialog with the server in FILE' complete -c mc -s P -l printwd -d 'Print the last working directory to FILE' complete -c mc -s s -d 'Set alternative mode drawing of frameworks' complete -c mc -s t -l termcap -d 'Use the TERMCAP variable for terminal info' complete -c mc -s u -l nosubshell -d 'Disable use of the concurrent shell' complete -c mc -s U -l subshell -d 'Enable use of the concurrent shell' complete -c mc -s v -l view -d 'Start the internal viewer with FILE' complete -c mc -s V -l version -d 'Display the version of the program' complete -c mc -s x -l xterm -d 'Force xterm mode' complete -c mc -s g -l oldmouse -d 'Force a "normal tracking" mouse mode' fish/share/completions/md5sum.fish000066400000000000000000000000341214535744100175350ustar00rootroot00000000000000__fish_complete_xsum md5sum fish/share/completions/mimedb.fish000066400000000000000000000014241214535744100175640ustar00rootroot00000000000000complete -c mimedb -s t -l input-file-data --description "Input is a file, use name and contents to determine mimetype" complete -c mimedb -s f -l input-filename --description "Input is a file, use name to determine mimetype" complete -c mimedb -s i -l input-mime --description "Input is a mimetype" complete -c mimedb -s m -l output-mime --description "Output mimetype" complete -c mimedb -s d -l output-description --description "Output description of mimetype" complete -c mimedb -s a -l output-action --description "Output default action for mimetype" complete -c mimedb -s l -l launch --description "Launch default action for each file" complete -c mimedb -s h -l help --description "Display help and exit" complete -c mimedb -s v -l version --description "Display version and exit" fish/share/completions/mktemp.fish000066400000000000000000000011051214535744100176200ustar00rootroot00000000000000complete -c mktemp -s d -l directory -d 'create a directory, not a file' complete -c mktemp -s u -l dry-run -d 'do not create anything; merely print a name (unsafe)' complete -c mktemp -s q -l quiet -d 'suppress diagnostics about file/dir-creation failure' complete -c mktemp -l suffix -r -d 'append SUFF to TEMPLATE' complete -c mktemp -l tmpdir -d 'interpret TEMPLATE relative to DIR' complete -c mktemp -l help -d 'display this help and exit' complete -c mktemp -l version -d 'output version information and exit' fish/share/completions/mocp.fish000066400000000000000000000061221214535744100172650ustar00rootroot00000000000000complete -c mocp -s V -l version -d "Print program version and exit" complete -c mocp -s h -l help -d "Print usage and exit" complete -c mocp -s D -l debug -d "Turn on logging to a file" complete -c mocp -s S -l server -d "Run only the server" complete -c mocp -s F -l foreground -d "Run server in foreground, log to stdout" complete -c mocp -s R -l sound-driver -d "Use the specified sound driver" -xa 'oss alsa jack null' complete -c mocp -s m -l music-dir -r -d "Start in MusicDir" complete -c mocp -s a -l append -r -d "Append the files/directories/playlists passed in the command line to playlist and exit" complete -c mocp -s q -l enqueue -r -d "Add the files given on command line to the queue" complete -c mocp -s c -l clear -d "Clear the playlist and exit" complete -c mocp -s p -l play -r -d "Start playing from the first item on the playlist" complete -c mocp -s l -l playit -r -d "Play files given on command line without modifying the playlist" complete -c mocp -s s -l stop -d "Stop playing" complete -c mocp -s f -l next -d "Play next song" complete -c mocp -s r -l previous -d "Play previous song" complete -c mocp -s x -l exit -d "Shutdown the server" complete -c mocp -s T -l theme -r -d "Use selected theme file (read from ~/.moc/themes if the path is not absolute" complete -c mocp -s C -l config -r -d "Use the specified config file instead of the default" complete -c mocp -s O -l set-option -r -d "NAME=VALUE Override configuration option NAME with VALUE" complete -c mocp -s M -l moc-dir -r -d "Use the specified MOC directory instead of the default" complete -c mocp -s P -l pause -d "Pause" complete -c mocp -s U -l unpause -d "Unpause" complete -c mocp -s G -l toggle-pause -d "Toggle between play/pause" complete -c mocp -s v -l volume -d "(+/-)LEVEL Adjust PCM volume" -xa '+ -' complete -c mocp -s y -l sync -d "Synchronize the playlist with other clients" complete -c mocp -s n -l nosync -d "Don't synchronize the playlist with other client's" complete -c mocp -s A -l ascii -d "Use ASCII characters to draw lines" complete -c mocp -s i -l info -d "Print the information about the currently played file" complete -c mocp -s Q -l format -rf -d "Print the formatted information about the currently played file" complete -c mocp -s e -l recursively -d "Alias for -a" complete -c mocp -s k -l seek -rf -d "Seek by N seconds (can be negative)" complete -c mocp -s j -l jump -rf -d "N{%,s} Jump to some position of the current track" complete -c mocp -s o -l on -d "Turn on a control" -xa 'shuffle autonext repeat' complete -c mocp -s u -l off -d "Turn off a control" -xa 'shuffle autonext repeat' complete -c mocp -s t -l toggle -d "Toggle a control" -xa '(__fish_complete_list , "echo shuffle\nautonext\nrepeat\ns\tshuffle\nr\trepeat\nn\tautonext")' fish/share/completions/modprobe.fish000066400000000000000000000035161214535744100201420ustar00rootroot00000000000000# # Completions for the modprobe command # complete -c modprobe -d Module -a "(/sbin/modprobe -l | sed -e 's/\/.*\/\([^\/.]*\).*/\1/')" complete -c modprobe -s v -l verbose --description "Print messages about what the program is doing" complete -c modprobe -s C -l config --description "Configuration file" -r complete -c modprobe -s c -l showconfig --description "Dump configuration file" complete -c modprobe -s n -l dry-run --description "Do not actually insert/remove module" complete -c modprobe -s i -l ingnore-install --description "Ignore install and remove commands in configuration file" complete -c modprobe -l ingnore-remove --description "Ignore install and remove commands in configuration file" complete -c modprobe -s q -l quiet --description "Ignore bogus module names" complete -c modprobe -s r -l remove --description "Remove modules" complete -c modprobe -s V -l version --description "Display version and exit" complete -c modprobe -s f -l force --description "Ignore all version information" complete -c modprobe -l force-vermagic --description "Ignore version magic information" complete -c modprobe -l force-modversion --description "Ignore module interface version" complete -c modprobe -s l -l list --description "List all modules matching the given wildcard" complete -c modprobe -s a -l all --description "Insert modules matching the given wildcard" complete -c modprobe -s t -l type --description "Restrict wildcards to specified directory" complete -c modprobe -s s -l syslog --description "Send error messages through syslog" complete -c modprobe -l set-version --description "Specify kernel version" complete -c modprobe -l show-depends --description "List dependencies of module" complete -c modprobe -s o -l name --description "Rename module" complete -c modprobe -l first-time --description "Fail if inserting already loaded module" fish/share/completions/mogrify.fish000066400000000000000000000543111214535744100200060ustar00rootroot00000000000000complete -c mogrify -o adjoin -d 'Join images into a single multi-image file' complete -c mogrify -o affine -d 'Affine transform matrix [matrix]' complete -c mogrify -o antialias -d 'Remove pixel-aliasing ' complete -c mogrify -o authenticate -d 'Decrypt image with this password [value]' complete -c mogrify -o background -d 'Background color [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o bias -d 'Add bias when convolving an image [value]' complete -c mogrify -o black-point-compensation -d 'Use black point compensation' complete -c mogrify -o blue-primary -d 'Chromaticity blue primary point [point]' complete -c mogrify -o bordercolor -d 'Border color [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o caption -d 'Assign a caption to an image [string]' complete -c mogrify -o cdl -d 'Color correct with a color decision list [filename]' -r complete -c mogrify -o channel -d 'Apply option to select image channels [type]' -xa '(mogrify -list channel)' complete -c mogrify -o colors -d 'Preferred number of colors in the image [value]' complete -c mogrify -o colorspace -d 'Alternate image colorspace [type]' -xa '(mogrify -list colorspace)' complete -c mogrify -o comment -d 'Annotate image with comment [string]' complete -c mogrify -o compose -d 'Set image composite operator [operator]' complete -c mogrify -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(mogrify -list compress)' complete -c mogrify -o decipher -d 'Convert cipher pixels to plain pixels [filename]' -r complete -c mogrify -o define -d 'Define one or more image format options [format:option]' complete -c mogrify -o delay -d 'Display the next image after pausing [value]' complete -c mogrify -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c mogrify -o depth -d 'Image depth [value]' complete -c mogrify -o direction -d 'Render text right-to-left or left-to-right [type]' -xa '(mogrify -list direction)' complete -c mogrify -o display -d 'Get image or font from this X server [server]' complete -c mogrify -o dispose -d 'Layer disposal method [method]' -xa '(mogrify -list dispose)' complete -c mogrify -o dither -d 'Apply error diffusion to image [method]' -xa '(mogrify -list dither)' complete -c mogrify -o encipher -d 'Convert plain pixels to cipher pixels [filename]' -r complete -c mogrify -o encoding -d 'Encoding type [type text]' -xa '(__fish_print_encodings)' complete -c mogrify -o endian -d 'Endianness (MSB or LSB) of the image [type]' -xa '(mogrify -list endian)' complete -c mogrify -o family -d 'Render text with this font family [name]' -xa '(__fish_complete_convert_options family)' complete -c mogrify -o fill -d 'Color to use when filling a graphic primitive [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o filter -d 'Use this filter when resizing an image [type]' -xa '(mogrify -list filter)' complete -c mogrify -o flatten -d 'Flatten a sequence of images' complete -c mogrify -o font -d 'Render text with this font [name]' -xa '(__fish_complete_convert_options font)' complete -c mogrify -o format -d 'Image format type [type]' -xa '(__fish_complete_convert_options type)' complete -c mogrify -o function -d 'Apply a function to the image [name]' -xa '(mogrify -list function)' complete -c mogrify -o fuzz -d 'Colors within this distance are considered equal [distance]' complete -c mogrify -o gravity -d 'Horizontal and vertical text placement [type]' -xa '(mogrify -list gravity)' complete -c mogrify -o green-primary -d 'Chromaticity green primary point [point]' complete -c mogrify -o intent -d 'Type of rendering intent when managing the image color [type]' -xa '(mogrify -list intent)' complete -c mogrify -o interlace -d 'Type of image interlacing scheme [type]' -xa '(mogrify -list interlace)' complete -c mogrify -o interpolate -d 'Pixel color interpolation method [method]' -xa '(mogrify -list interpolate)' complete -c mogrify -o kerning -d 'Set the space between two letters [value]' complete -c mogrify -o label -d 'Assign a label to an image [string]' complete -c mogrify -o limit -d 'Pixel cache resource limit [type value]' -x complete -c mogrify -o loop -d 'Add Netscape loop extension to your GIF animation [iterations]' complete -c mogrify -o mask -d 'Associate a mask with the image [filename]' -r complete -c mogrify -o matte -d 'Store matte channel if the image has one' complete -c mogrify -o mattecolor -d 'Frame color [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o monitor -d 'Monitor progress ' complete -c mogrify -o morphology -d 'Apply a morphology method to the image [method kernel]' -xa '(mogrify -list morphology)' complete -c mogrify -o orient -d 'Image orientation [type]' -xa '(mogrify -list orientation)' complete -c mogrify -o origin -d 'Image origin [geometry]' complete -c mogrify -o page -d 'Size and location of an image canvas (setting) [geometry]' complete -c mogrify -o path -d 'Path write images to this path on disk' complete -c mogrify -o ping -d 'Efficiently determine image attributes' complete -c mogrify -o pointsize -d 'Font point size [value]' complete -c mogrify -o preview -d 'Image preview type [type]' -xa '(mogrify -list preview)' complete -c mogrify -o quality -d 'JPEG/MIFF/PNG compression level [value]' complete -c mogrify -o quiet -d 'Suppress all warning messages' complete -c mogrify -o red-primary -d 'Chromaticity red primary point [point]' complete -c mogrify -o regard-warnings -d 'Pay attention to warning messages' complete -c mogrify -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c mogrify -o scene -d 'Image scene number [value]' complete -c mogrify -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c mogrify -o size -d 'Width and height of image [geometry]' complete -c mogrify -o stretch -d 'Render text with this font stretch [type]' -xa '(mogrify -list stretch)' complete -c mogrify -o stroke -d 'Graphic primitive stroke color [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o strokewidth -d 'Graphic primitive stroke width [value]' complete -c mogrify -o style -d 'Render text with this font style [type]' -xa '(mogrify -list style)' complete -c mogrify -o support -d 'Resize support: > 1.0 is blurry, < 1.0 is sharp [factor]' complete -c mogrify -o synchronize -d 'Synchronize image to storage device' complete -c mogrify -o taint -d 'Declare the image as modified' complete -c mogrify -o texture -d 'Name of texture to tile onto the image background [filename]' -r complete -c mogrify -o tile-offset -d 'Tile offset [geometry]' complete -c mogrify -o treedepth -d 'Color tree depth [value]' complete -c mogrify -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o undercolor -d 'Annotation bounding box color [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o units -d 'The units of image resolution [type]' -xa '(mogrify -list units)' complete -c mogrify -o verbose -d 'Print detailed information about the image' complete -c mogrify -o view -d 'FlashPix viewing transforms' complete -c mogrify -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(mogrify -list virtual-pixel)' complete -c mogrify -o weight -d 'Render text with this font weight [type]' -x complete -c mogrify -o white-point -d 'Chromaticity white point [point]' complete -c mogrify -o adaptive-blur -d 'Adaptively blur pixels; decrease effect near edges [geometry]' complete -c mogrify -o adaptive-resize -d 'Adaptively resize image with data dependent triangulation [geometry]' complete -c mogrify -o adaptive-sharpen -d 'Adaptively sharpen pixels; increase effect near edges [geometry]' complete -c mogrify -o annotate -d 'Annotate the image with text [geometry text]' complete -c mogrify -o auto-orient -d 'Automatically orient image' complete -c mogrify -o black-threshold -d 'Force all pixels below the threshold into black [value]' complete -c mogrify -o blur -d 'Reduce image noise and reduce detail levels [geometry]' complete -c mogrify -o border -d 'Surround image with a border of color [geometry]' complete -c mogrify -o charcoal -d 'Simulate a charcoal drawing [radius]' complete -c mogrify -o chop -d 'Remove pixels from the image interior [geometry]' complete -c mogrify -o clip -d 'Clip along the first path from the 8BIM profile' complete -c mogrify -o clip-mask -d 'Associate a clip mask with the image [filename]' -r complete -c mogrify -o clip-path -d 'Clip along a named path from the 8BIM profile [id]' complete -c mogrify -o colorize -d 'Colorize the image with the fill color [value]' complete -c mogrify -o color-matrix -d 'Apply color correction to the image [matrix]' complete -c mogrify -o contrast -d 'Enhance or reduce the image contrast' complete -c mogrify -o contrast-stretch -d 'Improve contrast by `stretching\' the intensity range [geometry]' complete -c mogrify -o convolve -d 'Apply a convolution kernel to the image [coefficients]' complete -c mogrify -o cycle -d 'Cycle the image colormap [amount]' complete -c mogrify -o despeckle -d 'Reduce the speckles within an image' complete -c mogrify -o draw -d 'Annotate the image with a graphic primitive [string]' complete -c mogrify -o edge -d 'Apply a filter to detect edges in the image [radius]' complete -c mogrify -o emboss -d 'Emboss an image [radius]' complete -c mogrify -o enhance -d 'Apply a digital filter to enhance a noisy image' complete -c mogrify -o equalize -d 'Perform histogram equalization to an image' complete -c mogrify -o evaluate -d 'Evaluate an arithmetic, relational, or logical expression [operator value]' complete -c mogrify -o extent -d 'Set the image size [geometry]' complete -c mogrify -o extract -d 'Extract area from image [geometry]' complete -c mogrify -o fft -d 'Implements the discrete Fourier transform (DFT)' complete -c mogrify -o flip -d 'Flip image vertically' complete -c mogrify -o floodfill -d 'Color floodfill the image with color [geometry]' complete -c mogrify -o flop -d 'Flop image horizontally' complete -c mogrify -o frame -d 'Surround image with an ornamental border [geometry]' complete -c mogrify -o gamma -d 'Level of gamma correction [value]' complete -c mogrify -o gaussian-blur -d 'Reduce image noise and reduce detail levels [geometry]' complete -c mogrify -o geometry -d 'Preferred size or location of the image [geometry]' complete -c mogrify -o ift -d 'Implements the inverse discrete Fourier transform (DFT)' complete -c mogrify -o help -d 'Print program options' complete -c mogrify -o identify -d 'Identify the format and characteristics of the image' complete -c mogrify -o implode -d 'Implode image pixels about the center [amount]' complete -c mogrify -o lat -d 'Local adaptive thresholding [geometry]' complete -c mogrify -o layers -d 'Optimize or compare image layers [method]' -xa '(mogrify -list layers)' complete -c mogrify -o level -d 'Adjust the level of image contrast [value]' complete -c mogrify -o linear-stretch -d 'Improve contrast by `stretching with saturation\' the intensity range [geometry]' complete -c mogrify -o median -d 'Apply a median filter to the image [geometry]' complete -c mogrify -o mode -d 'Make each pixel the \'predominant color\' of the neighborhood [geometry]' complete -c mogrify -o modulate -d 'Vary the brightness, saturation, and hue [value]' complete -c mogrify -o monochrome -d 'Transform image to black and white' complete -c mogrify -o motion-blur -d 'Simulate motion blur [geometry]' complete -c mogrify -o negate -d 'Replace each pixel with its complementary color' complete -c mogrify -o noise -d 'Add or reduce noise in an image [geometry]' complete -c mogrify -o normalize -d 'Transform image to span the full range of colors' complete -c mogrify -o opaque -d 'Change this color to the fill color [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o ordered-dither -d 'Add a noise pattern to the image with specific amplitudes [NxN]' complete -c mogrify -o paint -d 'Simulate an oil painting [radius]' complete -c mogrify -o polaroid -d 'Simulate a Polaroid picture [angle]' complete -c mogrify -o posterize -d 'Reduce the image to a limited number of color levels [levels]' complete -c mogrify -o print -d 'Interpret string and print to console [string]' complete -c mogrify -o profile -d 'Add, delete, or apply an image profile [filename]' -r complete -c mogrify -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(mogrify -list colorspace)' complete -c mogrify -o radial-blur -d 'Radial blur the image [angle]' complete -c mogrify -o raise -d 'Lighten/darken image edges to create a 3-D effect [value]' complete -c mogrify -o random-threshold -d 'Random threshold the image [low,high]' complete -c mogrify -o region -d 'Apply options to a portion of the image [geometry]' complete -c mogrify -o render -d 'Render vector graphics' complete -c mogrify -o repage -d 'Size and location of an image canvas [geometry]' complete -c mogrify -o resample -d 'Change the resolution of an image [geometry]' complete -c mogrify -o resize -d 'Resize the image [geometry]' complete -c mogrify -o roll -d 'Roll an image vertically or horizontally [geometry]' complete -c mogrify -o rotate -d 'Apply Paeth rotation to the image [degrees]' complete -c mogrify -o sample -d 'Scale image with pixel sampling [geometry]' complete -c mogrify -o scale -d 'Scale the image [geometry]' complete -c mogrify -o segment -d 'Segment an image [values]' complete -c mogrify -o selective-blur -d 'Selectively blur pixels within a contrast threshold [geometry]' complete -c mogrify -o sepia-tone -d 'Simulate a sepia-toned photo [threshold]' complete -c mogrify -o set -d 'Set an image property [property value]' complete -c mogrify -o shade -d 'Shade the image using a distant light source [degrees]' complete -c mogrify -o shadow -d 'Simulate an image shadow [geometry]' complete -c mogrify -o sharpen -d 'Sharpen the image [geometry]' complete -c mogrify -o shave -d 'Shave pixels from the image edges [geometry]' complete -c mogrify -o shear -d 'Slide one edge of the image along the X or Y axis [geometry]' complete -c mogrify -o sigmoidal-contrast -d 'Lightness rescaling using sigmoidal contrast enhancement [geometry]' complete -c mogrify -o sketch -d 'Simulate a pencil sketch [geometry]' complete -c mogrify -o solarize -d 'Negate all pixels above the threshold level [threshold]' complete -c mogrify -o splice -d 'Splice the background color into the image [geometry]' complete -c mogrify -o spread -d 'Displace image pixels by a random amount [amount]' complete -c mogrify -o statistic -d 'Replace each pixel with corresponding statistic from the neighborhood [type geometry]' -xa '(mogrify -list statistic)' complete -c mogrify -o strip -d 'Strip image of all profiles and comments' complete -c mogrify -o swirl -d 'Swirl image pixels about the center [degrees]' complete -c mogrify -o threshold -d 'Threshold the image [value]' complete -c mogrify -o thumbnail -d 'Create a thumbnail of the image [geometry]' complete -c mogrify -o tile -d 'Tile image when filling a graphic primitive [filename]' -r complete -c mogrify -o tint -d 'Tint the image with the fill color [value]' complete -c mogrify -o transform -d 'Affine transform image' complete -c mogrify -o transparent -d 'Make this color transparent within the image [color]' -xa '(__fish_complete_convert_options color)' complete -c mogrify -o transpose -d 'Flip image vertically and rotate 90 degrees' complete -c mogrify -o transverse -d 'Flop image horizontally and rotate 270 degrees' complete -c mogrify -o trim -d 'Trim image edges' complete -c mogrify -o type -d 'Image type [type]' -xa '(mogrify -list type)' complete -c mogrify -o unique-colors -d 'Discard all but one of any pixel color' complete -c mogrify -o unsharp -d 'Sharpen the image [geometry]' complete -c mogrify -o vignette -d 'Soften the edges of the image in vignette style [geometry]' complete -c mogrify -o wave -d 'Alter an image along a sine wave [geometry]' complete -c mogrify -o white-threshold -d 'Force all pixels above the threshold into white [value]' complete -c mogrify -o affinity -d 'Transform image colors to match this set of colors [filename]' -r complete -c mogrify -o append -d 'Append an image sequence top to botto (use +append for left to right)' complete -c mogrify -o clut -d 'Apply a color lookup table to the image' complete -c mogrify -o coalesce -d 'Merge a sequence of images' complete -c mogrify -o combine -d 'Combine a sequence of images' complete -c mogrify -o composite -d 'Composite image ' complete -c mogrify -o crop -d 'Cut out a rectangular region of the image [geometry]' complete -c mogrify -o deconstruct -d 'Break down an image sequence into constituent parts' complete -c mogrify -o evaluate-sequence -d 'Evaluate an arithmetic, relational, or logical expression [operator]' complete -c mogrify -o fx -d 'Apply mathematical expression to an image channel(s) [expression]' complete -c mogrify -o hald-clut -d 'Apply a Hald color lookup table to the image' complete -c mogrify -o morph -d 'Morph an image sequence [value]' complete -c mogrify -o mosaic -d 'Create a mosaic from an image sequence' complete -c mogrify -o process -d 'Process the image with a custom image filter [arguments]' -xa '(mogrify -list filter)' complete -c mogrify -o separate -d 'Separate an image channel into a grayscale image' complete -c mogrify -o smush -d 'Smush an image sequence together [geometry]' complete -c mogrify -o write -d 'Write images to this file [filename]' -r complete -c mogrify -o delete -d 'Delete the image from the image sequence [indexes]' complete -c mogrify -o duplicate -d 'Duplicate an image one or more times [count,indexes]' complete -c mogrify -o insert -d 'Insert last image into the image sequence [index]' complete -c mogrify -o swap -d 'Swap two images in the image sequence [indexes]' complete -c mogrify -o debug -d 'Display copious debugging information [events]' -xa '(mogrify -list debug)' complete -c mogrify -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c mogrify -o list -d 'Print a list of supported option arguments [type]' -xa '(mogrify -list list)' fish/share/completions/montage.fish000066400000000000000000000261471214535744100177720ustar00rootroot00000000000000complete -c montage -o adjoin -d 'Join images into a single multi-image file' complete -c montage -o affine -d 'Affine transform matrix [matrix]' complete -c montage -o alpha -d 'On, activate, off, deactivate, set, opaque, copy transparent, extract, background, or shape [option]' -xa '(montage -list alpha)' complete -c montage -o authenticate -d 'Decipher image with this password [password]' complete -c montage -o blue-primary -d 'Chromaticity blue primary point [point]' complete -c montage -o bordercolor -d 'Border color [color]' -xa '(__fish_complete_convert_options color)' complete -c montage -o caption -d 'Assign a caption to an image [string]' complete -c montage -o channel -d 'Apply option to select image channels [type]' -xa '(montage -list channel)' complete -c montage -o colors -d 'Preferred number of colors in the image [value]' complete -c montage -o colorspace -d 'Alternate image colorsapce [type]' -xa '(montage -list colorspace)' complete -c montage -o comment -d 'Annotate image with comment [string]' complete -c montage -o compose -d 'Composite operator [operator]' complete -c montage -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(montage -list compress)' complete -c montage -o define -d 'Define one or more image format options [format:option]' complete -c montage -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c montage -o depth -d 'Image depth [value]' complete -c montage -o display -d 'Query font from this X server [server]' complete -c montage -o dispose -d 'Layer disposal method [method]' -xa '(montage -list dispose)' complete -c montage -o dither -d 'Apply error diffusion to image [method]' -xa '(montage -list dither)' complete -c montage -o draw -d 'Annotate the image with a graphic primitive [string]' complete -c montage -o encoding -d 'Encoding type [type text]' -xa '(__fish_print_encodings)' complete -c montage -o endian -d 'Endianness (MSB or LSB) of the image [type]' -xa '(montage -list endian)' complete -c montage -o extract -d 'Extract area from image [geometry]' complete -c montage -o fill -d 'Color to use when filling a graphic primitive [color]' -xa '(__fish_complete_convert_options color)' complete -c montage -o filter -d 'Use this filter when resizing an image [type]' -xa '(montage -list filter)' complete -c montage -o font -d 'Render text with this font [name]' -xa '(__fish_complete_convert_options font)' complete -c montage -o format -d 'Output formatted image characteristics ["string"]' complete -c montage -o gamma -d 'Level of gamma correction [value]' complete -c montage -o geometry -d 'Preferred tile and border sizes [geometry]' complete -c montage -o gravity -d 'Direction which direction to gravitate towards' complete -c montage -o green-primary -d 'Chromaticity green primary point [point]' complete -c montage -o identify -d 'Identify the format and characteristics of the image' complete -c montage -o interlace -d 'Type of image interlacing scheme [type]' -xa '(montage -list interlace)' complete -c montage -o interpolate -d 'Pixel color interpolation method [method]' -xa '(montage -list interpolate)' complete -c montage -o kerning -d 'Set the space between two letters [value]' complete -c montage -o label -d 'Assign a label to an image [string]' complete -c montage -o limit -d 'Pixel cache resource limit [type value]' -x complete -c montage -o mattecolor -d 'Frame color [color]' -xa '(__fish_complete_convert_options color)' complete -c montage -o mode -d 'Framing style [type]' -xa '(montage -list mode)' complete -c montage -o monitor -d 'Monitor progress ' complete -c montage -o origin -d 'Image origin [geometry]' complete -c montage -o page -d 'Size and location of an image canvas (setting) [geometry]' complete -c montage -o pointsize -d 'Font point size [value]' complete -c montage -o profile -d 'Add, delete, or apply an image profile [filename]' -r complete -c montage -o quality -d 'JPEG/MIFF/PNG compression level [value]' complete -c montage -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(montage -list colorspace)' complete -c montage -o quiet -d 'Suppress all warning messages' complete -c montage -o red-primary -d 'Chromaticity red primary point [point]' complete -c montage -o regard-warnings -d 'Pay attention to warning messages' complete -c montage -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c montage -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c montage -o scenes -d 'Range image scene range' complete -c montage -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c montage -o set -d 'Attribute set an image attribute [ value]' complete -c montage -o shadow -d 'Add a shadow beneath a tile to simulate depth' complete -c montage -o size -d 'Width and height of image [geometry]' complete -c montage -o stroke -d 'Color to use when stroking a graphic primitive [color]' -xa '(__fish_complete_convert_options color)' complete -c montage -o synchronize -d 'Synchronize image to storage device' complete -c montage -o taint -d 'Declare the image as modified' complete -c montage -o texture -d 'Name of texture to tile onto the image background [filename]' -r complete -c montage -o thumbnail -d 'Create a thumbnail of the image [geometry]' complete -c montage -o tile -d 'Number of tiles per row and column [geometry]' complete -c montage -o title -d 'Decorate the montage image with a title [string]' complete -c montage -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c montage -o treedepth -d 'Color tree depth [value]' complete -c montage -o trim -d 'Trim image edges' complete -c montage -o units -d 'The units of image resolution [type]' -xa '(montage -list units)' complete -c montage -o verbose -d 'Print detailed information about the image' complete -c montage -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(montage -list virtual-pixel)' complete -c montage -o white-point -d 'Chromaticity white point [point]' complete -c montage -o adaptive-sharpen -d 'Adaptively sharpen pixels; increase effect near edges annotate geometry text annotate the image with text [geometry]' complete -c montage -o auto-orient -d 'Automagically orient image' complete -c montage -o blur -d 'Reduce image noise and reduce detail levels [geometry]' complete -c montage -o border -d 'Surround image with a border of color [geometry]' complete -c montage -o crop -d 'Preferred size and location of the cropped image [geometry]' complete -c montage -o extent -d 'Set the image size [geometry]' complete -c montage -o flatten -d 'Flatten a sequence of images' complete -c montage -o flip -d 'Flip image in the vertical direction' complete -c montage -o flop -d 'Flop image in the horizontal direction' complete -c montage -o frame -d 'Surround image with an ornamental border [geometry]' complete -c montage -o monochrome -d 'Transform image to black and white' complete -c montage -o polaroid -d 'Simulate a Polaroid picture [angle]' complete -c montage -o repage -d 'Size and location of an image canvas (operator) [geometry]' complete -c montage -o resize -d 'Resize the image [geometry]' complete -c montage -o rotate -d 'Apply Paeth rotation to the image [degrees]' complete -c montage -o strip -d 'Strip image of all profiles and comments' complete -c montage -o transform -d 'Affine transform image' complete -c montage -o transpose -d 'Flip image vertically and rotate 90 degrees' complete -c montage -o transparent -d 'Make this color transparent within the image [color]' -xa '(__fish_complete_convert_options color)' complete -c montage -o type -d 'Image type [type]' -xa '(montage -list type)' complete -c montage -o unsharp -d 'Sharpen the image [geometry]' complete -c montage -o coalesce -d 'Merge a sequence of images' complete -c montage -o composite -d 'Composite image ' complete -c montage -o clone -d 'Clone an image [indexes]' complete -c montage -o delete -d 'Delete the image from the image sequence [indexes]' complete -c montage -o duplicate -d 'Duplicate an image one or more times [count,indexes]' complete -c montage -o insert -d 'Insert last image into the image sequence [index]' complete -c montage -o reverse -d 'Reverse image sequence' complete -c montage -o swap -d 'Swap two images in the image sequence [indexes]' complete -c montage -o debug -d 'Display copious debugging information [events]' -xa '(montage -list debug)' complete -c montage -o help -d 'Print program options' complete -c montage -o list -d 'Print a list of supported option arguments [type]' -xa '(montage -list list)' complete -c montage -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c montage -o version -d 'Print version information' complete -c montage -o matte -d 'Store matte channel if the image has one' complete -c montage -o support -d 'Resize support: > 1.0 is blurry, < 1.0 is sharp [factor]' complete -c montage -o annotate -d 'Annotate the image with text [geometry text]' fish/share/completions/mosh.fish000066400000000000000000000022171214535744100172760ustar00rootroot00000000000000 complete -x -c mosh -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) " complete -x -c mosh -d User -a " (__fish_print_users)@ " complete -c mosh --description "Command to run" -x -a '(__fish_complete_subcommand --fcs-skip=2)' complete -c mosh -l client --description 'Path to client helper on local machine (default: "mosh-client")' complete -c mosh -l server --description 'Command to run server helper on remote machine (default: "mosh-server")' complete -c mosh -l ssh --description 'SSH command to run when setting up session (example: "ssh -p 2222") (default: "ssh")' complete -c mosh -f -l predict --description 'Controls use of speculative local echo' -a 'adaptive always never experimental' complete -c mosh -s a --description 'Synonym for --predict=always' complete -c mosh -s n --description 'Synonym for --predict=never' complete -c mosh -s p -l port --description 'Use a particular server-side UDP port or port range' # Since mosh runs subcommands, it can accept any switches complete -c mosh -u fish/share/completions/mount.fish000066400000000000000000000042601214535744100174720ustar00rootroot00000000000000 # A list of all known filesystem types, used by various completions, # including mount and df # Completions for mount complete -x -c mount -a '(cat /etc/fstab|sed -e "s/^\([^ \t]*\)[ \t]*\([^ \t]*\).*/\1\n\2/"|sgrep "^/")' --description 'Mount point' complete -c mount -s V --description 'Display version and exit' complete -c mount -s h --description 'Display help and exit' complete -c mount -s v --description 'Verbose mode' complete -c mount -s a --description 'Mount file systems in fstab' complete -c mount -s F --description 'Fork process for each mount' complete -c mount -s f --description 'Fake mounting' complete -c mount -s l --description 'Add label to output' complete -c mount -s n --description 'Do not write mtab' complete -c mount -s s --description 'Tolerate sloppy mount options' complete -c mount -s r --description 'Read only' complete -c mount -s w --description 'Read/Write mode' complete -x -c mount -s L --description 'Mount partition with specified label' complete -x -c mount -s U --description 'Mount partition with specified UID' complete -c mount -s O -x --description 'Exclude file systems' complete -c mount -l bind -f --description 'Remount a subtree to a second position' complete -c mount -l move -f --description 'Move a subtree to a new position' complete -c mount -x -s t --description 'File system' -a "(__fish_print_filesystems)" complete -c mount -x -s o --description 'Mount option' -a '(__fish_append , $__fish_mount_opts)' set -g __fish_mount_opts async\tUse\ asynchronous\ I/O atime\tUpdate\ time\ on\ each\ access auto\tMounted\ with\ -a defaults\tUse\ default\ options dev\tInterpret\ character/block\ special\ devices exec\tPermit\ executables _netdev\tFilesystem\ uses\ network noatime\tDo\ not\ update\ time\ on\ each\ access noauto\tNot\ mounted\ by\ -a nodev\tDo\ not\ interpret\ character/block\ special\ devices noexec\tDo\ not\ permit\ executables nosuid\tIgnore\ suid\ bits nouser\tOnly\ root\ may\ mount remount\tRemount\ read-only\ filesystem ro\tMount\ read-only rw\tMount\ read-write suid\tAllow\ suid\ bits sync\tUse\ synchronous\ I/O dirsync\tUse\ synchronous\ directory\ operations user\tAny\ user\ may\ mount users\tAny\ user\ may\ mount\ and\ unmount fish/share/completions/mplayer.fish000066400000000000000000000070201214535744100177760ustar00rootroot00000000000000# Completions for mplayer (Incomplete, there are too many options and # I am too lazy. Please send in suggested additions) # # List of two letter language codes for dvd audio, etc. Very # incomplete. Please send in additions. # set mplayer_lang " de\tGerman dk\tDanish en\tEnglish es\tSpanish fi\tFinnish fr\tFrench gr\tGreek hu\tHungarian it\tItalian jp\tJapanese no\tNorwegian hu\tHungarian pl\tPolish pt\tPortugese se\Swedish " complete -c mplayer -o autoq --description "Dynamically change postprocessing" -x complete -c mplayer -o autosync -x --description "A/V sync speed" complete -c mplayer -o framedrop --description "Skip frames to maintain A/V sync" complete -c mplayer -s h -o help --description "Display help and exit" complete -c mplayer -o hardframedrop --description "Skip frames to maintain A/V sync" complete -c mplayer -o loop -x --description "Loop playback" -r -a "0 1 2 3 4 5 6 7 8 9" complete -c mplayer -o shuffle --description "Play in random order" complete -c mplayer -s h -o help --description "Display help and exit" complete -c mplayer -o fs --description "Full screen" complete -c mplayer -o playlist --description "Set playlist"-r complete -c mplayer -o alang --description "Audio language" -x -a $mplayer_lang complete -c mplayer -o audiofile --description "Play audio from file" -r complete -c mplayer -o cdrom-device --description "Set default CD-ROM drive" complete -c mplayer -o channels --description "Set number of audio channels" -x -a "2 4 6" complete -c mplayer -o chapter --description "Set start chapter" -x complete -c mplayer -o dvd-device --description "Set default DVD-ROM drive" complete -c mplayer -o dvdangle --description "Set dvd viewing angle" -x -a "1 2 3 4 5 6 7 8" complete -c mplayer -o forceidx --description "Force rebuilding index" complete -c mplayer -o fps --description "Override framerate" -x -a "24 25 30" complete -c mplayer -o idx --description "Build index if unavailable" complete -c mplayer -o loadidx --description "Load index from file" -r complete -c mplayer -o ni --description "Force non-interleaved AVI parser" complete -c mplayer -o saveidx --description "Rebuild index and save to file" -r complete -c mplayer -o ss --description "Seek to given time position" -x complete -c mplayer -o tv --description "TV capture mode" complete -c mplayer -o slang --description "Subtitle language" -x -a $mplayer_lang complete -c mplayer -o sub --description "Subtitle file" -r complete -c mplayer -o unicode --description "Handle subtitlefile as unicode" complete -c mplayer -o utf8 --description "Handle subtitlefile as utf8" complete -c mplayer -o vo -x --description "Video output" -a " ( mplayer -vo help|sgrep \t.\*\t'\|^ *[a-zA-Z0-9][a-zA-Z0-9]* '|sed -e 's/[\t ]*\([a-zA-Z0-9]*\)[\t ]*\(.*\)/\1'\t'\2/' ) " complete -c mplayer -o ao -x --description "Audio output" -a " ( mplayer -ao help|sgrep \t.\*\t'\|^ *[a-zA-Z0-9][a-zA-Z0-9]* '|sed -e 's/[\t ]*\([a-zA-Z0-9]*\)[\t ]*\(.*\)/\1'\t'\2/' ) " complete -c mplayer -o afm -x --description "Audio output" -a " ( __fish_append ',' (mplayer -afm help|sgrep \t.\*\t'\|^ *[a-zA-Z0-9][a-zA-Z0-9]* '|sed -e 's/[\t ]*\([a-zA-Z0-9]*\)[\t ]*\(.*\)/\1'\t'\2/') ) " complete -c mplayer -o vfm -x --description "Video output" -a " ( __fish_append ',' (mplayer -vfm help|sgrep \t.\*\t'\|^ *[a-zA-Z0-9][a-zA-Z0-9]* '|sed -e 's/[\t ]*\([a-zA-Z0-9]*\)[\t ]*\(.*\)/\1'\t'\2/') ) " complete -c mplayer -l help --description "Display help and exit" complete -c mplayer -l version --description "Display version and exit" complete -c mplayer -u set -e mplayer_lang fish/share/completions/msgfmt.fish000066400000000000000000000053061214535744100176270ustar00rootroot00000000000000 complete -c msgfmt -s D -l directory --description "Add specified directory to list for input files search" -x -a "(__fish_complete_directories (commandline -ct))" set -l cond "not __fish_contains_opt -s j java java2 csharp csharp-resource tcl qt" complete -c msgfmt -n $cond -s j -l java --description "Generate a Java ResourceBundle class" complete -c msgfmt -n $cond -l java2 --description "Like --java, and assume Java2 (JDK 1.2 or higher)" complete -c msgfmt -n $cond -l csharp --description "Generate a .NET .dll file" complete -c msgfmt -n $cond -l csharp-resources --description "Generate a .NET .resources file" complete -c msgfmt -n $cond -l tcl --description "Generate a tcl/msgcat .msg file" complete -c msgfmt -n $cond -l qt --description "Generate a Qt .qm file" complete -c msgfmt -s o -l output-file --description "Write output to specified file" -r complete -c msgfmt -l strict --description "Enable strict Uniforum mode" set -l cond "__fish_contains_opt -s j java java2 csharp csharp-resource tcl" complete -c msgfmt -n $cond -s r -l resource --description "Resource name" complete -c msgfmt -n $cond -s l -l locale --description "Locale name, either language or language_COUNTRY" complete -c msgfmt -n $cond -s d --description "Base directory for output" -x -a "(__fish_complete_directories (commandline -ct))" complete -c msgfmt -s P -l properties-input --description "Input files are in Java .properties syntax" complete -c msgfmt -l stringtable-input --description "Input files are in NeXTstep/GNUstep .strings syntax" complete -c msgfmt -s c -l check --description "Perform all the checks implied by --check-format, --check-header, --check-domain" complete -c msgfmt -l check-format --description "Check language dependent format strings" complete -c msgfmt -l chack-header --description "Verify presence and contents of the header entry" complete -c msgfmt -l check-domain --description "Check for conflicts between domain directives and the --output-file option" complete -c msgfmt -s C -l check-compatibility --description "Check that GNU msgfmt behaves like X/Open msgfmt" complete -c msgfmt -l check-accelerators --description "Check presence of keyboard accelerators for menu items" complete -c msgfmt -s f -l use-fuzzy --description "Use fuzzy entries in output" complete -c msgfmt -s a -l alignment --description "Alignment" -r complete -c msgfmt -l no-hash --description "Binary file will not include the hash table" complete -c msgfmt -s h -l help --description "Display help and exit" complete -c msgfmt -s V -l version --description "Display version and exit" complete -c msgfmt -l statistics --description "Print statistics about translations" complete -c msgfmt -l verbose --description "Increase verbosity level" fish/share/completions/mupdf.fish000066400000000000000000000000711214535744100174370ustar00rootroot00000000000000complete -c mupdf -x -a "(__fish_complete_suffix .pdf)" fish/share/completions/mutt.fish000066400000000000000000000041321214535744100173170ustar00rootroot00000000000000if which abook >/dev/null complete -c mutt -f -a '(__fish_print_abook_emails)' complete -c mutt -s c -x -d 'Specify a carbon-copy (CC) recipient' -a '(__fish_print_abook_emails)' complete -c mutt -s b -x -d 'Specify a blind-carbon-copy (BCC) recipient' -a '(__fish_print_abook_emails)' end complete -c mutt -s D --description 'Print the value of all configuration options to stdout' complete -c mutt -s h --description 'Display help' complete -c mutt -s n --description 'Bypass the system configuration file' complete -c mutt -s p --description 'Resume a postponed message' complete -c mutt -s R --description 'Open a mailbox in read-only mode' complete -c mutt -s v --description 'Display the Mutt version number and compile-time definitions' complete -c mutt -s x --description 'Emulate the mailx compose mode' complete -c mutt -s y --description 'Start Mutt with a listing of all mailboxes' complete -c mutt -s z --description 'When used with -f, causes Mutt not to start if there are no messages' complete -c mutt -s Z --description 'Open the first mailbox which contains new mail' complete -r -c mutt -s A --description 'An expanded version of the given alias is passed to stdout' complete -r -c mutt -s a --description 'Attach a file to your message using MIME' complete -r -c mutt -s b --description 'Specify a blind-carbon-copy (BCC) recipient' complete -r -c mutt -s c --description 'Specify a carbon-copy (CC) recipient' complete -r -c mutt -s e --description 'Run command after processing of initialization files' complete -r -c mutt -s f --description 'Specify which mailbox to load' complete -r -c mutt -s F --description 'Specify an initialization file to read instead of ~/.muttrc' complete -r -c mutt -s H --description 'Specify a draft file containing header and body for the message' complete -r -c mutt -s i --description 'Specify a file to include into the body of a message' complete -r -c mutt -s m --description 'Specify a default mailbox type' complete -r -c mutt -s Q --description 'Query a configuration variables value' complete -r -c mutt -s s --description 'Specify the subject of the message' fish/share/completions/mv.fish000066400000000000000000000016041214535744100167510ustar00rootroot00000000000000complete -c mv -s b -l backup --description "Make backup of each existing destination file" complete -c mv -s f -l force --description "Do not prompt before overwriting" complete -c mv -s i -l interactive --description "Prompt before overwrite" complete -c mv -l reply -x -a "yes no query" --description "Answer for overwrite questions" complete -c mv -l strip-trailing-slashes --description "Remove trailing slashes from source" complete -c mv -s S -l suffix -r --description "Backup suffix" complete -c mv -l target-directory --description "Target directory" -x -a "(__fish_complete_directories (commandline -ct) 'Target directory')" complete -c mv -s u -l update --description "Do not overwrite newer files" complete -c mv -s v -l verbose --description "Verbose mode" complete -c mv -l help --description "Display help and exit" complete -c mv -l version --description "Display version and exit" fish/share/completions/namei.fish000066400000000000000000000011541214535744100174200ustar00rootroot00000000000000complete -c namei -s h -l help -d 'displays this help text' complete -c namei -s V -l version -d 'output version information and exit' complete -c namei -s x -l mountpoints -d 'show mount point directories with a \'D\'' complete -c namei -s m -l modes -d 'show the mode bits of each file' complete -c namei -s o -l owners -d 'show owner and group name of each file' complete -c namei -s l -l long -d 'use a long listing format (-m -o -v)' complete -c namei -s n -l nosymlinks -d 'don\'t follow symlinks' complete -c namei -s v -l vertical -d 'vertical align of modes and owners' fish/share/completions/ncdu.fish000066400000000000000000000005351214535744100172620ustar00rootroot00000000000000 complete -c ncdu -s h -d 'Print help' complete -c ncdu -s q -d 'Quiet mode. Refresh interval 2 seconds' complete -c ncdu -s v -d 'Print version' complete -c ncdu -s x -d 'Same filesystem' complete -c ncdu -l exclude -d 'Exclude files that match pattern' -r complete -c ncdu -s X -l exclude-from -d 'Exclude files that match any pattern in file' -r fish/share/completions/netcat.fish000066400000000000000000000023311214535744100176030ustar00rootroot00000000000000# NetCat completions for fish # By James Stanley complete -r -c nc -d "Remote hostname" -a "(__fish_print_hostnames)" complete -r -c nc -s c -d "Same as -e, but use /bin/sh" complete -r -c nc -s e -d "Program to execute after connection" complete -c nc -s b -d "Allow broadcasts" complete -r -c nc -s g -d "Source-routing hop points" complete -r -c nc -s G -d "Source-routing pointer" complete -c nc -s h -d "Show help" complete -r -c nc -s i -d "Delay interval for lines sent, ports scaned" complete -c nc -s k -d "Set keepalive option" complete -c nc -s l -d "Listen mode, acts as a server" complete -c nc -s n -d "Numeric-only IP addresses, no DNS" complete -r -c nc -s o -d "Hex dump of traffic" complete -r -c nc -s p -d "Local port number" complete -c nc -s r -d "Randomize local and remote ports" complete -r -c nc -s q -d "Quit after EOF on stdin and delay of secs" complete -r -c nc -s s -d "Local source address" complete -c nc -s t -d "Answer Telnet negotiation" complete -c nc -s u -d "UDP Mode" complete -c nc -s v -d "Verbose, use twice to be more verbose" complete -r -c nc -s w -d "Timeout for connects and final net reads" complete -r -c nc -s x -d "Set Type of Service" complete -c nc -s z -d "No I/O - used for scanning" fish/share/completions/nextd.fish000066400000000000000000000001041214535744100174430ustar00rootroot00000000000000complete -c nextd -s l --description "Also print directory history" fish/share/completions/nice.fish000066400000000000000000000006171214535744100172500ustar00rootroot00000000000000 complete -c nice -a "(__fish_complete_subcommand -- -n --adjustment)" --description "Command" complete -c nice -s n -l adjustment -n "__fish_no_arguments" --description "Add specified amount to niceness value" -x complete -c nice -l help -n "__fish_no_arguments" --description "Display help and exit" complete -c nice -l version -n "__fish_no_arguments" --description "Display version and exit" fish/share/completions/nl.fish000066400000000000000000000030531214535744100167400ustar00rootroot00000000000000set -l style 'a\t"number all lines" t\t"number only nonempty lines" n\t"number no lines" p\t"number only lines that match regular expression"' complete -c nl -s b -l body-numbering -d 'use STYLE for numbering body lines' -xa $style complete -c nl -s d -l section-delimiter -x -d 'use for separating logical pages' complete -c nl -s f -l footer-numbering -d 'use STYLE for numbering footer lines' -xa $style complete -c nl -s h -l header-numbering -d 'use STYLE for numbering header lines' -xa $style complete -c nl -s i -l line-increment -x -d 'line number increment at each line' complete -c nl -s l -l join-blank-lines -x -d 'group of NUMBER empty lines counted as one' complete -c nl -s n -l number-format -x -d 'insert line numbers according to FORMAT' complete -c nl -s n -l number-format -xa ln -d 'left justified, no leading zeroes' complete -c nl -s n -l number-format -xa rn -d 'right justified, no leading zeroes' complete -c nl -s n -l number-format -xa rz -d 'right justified, leading zeroes' complete -c nl -s p -l no-renumber -d 'do not reset line numbers at logical pages' complete -c nl -s s -l number-separator -x -d 'add STRING after (possible) line number' complete -c nl -s v -l starting-line-number -x -d 'first line number on each logical page' complete -c nl -s w -l number-width -x -d 'use NUMBER columns for line numbers' complete -c nl -l help -d 'display this help and exit' complete -c nl -l version -d 'output version information and exit' fish/share/completions/nm.fish000066400000000000000000000044201214535744100167400ustar00rootroot00000000000000complete -c nm -s a -l debug-syms -d 'Display debugger-only symbols' complete -c nm -s A -l print-file-name -d 'Print name of the input file before every symbol' #complete -c nm -C -l demangle[=STYLE] Decode low-level symbol names into user-level names # Same as --format=bsd # The STYLE, if specified, can be `auto' (the default), # `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java' or `gnat' complete -c nm -l no-demangle -d 'Do not demangle low-level symbol names' complete -c nm -s D -l dynamic -d 'Display dynamic symbols instead of normal symbols' complete -c nm -l defined-only -d 'Display only defined symbols' complete -c nm -s f -l format=FORMAT -d 'Use the output format FORMAT. FORMAT can be "bsd", "sysv" or "posix". The default is "bsd"' complete -c nm -s g -l extern-only -d 'Display only external symbols' complete -c nm -s l -l line-numbers -d 'Use debugging information to find a filename and line number for each symbol' complete -c nm -s n -l numeric-sort -d 'Sort symbols numerically by address' complete -c nm -s o -d 'Print name of the input file before every symbol' complete -c nm -s p -l no-sort -d 'Do not sort the symbols' complete -c nm -s P -l portability -d 'Same as --format=posix' complete -c nm -s r -l reverse-sort -d 'Reverse the sense of the sort' complete -c nm -l plugin -d 'Load the specified plugin' complete -c nm -s S -l print-size -d 'Print size of defined symbols' complete -c nm -s s -l print-armap -d 'Include index for symbols from archive members' complete -c nm -l size-sort -d 'Sort symbols by size' complete -c nm -l special-syms -d 'Include special symbols in the output' complete -c nm -l synthetic -d 'Display synthetic symbols as well' complete -c nm -s t -l radix=RADIX -d 'Use RADIX for printing symbol values' complete -c nm -l target=BFDNAME -d 'Specify the target object format as BFDNAME' complete -c nm -s u -l undefined-only -d 'Display only undefined symbols' complete -c nm -s h -l help -d 'Display this information' complete -c nm -s V -l version -d "Display this program's version number" fish/share/completions/nmcli.fish000066400000000000000000000050071214535744100174320ustar00rootroot00000000000000complete -c nmcli -s t -l terse -d 'Output is terse' complete -c nmcli -s p -l pretty -d 'Output is pretty' complete -c nmcli -s m -l mode -xa 'tabular multiline' -d 'Switch between tabular and multiline mode' complete -c nmcli -s f -l fields -xa 'all common' -d 'Specify the output fields' complete -c nmcli -s e -l escape -xa 'yes no' -d 'Whether to escape ":" and "\\" characters' complete -c nmcli -s v -l version -d 'Show nmcli version' complete -c nmcli -s h -l help -d 'Print help information' complete -c nmcli -d 'Command-line tool to control NetworkManager' -x complete -c nmcli -xa nm -n '__fish_use_subcommand' -d 'Inquiry and change the state of NM' -x complete -c nmcli -n '__fish_seen_subcommand_from nm; and not __fish_seen_subcommand_from status enable sleep wifi wwan' -xa 'status enable sleep wifi wwan' complete -c nmcli -n '__fish_seen_subcommand_from nm; and __fish_seen_subcommand_from enable sleep' -xa 'true false' complete -c nmcli -n '__fish_seen_subcommand_from nm; and __fish_seen_subcommand_from wifi wwan' -xa 'on off' complete -c nmcli -xa con -n '__fish_use_subcommand' -d "Get information about NM's connections" -x complete -c nmcli -n '__fish_seen_subcommand_from con; and not __fish_seen_subcommand_from list status up down delete' -xa 'list status up down delete' complete -c nmcli -n '__fish_seen_subcommand_from con; and __fish_seen_subcommand_from list up down delete' -xa 'id uuid' complete -c nmcli -n 'contains_seq con up -- (commandline -op)' -xa 'iface ap' complete -c nmcli -n 'contains_seq con up iface -- (commandline -op)' -xa '(__fish_print_interfaces)' complete -c nmcli -n 'contains_seq con up -- (commandline -op)' -l nowait -d 'Exit immediately' complete -c nmcli -n 'contains_seq con up -- (commandline -op)' -l timeout -d 'How long to wait for operation completion' -x complete -c nmcli -xa dev -n '__fish_use_subcommand' -d 'Get information about devices' -x complete -c nmcli -n '__fish_seen_subcommand_from dev; and not __fish_seen_subcommand_from status list disconnect wifi' -xa 'status list disconnect wifi' complete -c nmcli -n 'contains_seq dev disconnect -- (commandline -op)' -l nowait -d 'Exit immediately' complete -c nmcli -n 'contains_seq dev list -- (commandline -op)' -xa 'iface' complete -c nmcli -n '__fish_seen_subcommand_from dev; and __fish_seen_subcommand_from iface' -xa '(__fish_print_interfaces)' complete -c nmcli -n 'contains_seq dev wifi -- (commandline -op)' -xa 'list iface' complete -c nmcli -n 'contains_seq dev wifi list -- (commandline -op)' -xa 'essid bssid' fish/share/completions/not.fish000066400000000000000000000001661214535744100171310ustar00rootroot00000000000000 complete -c not -s h -l help --description 'Display help and exit' complete -c not -xa '__fish_complete_subcommand' fish/share/completions/oggenc.fish000066400000000000000000000044341214535744100175750ustar00rootroot00000000000000# # Completions for oggenc # complete -c oggenc -s Q -l quiet -f -d "Produce no output to stderr" complete -c oggenc -s h -l help -f -d "Print this help text" complete -c oggenc -s v -l version -f -d "Print the version number" complete -c oggenc -s r -l raw -f -d "Raw mode. Input files are read directly as PCM data" complete -c oggenc -s B -l raw-bits= -x -d "Set bits/sample for raw input. Default is 16" complete -c oggenc -s C -l raw-chan= -x -d "Set number of channels for raw input" complete -c oggenc -s R -l raw-rate= -x -d "Set samples/sec for raw input" complete -c oggenc -l raw-endianness -f -d "1 for bigendian, 0 for little (defaults to 0)" complete -c oggenc -s b -l bitrate -x -d "Choose a nominal bitrate to encode at" complete -c oggenc -l managed -f -d "Enable the bitrate management engine" complete -c oggenc -s m -l min-bitrate -x -d "Specify a minimum bitrate (in kbps)" complete -c oggenc -s M -l max-bitrate -x -d "Specify a maximum bitrate in kbps" complete -c oggenc -l advanced-encode-option -x -d "option=value Sets an advanced encoder option to the given value" complete -c oggenc -s q -l quality -x -d "Specify quality" complete -c oggenc -l resample -x -d "Resample input data to sampling rate n (Hz)" complete -c oggenc -l downmix -f -d "Downmix stereo to mono" complete -c oggenc -s s -l serial -x -d "Specify a serial number for the stream" complete -c oggenc -l discard-comments -f -d "Prevents comments in FLAC and Ogg FLAC files from being copied to the output Ogg Vorbis file" complete -c oggenc -s o -l output= -x -d "Write file to fn (only valid in single-file mode)" complete -c oggenc -s n -l names= -x -d "Produce filenames as this string" complete -c oggenc -s X -l name-remove= -x -d "Remove the specified characters from parameters" complete -c oggenc -s P -l name-replace= -x -d "Replace characters removed by --name-remove" complete -c oggenc -s c -l comment= -x -d "Add the given string as an extra comment" complete -c oggenc -s d -l date -x -d "Date for track" complete -c oggenc -s N -l tracknum -x -d "Track number" complete -c oggenc -s t -l title -x -d "Title of track" complete -c oggenc -s l -l album -x -d "Name of album" complete -c oggenc -s a -l artist -x -d "Name of artist" complete -c oggenc -s G -l genre -x -d "Genre of track" fish/share/completions/omega.fish000066400000000000000000000000331214535744100174120ustar00rootroot00000000000000__fish_complete_tex omega fish/share/completions/or.fish000066400000000000000000000001651214535744100167500ustar00rootroot00000000000000 complete -c or -s h -l help --description 'Display help and exit' complete -c or -xa '(__fish_complete_subcommand)' fish/share/completions/pacman-color.fish000066400000000000000000000000461214535744100207010ustar00rootroot00000000000000 __fish_complete_pacman pacman-color fish/share/completions/pacman-key.fish000066400000000000000000000035531214535744100203610ustar00rootroot00000000000000# Completions for pacman-key # Author: SanskritFritz (gmail) complete -c pacman-key -s a -l 'add' -d 'Add or update keys from ' complete -c pacman-key -l 'config' -d 'Use an alternate config ' complete -c pacman-key -s d -l 'delete' -d 'Remove the from the keyring' complete -c pacman-key -s e -l 'export' -d 'Export to stdout' complete -c pacman-key -l 'edit-key' -d 'Present a menu on specified ' complete -c pacman-key -s f -l 'finger' -d 'List a fingerprint for each specified ' complete -c pacman-key -l 'gpgdir' -d 'Alternate home for GnuPG' complete -c pacman-key -s h -l 'help' -d 'Output syntax and command line options' complete -c pacman-key -l 'import' -d 'Imports keys from /pubring.gpg' complete -c pacman-key -l 'import-trustdb' -d 'Imports ownertrust values from /trustdb.gpg' complete -c pacman-key -l 'init' -d 'Initialize the keyring' complete -c pacman-key -l 'keyserver' -d 'Use the specified ' complete -c pacman-key -s l -l 'list-keys' -d 'Lists all or specified from the keyring' complete -c pacman-key -l 'list-sigs' -d 'Same as --list-keys, but with signatures' complete -c pacman-key -l 'lsign-key' -d 'Locally sign the given ' complete -c pacman-key -s r -l 'recv-keys' -d 'Equivalent to --recv-keys in GnuPG' complete -c pacman-key -l 'refresh-keys' -d 'Equivalent to --refresh-keys in GnuPG' complete -c pacman-key -l 'populate' -d 'Reload the default keys' complete -c pacman-key -s u -l 'updatedb' -d 'Equivalent to --check-trustdb in GnuPG' complete -c pacman-key -s v -l 'verify' -d 'Verify the given file' complete -c pacman-key -s V -l 'version' -d 'Displays the program version' fish/share/completions/pacman.fish000066400000000000000000000000401214535744100175570ustar00rootroot00000000000000 __fish_complete_pacman pacman fish/share/completions/pacmatic.fish000066400000000000000000000000421214535744100201030ustar00rootroot00000000000000 __fish_complete_pacman pacmatic fish/share/completions/pactree.fish000066400000000000000000000016021214535744100177500ustar00rootroot00000000000000complete -c pactree -xa "(pacman -Sl | cut --delim ' ' --fields 2- | tr ' ' \t | sort)" complete -c pactree -s b -l dbpath -d 'Set an alternate database location' -xa '(__fish_complete_directories)' complete -c pactree -s c -l color -d 'Colorize output' complete -c pactree -s d -l depth -d 'Limit the depth of recursion' -x complete -c pactree -s g -l graph -d 'Generate output for graphviz\'s dot' complete -c pactree -s h -l help -d 'Display this help message' complete -c pactree -s l -l linear -d 'Enable linear output' complete -c pactree -s r -l reverse -d 'Show reverse dependencies' complete -c pactree -s s -l sync -d 'Search sync DBs instead of local' complete -c pactree -s u -l unique -d 'Show dependencies with no duplicates (implies -l)' complete -c pactree -l config -d 'Set an alternate configuration file' -r fish/share/completions/patch.fish000066400000000000000000000102121214535744100174210ustar00rootroot00000000000000# # Completions for patch # complete -c patch -s b -l backup --description "Make backup files, when patching a file, rename or copy the original instead of removing it" complete -c patch -l backup-if-mismatch --description "Back up a file if the patch does not match the file exactly" complete -c patch -l no-backup-if-mismatch --description "Do not back up a file if the patch does not match the file exactly" complete -c patch -s B -l prefix -r -f --description "Prefix pref to a file name when generating its simple backup file name" complete -c patch -l binary --description "Read and write all files in binary mode" complete -c patch -s c -l context --description "Interpret the patch file as a ordinary context diff" complete -c patch -s d -l directory -r -f --description "Change to the directory dir immediately" complete -c patch -s D -l ifdef -r -f --description "Use the #ifdef ... #endif construct to mark changes" complete -c patch -l dry-run --description "Print the results of applying the patches without actually changing any files" complete -c patch -s e -l ed --description "Interpret the patch file as an ed script" complete -c patch -s E -l remove-empty-files --description "Remove output files that are empty after the patches have been applied" complete -c patch -s f -l force --description "Assume that the user knows exactly what he/she is doing, and do not ask questions" complete -c patch -s F -l fuzz -r -f --description "Set the maximum fuzz factor" complete -c patch -s g -l get -r -f --description "This option controls patch's actions when a file is under RCS or SCCS control, and does not exist or is read-only and matches the default version, or when a file is under ClearCase control and does not exist" complete -c patch -l help --description "Display help and exit" complete -c patch -s i -l input -r -f --description "Read the patch from patchfile" complete -c patch -s l -l ignore-whitespace --description "Match patterns loosely, in case tabs or spaces have been munged in your files" complete -c patch -s n -l normal --description "Interpret the patch file as a normal diff" complete -c patch -s N -l forward --description "Ignore patches that seem to be reversed or already applied" complete -c patch -s o -l output -r -f --description "Send output to outfile instead of patching files in place" complete -c patch -s p -l strip -r -f --description "Strip the smallest prefix containing num leading slashes from each file name found in the patch file" complete -c patch -l posix --description "Conform more strictly to the POSIX standard" complete -c patch -l quoting-style -r -f --description "Use style word to quote output names" -a "literal shell shell-always c escape" complete -c patch -s r -l reject-file -r -f --description "Put rejects into rejectfile instead of the default .rej file" complete -c patch -s R -l reverse --description "Assume that this patch was created with the old and new files swapped" complete -c patch -s s -l silent -l quiet --description "Work silently, unless an error occurs" complete -c patch -s t -l batch --description "Suppress questions like -f, but make some different assumptions" complete -c patch -s T -l set-time --description "Set the modification and access times of patched files from time stamps given in context diff headers, local time" complete -c patch -s u -l unified --description "Interpret the patch file as a unified context diff" complete -c patch -s v -l version --description "Display version and exit" complete -c patch -s V -l version-control -r -f --description "Use method to determine backup file names" complete -c patch -l verbose --description "Output extra information about the work being done" complete -c patch -s x -l debug -r -f --description "Set internal debugging flags of interest only to patch patchers" complete -c patch -s Y -l basename-prefix -r -f --description "Prefix pref to the basename of a file name when generating its simple backup file name" complete -c patch -s z -l suffix -r -f --description "Use suffix as the simple backup suffix" complete -c patch -s Z -l set-utc --description "Set the modification and access times of patched files from time stamps given in context diff headers, UTC, GMT" fish/share/completions/pbget.fish000066400000000000000000000011471214535744100174320ustar00rootroot00000000000000# Completions for the pbget command. # Author: SanskritFritz (gmail) complete -c pbget -l abs --description 'Use the ABS tree' complete -c pbget -l arch --description 'Set the desired package architecture' complete -c pbget -l aur --description 'Search the AUR' complete -c pbget -l aur-only --description 'Only search the AUR' complete -c pbget -l dir --description 'Set the output directory' complete -c pbget -l help --description 'Display this message' complete -c pbget -l upgradable --description 'Search for upgradable packages' complete -c pbget -l testing --description 'Search the ABS testing branches' fish/share/completions/pdfelatex.fish000066400000000000000000000000401214535744100202740ustar00rootroot00000000000000__fish_complete_tex pdfelatex fish/share/completions/pdfetex.fish000066400000000000000000000000361214535744100177640ustar00rootroot00000000000000__fish_complete_tex pdfetex fish/share/completions/pdflatex.fish000066400000000000000000000000361214535744100201340ustar00rootroot00000000000000__fish_complete_tex pdflatex fish/share/completions/pdftex.fish000066400000000000000000000000351214535744100176160ustar00rootroot00000000000000__fish_complete_tex pdftex fish/share/completions/perl.fish000066400000000000000000000062511214535744100172740ustar00rootroot00000000000000begin set -l unicode 'commandline | sgrep -qe "-[a-zA-Z]*C[a-zA-Z]*\$"' set -l noopt 'commandline | not sgrep -qe "-[a-zA-Z]*C[a-zA-Z]*\$"' complete -c perl -s 0 -n $noopt --description 'Specify record separator' complete -c perl -s a -n $noopt --description 'Turn on autosplit mode' complete -c perl -s c -n $noopt --description 'Check syntax' complete -c perl -s C -n $noopt --description 'Control Unicode features' complete -c perl -s Ca -n $unicode --description 'Debug UTF-8 cache' complete -c perl -s CA -n $unicode --description 'ARGV uses UTF-8' complete -c perl -s CD -n $unicode --description 'Opened filehandles are UTF-8' complete -c perl -s CE -n $unicode --description 'STDERR is UTF-8' complete -c perl -s Ci -n $unicode --description 'Filehandles that are read are UTF-8' complete -c perl -s CI -n $unicode --description 'STDIN is UTF-8' complete -c perl -s CL -n $unicode --description 'Enable Unicode conditionally' complete -c perl -s Co -n $unicode --description 'Filehandles written to are UTF-8' complete -c perl -s CO -n $unicode --description 'STDOUT is UTF-8' complete -c perl -s CS -n $unicode --description 'STDOUT, STDIN, and STDERR are UTF-8' complete -c perl -s d -n $noopt --description 'Debugger' complete -c perl -s dt -n 'commandline | sgrep -qe "d\$"' --description 'Debugger, with threads' complete -c perl -s D -n $noopt -x --description 'Debug option' complete -c perl -s e -n $noopt -x --description 'Execute command' complete -c perl -s E -n $noopt -x --description 'Execute command, enable optional features' complete -c perl -s f -n $noopt --description 'Disable sitecustomize.pl' complete -c perl -s F -n $noopt -x --description 'Set regexp used to split input' complete -c perl -s h -n $noopt --description 'Show help and exit' complete -c perl -s i -n $noopt -x --description 'Edit files in-place' complete -c perl -s I -n $noopt -r --description 'Include path' complete -c perl -s l -n $noopt --description 'Automatic line ending processing' complete -c perl -s m -n $noopt -x --description 'Require module' complete -c perl -s M -n $noopt -x --description 'Use module' complete -c perl -s n -n $noopt --description 'Loop script' complete -c perl -s p -n $noopt --description 'Loop script, print $_' complete -c perl -s s -n $noopt --description 'Define custom switches' complete -c perl -s S -n $noopt --description 'Search $PATH for script' complete -c perl -s t -n $noopt --description 'Taint checking, but only with warnings' complete -c perl -s T -n $noopt --description 'Taint checking' complete -c perl -s u -n $noopt --description 'Dump core' complete -c perl -s U -n $noopt --description 'Unsafe mode' complete -c perl -s v -n $noopt --description 'Display version and exit' complete -c perl -s V -n $noopt --description 'Display configuration and exit' complete -c perl -s w -n $noopt --description 'Show warnings' complete -c perl -s W -n $noopt --description 'Force warnings' complete -c perl -s X -n $noopt --description 'Disable warnings' complete -c perl -s x -n $noopt -r --description 'Extract script' end fish/share/completions/pftp.fish000066400000000000000000000000311214535744100172710ustar00rootroot00000000000000__fish_complete_ftp pftp fish/share/completions/pgrep.fish000066400000000000000000000002341214535744100174420ustar00rootroot00000000000000 __fish_complete_pgrep pgrep complete -c pgrep -s d -r -d 'Output delimiter' complete -c pgrep -s l -d 'List the process name as well as the process ID' fish/share/completions/pine.fish000066400000000000000000000022721214535744100172640ustar00rootroot00000000000000complete -c pine -s f --description "Open folder" -a "(cd ~/.Mail; ls -d *)" complete -c pine -s F --description "Open file" -r complete -c pine -s h --description "Display help and exit" complete -c pine -s i --description "Start in folder index" complete -c pine -s I --description "Initial set of keystrokes" -x complete -c pine -s k --description "Use function keys for commands" complete -c pine -s l --description "Expand collections in FOLDER LIST display" complete -c pine -s n --description "Start with specified current message number" -x complete -c pine -s o --description "Open folder read-only" complete -c pine -s p --description "Set configuration file" -r complete -c pine -s P --description "Set global configuration file" complete -c pine -s r --description "Restricted mode" complete -c pine -s z --description "Enable suspension support" complete -c pine -o conf --description "Produce a sample global configuration file" complete -c pine -o pinerc --description "Produce sample configuration file" -r complete -c pine -o sort --description "Set mail sort order" -a " arrival subject from date size orderedsubj reverse " complete -c pine -o option --description "Config option" -x fish/share/completions/ping.fish000066400000000000000000000044201214535744100172630ustar00rootroot00000000000000complete -c ping -a "(__fish_print_hostnames)" -x complete -c ping -s a --description "Audible ping" complete -c ping -s A --description "Adaptive ping" complete -c ping -s b --description "Allow pinging a broadcast address" complete -c ping -s B --description "Do not allow ping to change source address of probes" complete -c ping -s c --description "Stop after specified number of ECHO_REQUEST packets" -x complete -c ping -s d --description "Set the SO_DEBUG option on the socket being used" complete -c ping -s F --description "Allocate and set 20 bit flow label on ECHO_REQUEST packets" -x complete -c ping -s f --description "Flood ping" complete -c ping -s i --description "Wait specified interval of seconds between sending each packet" -x complete -c ping -s I --description "Set source address to specified interface address" -x -a "(__fish_print_interfaces; fish_print_addresses)" complete -c ping -s l --description "Send the specified number of packets without waiting for reply" -x complete -c ping -s L --description "Suppress loopback of multicast packets" complete -c ping -s n --description "Numeric output only" complete -c ping -s p --description "Pad packet with empty bytes" -x complete -c ping -s Q --description "Set Quality of Service -related bits in ICMP datagrams" -x complete -c ping -s q --description "Quiet mode" complete -c ping -s R --description "Record route" complete -c ping -s r --description "Bypass the normal routing tables and send directly to a host on an attached interface" complete -c ping -s s --description "Specifies the number of data bytes to be sent" -x complete -c ping -s S --description "Set socket buffer size" -x complete -c ping -s t --description "Set the IP Time to Live" -x complete -c ping -s T --description "Set special IP timestamp options" -x complete -c ping -s M --description "Select Path MTU Discovery strategy" -x -a "do want dont" complete -c ping -s U --description "Print full user-to-user latency" complete -c ping -s v --description "Verbose mode" complete -c ping -s V --description "Display version and exit" complete -c ping -s w --description "Specify a timeout, in seconds, before ping exits regardless of how many packets have been sent or received" -x complete -c ping -s W --description "Time to wait for a response, in seconds" -x fish/share/completions/pinky.fish000066400000000000000000000016751214535744100174710ustar00rootroot00000000000000complete -c pinky -s l -d "produce long format output for the specified USERs" complete -c pinky -s b -d "omit the user's home directory and shell in long format" complete -c pinky -s h -d "omit the user's project file in long format" complete -c pinky -s p -d "omit the user's plan file in long format" complete -c pinky -s s -d "do short format output, this is the default" complete -c pinky -s f -d "omit the line of column headings in short format" complete -c pinky -s w -d "omit the user's full name in short format" complete -c pinky -s i -d "omit the user's full name and remote host in short format" complete -c pinky -s q -d "omit the user's full name, remote host and idle time in short format" complete -c pinky -l help -d "display this help and exit" complete -c pinky -l version -d "output version information and exit" fish/share/completions/pkgadd.fish000066400000000000000000000004701214535744100175610ustar00rootroot00000000000000#completion for pkgadd complete -c pkgadd -o u -l upgrade -d 'Upgrade' complete -c pkgadd -o f -l force -d 'Force installation, overwriting' complete -c pkgadd -o r -l root -d 'Alternative installation root' complete -c pkgadd -o v -l version -d 'Print version' complete -c pkgadd -o h -l help -d 'Print help' fish/share/completions/pkgfile.fish000066400000000000000000000022501214535744100177460ustar00rootroot00000000000000complete -c pkgfile -l version -d 'show program\'s version number and exit' complete -c pkgfile -s h -l help -d 'show this help message and exit' complete -c pkgfile -s b -l binaries -d 'only show files in a {s}bin/ directory. Works with -s, -l' complete -c pkgfile -s c -l case-sensitive -d 'make searches case sensitive' complete -c pkgfile -s g -l glob -d 'allow the use of * and ? as wildcards' complete -c pkgfile -s r -l regex -d 'allow the use of regex in searches' complete -c pkgfile -s R -l repo -d 'search only in the specified repository' -xa '(cat /etc/pacman.conf|grep "^\[" | sed "s/\[\|]//g")' complete -c pkgfile -s v -l verbose -d 'enable verbose output' complete -c pkgfile -s i -l info -d 'provides information about the package owning a file' -r complete -c pkgfile -s l -l list -d 'list files of a given package; similar to "pacman -Ql"' -xa "(pacman -Sl | cut --delim ' ' --fields 2- | tr ' ' \t | sort)" complete -c pkgfile -s s -l search -d 'search which package owns a file' -r complete -c pkgfile -s u -l update -d 'update to the latest filelist. This requires write permission to /var/cache/pkgtools/lists' fish/share/completions/pkginfo.fish000066400000000000000000000010541214535744100177630ustar00rootroot00000000000000#completion for pkginfo complete -f -c pkginfo -o i -l installed -d 'List installed packages' complete -f -c pkginfo -o l -l list -a '(__fish_crux_packages)' -r -d 'Package whose files to list' complete -f -c pkginfo -o o -l owner -d 'Print the package owning file matching pattern' complete -f -c pkginfo -o f -l footprint -d 'Print footprint for file' complete -f -c pkginfo -o r -l root -d 'Specify alternative installation root' complete -f -c pkginfo -o v -l version -d 'Print version of pkgutils' complete -f -c pkginfo -o h -l help -d 'Print help' fish/share/completions/pkgmk.fish000066400000000000000000000022141214535744100174360ustar00rootroot00000000000000#completion for pkgmk complete -f -c pkgmk -o i -l install -d 'Install with pkgadd after build' complete -f -c pkgmk -o u -l upgrade -d 'Upgrade with pkgadd after build' complete -f -c pkgmk -o r -l recursive -d 'Search and build packages recursively' complete -f -c pkgmk -o d -l download -d 'Download the sources' complete -f -c pkgmk -o do -l download-only -d 'Only download the sources' complete -f -c pkgmk -o utd -l up-to-date -d 'Check if the package is uptodate' complete -f -c pkgmk -o uf -l update-footprint -d 'Update footprint' complete -f -c pkgmk -o if -l ignore-footprint -d 'Ignore footprint' complete -f -c pkgmk -o um -l update-md5sum -d 'Update md5sum' complete -f -c pkgmk -o im -l ignore-md5sum -d 'Ignore md5sum' complete -f -c pkgmk -o ns -l no-strip -d 'Do not strip executables' complete -f -c pkgmk -o f -l force -d 'Force rebuild' complete -f -c pkgmk -o c -l clean -d 'Remove package and sources' complete -f -c pkgmk -o kw -l keep-work -d 'Keep working dir' complete -f -c pkgmk -o cf -l config-file -r -d 'Use another config' complete -f -c pkgmk -o v -l version -d 'Print version' complete -f -c pkgmk -o h -l help -d 'Print help' fish/share/completions/pkgrm.fish000066400000000000000000000004141214535744100174450ustar00rootroot00000000000000#completion for pkgrm complete -f -c pkgrm -a '(__fish_crux_packages)' -d 'Package to remove' complete -c pkgrm -o r -l root -d 'Alternative installation root' complete -f -c pkgrm -o v -l version -d 'Print version' complete -f -c pkgrm -o h -l help -d 'Print help' fish/share/completions/pkill.fish000066400000000000000000000003771214535744100174500ustar00rootroot00000000000000 __fish_complete_pgrep pkill __fish_make_completion_signals for i in $__kill_signals set number (echo $i | cut -d " " -f 1) set name (echo $i | cut -d " " -f 2) complete -c pkill -o $number -d $name complete -c pkill -o $name -d $name end fish/share/completions/poff.fish000066400000000000000000000010041214535744100172530ustar00rootroot00000000000000complete -c poff -d 'PPP connection' -xa '(__fish_complete_ppp_peer)' complete -c poff -s r -d 'Causes the connection to be redialed after it is dropped' complete -c poff -s d -d 'Toggles the state of pppd\'s debug option' complete -c poff -s c -d 'Causes pppd(8) to renegotiate compression' complete -c poff -s a -d 'Stops all running ppp connections. If the argument isp-name is given it will be ignored' complete -c poff -s h -d 'Displays help information' complete -c poff -s v -d 'Prints the version and exits' fish/share/completions/pon.fish000066400000000000000000000001051214535744100171160ustar00rootroot00000000000000complete -c pon -d 'PPP connection' -xa '(__fish_complete_ppp_peer)' fish/share/completions/ports.fish000066400000000000000000000005371214535744100175020ustar00rootroot00000000000000#completion for ports complete -f -c ports -s u -l update -a '(__fish_ports_dirs)' -d 'Update ports' complete -f -c ports -s l -l list -d 'List ports' complete -f -c ports -s d -l diff -d 'List version diffs between local and installed ports' complete -f -c ports -s v -l version -d 'Print version' complete -f -c ports -s h -l help -d 'Print help' fish/share/completions/prevd.fish000066400000000000000000000001041214535744100174410ustar00rootroot00000000000000complete -c prevd -s l --description "Also print directory history" fish/share/completions/prt-get.fish000066400000000000000000000237251214535744100177210ustar00rootroot00000000000000#completion for prt-get complete -f -c prt-get -n '__fish_prt_use_package' -a '(__fish_prt_packages)' -d 'Package' complete -f -c prt-get -n '__fish_prt_use_port' -a '(__fish_prt_ports)' -d 'Port' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'install' -d 'Install listed ports' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'depinst' -d 'Install listed ports and their deps' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'grpinst' -d 'Install listed ports, stop if one fails' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'update' -d 'Update listed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'remove' -d 'Remove listed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'sysup' -d 'Update all outdated installed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'lock' -d 'Do not update this in sysup' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'unlock' -d 'Remove this from lock' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'diff' -d 'Print differences between installed packages and ports in the port tree' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'search' -d 'Search for an expr in port names' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'dsearch' -d 'Search for an expr in port names and descriptions' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'info' -d 'Print info on a port' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'fsearch' -d 'Search for a pattern in the footprints in the ports tree' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'path' -d 'Print the path of a port' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'readme' -d 'Print the eventual README of a port' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'depends' -d 'Print a list of deps for the listed ports' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'quickdeo' -d 'Print a simple list of deps for the listed ports' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'deptree' -d 'Print a deptree for the port' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'dup' -d 'List ports in multiple directories' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'list' -d 'List all the ports' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'printf' -d 'Print formatted list of ports' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'listinst' -d 'List installed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'listorphans' -d 'List installed packages which have no dependent packages' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'isinst' -d 'Check if a port is installed' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'current' -d 'Print the version of an installed package' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'ls' -d 'Print the listing of the directory of a port' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'cat' -d 'Print a file in a port to stdout' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'edit' -d 'Edit a file in a port' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'help' -d 'Shows a help screen' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'dumpconfig' -d 'Print the configuration of prt-get' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'version' -d 'Show the current version of prt-get' complete -f -n '__fish_prt_no_subcommand' -c prt-get -a 'cache' -d 'Create a cache for prt-get' complete -c prt-get -o f -o i -d 'Force install' complete -c prt-get -o fr -d 'Force rebuild' complete -c prt-get -o um -d 'Update md5sum' complete -c prt-get -o im -d 'Ignore md5sum' complete -c prt-get -o uf -d 'Update footprint' complete -c prt-get -o if -d 'Ignore footprint' complete -c prt-get -o ns -d 'No stripping' complete -c prt-get -o kw -d 'Keep work directory' complete -c prt-get -l ignore -a '(__fish_prt_ports)' -r -f -d 'Ignore the listed ports' complete -c prt-get -l cache -d 'Use cache' complete -c prt-get -l test -d 'Dry run' complete -c prt-get -l pre-install -d 'Exec eventual pre-install script' complete -c prt-get -l post-install -d 'Exec eventual post-install script' complete -c prt-get -l install-scripts -d 'Exec eventual pre-post-install scripts' complete -c prt-get -l no-std-config -r -d 'Ignore default config file' complete -c prt-get -l config-prepend -r -d 'Prepend string to config file' complete -c prt-get -l config-append -r -d 'Append string to config file' complete -c prt-get -l config-set -r -d 'Overrirde config file with string' complete -c prt-get -o v -d 'Be verbose' complete -c prt-get -l margs -r -d 'Arguments for pkgmk' complete -c prt-get -l aargs -r -d 'Arguments for pkgadd' complete -c prt-get -l rargs -r -d 'Arguments for pkgrm' complete -c prt-get -l prefer-higher -o ph -d 'Prefer higher version' complete -c prt-get -l strict-diff -o sd -d 'Override prefer-higher' complete -c prt-get -l config -r -d 'Use alternative config file' complete -c prt-get -l install-root -r -d 'Use this alternative root for installation' complete -c prt-get -l log -d 'Write output to log file' complete -f -c prt-cache -n '__fish_prt_use_package' -a '(__fish_prt_packages)' -d 'Port' complete -f -c prt-cache -n '__fish_prt_use_port' -a '(__fish_prt_ports)' -d 'Package' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'install' -d 'Install listed ports' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'depinst' -d 'Install listed ports and their deps' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'grpinst' -d 'Install listed ports, stop if one fails' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'update' -d 'Update listed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'remove' -d 'Remove listed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'sysup' -d 'Update all outdated installed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'lock' -d 'Do not update this in sysup' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'unlock' -d 'Remove this from lock' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'diff' -d 'Print differences between installed packages and ports in the port tree' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'search' -d 'Search for an expr in port names' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'dsearch' -d 'Search for an expr in port names and descriptions' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'info' -d 'Print info on a port' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'fsearch' -d 'Search for a pattern in the footprints in the ports tree' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'path' -d 'Print the path of a port' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'readme' -d 'Print the eventual README of a port' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'depends' -d 'Print a list of deps for the listed ports' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'quickdeo' -d 'Print a simple list of deps for the listed ports' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'deptree' -d 'Print a deptree for the port' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'list' -d 'List all the ports' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'printf' -d 'Print formatted list of ports' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'listinst' -d 'List installed packages' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'listorphans' -d 'List installed packages which have no dependent packages' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'current' -d 'Print the version of an installed package' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'ls' -d 'Print the listing of the directory of a port' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'cat' -d 'Print a file in a port to stdout' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'edit' -d 'Edit a file in a port' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'help' -d 'Shows a help screen' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'dumpconfig' -d 'Print the configuration of prt-get' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'version' -d 'Show the current version of prt-get' complete -f -n '__fish_prt_no_subcommand' -c prt-cache -a 'cache' -d 'Create a cache for prt-get' complete -c prt-cache -o f -o i -d 'Force install' complete -c prt-cache -o fr -d 'Force rebuild' complete -c prt-cache -o um -d 'Update md5sum' complete -c prt-cache -o im -d 'Ignore md5sum' complete -c prt-cache -o uf -d 'Update footprint' complete -c prt-cache -o if -d 'Ignore footprint' complete -c prt-cache -o ns -d 'No stripping' complete -c prt-cache -o kw -d 'Keep work directory' complete -c prt-cache -l ignore -a '(__fish_prt_ports)' -r -f -d 'Ignore the listed ports' complete -c prt-cache -l test -d 'Dry run' complete -c prt-cache -l pre-install -d 'Exec eventual pre-install script' complete -c prt-cache -l post-install -d 'Exec eventual post-install script' complete -c prt-cache -l install-scripts -d 'Exec eventual pre-post-install scripts' complete -c prt-cache -l no-std-config -r -d 'Ignore default config file' complete -c prt-cache -l config-prepend -r -d 'Prepend string to config file' complete -c prt-cache -l config-append -r -d 'Append string to config file' complete -c prt-cache -l config-set -r -d 'Overrirde config file with string' complete -c prt-cache -o v -d 'Be verbose' complete -c prt-cache -l margs -r -d 'Arguments for pkgmk' complete -c prt-cache -l aargs -r -d 'Arguments for pkgadd' complete -c prt-cache -l rargs -r -d 'Arguments for pkgrm' complete -c prt-cache -l prefer-higher -o ph -d 'Prefer higher version' complete -c prt-cache -l strict-diff -o sd -d 'Override prefer-higher' complete -c prt-cache -l config -r -d 'Use alternative config file' complete -c prt-cache -l install-root -r -d 'Use this alternative root for installation' complete -c prt-cache -l log -d 'Write output to log file' fish/share/completions/ps.fish000066400000000000000000000055531214535744100167600ustar00rootroot00000000000000# Completions for ps complete -c ps -s A --description "Select all" complete -c ps -s N --description "Invert selection" complete -c ps -s a --description "Select all processes except session leaders and terminal-less" complete -c ps -s d --description "Select all processes except session leaders" complete -c ps -s e --description "Select all" complete -c ps -l deselect --description "Deselect all processes that do not fulfill conditions" complete -c ps -s C --description "Select by command" -ra '(__fish_complete_list , __fish_complete_proc)' complete -c ps -s G -l Group --description "Select by group" -x -a "(__fish_complete_list , __fish_complete_groups)" complete -c ps -s U -l User --description "Select by user" -x -a "(__fish_complete_list , __fish_complete_users)" complete -c ps -s u -l user --description "Select by user" -x -a "(__fish_complete_list , __fish_complete_users)" complete -c ps -s g -l group --description "Select by group/session" -x -a "(__fish_complete_list , __fish_complete_groups)" complete -c ps -s p -l pid --description "Select by PID" -x -a "(__fish_complete_list , __fish_complete_pids)" complete -c ps -l ppid --description "Select by parent PID" -x -a "(__fish_complete_list , __fish_complete_pids)" complete -c ps -s s -l sid --description "Select by session ID" -x -a "(__fish_complete_list , __fish_complete_pids)" complete -c ps -s t -l tty --description "Select by tty" -r complete -c ps -s F --description "Extra full format" complete -c ps -s O --description "User defined format" -x complete -c ps -s M --description "Add column for security data" complete -c ps -s c -d 'Show different scheduler information for the -l option' complete -c ps -s f --description "Full format" complete -c ps -s j --description "Jobs format" complete -c ps -s l --description "Long format" complete -c ps -s o -l format --description "User defined format" -x complete -c ps -s y --description "Do not show flags" complete -c ps -s Z -l context --description "Add column for security data" complete -c ps -s H -l forest --description "Show hierarchy" complete -c ps -s n --description "Set namelist file" -r complete -c ps -s w --description "Wide output" complete -c ps -l cols -l columns -l width -d 'Set screen width' -r complete -c ps -l cumulative -d 'Include dead child process data' complete -c ps -l headers -d 'Repead header lines, one per page' complete -c ps -l no-headers -d 'Print no headers' complete -c ps -l lines -l rows -d 'Set screen height' -r complete -c ps -l sort -d 'Spericy sorting order' -r complete -c ps -s L --description "Show threads. With LWP/NLWP" complete -c ps -s T --description "Show threads. With SPID" complete -c ps -s m -d 'Show threads after processes' complete -c ps -s V -l version --description "Display version and exit" complete -c ps -l help --description "Display help and exit" complete -c ps -l info --description "Display debug info" fish/share/completions/ps2pdf.fish000066400000000000000000000001101214535744100175140ustar00rootroot00000000000000complete -c ps2pdf -x -a "( __fish_complete_suffix .ps )" fish/share/completions/psub.fish000066400000000000000000000002451214535744100173000ustar00rootroot00000000000000complete -c psub -s h -l help --description "Display help and exit" complete -c psub -s f -l file --description "Communicate using a regular file, not a named pipe" fish/share/completions/pushd.fish000066400000000000000000000000571214535744100174530ustar00rootroot00000000000000complete -c pushd -x -a "(__fish_complete_cd)" fish/share/completions/pydf.fish000066400000000000000000000026161214535744100172750ustar00rootroot00000000000000 complete -c pydf -r -d 'Report colourised filesystem disk space usage' complete -c pydf -l help -d 'show this help message' complete -c pydf -s v -l version -d 'show version' complete -c pydf -s a -l all -d 'include filesystems having 0 blocks' complete -c pydf -s h -l human-readable -d 'print sizes in human readable format (e.g., 1K 234M 2G)' complete -c pydf -s H -l si -d 'likewise, but use powers of 1000 not 1024' complete -c pydf -s b -l block-size -x -d 'use BLOCKSIZE-byte blocks' complete -c pydf -s l -l local -d 'limit listing to local filesystems' complete -c pydf -s k -l kilobytes -d 'like --block-size=1024' complete -c pydf -s m -l megabytes -d 'like --block-size=1048576' complete -c pydf -s g -l gigabytes -d 'like --block-size=1073741824' complete -c pydf -l blocks -d 'use filesystem native block size' complete -c pydf -l bw -d 'do not use colours' complete -c pydf -l mounts -r -d 'file to get mount information from. On normal Linux systems only /etc/mtab or /proc/mounts make sense. Some other Unices use /etc/mnttab. Use /proc/mounts when /etc/mtab is corrupted or inaccessible (the output looks a bit weird in this case).' complete -c pydf -s B -l show-binds -d 'show \'mount --bind\' mounts' complete -c pydf -s i -l inodes -d 'show inode instead of block usage' fish/share/completions/python.fish000066400000000000000000000000361214535744100176460ustar00rootroot00000000000000__fish_complete_python python fish/share/completions/python2.fish000066400000000000000000000000371214535744100177310ustar00rootroot00000000000000__fish_complete_python python2 fish/share/completions/python3.fish000066400000000000000000000000401214535744100177240ustar00rootroot00000000000000__fish_complete_python python3 fish/share/completions/quilt.fish000066400000000000000000000063001214535744100174630ustar00rootroot00000000000000# completions for quilt version 0.46 or similiar complete -c quilt -s h -d "show help" complete -c quilt -l version -d "show version" complete -c quilt -l quiltrc -r --no-file -d "specify the file to Run Control file to use" complete -c quilt -l trace -r --no-file -d "Runs the command in bash trace mode (-x). For internal debugging" complete -c quilt -a add -r -d "Add one or more files to the topmost or named patch" complete -c quilt -a annotate -r -d "Print an annotated listing of the specified file" complete -c quilt -a applied -r -d "Print a list of applied patches" complete -c quilt -a delete -r -d "Remove the specified or topmost patch from the series file" complete -c quilt -a diff -r -d "Produces a diff of the specified file(s) in the topmost or specified patch" complete -c quilt -a edit -r -d "Edit the specified file(s) in $EDITOR" complete -c quilt -a files -r -d "Print the list of files that the topmost or specified patch changes" complete -c quilt -a fold -r -d "Integrate the patch read from standard input into the topmost patch" complete -c quilt -a fork -r --no-file -d " Fork the topmost patch" complete -c quilt -a graph -r --no-file -d "Generate a dot(1) directed graph showing the dependencies between applied patches" complete -c quilt -a grep -r --no-file -d "Grep through the source files, recursively, skipping patches and quilt meta-information" complete -c quilt -a header -r --no-file -d " Print or change the header of the topmost or specified patch" complete -c quilt -a import -r -d "Import external patches" complete -c quilt -a mail -r -d "Create mail messages from all patches in the series file, and either store or send them" complete -c quilt -a new -r -d "Create a new patch with the specified file name, and insert it after the topmost patch" complete -c quilt -a next -r -d "Print the name of the next patch after the specified or topmost patch in the series file" complete -c quilt -a patches -r -d "Print the list of patches that modify the specified file" complete -c quilt -a pop -r -d "Remove patch(es) from the stack of applied patches" complete -c quilt -a previous -r -d "Print the name of the previous patch before the specified or topmost patch in the series file" complete -c quilt -a push -r -d "Apply patch(es) from the series file" complete -c quilt -a refresh -r -d "Refreshes the specified patch, or the topmost patch by default" complete -c quilt -a remove -r -d "Remove one or more files from the topmost or named patch" complete -c quilt -a rename -r -d "Rename the topmost or named patch" complete -c quilt -a series -r --no-file -d "Print the names of all patches in the series file" complete -c quilt -a setup -r -d " Initializes a source tree from an rpm spec file or a quilt series file" complete -c quilt -a snapshot -r --no-file -d " Take a snapshot of the current working state" complete -c quilt -a top -d "Print the name of the topmost patch on the current stack of applied patches" complete -c quilt -a unapplied -r -d "Print a list of patches that are not applied, or all patches that follow the specified patch in the series file" complete -c quilt -a upgrade -d "Upgrade the meta-data in a working tree from an old version of quilt to the current version" fish/share/completions/random.fish000066400000000000000000000001071214535744100176040ustar00rootroot00000000000000 complete -c random -s h -l help --description "Display help and exit" fish/share/completions/rbenv.fish000066400000000000000000000074001214535744100174430ustar00rootroot00000000000000# fish completion for rbenv function __fish_rbenv_needs_command set cmd (commandline -opc) if [ (count $cmd) -eq 1 -a $cmd[1] = 'rbenv' ] return 0 end return 1 end function __fish_rbenv_using_command set cmd (commandline -opc) if [ (count $cmd) -gt 1 ] if [ $argv[1] = $cmd[2] ] return 0 end end return 1 end function __fish_rbenv_executables rbenv exec --complete end function __fish_rbenv_installed_rubies rbenv versions --bare end function __fish_rbenv_official_rubies ruby-build --definitions end function __fish_rbenv_prefixes rbenv prefix --complete end ### commands complete -f -c rbenv -n '__fish_rbenv_needs_command' -a commands -d 'List all rbenv commands' complete -f -c rbenv -n '__fish_rbenv_using_command commands' -a '--complete --sh --no-sh' ### completions complete -f -c rbenv -n '__fish_rbenv_needs_command' -a completions ### exec complete -f -c rbenv -n '__fish_rbenv_needs_command' -a exec complete -f -c rbenv -n '__fish_rbenv_using_command exec' -a '(__fish_rbenv_executables)' ### global complete -f -c rbenv -n '__fish_rbenv_needs_command' -a global -d 'Set or show the global Ruby version' complete -f -c rbenv -n '__fish_rbenv_using_command global' -a '(__fish_rbenv_installed_rubies)' ### help complete -f -c rbenv -n '__fish_rbenv_needs_command' -a help ### hooks complete -f -c rbenv -n '__fish_rbenv_needs_command' -a hooks ### init complete -f -c rbenv -n '__fish_rbenv_needs_command' -a init ### install complete -f -c rbenv -n '__fish_rbenv_needs_command' -a install -d 'Install a ruby version' complete -f -c rbenv -n '__fish_rbenv_using_command install' -a '(__fish_rbenv_official_rubies)' ### local complete -f -c rbenv -n '__fish_rbenv_needs_command' -a local -d 'Set or show the local directory-specific Ruby version' complete -f -c rbenv -n '__fish_rbenv_using_command local' -a '(__fish_rbenv_installed_rubies)' ### prefix complete -f -c rbenv -n '__fish_rbenv_needs_command' -a prefix -d 'Shows a ruby version installed folder' complete -f -c rbenv -n '__fish_rbenv_using_command prefix' -a '(__fish_rbenv_prefixes)' ### rehash complete -f -c rbenv -n '__fish_rbenv_needs_command' -a rehash -d 'Rehash rbenv shims (run this after installing binaries)' ### root complete -f -c rbenv -n '__fish_rbenv_needs_command' -a root -d 'rbenv root folder' ### shell complete -f -c rbenv -n '__fish_rbenv_needs_command' -a shell -d 'Set or show the shell-specific Ruby version' complete -f -c rbenv -n '__fish_rbenv_using_command shell' -a '--unset (__fish_rbenv_installed_rubies)' ### shims complete -f -c rbenv -n '__fish_rbenv_needs_command' -a shims complete -f -c rbenv -n '__fish_rbenv_using_command shims' -a '--short' ### version complete -f -c rbenv -n '__fish_rbenv_needs_command' -a version -d 'Show the current Ruby version' ### version-file complete -f -c rbenv -n '__fish_rbenv_needs_command' -a version-file ### version-file-read complete -f -c rbenv -n '__fish_rbenv_needs_command' -a version-file-read ### version-file-write complete -f -c rbenv -n '__fish_rbenv_needs_command' -a version-file-write ### version-name complete -f -c rbenv -n '__fish_rbenv_needs_command' -a version-name ### version-origin complete -f -c rbenv -n '__fish_rbenv_needs_command' -a version-origin ### versions complete -f -c rbenv -n '__fish_rbenv_needs_command' -a versions -d 'List all Ruby versions known by rbenv' ### whence complete -f -c rbenv -n '__fish_rbenv_needs_command' -a whence -d 'List all Ruby versions with the given command' complete -f -c rbenv -n '__fish_rbenv_using_command whence' -a '--complete --path' ### which complete -f -c rbenv -n '__fish_rbenv_needs_command' -a which -d 'Show the full path for the given Ruby command' complete -f -c rbenv -n '__fish_rbenv_using_command which' -a '(__fish_rbenv_executables)' fish/share/completions/rc.d.fish000066400000000000000000000013061214535744100171540ustar00rootroot00000000000000 complete -c rc.d -xa 'list start stop restart help' -n 'not __fish_seen_subcommand_from list start stop restart' complete -c rc.d -s s -l started -n '__fish_seen_subcommand_from list start stop restart' -d 'Filter started daemons' complete -c rc.d -s S -l stopped -n '__fish_seen_subcommand_from list start stop restart' -d 'Filter stopped daemons' complete -c rc.d -s a -l auto -n '__fish_seen_subcommand_from list start stop restart' -d 'Filter auto started daemons' complete -c rc.d -s A -l noauto -n '__fish_seen_subcommand_from list start stop restart' -d 'Filter manually started daemons' complete -c rc.d -n '__fish_seen_subcommand_from list start stop restart' -xa '( __fish_print_arch_daemons )' fish/share/completions/read.fish000066400000000000000000000017011214535744100172400ustar00rootroot00000000000000complete -c read -s h -l help --description "Display help and exit" complete -c read -s p -l prompt --description "Set prompt command" -x complete -c read -s x -l export --description "Export variable to subprocess" complete -c read -s g -l global --description "Make variable scope global" complete -c read -s l -l local --description "Make variable scope local" complete -c read -s U -l universal --description "Make variable scope universal, i.e. share variable with all the users fish processes on this computer" complete -c read -s u -l unexport --description "Do not export variable to subprocess" complete -c read -s m -l mode-name --description "Name to load/save history under" -r -a "read fish" complete -c read -s c -l command --description "Initial contents of read buffwhen reading interactively" complete -c read -s s -l shell --description "Use syntax highlighting, tab completions and command termination suitable for entering shellscript code" fish/share/completions/readlink.fish000066400000000000000000000016121214535744100201170ustar00rootroot00000000000000# # Completions for the readlink command. # SanskritFritz (gmail) # complete -c readlink -s f -l canonicalize --description 'Canonicalize, follow symlinks, last can be missing' complete -c readlink -s e -l canonicalize-existing --description 'Canonicalize, follow symlinks, none can be missing' complete -c readlink -s m -l canonicalize-missing --description 'Canonicalize, follow symlinks, all can be missing' complete -c readlink -s n -l no-newline --description 'Do not output the trailing newline' complete -c readlink -s q -l quiet -s s -l silent --description 'Suppress most error messages' complete -c readlink -s v -l verbose --description 'Report error messages' complete -c readlink -l help --description 'Display this help and exit' complete -c readlink -l version --description 'Output version information and exit' fish/share/completions/realpath.fish000066400000000000000000000017421214535744100201320ustar00rootroot00000000000000complete -c realpath -s e -l canonicalize-existing -d 'all components of the path must exist' complete -c realpath -s m -l canonicalize-missing -d 'no components of the path need exist' complete -c realpath -s L -l logical -d 'resolve \'..\' components before symlinks' complete -c realpath -s P -l physical -d 'resolve symlinks as encountered (default)' complete -c realpath -s q -l quiet -d 'suppress most error messages' complete -c realpath -l relative-to -r -d 'print the resolved path relative to FILE' complete -c realpath -l relative-base -r -d 'print absolute paths unless paths below FILE' complete -c realpath -s s -l strip -l no-symlinks -d 'don\'t expand symlinks' complete -c realpath -s z -l zero -d 'separate output with NUL rather than newline' complete -c realpath -l help -d 'display this help and exit' complete -c realpath -l version -d 'output version information and exit' fish/share/completions/reject.fish000066400000000000000000000001121214535744100175740ustar00rootroot00000000000000__fish_complete_lpr reject complete -c reject -s r -d 'Reject reason' -x fish/share/completions/rejmerge.fish000066400000000000000000000003051214535744100201240ustar00rootroot00000000000000#completion for rejmerge complete -f -c rejmerge -o r -l root -d 'Alternative root' complete -f -c rejmerge -o v -l version -d 'Print version' complete -f -c rejmerge -o h -l help -d 'Print help' fish/share/completions/renice.fish000066400000000000000000000004631214535744100175760ustar00rootroot00000000000000 complete -c renice -s p --description "Force following parameters to be process ID's (The default)" complete -c renice -s g --description "Force following parameters to be interpreted as process group ID's" complete -c renice -s u --description "Force following parameters to be interpreted as user names" fish/share/completions/return.fish000066400000000000000000000003431214535744100176450ustar00rootroot00000000000000 complete -c return -s h -l help --description "Display help and exit" complete -c return -x -a 0 -d "Return from function with normal exit status" complete -c return -x -a 1 -d "Return from function with abnormal exit status" fish/share/completions/rfkill.fish000066400000000000000000000005371214535744100176160ustar00rootroot00000000000000complete -c rfkill -xa 'block unblock list event help' -n 'not __fish_seen_subcommand_from block unblock list event help' complete -c rfkill -n '__fish_seen_subcommand_from block unblock list' -d 'device group' -xa "all wifi wlan bluetooth uwb ultrawideband wimax wwan gps fm (rfkill list | tr : \t)" complete -c rfkill -l version -d 'Print version' fish/share/completions/rgrep.fish000066400000000000000000000000331214535744100174410ustar00rootroot00000000000000__fish_complete_grep rgrep fish/share/completions/rm.fish000066400000000000000000000011401214535744100167400ustar00rootroot00000000000000#Completions for rm complete -c rm -s d -l directory --description "Unlink directory (Only by superuser)" complete -c rm -s f -l force --description "Never prompt before removal" complete -c rm -s i -l interactive --description "Prompt before removal" complete -c rm -s r -l recursive --description "Recursively remove subdirectories" complete -c rm -s R --description "Recursively remove subdirectories" complete -c rm -s v -l verbose --description "Explain what is done" complete -c rm -s h -l help --description "Display help and exit" complete -c rm -l version --description "Display version and exit" fish/share/completions/rmdir.fish000066400000000000000000000007361214535744100174510ustar00rootroot00000000000000#Completions for rmdir complete -x -c rmdir -a "(__fish_complete_directories (commandline -ct))" complete -c rmdir -l ignore-fail-on-non-empty --description "Ignore errors from non-empty directories" complete -c rmdir -s p -l parents --description "Remove each component of path" complete -c rmdir -s v -l verbose --description "Verbose mode" complete -c rmdir -l help --description "Display help and exit" complete -c rmdir -l version --description "Display version and exit" fish/share/completions/root.fish000066400000000000000000000007771214535744100173240ustar00rootroot00000000000000 complete -c root -s b -d 'Run in batch mode' complete -c root -s n -d 'Do not execute logon and logoff macros' complete -c root -s q -d 'Exit after processing commandline macro files' complete -c root -s l -d 'Do not show splashscreen' complete -c root -s x -d 'Exit on exception' complete -c root -s h -s \? -l help -d 'Print help' complete -c root -o config -d 'Print ./configure options' complete -c root -o memstat -d 'Run with memory usage monitoring' complete -c root -a "(__fish_complete_suffix .root)" fish/share/completions/rpm.fish000066400000000000000000000253331214535744100171320ustar00rootroot00000000000000# Completions for the rpm command. Insanely complicated, # since rpm has multiple operation modes, and a perverse number of switches. complete -c rpm -s "?" -l help --description "Display help and exit" complete -c rpm -l version --description "Display version and exit" complete -c rpm -l quiet --description "Quiet mode" complete -c rpm -s v --description "Verbose mode" complete -c rpm -l rcfile --description "List of rpm configuration files" -f complete -c rpm -l pipe --description "Pipe output through specified command" -r complete -c rpm -l dbpath --description "Specify directory for rpm database" -a " ( __fish_complete_directories (commandline -ct) 'Rpm database directory' ) " complete -c rpm -l root --description "Specify root directory for rpm operations" -a " ( __fish_complete_directories (commandline -ct) 'Root directory for rpm operations' ) " set rpm_install -c rpm -n "__fish_contains_opt -s i -s U -s F install upgrade freshen" complete $rpm_install -l aid --description "Add suggested packages to the transaction set when needed" complete $rpm_install -l allfiles --description "Installs or upgrades all the files in the package, even if they aren't needed (missingok) and don't exist" complete $rpm_install -l badreloc --description "Used with --relocate, permit relocations on all file paths, not just those OLD-PATH's included in the binary package relocation hint(s)" complete $rpm_install -l excludepath --description "Don't install files whose name begins with specified path" -xa "(__fish_complete_directories (commandline -ct) 'Skip installation of files in this directory')" complete $rpm_install -l excludedocs --description "Don't install any files which are marked as documentation" complete $rpm_install -l force --description 'Same as using --replacepkgs, --replacefiles, and --oldpackage' complete $rpm_install -s h -l hash --description 'Print 50 hash marks as the package archive is unpacked' complete $rpm_install -l ignoresize --description "Don't check for sufficient disk space before installation" complete $rpm_install -l ignorearch --description "Allow installation or upgrading even if the architectures of the binary package and host don't match" complete $rpm_install -l ignoreos --description "Allow installation or upgrading even if the operating systems of the binary package and host don't match" complete $rpm_install -l includedocs --description 'Install documentation files (default)' complete $rpm_install -l justdb --description 'Update only the database, not the filesystem' complete $rpm_install -l nodigest --description "Don't verify package or header digests when reading" complete $rpm_install -l nosignature --description "Don't verify package or header signatures when reading" complete $rpm_install -l nodeps --description "Don't do a dependency check" complete $rpm_install -l nosuggest --description "Don't suggest package(s) that provide a missing dependency" complete $rpm_install -l noorder --description "Don't change the package installation order" complete $rpm_install -l noscripts --description "Don't execute scripts" complete $rpm_install -l nopre --description "Don't execute pre scripts" complete $rpm_install -l nopost --description "Don't execute post scripts" complete $rpm_install -l nopreun --description "Don't execute preun scripts" complete $rpm_install -l nopostun --description "Don't execute postun scripts" complete $rpm_install -l notriggers --description "Don't execute trigger scriptlets" complete $rpm_install -l notriggerin --description "Don't execute triggerin scriptlets" complete $rpm_install -l notriggerun --description "Don't execute triggerun scriptlets" complete $rpm_install -l notriggerpostun --description "Don't execute triggerpostun scriptlets" complete $rpm_install -l oldpackage --description 'Allow an upgrade to replace a newer package with an older one' complete $rpm_install -l percent --description 'Print percentages as files are unpacked from the package archive. This is intended to make rpm easy to run from other tools' complete $rpm_install -l prefix --description 'For relocatable binary packages, translate all file paths that start with the installation prefix in the package relocation hint(s) to NEWPATH' -xa "(__fish_complete_directories (commandline -ct) 'Directory prefix for relocatable packages')" complete $rpm_install -l relocate -x --description "Translate all paths that start with first half of following parameter to second half of following parameter" complete $rpm_install -l repackage --description 'Re-package the files before erasing' complete $rpm_install -l replacefiles --description 'Install the packages even if they replace files from other, already installed, packages' complete $rpm_install -l replacepkgs --description 'Install the packages even if some of them are already installed on this system' complete $rpm_install -l test --description "Don't install the package, simply check for and report potential conflicts" set -e rpm_install set rpm_query -c rpm -n "__fish_contains_opt -s q query" complete $rpm_query -l changelog --description 'Display change information for the package' complete $rpm_query -s c -l configfiles --description 'List only configuration files (implies -l)' complete $rpm_query -s d -l docfiles --description 'List only documentation files (implies -l)' complete $rpm_query -l dump --description 'Dump file information. Must be used with at least one of -l, -c, -d' complete $rpm_query -l filesbypkg --description 'List all the files in each selected package' complete $rpm_query -s i -l info --description 'Display package information, including name, version, and description. Uses --queryformat if specified' complete $rpm_query -l last --description 'Orders the package listing by install time' complete $rpm_query -s l -l list --description 'List files in package' complete $rpm_query -l provides --description 'List capabilities this package provides' complete $rpm_query -s R -l requires --description 'List packages on which this package depends' complete $rpm_query -l scripts --description 'List the package specific scriptlets' complete $rpm_query -s s -l state --description 'Display the states of files in the package. The state of each file is one of normal, not installed, or replaced' complete $rpm_query -l triggers --description 'Display the trigger scripts contained in the package' complete $rpm_query -l triggerscripts --description 'Display the trigger scripts contained in the package' set -e rpm_query set rpm_select -c rpm -n "__fish_contains_opt -s q -s V query verify" complete $rpm_select -a "(__fish_print_packages)" complete $rpm_select -s a -l all --description 'Query all installed packages' complete $rpm_select -s f -l file --description 'Query package owning specified file' -r complete $rpm_select -l fileid --description 'Query package that contains a given file identifier, i.e. the MD5 digest of the file contents' -x complete $rpm_select -s g -l group --description 'Query packages with the specified group' -x complete $rpm_select -l hdrid --description 'Query package that contains a given header identifier, i.e. the SHA1 digest of the immutable header region' -x complete $rpm_select -s p -l package --description 'Query an (uninstalled) package in specified file' -xa "(__fish_complete_suffix .rpm)" complete $rpm_select -l pkgid --description 'Query package that contains a given package identifier, i.e. the MD5 digest of the combined header and payload contents' -x complete $rpm_select -l specfile --description 'Parse and query specified spec-file as if it were a package' -xa "(__fish_complete_suffix .spec)" complete $rpm_select -l tid --description 'Query package(s) that have the specified TID (transaction identifier)' -x complete $rpm_select -l triggeredby --description 'Query packages that are triggered by the specified packages' -x -a "(__fish_print_packages)" complete $rpm_select -l whatprovides --description 'Query all packages that provide the specified capability' -x complete $rpm_select -l whatrequires --description 'Query all packages that requires the specified capability for functioning' -x set -e rpm_select set rpm_verify -c rpm -n "__fish_contains_opt -s V verify" complete $rpm_verify -l nodeps --description "Don't verify dependencies of packages" complete $rpm_verify -l nodigest --description "Don't verify package or header digests when reading" complete $rpm_verify -l nofiles --description "Don't verify any attributes of package files" complete $rpm_verify -l noscripts --description "Don't execute the %verifyscript scriptlet" complete $rpm_verify -l nosignature --description "Don't verify package or header signatures when reading" complete $rpm_verify -l nolinkto --description "Don't verify linkto attribute" complete $rpm_verify -l nomd5 --description "Don't verify md5 attribute" complete $rpm_verify -l nosize --description "Don't verify size attribute" complete $rpm_verify -l nouser --description "Don't verify user attribute" complete $rpm_verify -l nogroup --description "Don't verify group attribute" complete $rpm_verify -l nomtime --description "Don't verify time attribute" complete $rpm_verify -l nomode --description "Don't verify mode attribute" complete $rpm_verify -l nordev --description "Don't verify dev attribute" set -e rpm_verify set rpm_erase -c rpm -n "__fish_contains_opt -s e erase" complete $rpm_erase -a "(__fish_print_packages)" complete $rpm_erase -l allmatches --description 'Remove all versions of the package which match specified string' complete $rpm_erase -l nodeps --description "Don't check dependencies before uninstalling the packages" complete $rpm_erase -l noscripts --description "Don't execute scriplets" complete $rpm_erase -l nopreun --description "Don't execute preun scriptlet" complete $rpm_erase -l nopostun --description "Don't execute postun scriptlet" complete $rpm_erase -l notriggers --description "Don't execute trigger scriptlets" complete $rpm_erase -l notriggerun --description "Don't execute triggerun scriptlets" complete $rpm_erase -l notriggerpostun --description "Don't execute triggerpostun scriptlets" complete $rpm_erase -l repackage --description 'Re-package the files before erasing' complete $rpm_erase -l test --description "Don't really uninstall anything" set -e rpm_erase set rpm_mode -c rpm -n 'not __fish_contains_opt -s e -s i -s F -s V -s U -s q erase install freshen verify upgrade query' complete $rpm_mode -s i -l install --description 'Install new package' complete $rpm_mode -s U -l upgrade --description 'Upgrade existing package' complete $rpm_mode -s F -l freshen --description 'Upgrade package if already installed' complete $rpm_mode -s q -l query --description 'Query installed packages' complete $rpm_mode -s V -l verify --description 'Verify package integrity' complete $rpm_mode -s e -l erase --description 'Erase package' set -e rpm_mode complete -c rpm -xa '(__fish_complete_suffix .rpm)' fish/share/completions/rsync.fish000066400000000000000000000215171214535744100174720ustar00rootroot00000000000000 complete -c rsync -s v -l verbose --description "Increase verbosity" complete -c rsync -s q -l quiet --description "Suppress non-error messages" complete -c rsync -s c -l checksum --description "Skip based on checksum, not mod-time & size" complete -c rsync -s a -l archive --description "Archive mode; same as -rlptgoD (no -H)" complete -c rsync -l no-OPTION --description "Turn off an implied OPTION (e.g. --no-D)" complete -c rsync -s r -l recursive --description "Recurse into directories" complete -c rsync -s R -l relative --description "Use relative path names" complete -c rsync -l no-implied-dirs --description "Don’t send implied dirs with --relative" complete -c rsync -s b -l backup --description "Make backups (see --suffix & --backup-dir)" complete -c rsync -l backup-dir=DIR --description "Make backups into hierarchy based in DIR" complete -c rsync -l suffix=SUFFIX --description "Backup suffix (default ~ w/o --backup-dir)" complete -c rsync -s u -l update --description "Skip files that are newer on the receiver" complete -c rsync -l inplace --description "Update destination files in-place" complete -c rsync -l append --description "Append data onto shorter files" complete -c rsync -s d -l dirs --description "Transfer directories without recursing" complete -c rsync -s l -l links --description "Copy symlinks as symlinks" complete -c rsync -s L -l copy-links --description "Transform symlink into referent file/dir" complete -c rsync -l copy-unsafe-links --description "Only \"unsafe\" symlinks are transformed" complete -c rsync -l safe-links --description "Ignore symlinks that point outside the tree" complete -c rsync -s k -l copy-dirlinks --description "Transform symlink to dir into referent dir" complete -c rsync -s K -l keep-dirlinks --description "Treat symlinked dir on receiver as dir" complete -c rsync -s H -l hard-links --description "Preserve hard links" complete -c rsync -s p -l perms --description "Preserve permissions" complete -c rsync -s E -l executability --description "Preserve executability" complete -c rsync -s A -l acls --description "Preserve ACLs (implies -p) [non-standard]" complete -c rsync -s X -l xattrs --description "Preserve extended attrs (implies -p) [n.s.]" complete -c rsync -l chmod=CHMOD --description "Change destination permissions" complete -c rsync -s o -l owner --description "Preserve owner (super-user only)" complete -c rsync -s g -l group --description "Preserve group" complete -c rsync -l devices --description "Preserve device files (super-user only)" complete -c rsync -l specials --description "Preserve special files" complete -c rsync -s D --description "Same as --devices --specials" complete -c rsync -s t -l times --description "Preserve times" complete -c rsync -s O -l omit-dir-times --description "Omit directories when preserving times" complete -c rsync -l super --description "Receiver attempts super-user activities" complete -c rsync -s S -l sparse --description "Handle sparse files efficiently" complete -c rsync -s n -l dry-run --description "Show what would have been transferred" complete -c rsync -s W -l whole-file --description "Copy files whole (without rsync algorithm)" complete -c rsync -s x -l one-file-system --description "Don’t cross filesystem boundaries" complete -c rsync -s B -l block-size -x --description "Force a fixed checksum block-size" complete -c rsync -s e -l rsh -x --description "Specify the remote shell to use" complete -c rsync -l rsync-path -x --description "Specify the rsync to run on remote machine" complete -c rsync -l existing --description "Ignore non-existing files on receiving side" complete -c rsync -l ignore-existing --description "Ignore files that already exist on receiver" complete -c rsync -l remove-sent-files --description "Sent files/symlinks are removed from sender" complete -c rsync -l del --description "An alias for --delete-during" complete -c rsync -l delete --description "Delete files that don’t exist on sender" complete -c rsync -l delete-before --description "Receiver deletes before transfer (default)" complete -c rsync -l delete-during --description "Receiver deletes during xfer, not before" complete -c rsync -l delete-after --description "Receiver deletes after transfer, not before" complete -c rsync -l delete-excluded --description "Also delete excluded files on receiver" complete -c rsync -l ignore-errors --description "Delete even if there are I/O errors" complete -c rsync -l force --description "Force deletion of dirs even if not empty" complete -c rsync -l max-delete=NUM --description "Don’t delete more than NUM files" complete -c rsync -l max-size=SIZE --description "Don’t transfer any file larger than SIZE" complete -c rsync -l min-size=SIZE --description "Don’t transfer any file smaller than SIZE" complete -c rsync -l partial --description "Keep partially transferred files" complete -c rsync -l partial-dir=DIR --description "Put a partially transferred file into DIR" complete -c rsync -l delay-updates --description "Put all updated files into place at end" complete -c rsync -s m -l prune-empty-dirs --description "Prune empty directory chains from file-list" complete -c rsync -l numeric-ids --description "Don’t map uid/gid values by user/group name" complete -c rsync -l timeout=TIME --description "Set I/O timeout in seconds" complete -c rsync -s I -l ignore-times --description "Don’t skip files that match size and time" complete -c rsync -l size-only --description "Skip files that match in size" complete -c rsync -l modify-window=NUM --description "Compare mod-times with reduced accuracy" complete -c rsync -s T -l temp-dir=DIR --description "Create temporary files in directory DIR" complete -c rsync -s y -l fuzzy --description "Find similar file for basis if no dest file" complete -c rsync -l compare-dest -x --description "Also compare received files relative to DIR" complete -c rsync -l copy-dest -x --description "Also compare received files relative to DIR and include copies of unchanged files" complete -c rsync -l link-dest=DIR --description "Hardlink to files in DIR when unchanged" complete -c rsync -s z -l compress --description "Compress file data during the transfer" complete -c rsync -l compress-level --description "Explicitly set compression level" complete -c rsync -s C -l cvs-exclude --description "Auto-ignore files in the same way CVS does" complete -c rsync -s f -l filter=RULE --description "Add a file-filtering RULE" complete -c rsync -s F --description "Same as --filter=’dir-merge /.rsync-filter’ repeated: --filter='- .rsync-filter'" complete -c rsync -l exclude=PATTERN --description "Exclude files matching PATTERN" complete -c rsync -l exclude-from=FILE --description "Read exclude patterns from FILE" complete -c rsync -l include=PATTERN --description "Don’t exclude files matching PATTERN" complete -c rsync -l include-from=FILE --description "Read include patterns from FILE" complete -c rsync -l files-from=FILE --description "Read list of source-file names from FILE" complete -c rsync -s 0 -l from0 --description "All *from/filter files are delimited by 0s" complete -c rsync -l address=ADDRESS --description "Bind address for outgoing socket to daemon" complete -c rsync -l port=PORT --description "Specify double-colon alternate port number" complete -c rsync -l sockopts=OPTIONS --description "Specify custom TCP options" complete -c rsync -l blocking-io --description "Use blocking I/O for the remote shell" complete -c rsync -l stats --description "Give some file-transfer stats" complete -c rsync -s 8 -l 8-bit-output --description "Leave high-bit chars unescaped in output" complete -c rsync -s h -l human-readable --description "Output numbers in a human-readable format" complete -c rsync -l progress --description "Show progress during transfer" complete -c rsync -s P --description "Same as --partial --progress" complete -c rsync -s i -l itemize-changes --description "Output a change-summary for all updates" complete -c rsync -l log-format -x --description "Output filenames using the specified format" complete -c rsync -l password-file -x --description "Read password from FILE" complete -c rsync -l list-only --description "List the files instead of copying them" complete -c rsync -l bwlimit -x --description "Limit I/O bandwidth; KBytes per second" complete -c rsync -l write-batch -x --description "Write a batched update to FILE" complete -c rsync -l only-write-batch --description "Like --write-batch but w/o updating dest" complete -c rsync -l read-batch -x --description "Read a batched update from FILE" complete -c rsync -l protocol -x --description "Force an older protocol version to be used" complete -c rsync -l checksum-seed -x --description "Set block/file checksum seed (advanced)" complete -c rsync -s 4 -l ipv4 --description "Prefer IPv4" complete -c rsync -s 6 -l ipv6 --description "Prefer IPv6" complete -c rsync -l version --description "Display version and exit" complete -c rsync -l help --description "Display help and exit" fish/share/completions/ruby-build.fish000066400000000000000000000014721214535744100204100ustar00rootroot00000000000000function __fish_ruby-build_needs_command set cmd (commandline -opc) if [ (count $cmd) -eq 1 -a $cmd[1] = 'ruby-build' ] return 0 end return 1 end function __fish_ruby-build_definitions ruby-build --definitions end complete -f -c ruby-build -n '__fish_ruby-build_needs_command' -a '(__fish_ruby-build_definitions)' -d 'Definition' complete -f -c ruby-build -n '__fish_ruby-build_needs_command' -l keep -s k -d 'Do not remove source tree after installation' complete -f -c ruby-build -n '__fish_ruby-build_needs_command' -l verbose -s v -d 'Verbose mode: print compilation status to stdout' complete -f -c ruby-build -n '__fish_ruby-build_needs_command' -l definitions -d 'List all built-in definitions' complete -f -c ruby-build -n '__fish_ruby-build_needs_command' -l help -s h -d 'Display help information' fish/share/completions/ruby.fish000066400000000000000000000026451214535744100173160ustar00rootroot00000000000000#Completions for ruby complete -c ruby -s 0 --description 'Specify record separator' complete -c ruby -s a --description 'Turn on autosplit mode' complete -c ruby -s c --description 'Check syntax' complete -c ruby -s K --description 'Kanji code-set' complete -c ruby -s d -l debug --description 'Debugger' complete -c ruby -s e -x --description 'Execute command' complete -c ruby -s h -l help --description 'Display help and exit' complete -c ruby -s F --description 'Set regexp used to split input' complete -c ruby -s i --description 'Edit files in-place' complete -c ruby -s I --description 'Include path' complete -c ruby -s l --description 'Automatic line ending processing' complete -c ruby -s n --description 'Loop script' complete -c ruby -s p --description 'Loop script, print $_' complete -c ruby -s r -r --description 'Require file' complete -c ruby -s s --description 'Define custom switches' complete -c ruby -s S --description 'Search $PATH for script' complete -c ruby -s T --description 'Taint checking' complete -c ruby -s v -l verbose --description 'Verbose mode' complete -c ruby -s w --description 'Verbose mode without message' complete -c ruby -l version --description 'Display version and exit' complete -c ruby -s x --description 'Extract script' complete -c ruby -s X -x -a '(__fish_complete_directories (commandline -ct))' --description 'Directory' complete -c ruby -s y -l yydebug --description 'Compiler debug mode' fish/share/completions/scanimage.fish000066400000000000000000000056071214535744100202650ustar00rootroot00000000000000complete -c scanimage -s l -r -d 'Top-left x position of scan area [0..480pel]/[0..218mm]' complete -c scanimage -s t -r -d 'Top-left y position of scan area [0..360pel]' complete -c scanimage -s x -r -d 'Width of scan area [160..640pel]' complete -c scanimage -s y -r -d 'Height of scan area [120..480pel]' complete -c scanimage -l brightness -r -d 'Controls the brightness of the acquired image [0..255: 128]' complete -c scanimage -l hue -d 'Controls the "hue" (blue-level) of the acquired image [0..255]: 128' complete -c scanimage -l color -d 'Sets the picture\'s color [0..255]: 133' complete -c scanimage -l contrast -d 'Controls the contrast of the acquired image [0..255]: 128' complete -c scanimage -l white-level -d 'Selects what radiance level should be considered "white" [0..255]: 124' complete -c scanimage -l custom-gamma -d 'Use custom gamma gable' complete -c scanimage -l gamma-table -r -d 'Gamma-correction table [0..255,...]' complete -c scanimage -l mode -xa 'Lineart Gray Color' -d 'Scan mode' complete -c scanimage -s d -l device-name -d 'Device name to use' -xa '(scanimage -f "%d%n")' complete -c scanimage -s L -l list-devices -d 'List devices' complete -c scanimage -s f -l formatted-device-list -r -d 'Print formatted device list [%d, %v, %m, %t, %i, %n]' complete -c scanimage -l channel -r -d 'Selects the channel of the v4l device (e.g. television or video-in.)' complete -c scanimage -l filename -d 'The filename of the image to be loaded' complete -c scanimage -l format -xa 'pnm tiff' -d 'Output image format' complete -c scanimage -s i -l icc-profile -r -d 'Include this ICC profile into TIFF file' complete -c scanimage -s b -l batch -d 'Working in batch mode, FORMAT is \'out%d.pnm\' or \'out%d.tif\' by default depending on --format' complete -c scanimage -l batch-start -r -d 'Page number to start naming files with' complete -c scanimage -l batch-count -r -d 'How many pages to scan in batch mode' complete -c scanimage -l batch-increment -r -d 'Increase page number in filename by #' complete -c scanimage -l batch-double -d 'Increment page number by two' complete -c scanimage -l batch-prompt -d 'Ask for pressing a key before scanning a page' complete -c scanimage -l accept-md5-only -d 'Only accept authorization requests using md5' complete -c scanimage -s p -l progress -d 'Print progress messages' complete -c scanimage -s n -l dont-scan -d 'Only set options, don\'t actually scan' complete -c scanimage -s T -l test -d 'Test backend thoroughly' complete -c scanimage -s A -l all-options -d 'List all available backend options' complete -c scanimage -s h -l help -d 'Display this help message and exit' complete -c scanimage -s v -l verbose -d 'Give even more status messages' complete -c scanimage -s B -l buffer-size -r -d 'Change input buffer size (in kB, default 32)' complete -c scanimage -s V -l version -d 'Print version information' fish/share/completions/scons.fish000066400000000000000000000125111214535744100174530ustar00rootroot00000000000000# # Command specific completions for the scons command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c scons -s c -l clean -l remove --description 'Clean up by removing all target files for which a construction command is specified' complete -c scons -l cache-debug --description 'Print debug information about the CacheDir() derived-file caching to the specified file' complete -c scons -l cache-disable -l no-cache --description 'Disable the derived-file caching specified by CacheDir()' complete -c scons -l cache-force -l cache-populate --description 'When using CacheDir(), populate a cache by copying any already- existing, up-to-date derived files to the cache, in addition to files built by this invocation' complete -c scons -l cache-show --description 'When using CacheDir() and retrieving a derived file from the cache, show the command that would have been executed to build the file, instead of the usual report, "Retrieved file from cache' complete -c scons -l config --description 'This specifies how the Configure call should use or generate the results of configuration tests' -a ' auto\t"Use normal dependency mechanism" force\t"Rerun all tests" cache\t"Take all results from cache"' -x complete -c scons -s C --description 'Directory, --directory=directory Change to the specified directory before searching for the SCon struct, Sconstruct, or sconstruct file, or doing anything else' complete -c scons -s D --description 'Works exactly the same way as the -u option except for the way default targets are handled' complete -c scons -l debug --description 'Debug the build process' -a "count dtree explain findlibs includes memoizer memory nomemoizer objects pdb presub stacktrace stree time tree" -x complete -c scons -l diskcheck --description 'Enable specific checks for whether or not there is a file on disk where the SCons configuration expects a directory (or vice versa), and whether or not RCS or SCCS sources exist when searching for source and include files' -a "all none match rcs " -x complete -c scons -s f -l file -l makefile -l sconstruct --description 'Use file as the initial SConscript file' complete -c scons -s h -l help --description 'Print a local help message for this build, if one is defined in the SConscript file(s), plus a line that describes the -H option for command-line option help' complete -c scons -s H -l help-options --description 'Print the standard help message about command-line options and exit' complete -c scons -s i -l ignore-errors --description 'Ignore all errors from commands executed to rebuild files' complete -c scons -s I -l include-dir --description 'Specifies a directory to search for imported Python modules' complete -c scons -l implicit-cache --description 'Cache implicit dependencies' complete -c scons -l implicit-deps-changed --description 'Force SCons to ignore the cached implicit dependencies' complete -c scons -l implicit-deps-unchanged --description 'Force SCons to ignore changes in the implicit dependencies' complete -c scons -s j -l jobs --description 'Specifies the number of jobs (commands) to run simultaneously' complete -c scons -s k -l keep-going --description 'Continue as much as possible after an error' complete -c scons -l duplicate --description 'There are three ways to duplicate files in a build tree: hard links, soft (symbolic) links and copies' complete -c scons -l max-drift --description 'Set the maximum expected drift in the modification time of files to SECONDS' complete -c scons -s n -l just-print -l dry-run -l recon --description 'No execute' complete -c scons -l profile --description 'Run SCons under the Python profiler and save the results in the specified file' complete -c scons -s q -l question --description 'Do not run any commands, or print anything' complete -c scons -s Q --description 'Quiets SCons status messages about reading SConscript files, building targets and entering directories' complete -c scons -l random --description 'Build dependencies in a random order' complete -c scons -s s -l silent -l quiet --description 'Silent' complete -c scons -l taskmastertrace --description 'Prints trace information to the specified file about how the internal Taskmaster object evaluates and controls the order in which Nodes are built' complete -c scons -s u -l up -l search-up --description 'Walks up the directory structure until an SConstruct , Scon struct or sconstruct file is found, and uses that as the top of the directory tree' complete -c scons -s U --description 'Works exactly the same way as the -u option except for the way default targets are handled' complete -c scons -s v -l version --description 'Print the scons version, copyright information, list of authors, and any other relevant information' complete -c scons -s w -l print-directory --description 'Print a message containing the working directory before and after other processing' complete -c scons -l warn --description 'Enable or disable warnings' -a 'all no-all dependency no-dependency deprecated no-deprecated missing-sconscript no-missing-sconscript' -x complete -c scons -l no-print-directory --description 'Turn off -w, even if it was turned on implicitly' complete -c scons -s Y -l repository --description 'Search the specified repository for any input and target files not found in the local directory hierarchy' fish/share/completions/scp.fish000066400000000000000000000025151214535744100171160ustar00rootroot00000000000000# # Load common ssh options # __fish_complete_ssh scp # # scp specific completions # complete -c scp -d Hostname -a " ( #Find a suitable hostname from the knownhosts files cat ~/.ssh/known_hosts{,2} ^/dev/null|cut -d ' ' -f 1| cut -d , -f 1 ): ( #Prepend any username specified in the completion to the hostname echo (commandline -ct)|sed -ne 's/\(.*@\).*/\1/p' )( cat ~/.ssh/known_hosts{,2} ^/dev/null|cut -d ' ' -f 1| cut -d , -f 1 ): (__fish_print_users)@\tUsername " # # Remote path # complete -c scp -d "Remote Path" -n "echo (commandline -ct)|sgrep -o '.*:';and true" -a " ( #Prepend any user@host information supplied before the remote completion echo (commandline -ct)|sgrep -o '.*:' )( #Get the list of remote files from the specified ssh server ssh -o \"BatchMode yes\" (echo (commandline -ct)|sed -ne 's/\(.*\):.*/\1/p') ls\ -dp\ (echo (commandline -ct)|sed -ne 's/.*://p')\* ) " complete -c scp -s B --description "Batch mode" complete -c scp -s l -x --description "Bandwidth limit" complete -c scp -s P -x --description "Port" complete -c scp -s p --description "Preserves modification times, access times, and modes from the original file" complete -c scp -s q --description "Do not display progress bar" complete -c scp -s r --description "Recursively copy" complete -c scp -s S --description "Encryption program" fish/share/completions/screen.fish000066400000000000000000000032661214535744100176140ustar00rootroot00000000000000function __fish_complete_screen --description "Print a list of running screen sessions" screen -list |sgrep \^\t.\*\(.\*\)|sed -e 's/\t\(.*\)\t(\(.*\))/\1'\t'Screen: \2/' end complete -c screen -x complete -c screen -s a -d 'Include all capabilitys' complete -c screen -s A -d 'Adapt window size' complete -c screen -s c -r -d 'Specify init file' complete -c screen -s d -d 'Detach screen' -a '(__fish_complete_screen)' complete -c screen -s D -d 'Detach screen' -a '(__fish_complete_screen)' complete -c screen -s r -d 'Reattach session' -a '(__fish_complete_screen)' complete -c screen -s R -d 'Reattach/create session' complete -c screen -o RR -d 'Reattach/create any session' complete -c screen -s e -x -d 'Escape character' complete -c screen -s f -d 'Flow control on' complete -c screen -o fn -d 'Flow control off' complete -c screen -o fa -d 'Flow control automatic' complete -c screen -s h -x -d 'History length' complete -c screen -s i -d 'Interrupt display on C-c' complete -c screen -s l -d 'Login on' complete -c screen -o ln -d 'Login off' complete -c screen -o ls -d 'List sessions' complete -c screen -o list -d 'List sessions' complete -c screen -s L -d 'Log on' complete -c screen -s m -d 'Ignore $STY' complete -c screen -s O -d 'Optimal output' complete -c screen -s p -d 'Preselect window' complete -c screen -s q -d 'Quiet mode' complete -c screen -s s -r -d 'Set shell' complete -c screen -s S -x -d 'Session name' complete -c screen -s t -x -d 'Session title' complete -c screen -s U -d 'UTF-8 mode' complete -c screen -s v -d 'Display version and exit' complete -c screen -o wipe -d 'Wipe dead sessions' complete -c screen -s x -d 'Multi attach' complete -c screen -s X -r -d 'Send command' fish/share/completions/scrot.fish000066400000000000000000000021311214535744100174550ustar00rootroot00000000000000 complete -c scrot -s h -l help -d 'display this help and exit' complete -c scrot -s v -l version -d 'output version information and exit' complete -c scrot -s b -l border -d 'When selecting a window, grab wm border too' complete -c scrot -s c -l count -d 'show a countdown before taking the shot' complete -c scrot -s d -l delay -x -d 'wait NUM seconds before taking a shot' complete -c scrot -s e -l exec -d 'run APP on the resulting screenshot' -xa '(complete -C(commandline -ct))' complete -c scrot -s q -l quality -x -d 'Image quality (1-100) high value means high size, low compression. Default: 75. For lossless compression formats, like png, low quality means high compression.' complete -c scrot -s m -l multidisp -d 'For multiple heads, grab shot from each and join them together.' complete -c scrot -s s -l select -d 'interactively choose a window or rectangle with the mouse' complete -c scrot -s t -l thumb -x -d 'generate thumbnail too. NUM is the percentage of the original size for the thumbnail to be, or the geometry in percent, e.g. 50x60 or 80x20.' fish/share/completions/sed.fish000066400000000000000000000026271214535744100171100ustar00rootroot00000000000000# # Completions for sed # # Test if we are using GNU sed set -l is_gnu sed --version >/dev/null ^/dev/null; and set is_gnu --is-gnu # Shared ls switches __fish_gnu_complete -c sed -s n -l quiet --description "Silent mode" $is_gnu __fish_gnu_complete -c sed -s e -l expression -x --description "Evaluate expression" $is_gnu __fish_gnu_complete -c sed -s f -l file -r --description "Evalute file" $is_gnu __fish_gnu_complete -c sed -s i -l in-place --description "Edit files in place" $is_gnu if test -n "$is_gnu" # GNU specific features complete -c sed -l silent --description "Silent mode" complete -c sed -s l -l line-length -x --description "Specify line-length" complete -c sed -l posix --description "Disable all GNU extensions" complete -c sed -s r -l regexp-extended --description "Use extended regexp" complete -c sed -s s -l separate --description "Consider files as separate" complete -c sed -s u -l unbuffered --description "Use minimal IO buffers" complete -c sed -l help --description "Display help and exit" complete -c sed -s V -l version --description "Display version and exit" else # If not a GNU system, assume we have standard BSD ls features instead complete -c sed -s E --description "Use extended regexp" complete -c sed -s a --description "Delay opening files until a command containing the related 'w' function is applied" complete -c sed -s l --description "Use line buffering" end fish/share/completions/seq.fish000066400000000000000000000005771214535744100171270ustar00rootroot00000000000000# Completions for seq. # Author: SanskritFritz (gmail) complete -c seq -s f -l format -d 'Use printf style floating-point FORMAT' complete -c seq -s s -l separator -d 'Use STRING to separate numbers' complete -c seq -s w -l equal-width -d 'Equalize width with leading zeroes' complete -c seq -l help -d 'Display this help' complete -c seq -l version -d 'Output version information' fish/share/completions/service.fish000066400000000000000000000011011214535744100177570ustar00rootroot00000000000000function __fish_service_print_names if type -f systemctl >/dev/null command systemctl list-units -t service | cut -d ' ' -f 1 | grep '\.service$' | sed -e 's/\.service$//' end command ls /etc/init.d end # Fist argument is the names of the service, i.e. a file in /etc/init.d complete -c service -n "test (count (commandline -poc)) = 1" -xa "(__fish_service_print_names)" --description "Service name" #The second argument is what action to take with the service complete -c service -n "test (count (commandline -poc)) -gt 1" -xa '$__fish_service_commands' fish/share/completions/set.fish000066400000000000000000000051501214535744100171220ustar00rootroot00000000000000# # Completions for the 'set' builtin # # # All locale variables used by set completions # set -g __fish_locale_vars LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME # # Various helper functions # function __fish_set_is_color -d 'Test if We are specifying a color value for the prompt' set cmd (commandline -poc) set -e cmd[1] for i in $cmd switch $i case 'fish_color_*' 'fish_pager_color_*' return 0 case '-*' case '*' return 1 end end return 1 end function __fish_set_is_locale -d 'Test if We are specifying a locale value for the prompt' set cmd (commandline -poc) set -e cmd[1] for i in $cmd switch $i case $__fish_locale_vars return 0 case '-*' case '*' return 1 end end return 1 end # # Completions # # Regular switches, set only accepts these before the variable name, # so we need to test using __fish_is_first_token complete -c set -n '__fish_is_first_token' -s e -l erase --description "Erase variable" complete -c set -n '__fish_is_first_token' -s x -l export --description "Export variable to subprocess" complete -c set -n '__fish_is_first_token' -s u -l unexport --description "Do not export variable to subprocess" complete -c set -n '__fish_is_first_token' -s g -l global --description "Make variable scope global" complete -c set -n '__fish_is_first_token' -s l -l local --description "Make variable scope local" complete -c set -n '__fish_is_first_token' -s U -l universal --description "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 --description "Test if variable is defined" complete -c set -n '__fish_is_first_token' -s h -l help --description "Display help and exit" complete -c set -n '__fish_is_first_token' -s n -l names --description "List the names of the variables, but not their value" # Complete using preexisting variable names complete -c set -n '__fish_is_first_token' -x -a "(set|sed -e 's/ /'\t'Variable: /')" # Color completions complete -c set -n '__fish_set_is_color' -x -a '(set_color --print-colors)' --description Color complete -c set -n '__fish_set_is_color' -s b -l background -x -a '(set_color --print-colors)' --description "Change background color" complete -c set -n '__fish_set_is_color' -s o -l bold --description 'Make font bold' # Locale completions complete -c set -n '__fish_is_first_token' -x -a '$__fish_locale_vars' -d 'Locale variable' complete -c set -n '__fish_set_is_locale' -x -a '(locale -a)' -d (_ Locale) complete -c set -s L -l long -d 'Do not truncate long lines' complete -c set -u fish/share/completions/set_color.fish000066400000000000000000000011111214535744100203110ustar00rootroot00000000000000complete -c set_color -x --description "Color" -a '(set_color --print-colors)' complete -c set_color -s b -l background -x -a '(set_color --print-colors)' --description "Change background color" complete -c set_color -s o -l bold --description 'Make font bold' complete -c set_color -s u -l underline --description 'Underline text' complete -c set_color -s v -l version --description 'Display version and exit' complete -c set_color -s h -l help --description 'Display help and exit' complete -c set_color -s c -l print-colors --description 'Print a list of all accepted color names' fish/share/completions/setxkbmap.fish000066400000000000000000000043001214535744100203210ustar00rootroot00000000000000 set -l filter '"s/\S+\s\S+\s(.+)\((.+)\)/\1\t\2/;"' complete -c setxkbmap -o '?' -o help -d 'Print this message' complete -c setxkbmap -o compat -d 'Specifies compatibility map component name' -xa "(cat /usr/share/X11/xkb/compat.dir | sed -r $filter)" complete -c setxkbmap -o config -d 'Specifies configuration file to use' -r complete -c setxkbmap -o device -d 'Specifies the device ID to use' -x complete -c setxkbmap -o display -d 'Specifies display to use' -x complete -c setxkbmap -o geometry -d 'Specifies geometry component name' -xa "(cat /usr/share/X11/xkb/geometry.dir | sed -r $filter)" complete -c setxkbmap -o I -d 'Add to list of directories to be used' -xa '(__fish_complete_directories)' complete -c setxkbmap -o keycodes -d 'Specifies keycodes component name' -xa "(cat /usr/share/X11/xkb/keycodes.dir | sed -r $filter)" complete -c setxkbmap -o keymap -d 'Specifies name of keymap to load' -xa "(cat /usr/share/X11/xkb/keymap.dir | sed -r $filter)" complete -c setxkbmap -o layout -d 'Specifies layout used to choose component names' -xa "(__fish_complete_setxkbmap layout)" complete -c setxkbmap -o model -d 'Specifies model used to choose component names' -xa "(__fish_complete_setxkbmap model)" complete -c setxkbmap -o option -d 'Adds an option used to choose component names' -xa "(__fish_complete_list , '__fish_complete_setxkbmap option')" complete -c setxkbmap -o print -d 'Print a complete xkb_keymap description and exit' complete -c setxkbmap -o query -d 'Print the current layout settings and exit' complete -c setxkbmap -o rules -d 'Name of rules file to use' -x complete -c setxkbmap -o symbols -d 'Specifies symbols component name' -xa "(cat /usr/share/X11/xkb/symbols.dir | sed -r $filter)" complete -c setxkbmap -o synch -d 'Synchronize request w/X server' complete -c setxkbmap -o types -d 'Specifies types component name' -xa "(cat /usr/share/X11/xkb/types.dir | sed -r $filter)" complete -c setxkbmap -o v -o verbose -d 'Sets verbosity (1..10). Higher values yield more messages' -xa '(seq 1 10)' complete -c setxkbmap -o variant -d 'Specifies layout variant used to choose component names' -xa "(__fish_complete_setxkbmap variant)" fish/share/completions/sha1sum.fish000066400000000000000000000000351214535744100177050ustar00rootroot00000000000000__fish_complete_xsum sha1sum fish/share/completions/sha224sum.fish000066400000000000000000000000371214535744100200560ustar00rootroot00000000000000__fish_complete_xsum sha224sum fish/share/completions/sha256sum.fish000066400000000000000000000000371214535744100200630ustar00rootroot00000000000000__fish_complete_xsum sha256sum fish/share/completions/sha384sum.fish000066400000000000000000000000371214535744100200650ustar00rootroot00000000000000__fish_complete_xsum sha384sum fish/share/completions/sha512sum.fish000066400000000000000000000000371214535744100200560ustar00rootroot00000000000000__fish_complete_xsum sha512sum fish/share/completions/sort.fish000066400000000000000000000027301214535744100173170ustar00rootroot00000000000000complete -c sort -s b -l ignore-leading-blanks --description "Ignore leading blanks" complete -c sort -s d -l dictionary-order --description "Consider only blanks and alphanumerics" complete -c sort -s f -l ignore-case --description "Ignore case" complete -c sort -s g -l general-numeric-sort --description "Compare general numeric value" complete -c sort -s i -l ignore-nonprinting --description "Consider only printable" complete -c sort -s M -l month-sort --description "Compare month names" complete -c sort -s n -l numeric-sort --description "Compare string numerical value" complete -c sort -s r -l reverse --description "Reverse results" complete -c sort -s c -l check --description "Only check if sorted" complete -c sort -s k -l key --description "Define key" complete -c sort -s m -l merge --description "Merge sorted files" complete -c sort -s o -l output -f --description "Write to file" complete -c sort -s s -l stable --description "Stabilize sort" complete -c sort -s S -l buffer-size -r --description "Set memory buffer size" complete -c sort -s t -l field-separator --description "Field separator" complete -c sort -s T -l temporary-directory -r --description "Set temporary directory" complete -c sort -s u -l unique --description "Output only first of equal lines" complete -c sort -s z -l zero-terminated --description "Lines end with 0 byte" complete -c sort -l help --description "Display help and exit" complete -c sort -l version --description "Display version and exit" fish/share/completions/ssh.fish000066400000000000000000000037141214535744100171300ustar00rootroot00000000000000# # Load common ssh options # __fish_complete_ssh ssh complete -x -c ssh -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) " complete -x -c ssh -d User -a " (__fish_print_users)@ " complete -c ssh --description "Command to run" -x -a '(__fish_complete_subcommand --fcs-skip=2)' complete -c ssh -s a --description "Disables forwarding of the authentication agent" complete -c ssh -s A --description "Enables forwarding of the authentication agent" complete -x -c ssh -s b --description "Interface to transmit from" -a " ( cat /proc/net/arp ^/dev/null| sgrep -v '^IP'|cut -d ' ' -f 1 ^/dev/null ) " complete -x -c ssh -s e --description "Escape character" -a "\^ none" complete -c ssh -s f --description "Go to background" complete -c ssh -s g --description "Allow remote host to connect to local forwarded ports" complete -c ssh -s I --description "Smartcard device" complete -c ssh -s k --description "Disable forwarding of Kerberos tickets" complete -c ssh -s l -x -a "(__fish_complete_users)" --description "User" complete -c ssh -s m --description "MAC algorithm" complete -c ssh -s n --description "Prevent reading from stdin" complete -c ssh -s N --description "Do not execute remote command" complete -c ssh -s p -x --description "Port" complete -c ssh -s q --description "Quiet mode" complete -c ssh -s s --description "Subsystem" complete -c ssh -s t --description "Force pseudo-tty allocation" complete -c ssh -s T --description "Disable pseudo-tty allocation" complete -c ssh -s x --description "Disable X11 forwarding" complete -c ssh -s X --description "Enable X11 forwarding" complete -c ssh -s L --description "Locally forwarded ports" complete -c ssh -s R --description "Remotely forwarded ports" complete -c ssh -s D --description "Dynamic port forwarding" # Since ssh runs subcommands, it can accept any switches complete -c ssh -u fish/share/completions/sshfs.fish000066400000000000000000000017541214535744100174630ustar00rootroot00000000000000# # 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 --description "Mount point" -x -a '(find ~/mnt -type d)' # # Command options # complete -c sshfs -s V --description "Display version and exit" complete -c sshfs -s p -x --description "Port" complete -c sshfs -s C --description "Compression" complete -c sshfs -s o -x --description "Mount options" complete -c sshfs -s d --description "Enable debug" complete -c sshfs -s f --description "Foreground operation" complete -c sshfs -s s --description "Disable multi-threaded operation" complete -c sshfs -s r --description "Mount options" complete -c sshfs -s h --description "Display help and exit" fish/share/completions/stat.fish000066400000000000000000000012641214535744100173040ustar00rootroot00000000000000complete -c stat -s L -l dereference -d 'follow links' complete -c stat -s f -l file-system -d 'display file system status instead of file status' complete -c stat -s c -l format -x -d 'use the specified FORMAT instead of the default; output a newline after each use of FORMAT' complete -c stat -l printf -x -d 'like --format, but interpret backslash escapes, and do not output a mandatory trailing newline. If you want a newline, include \n in FORMAT' complete -c stat -s t -l terse -d 'print the information in terse form' complete -c stat -l help -d 'display this help and exit' complete -c stat -l version -d 'output version information and exit' fish/share/completions/status.fish000066400000000000000000000020221214535744100176450ustar00rootroot00000000000000 complete -c status -s h -l help --description "Display help and exit" complete -c status -l is-command-substitution --description "Test if a command substitution is currently evaluated" complete -c status -l is-block --description "Test if a code block is currently evaluated" complete -c status -l is-interactive --description "Test if this is an interactive shell" complete -c status -l is-login --description "Test if this is a login shell" complete -c status -l is-full-job-control --description "Test if all new jobs are put under job control" complete -c status -l is-interactive-job-control --description "Test if only interactive new jobs are put under job control" complete -c status -l is-no-job-control --description "Test if new jobs are never put under job control" complete -c status -s j -l job-control -xa "full interactive none" --description "Set which jobs are out under job control" complete -c status -s t -l print-stack-trace --description "Print a list of all function calls leading up to running the current command" fish/share/completions/stream.fish000066400000000000000000000070071214535744100176250ustar00rootroot00000000000000complete -c stream -o authenticate -d 'Decipher image with this password [password]' complete -c stream -o channel -d 'Apply option to select image channels [type]' -xa '(stream -list channel)' complete -c stream -o colorspace -d 'Alternate image colorspace [type]' -xa '(stream -list colorspace)' complete -c stream -o compress -d 'Type of pixel compression when writing the image [type]' -xa '(stream -list compress)' complete -c stream -o define -d 'Define one or more image format options [format:option]' complete -c stream -o density -d 'Horizontal and vertical density of the image [geometry]' complete -c stream -o depth -d 'Image depth [value]' complete -c stream -o extract -d 'Extract area from image [geometry]' complete -c stream -o identify -d 'Identify the format and characteristics of the image' complete -c stream -o interlace -d 'Type of image interlacing scheme [type]' -xa '(stream -list interlace)' complete -c stream -o interpolate -d 'Pixel color interpolation method [method]' -xa '(stream -list interpolate)' complete -c stream -o limit -d 'Pixel cache resource limit [type value]' -x complete -c stream -o map -d 'Components one or more pixel components' complete -c stream -o monitor -d 'Monitor progress ' complete -c stream -o quantize -d 'Reduce colors in this colorspace [colorspace]' -xa '(stream -list colorspace)' complete -c stream -o quiet -d 'Suppress all warning messages' complete -c stream -o regard-warnings -d 'Pay attention to warning messages' complete -c stream -o respect-parentheses -d 'Settings remain in effect until parenthesis boundary' complete -c stream -o sampling-factor -d 'Horizontal and vertical sampling factor [geometry]' complete -c stream -o seed -d 'Seed a new sequence of pseudo-random numbers [value]' complete -c stream -o set -d 'Attribute set an image attribute [ value]' complete -c stream -o size -d 'Width and height of image [geometry]' complete -c stream -o storage-type -d 'Pixel storage type [type]' -xa '(stream -list storage)' complete -c stream -o synchronize -d 'Synchronize image to storage device' complete -c stream -o taint -d 'Declare the image as modified' complete -c stream -o transparent-color -d 'Transparent color [color]' -xa '(__fish_complete_convert_options color)' complete -c stream -o verbose -d 'Print detailed information about the image' complete -c stream -o virtual-pixel -d 'Virtual pixel access method [method]' -xa '(stream -list virtual-pixel)' complete -c stream -o debug -d 'Display copious debugging information [events]' -xa '(stream -list debug)' complete -c stream -o help -d 'Print program options' complete -c stream -o list -d 'Print a list of supported option arguments [type]' -xa '(stream -list list)' complete -c stream -o log -d 'Format of debugging information [format]' -xa '(__fish_complete_convert_options format)' complete -c stream -o version -d 'Print version information' fish/share/completions/su.fish000066400000000000000000000011631214535744100167560ustar00rootroot00000000000000# Completions for su complete -x -c su -a "(__fish_complete_users)" complete -c su -s l -l login --description "Make login shell" complete -r -c su -s c -l command --description "Pass command to shell" -xa "(complete -C(commandline -ct))" complete -c su -s f -l fast --description "Pass -f to the shell" complete -c su -s m -l preserve_environment --description "Preserve environment" complete -c su -s p --description "Preserve environment" complete -x -c su -s s -l shell -a "(cat /etc/shells)" complete -c su -l help --description "Display help and exit" complete -c su -l version --description "Display version and exit" fish/share/completions/sudo.fish000066400000000000000000000013431214535744100173010ustar00rootroot00000000000000# # Completion for sudo # complete -c sudo -s h -n "__fish_no_arguments" --description "Display help and exit" complete -c sudo -s v -n "__fish_no_arguments" --description "Validate" complete -c sudo -s u -a "(__fish_complete_users)" -x -d "Run command as user" complete -c sudo -s g -a "(__fish_complete_groups)" -x -d "Run command as group" complete -c sudo -s E -d "Preserve environment" complete -c sudo -s P -d "Preserve group vector" complete -c sudo -s S -d "Read password from stdin" complete -c sudo -s H -d "Set home" complete -c sudo -s e -r -d "Edit" complete -c sudo --description "Command to run" -x -a "(__fish_complete_subcommand_root -u -g)" # Since sudo runs subcommands, it can accept any switches complete -c sudo -u fish/share/completions/svn.fish000066400000000000000000000000301214535744100171250ustar00rootroot00000000000000__fish_complete_svn svn fish/share/completions/sylpheed.fish000066400000000000000000000017621214535744100201510ustar00rootroot00000000000000#completion for sylpheed complete -c sylpheed -l exit --description 'Exit sylpheed' complete -c sylpheed -l debug --description 'Debug mode' complete -c sylpheed -l help --description 'Display help and exit' complete -c sylpheed -l version --description 'Output version information and exit' complete -r -c sylpheed -l compose --description 'Open composition window with address' complete -r -c sylpheed -l attach --description 'Open composition window with attached files' complete -r -c sylpheed -l receive --description 'Receive new messages' complete -r -c sylpheed -l receive-all --description 'Receive new messages of all accounts' complete -r -c sylpheed -l send --description 'Send all queued messages' complete -r -c sylpheed -l status --description 'Show the total number of messages for folder' complete -r -c sylpheed -l status-full --description 'Show the total number of messages for each folder' complete -r -c sylpheed -l configdir --description 'Specify directory with configuration files' fish/share/completions/tail.fish000066400000000000000000000025561214535744100172670ustar00rootroot00000000000000complete -c tail -s c -l bytes -x -d 'output the last K bytes; alternatively, use -c +K to output bytes starting with the Kth of each file' complete -c tail -s f -l follow -xa 'name descriptor' -d 'output appended data as the file grows; -f -l follow, and --follow=descriptor are equivalent' complete -c tail -s F -d 'same as --follow=name --retry' complete -c tail -s n -l lines -x -d 'output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth' complete -c tail -l max-unchanged-stats -x -d 'with --follow=name, reopen a FILE which has not changed size after N iterations' complete -c tail -l pid -d 'with -f, terminate after process ID, PID dies' -xa '(__fish_complete_pids)' complete -c tail -s q -l quiet -l silent -d 'never output headers giving file names' complete -c tail -l retry -d 'keep trying to open a file even when it is or becomes inaccessible; useful when following by name, i.e., with --follow=name' complete -c tail -s s -l sleep-interval -x -d 'with -f, sleep for approximately N seconds (default 1.0) between iterations' complete -c tail -s v -l verbose -d 'always output headers giving file names' complete -c tail -l help -d 'display this help and exit' complete -c tail -l version -d 'output version information and exit' fish/share/completions/tar.fish000066400000000000000000000106441214535744100171210ustar00rootroot00000000000000 # Peek inside of archives and list all files complete -c tar -a "(__fish_complete_tar)" complete -c tar -s A -l catenate --description "Append archive to archive" complete -c tar -l concatenate --description "Append archive to archive" complete -c tar -s c -l create --description "Create archive" complete -c tar -s d -l diff --description "Compare archive and filesystem" complete -c tar -l compare --description "Compare archive and filesystem" complete -c tar -l delete --description "Delete from archive" complete -c tar -s r -l append --description "Append files to archive" complete -c tar -s t -l list --description "List archive" complete -c tar -s u -l update --description "Append new files" complete -c tar -s x -l extract --description "Extract from archive" complete -c tar -l get --description "Extract from archive" complete -c tar -l atime-preserve --description "Keep access time" complete -c tar -s b -l block-size --description "Block size" complete -c tar -s B -l read-full-blocks --description "Reblock while reading" complete -c tar -s C -l directory -r --description "Change directory" complete -c tar -l checkpoint --description "Print directory names" complete -c tar -s f -l file -r --description "Archive file" complete -c tar -l force-local --description "Archive is local" complete -c tar -s F -l info-script --description "Run script at end of tape" complete -c tar -s G -l incremental --description "Use old incremental GNU format" complete -c tar -s g -l listed-incremental --description "Use new incremental GNU format" complete -c tar -s h -l dereference --description "Dereference symlinks" complete -c tar -s i -l ignore-zeros --description "Ignore zero block in archive" complete -c tar -s j -l bzip --description "Filter through bzip2" complete -c tar -l ignore-failed-read --description "Don't exit on unreadable files" complete -c tar -s k -l keep-old-files --description "Don't overwrite" complete -c tar -s K -l starting-file -r --description "Starting file in archive" complete -c tar -s l -l one-file-system --description "Stay in local filesystem" complete -c tar -s L -l tape-length -r --description "Tape length" complete -c tar -s m -l modification-time --description "Don't extract modification time" complete -c tar -s M -l multi-volume --description "Multi volume archive" complete -c tar -s N -l after-date -r --description "Only store newer files" complete -c tar -s o -l old-archive --description "Use V7 format" complete -c tar -l portability --description "Use V7 format" complete -c tar -s O -l to-stdout --description "Extract to stdout" complete -c tar -s p -l same-permissions --description "Extract all permissions" complete -c tar -l preserve-permissions --description "Extract all permissions" complete -c tar -s P -l absolute-paths --description "Don't strip leading /" complete -c tar -l preserve --description "Preserve all permissions and do not sort file arguments" complete -c tar -s R -l record-number --description "Show record number" complete -c tar -l remove-files --description "Remove files after adding to archive" complete -c tar -s s -l same-order --description "Do not sort file arguments" complete -c tar -l preserve-order --description "Do not sort file arguments" complete -c tar -l same-owner --description "Preserve file ownership" complete -c tar -s S -l sparse --description "Handle sparse files" complete -c tar -s T -l files-from -r --description "Extract file from file" complete -c tar -l null --description "-T has null-terminated names" complete -c tar -l totals --description "Print total bytes written" complete -c tar -s v -l verbose --description "Verbose mode" complete -c tar -s V -l label -r --description "Set volume name" complete -c tar -l version --description "Display version and exit" complete -c tar -s w -l interactive --description "Ask for confirmation" complete -c tar -l confirmation --description "Ask for confirmation" complete -c tar -s W -l verify --description "Verify archive" complete -c tar -l exclude -r --description "Exclude file" complete -c tar -s X -l exclude-from -r --description "Exclude files listed in specified file" complete -c tar -s Z -l compress --description "Filter through compress" complete -c tar -l uncompress --description "Filter through compress" complete -c tar -s z -l gzip --description "Filter through gzip" complete -c tar -l gunzip --description "Filter through gzip" complete -c tar -l use-compress-program -r --description "Filter through specified program" fish/share/completions/tee.fish000066400000000000000000000004501214535744100171020ustar00rootroot00000000000000complete -c tee -s a -l append -d 'append to the given FILEs, do not overwrite' complete -c tee -s i -l ignore-interrupts -d 'ignore interrupt signals' complete -c tee -l help -d 'display this help and exit' complete -c tee -l version -d 'output version information and exit' fish/share/completions/telnet.fish000066400000000000000000000022741214535744100176260ustar00rootroot00000000000000# # Load common telnet options # # Written by: Sean C. Higgins # complete -x -c telnet -d Hostname -a "(__fish_print_hostnames)" complete -c telnet -s 8 -d (_ "Specifies an 8-bit data path") complete -c telnet -s 7 -d (_ "Do not try to negotiate TELNET BINARY option") complete -c telnet -s E -d (_ "Stops any character from being recognized as an escape character") complete -c telnet -s F -d (_ "Use local Kerberos authentication, if possible") complete -c telnet -s K -d (_ "Specifies no automatic login to remote system") complete -c telnet -s L -d (_ "Specifies an 8-bit data path") complete -c telnet -s a -d (_ "Attempt automatic login") complete -c telnet -s c -d (_ "Disables reading user's .telnetrc") complete -c telnet -s d -d (_ "Sets debug mode") complete -c telnet -s S -x -d (_ "Sets IP TOS") complete -c telnet -s X -x -d (_ "Disables specified type of authentication") complete -c telnet -s l -x -a "(__fish_complete_users)" -d (_ "User login") complete -c telnet -s n -x -d (_ "Log to tracefile") complete -c telnet -s x -d (_ "Turn on encryption") complete -c telnet -s r -d (_ "User interface similar to rlogin") complete -c telnet -s k -x -d (_ "Use Kerberos realm for authentication") fish/share/completions/test.fish000066400000000000000000000044161214535744100173120ustar00rootroot00000000000000 complete -c test -l help --description "Display help and exit" complete -c test -l version --description "Display version and exit" complete -c test -a ! --description "Negate expression" complete -c test -s a --description "Logical and" complete -c test -s o --description "Logical or" complete -c test -s n --description "String length is non-zero" complete -c test -s z --description "String length is zero" complete -c test -a = --description "Strings are equal" complete -c test -a != --description "Strings are not equal" complete -c test -o eq --description "Integers are equal" complete -c test -o ge --description "Left integer larger than or equal to right integer" complete -c test -o gt --description "Left integer larger than right integer" complete -c test -o le --description "Left integer less than or equal to right integer" complete -c test -o lt --description "Left integer less than right integer" complete -c test -o ne --description "Left integer not equal to right integer" complete -c test -o ef --description "Left file equal to right file" complete -c test -o nt --description "Left file newer than right file" complete -c test -o ot --description "Left file older than right file" complete -c test -s b --description "File is block device" complete -c test -s c --description "File is character device" complete -c test -s d --description "File is directory" complete -c test -s e --description "File exists" complete -c test -s f --description "File is regular" complete -c test -s g --description "File is set-group-ID" complete -c test -s h --description "File is symlink" complete -c test -s G --description "File owned by effective group ID" complete -c test -s k --description "File has sticky bit set" complete -c test -s L --description "File is symlink" complete -c test -s O --description "File owned by effective user ID" complete -c test -s p --description "File is named pipe" complete -c test -s r --description "File is readable" complete -c test -s s --description "File size is non-zero" complete -c test -s S --description "File is socket" complete -c test -s t --description "FD is terminal" complete -c test -s u --description "File set-user-ID bit is set" complete -c test -s w --description "File is writable" complete -c test -s x --description "File is executable" fish/share/completions/tex.fish000066400000000000000000000002021214535744100171200ustar00rootroot00000000000000 set -l cmds -c etex -c tex -c elatex -c latex -c pdflatex -c pdfelatex -c pdftex -c pdfetex -c omega __fish_complete_tex tex fish/share/completions/time.fish000066400000000000000000000016421214535744100172670ustar00rootroot00000000000000 complete -c time -a "(__fish_complete_subcommand -- -o --output -f --format)" --description "Command" complete -c time -s f -l format -n "__fish_no_arguments" --description "Specify output format" -x complete -c time -s p -l portable -n "__fish_no_arguments" --description "Use the portable output format" complete -c time -s o -l output -n "__fish_no_arguments" --description "Do not send the results to stderr, but overwrite the specified file" -r complete -c time -s a -l append -n "__fish_no_arguments" --description "(Used together with -o) Do not overwrite but append" complete -c time -s v -l verbose -n "__fish_no_arguments" --description "Verbose mode" complete -c time -l help -n "__fish_no_arguments" --description "Display help and exit" complete -c time -s V -l version -n "__fish_no_arguments" --description "Display version and exit" # Since time runs subcommands, it can accept any switches complete -c time -u fish/share/completions/timeout.fish000066400000000000000000000006231214535744100200150ustar00rootroot00000000000000# # Completions for timeout # SanskritFritz (gmail) complete -c timeout -l foreground -d 'Run COMMAND in the foreground' complete -c timeout -s k -l kill-after -d 'Send a KILL signal after DURATION' complete -c timeout -s s -l signal -d 'Specify the signal to be sent' complete -c timeout -l help -d 'Display this help and exit' complete -c timeout -l version -d 'Output version information and exit' fish/share/completions/tmux.fish000066400000000000000000000270701214535744100173310ustar00rootroot00000000000000function __fish_tmux_sessions --description 'available sessions' tmux list-sessions -F "#S #{session_windows} windows created: #{session_created_string} [#{session_width}x#{session_height}]#{session_attached}" | sed 's/0$//;s/1$/ (attached)/' ^/dev/null end function __fish_tmux_clients --description 'connected clients' tmux list-clients -F "#{client_tty} #S: Created: #{client_created_string} [#{client_width}x#{client_height} #{client_termname}]" ^/dev/null end function __fish_tmux_panes --description 'window panes' #fully qualified pane names tmux list-panes -F '#S:#W.#P session:window.pane' ^/dev/null #panes by themselves tmux list-panes -F '#P pane' ^/dev/null #windows by themselves tmux list-panes -F '#W window' ^/dev/null end #don't allow dirs in the completion list... complete -c tmux -x ############### Begin: Front Flags ############### #these do not require parameters complete -c tmux -n '__fish_use_subcommand' -s 2 -d 'Force tmux to assume the terminal supports 256 colours' complete -c tmux -n '__fish_use_subcommand' -s 8 -d 'Like -2, but indicates that the terminal supports 88 colours' complete -c tmux -n '__fish_use_subcommand' -s l -d 'Behave as a login shell' complete -c tmux -n '__fish_use_subcommand' -s q -d 'Set the quiet server option' complete -c tmux -n '__fish_use_subcommand' -s u -d 'Flag explicitly informs tmux that UTF-8 is supported' complete -c tmux -n '__fish_use_subcommand' -s v -d 'Request verbose logging' complete -c tmux -n '__fish_use_subcommand' -s V -d 'Report the tmux version' #these require parameters complete -c tmux -n '__fish_use_subcommand' -xs c -d 'Execute command using the default shell' complete -c tmux -n '__fish_use_subcommand' -rs f -d 'Alternate config file' complete -c tmux -n '__fish_use_subcommand' -rs L -d 'Specify the name of the server socket to use' complete -c tmux -n '__fish_use_subcommand' -rs S -d 'Full path to sever socket. If set, -L is ignored.' ############### End: Front Flags ############### ############### Begin: Clients and Sessions ############### set -l attach 'attach-session attach' set -l detach 'detach-client detach' set -l has 'has-session has' set -l killserver 'kill-server' set -l killsession 'kill-session' set -l lsc 'list-clients lsc' set -l lscm 'list-commands lscm' set -l ls 'list-sessions ls' set -l lockc 'lock-client lockc' set -l locks 'lock-session locks' set -l new 'new-session new' set -l refresh 'refresh-client refresh' set -l rename 'rename-session rename' set -l showmsgs 'show-messages showmsgs' set -l source 'source-file source' set -l start 'start-server start' set -l suspendc 'suspend-client suspendc' set -l switchc 'switch-client switchc' complete -c tmux -n '__fish_use_subcommand' -a $attach -d 'attach to existing session' complete -c tmux -n "__fish_seen_subcommand_from $attach" -s d -d 'detach other clients' complete -c tmux -n "__fish_seen_subcommand_from $attach" -s r -d 'attach in read-only mode' complete -c tmux -n '__fish_use_subcommand' -a $detach -d 'detach current client' complete -c tmux -n "__fish_seen_subcommand_from $detach" -s P -d 'SIGHUP parent process of client, likely causing it to exit' complete -c tmux -n '__fish_use_subcommand' -a $has -d 'report error and exit with 1 if the specified session does not exist' complete -c tmux -n '__fish_use_subcommand' -a $killserver -d 'kill tmux server, clients, and sessions' complete -c tmux -n '__fish_use_subcommand' -a $killsession -d 'destroy session, closing windows linked to it and no other sessions, detach all clients' complete -c tmux -n '__fish_use_subcommand' -a $lsc -d 'list all attached clients' complete -c tmux -n '__fish_use_subcommand' -a $lscm -d 'list syntax for all tmux commands' complete -c tmux -n '__fish_use_subcommand' -a $ls -d 'list all sessions' complete -c tmux -n '__fish_use_subcommand' -a $lockc -d 'lock client' complete -c tmux -n '__fish_use_subcommand' -a $locks -d 'lock session' complete -c tmux -n '__fish_use_subcommand' -a $new -d 'create a new session with name session-name' complete -c tmux -n "__fish_seen_subcommand_from $new" -s d -d "don't attach to current window" complete -c tmux -n "__fish_seen_subcommand_from $new" -xs n -d 'window-name' complete -c tmux -n "__fish_seen_subcommand_from $new" -xs s -d 'session-name' complete -c tmux -n "__fish_seen_subcommand_from $new" -xs x -d 'width' complete -c tmux -n "__fish_seen_subcommand_from $new" -xs y -d 'height' complete -c tmux -n '__fish_use_subcommand' -a $refresh -d 'refresh client' complete -c tmux -n "__fish_seen_subcommand_from $refresh" -s S -d 'update client status bar' complete -c tmux -n '__fish_use_subcommand' -a $rename -d 'rename session' complete -c tmux -n '__fish_use_subcommand' -a $showmsgs -d 'save msgs in status bar in per-client msg log' complete -c tmux -n '__fish_use_subcommand' -a $source -d 'execute commands from path' complete -c tmux -n '__fish_use_subcommand' -a $start -d 'start tmux server if not running; do not create a session' complete -c tmux -n '__fish_use_subcommand' -a $suspendc -d 'send SIGTSTP signal to client (tty stop)' complete -c tmux -n '__fish_use_subcommand' -a $switchc -d 'Switch the current session for client target-client to target-session' complete -c tmux -n "__fish_seen_subcommand_from $switchc" -s l -d 'move client to the last session' complete -c tmux -n "__fish_seen_subcommand_from $switchc" -s n -d 'move client to the next session' complete -c tmux -n "__fish_seen_subcommand_from $switchc" -s p -d 'move client to the previous session' complete -c tmux -n "__fish_seen_subcommand_from $switchc" -s r -d 'toggle if client is read-only' #commands with a session flag complete -c tmux -xs t -n "__fish_seen_subcommand_from $attach $new $has $killsession $lsc $locks $rename $switchc" -a '(__fish_tmux_sessions)' -d 'target-session' complete -c tmux -xs s -n "__fish_seen_subcommand_from $detach" -a '(__fish_tmux_sessions)' -d 'target-session' #commands with a client flag complete -c tmux -xs t -n "__fish_seen_subcommand_from $detach $lockc $refresh $showmsgs $suspendc" -a '(__fish_tmux_clients)' -d 'target-client' complete -c tmux -xs c -n "__fish_seen_subcommand_from $switchc" -a '(__fish_tmux_clients)' -d 'target-client' #commands with the -F format flag complete -c tmux -n "__fish_seen_subcommand_from $lsc $ls" -rs F -d 'format string' ############### End: Clients and Sessions ############### ############### Begin: Windows and Panes ############### #TODO - these commands are not currently implemented. #there is a section in the tmux man page that has the same title as this section #use the "Clients and Sessions" code as an example when implementing this ############### End: Windows and Panes ############### ############### Begin: Key Bindings ############### set -l bind 'bind-key bind' set -l lsk 'list-keys lsk' set -l send 'send-keys send' set -l sendprefix 'send-prefix' set -l unbind 'unbind-key unbind' set -l key_table 'vi-edit emacs-edit vi-choice emacs-choice vi-copy emacs-copy' complete -c tmux -n '__fish_use_subcommand' -a $bind -d 'bind key to command' complete -c tmux -n "__fish_seen_subcommand_from $bind" -s c -d 'bind for command mode instead of normal mode' complete -c tmux -n "__fish_seen_subcommand_from $bind" -s n -d 'make the binding work without using a prefix key' complete -c tmux -n "__fish_seen_subcommand_from $bind" -s r -d 'key may repeat' complete -c tmux -n "__fish_seen_subcommand_from $bind" -xs t -d 'choose key table for binding' -xa "$key_table" complete -c tmux -n '__fish_use_subcommand' -a $lsk -d 'list all key bindings' complete -c tmux -n "__fish_seen_subcommand_from $lsk" -s t -d 'key table' -xa "$key_table" complete -c tmux -n '__fish_use_subcommand' -a $send -d 'list all key bindings' complete -c tmux -n "__fish_seen_subcommand_from $send" -s R -d 'reset terminal state' complete -c tmux -n "__fish_seen_subcommand_from $send" -xs t -a '(__fish_tmux_panes)' -d 'target pane' complete -c tmux -n '__fish_use_subcommand' -a $sendprefix -d 'send the prefix key' complete -c tmux -n "__fish_seen_subcommand_from $sendprefix" -s 2 -d 'use secondary prefix' complete -c tmux -n "__fish_seen_subcommand_from $sendprefix" -xs t -a '(__fish_tmux_panes)' -d 'target pane' complete -c tmux -n '__fish_use_subcommand' -a $unbind -d 'unbind the command bound to key' complete -c tmux -n "__fish_seen_subcommand_from $unbind" -s a -d 'remove all key bindings' complete -c tmux -n "__fish_seen_subcommand_from $unbind" -s c -d 'binding for command mode' complete -c tmux -n "__fish_seen_subcommand_from $unbind" -s n -d 'command bound to key without a prefix (if any) removed' complete -c tmux -n "__fish_seen_subcommand_from $unbind" -xs t -d 'key table' -xa "$key_table" ############### End: Key Bindings ############### ############### Begin: Options ############### #TODO - these commands are not currently implemented. #there is a section in the tmux man page that has the same title as this section #use the "Clients and Sessions" code as an example when implementing this ############### End: Options ############### ############### Begin: Environment ############### set -l setenv 'set-environment setenv' set -l showenv 'show-environment showenv' complete -c tmux -n '__fish_use_subcommand' -a $setenv -d 'Set or unset an environment variable' complete -c tmux -n "__fish_seen_subcommand_from $setenv" -s g -d 'global environment' complete -c tmux -n "__fish_seen_subcommand_from $setenv" -s r -d 'remove from environment before starting a new process' complete -c tmux -n "__fish_seen_subcommand_from $setenv" -s u -d 'unset variable' complete -c tmux -xs t -n "__fish_seen_subcommand_from $setenv" -a '(__fish_tmux_sessions)' -d 'target-session' complete -c tmux -n '__fish_use_subcommand' -a $showenv -d 'bind key to command' complete -c tmux -n "__fish_seen_subcommand_from $showenv" -s g -d 'global environment' complete -c tmux -xs t -n "__fish_seen_subcommand_from $showenv" -a '(__fish_tmux_sessions)' -d 'target-session' ############### End: Environment ############### ############### Begin: Status Line ############### set -l commandprompt 'command-prompt' set -l display 'display-message display' complete -c tmux -n '__fish_use_subcommand' -a $commandprompt -d 'Open the command prompt in a client' complete -c tmux -n "__fish_seen_subcommand_from $commandprompt" -s I -x -d 'Comma-separated list of initial text for each prompt' complete -c tmux -n "__fish_seen_subcommand_from $commandprompt" -s p -x -d 'Comma-separated list of prompts' complete -c tmux -n "__fish_seen_subcommand_from $commandprompt" -s t -xa '(__fish_tmux_clients)' -d 'target-client' complete -c tmux -n '__fish_use_subcommand' -a $display -d 'Display a message' complete -c tmux -n "__fish_seen_subcommand_from $display" -s p -d 'print to stdout' complete -c tmux -n "__fish_seen_subcommand_from $display" -s t -xa '(__fish_tmux_panes)' -d 'target-pane' complete -c tmux -n "__fish_seen_subcommand_from $display" -s c -xa '(__fish_tmux_clients)' -d 'target-client' ############### End: Status Line ############### ############### Begin: Buffers ############### #TODO - these commands are not currently implemented. #there is a section in the tmux man page that has the same title as this section #use the "Clients and Sessions" code as an example when implementing this ############### End: Buffers ############### ############### Begin: Miscellaneous ############### #TODO - these commands are not currently implemented. #there is a section in the tmux man page that has the same title as this section #use the "Clients and Sessions" code as an example when implementing this ############### End: Miscellaneous ############### fish/share/completions/top.fish000066400000000000000000000014271214535744100171340ustar00rootroot00000000000000# Completions for top complete -c top -s b --description "Batch mode" complete -c top -s c --description "Toggle command line/program name" complete -c top -s d --description "Update interval" -x complete -c top -s h --description "Display help and exit" complete -c top -s i --description "Toggle idle processes" complete -c top -s n --description "Maximum iterations" -x complete -c top -s u --description "Monitor effective UID" -x -a "(__fish_complete_users)" complete -c top -s U --description "Monitor user" -x -a "(__fish_complete_users)" complete -c top -s p --description "Monitor PID" -x -a "(__fish_complete_pids)" complete -c top -s s --description "Secure mode" complete -c top -s S --description "Cumulative mode" complete -c top -s v --description "Display version and exit" fish/share/completions/totem.fish000066400000000000000000000027631214535744100174660ustar00rootroot00000000000000#completion for totem complete -c totem -l usage --description 'Output a brief synopsis of command options then quit' complete -c totem -s ? -l help --description 'Output a longer help message then quit' complete -c totem -l version --description 'Output version information then quit' complete -c totem -l play-pause --description 'Tell any running totem instance: Toggle between play and pause' complete -c totem -l play --description 'Tell any running totem instance: Play' complete -c totem -l pause --description 'Tell any running totem instance: Pause' complete -c totem -l next --description 'Tell any running totem instance: Skip to next' complete -c totem -l previous --description 'Tell any running totem instance: Skip to previous' complete -c totem -l seek-fwd --description 'Tell any running totem instance: Seek forwards 15 sec' complete -c totem -l seek-bwd --description 'Tell any running totem instance: Seek backwards 15 sec' complete -c totem -l volume-up --description 'Tell any running totem instance: Raise volume by 8%' complete -c totem -l volume-down --description 'Tell any running totem instance: Lower volume by 8%' complete -c totem -l fullscreen --description 'Tell any running totem instance: Toggle fullscreen' complete -c totem -l quit --description 'Tell any running totem instance: Quit' complete -r -c totem -l enqueue --description 'Tell any running totem instance: Add to playlist' complete -r -c totem -l replace --description 'Tell any running totem instance: Play from playlist' fish/share/completions/touch.fish000066400000000000000000000012731214535744100174530ustar00rootroot00000000000000complete -c touch -s a --description "Change access time" complete -c touch -s B -l backward -x --description "Set date back" complete -c touch -s c -l no-create --description "Do not create file" complete -c touch -s d -l date -x --description "Set date" complete -c touch -s f -l forward -x --description "Set date forward" complete -c touch -s m --description "Change modification time" complete -c touch -s r -l reference --description "Use this files times" complete -c touch -s t --description "Set date" complete -c touch -l time -x --description "Set time" complete -c touch -l help --description "Display help and exit" complete -c touch -l version --description "Display version and exit" fish/share/completions/tr.fish000066400000000000000000000024321214535744100167540ustar00rootroot00000000000000complete -c tr -x complete -c tr -s c -s C -l complement -d 'use the complement of SET1' complete -c tr -s d -l delete -d 'delete characters in SET1, do not translate' complete -c tr -s s -l squeeze-repeats -d 'replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character' complete -c tr -s t -l truncate-set1 -d 'first truncate SET1 to length of SET2' complete -c tr -l help -d 'display this help and exit' complete -c tr -l version -d 'output version information and exit' complete -c tr -a '[:alnum:]' -d 'all letters and digits' complete -c tr -a '[:alpha:]' -d 'all letters' complete -c tr -a '[:blank:]' -d 'all horizontal whitespace' complete -c tr -a '[:cntrl:]' -d 'all control characters' complete -c tr -a '[:digit:]' -d 'all digits' complete -c tr -a '[:graph:]' -d 'all printable characters, not including space' complete -c tr -a '[:lower:]' -d 'all lower case letters' complete -c tr -a '[:print:]' -d 'all printable characters, including space' complete -c tr -a '[:punct:]' -d 'all punctuation characters' complete -c tr -a '[:space:]' -d 'all horizontal or vertical whitespace' complete -c tr -a '[:upper:]' -d 'all upper case letters' complete -c tr -a '[:xdigit:]' -d 'all hexadecimal digits' fish/share/completions/trap.fish000066400000000000000000000003631214535744100172760ustar00rootroot00000000000000 complete -c trap -s l -l list-signals --description 'Display names of all signals' complete -c trap -s p -l print --description 'Display all currently defined trap handlers' complete -c trap -s h -l help --description 'Display help and exit' fish/share/completions/tree.fish000066400000000000000000000070111214535744100172640ustar00rootroot00000000000000 ## Listing options complete -c tree -s a -d 'All files are listed' complete -c tree -s d -d 'List directories only' complete -c tree -s l -d 'Follow symbolic links like directories' complete -c tree -s f -d 'Print the full path prefix for each file' complete -c tree -s x -d 'Stay on current filesystem only' complete -c tree -s L -x -d 'Descend only level directories deep' complete -c tree -s R -d 'Rerun tree when max dir level reached' complete -c tree -s P -r -d 'List only those files that match the pattern given' complete -c tree -s I -r -d 'Do not list files that match the given pattern' complete -c tree -l noreport -d 'Turn off file/directory count at end of tree listing' complete -c tree -l charset -x -d 'Use charset X for terminal/HTML and indentation line output' complete -c tree -l filelimit -r -d 'Do not descend dirs with more than # files in them' complete -c tree -l timefmt -x -d 'Print and format time according to the format ' complete -c tree -s o -r -d 'Output to file instead of stdout' ## File options complete -c tree -s q -d 'Print non-printable characters as \'?\'' complete -c tree -s N -d 'Print non-printable characters as is' complete -c tree -s Q -d 'Quote filenames with double quotes' complete -c tree -s p -d 'Print the protections for each file' complete -c tree -s u -d 'Displays file owner or UID number' complete -c tree -s g -d 'Displays file group owner or GID number' complete -c tree -s s -d 'Print the size in bytes of each file' complete -c tree -s h -d 'Print the size in a more human readable way' complete -c tree -l si -d 'Like -h, but use in SI units (powers of 1000)' complete -c tree -s D -d 'Print the date of last modification or (-c) status change' complete -c tree -s F -d 'Appends \'/\', \'=\', \'*\', \'@\', \'|\' or \'>\' as per ls -F' complete -c tree -l inodes -d 'Print inode number of each file' complete -c tree -l device -d 'Print device ID number to which each file belongs' ## Sorting options complete -c tree -s v -d 'Sort files alphanumerically by version' complete -c tree -s r -d 'Sort files in reverse alphanumeric order' complete -c tree -s t -d 'Sort files by last modification time' complete -c tree -s c -d 'Sort files by last status change time' complete -c tree -s U -d 'Leave files unsorted' complete -c tree -l dirsfirst -d 'List directories before files (-U disables)' ## Graphics options complete -c tree -s i -d 'Don\'t print indentation lines' complete -c tree -s A -d 'Print ANSI lines graphic indentation lines' complete -c tree -s S -d 'Print with ASCII graphics indentation lines' complete -c tree -s n -d 'Turn colorization off always (-C overrides)' complete -c tree -s C -d 'Turn colorization on always' ## XML/HTML options complete -c tree -s X -d 'Prints out an XML representation of the tree' complete -c tree -s H -r -d 'Prints out HTML format with baseHREF as top directory' complete -c tree -s T -r -d 'Replace the default HTML title and H1 header with string' complete -c tree -l nolinks -d 'Turn off hyperlinks in HTML output' ## Miscellaneous options complete -c tree -l version -d 'Print version and exit' complete -c tree -l help -d 'Print usage and this help message and exit' fish/share/completions/type.fish000066400000000000000000000012511214535744100173060ustar00rootroot00000000000000 complete -c type -s h -l help --description "Display help and exit" complete -c type -s a -l all --description "Print all possible definitions of the specified name" complete -c type -s f -l no-functions --description "Suppress function and builtin lookup" complete -c type -s t -l type --description "Print command type" complete -c type -s p -l path --description "Print path to command, or nothing if name is not a command" complete -c type -s P -l force-path --description "Print path to command" complete -c type -a "(builtin -n)" --description "Builtin" complete -c type -a "(functions -n)" --description "Function" complete -c type -a "(complete -C(commandline -ct))" -x fish/share/completions/ulimit.fish000066400000000000000000000024631214535744100176360ustar00rootroot00000000000000 complete -c ulimit -s S -l soft --description "Set or get soft limit" complete -c ulimit -s H -l hard --description "Set or get hard limit" complete -c ulimit -s a -l all --description "Set or get all current limits" complete -c ulimit -s c -l core-size --description "Maximum size of core files created" complete -c ulimit -s d -l data-size --description "Maximum size of a process's data segment" complete -c ulimit -s f -l file-size --description "Maximum size of files created by the shell" complete -c ulimit -s l -l lock-size --description "Maximum size that may be locked into memory" complete -c ulimit -s m -l resident-set-size --description "Maximum resident set size" complete -c ulimit -s n -l file-descriptor-count --description "Maximum number of open file descriptors" complete -c ulimit -s s -l stack-size --description "Maximum stack size" complete -c ulimit -s t -l cpu-time --description "Maximum amount of cpu time in seconds" complete -c ulimit -s u -l process-count --description "Maximum number of processes available to a single user" complete -c ulimit -s v -l virtual-memory-size --description "Maximum amount of virtual memory available to the shell" complete -c ulimit -s h -l help --description "Display help and exit" complete -c ulimit -a "unlimited soft hard" --description "New resource limit" fish/share/completions/umount.fish000066400000000000000000000025641214535744100176640ustar00rootroot00000000000000# # Completions for the umount command # # # Find all mountpoints # complete -c umount --description "Mount point" -x -a '(__fish_print_mounted)' complete -c umount -s V --description "Display version and exit" complete -c umount -s h --description "Display help and exit" complete -c umount -s v --description "Verbose mode" complete -c umount -s n --description "Unmount without writing in /etc/mtab" complete -c umount -s r --description "In case unmounting fails, try to remount read-only" complete -c umount -s d --description "In case the unmounted device was a loop device, also free this loop device" complete -c umount -s i --description "Don't call the /sbin/umount. helper even if it exists" complete -c umount -s a --description "Unmount all of the file systems described in /etc/mtab" complete -c umount -s t --description "Actions should only be taken on file systems of the specified type" -xa "(__fish_print_filesystems)" complete -c umount -s O --description "Actions should only be taken on file systems with the specified options in /etc/fstab" -xa '(cat /etc/mtab | cut -d " " -f 4)\t"Mount option"' complete -c umount -s f --description "Force unmount (in case of an unreachable NFS system)" complete -c umount -s l --description "Detach the filesystem from the filesystem hierarchy now, and cleanup all references to the filesystem as soon as it is not busy" fish/share/completions/uname.fish000066400000000000000000000014541214535744100174370ustar00rootroot00000000000000complete -c uname -s a -l all --description "Print all information" complete -c uname -s s -l kernel-name --description "Print kernel name" complete -c uname -s n -l nodename --description "Print network node hostname" complete -c uname -s r -l kernel-release --description "Print kernel release" complete -c uname -s v -l kernel-version --description "Print kernel version" complete -c uname -s m -l machine --description "Print machine name" complete -c uname -s p -l processor --description "Print processor" complete -c uname -s i -l hardware-platform --description "Print hardware platform" complete -c uname -s o -l operating-system --description "Print operating system" complete -c uname -l help --description "Display help and exit" complete -c uname -l version --description "Display version and exit" fish/share/completions/unexpand.fish000066400000000000000000000010301214535744100201420ustar00rootroot00000000000000complete -c unexpand -s a -l all -d 'convert all blanks, instead of just initial blanks' complete -c unexpand -l first-only -d 'convert only leading sequences of blanks (overrides -a)' complete -c unexpand -s t -l tabs -x -d 'have tabs N characters apart instead of 8 (enables -a)' complete -c unexpand -s t -l tabs -x -d 'use comma separated LIST of tab positions (enables -a)' complete -c unexpand -l help -d 'display this help and exit' complete -c unexpand -l version -d 'output version information and exit' fish/share/completions/uniq.fish000066400000000000000000000017611214535744100173070ustar00rootroot00000000000000complete -c uniq -s c -l count --description "Print number of occurences" complete -c uniq -s d -l repeated --description "Only print duplicates" complete -c uniq -s D -l all-repeated --description "Remove non-duplicate lines" -f -x -a " none\t'Remove none-duplicate lines' prepend\t'Remove non-duplicate lines and print an empty line before each non-duplicate' separate\t'Remove non-duplicate lines and print an empty line between each non-duplicate' " complete -c uniq -s f -l skip-fields --description "Avoid comparing first N fields" -r complete -c uniq -s i -l ignore-case --description "Case insensitive" complete -c uniq -s s -l skip-chars --description "Avoid comparing first N characters" -r complete -c uniq -s u -l unique --description "Only print unique lines" complete -c uniq -s w -l check-chars --description "Compare only specified number of characters" -r complete -c uniq -l help --description "Display help and exit" complete -c uniq -l version --description "Display version and exit" fish/share/completions/unrar.fish000066400000000000000000000020171214535744100174550ustar00rootroot00000000000000 # Peek inside of archives and list all files complete -c unrar -a "(__fish_complete_unrar)" complete -x -c unrar -n '__fish_use_subcommand' -a e --description "Extract files to current directory" complete -x -c unrar -n '__fish_use_subcommand' -a l --description "List archive" complete -x -c unrar -n '__fish_use_subcommand' -a lt --description "List archive (technical)" complete -x -c unrar -n '__fish_use_subcommand' -a lb --description "List archive (bare)" complete -x -c unrar -n '__fish_use_subcommand' -a p --description "Print file to stdout" complete -x -c unrar -n '__fish_use_subcommand' -a t --description "Test archive files" complete -x -c unrar -n '__fish_use_subcommand' -a v --description "Verbosely list archive" complete -x -c unrar -n '__fish_use_subcommand' -a vt --description "Verbosely list archive (technical)" complete -x -c unrar -n '__fish_use_subcommand' -a vb --description "Verbosely list archive (bare)" complete -x -c unrar -n '__fish_use_subcommand' -a x --description "Extract files with full path" fish/share/completions/update-eix-remote.fish000066400000000000000000000016241214535744100216670ustar00rootroot00000000000000# Completions for the eix tool's update-eix-remote command # http://dev.croup.de/proj/eix and http://sourceforge.net/projects/eix/ # Author: Tassilo Horn ########## # UPDATE-EIX-REMOTE ##### # Options complete -c update-eix-remote -s q -d "Be quiet" complete -c update-eix-remote -s v -d "Be verbose (default)" complete -c update-eix-remote -s u -xua '(__fish_print_users)' -d "Call wget as the given USER" complete -c update-eix-remote -s o -d "Use the given PATH as $OVERLAYPARENT" ##### # Subcommands complete -c update-eix-remote -xa 'update\t"'(_ "Fetch the eix-caches of some layman overlays into a temporary file resp. into FILE and add them to the eix database")'" fetch\t"'(_ "Only fetch the overlays into FILE")'" add\t"'(_ "Only add the overlays from FILE to the eix database")'" remove\t"'(_ "Remove all temporarily added virtual overlays from the eix database")'"' ########## fish/share/completions/update-eix.fish000066400000000000000000000015721214535744100204000ustar00rootroot00000000000000# Completions for the eix tool's update-eix command # http://dev.croup.de/proj/eix and http://sourceforge.net/projects/eix/ # Author: Tassilo Horn ########## # UPDATE-EIX complete -c update-eix -s h -l help -d "Show a short help screen" complete -c update-eix -s V -l version -d "Show version string" complete -c update-eix -l dump -d "Show eixrc-variables" complete -c update-eix -l dump-defaults -d "Show default eixrc-variables" complete -c update-eix -s q -l quiet -d "Produce no output" complete -c update-eix -s o -l output -d "Output to the given file" complete -c update-eix -s x -l exclude-overlay -d "Exclude the given overlay from the update-process" complete -c update-eix -s a -l add-overlay -d "Add the given overlay to the update-process" complete -c update-eix -s m -l override-method -d "Override cache method for a specified overlay" ########## fish/share/completions/useradd.fish000066400000000000000000000036541214535744100177650ustar00rootroot00000000000000# # Command specific completions for the useradd command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c useradd -s c -l comment --description 'A comment about this user' -r complete -c useradd -s d -l home --description 'Home directory for the new user' -x -a '(__fish_complete_directories)' complete -c useradd -s G -l groups --description 'Supplementary groups' -xa '(__fish_append , (cat /etc/group|cut -d : -f 1))' complete -c useradd -s h -l help --description 'Display help message and exit' complete -c useradd -s m -l create-home --description 'The user's home directory will be created if it does not exist' complete -c useradd -s n --description 'A group having the same name as the user being added to the system will be created by default (when -g is not specified)' complete -c useradd -s K -l key --description 'Overrides default key/value pairs from /etc/login' complete -c useradd -s o -l non-unique --description 'Allow the creation of a user account with a duplicate (non-unique) UID' complete -c useradd -s p -l password --description 'The encrypted password, as returned by crypt(3)' -r complete -c useradd -s u -l uid --description 'The numerical value of the user's ID' -r complete -c useradd -s b -l base-dir --description 'The initial path prefix for a new user's home directory' -r -a '(__fish_complete_directories)' complete -c useradd -s e -l expiredate --description 'The date on which the user account is disabled' -r complete -c useradd -s f -l inactive --description 'The number of days after a password has expired before the account will be disabled' -r complete -c useradd -s g -l gid --description 'The group name or ID for a new user's initial group' -x -a '(cat /etc/group|cut -d : -f 1,3|sed -e "s/:/\n/")' complete -c useradd -s s -l shell --description 'Name of the new user's login shell' -x -a '(cat /etc/shells)' fish/share/completions/valgrind.fish000066400000000000000000000137101214535744100201360ustar00rootroot00000000000000# Don't go invoking valgrind unless it is installed set -l skin tool if begin ; type valgrind >/dev/null ; and valgrind --version ^/dev/null | sgrep -- '-2\.[012]\.' >/dev/null ^/dev/null ; end # In older versions of Valgrind, the skin selection option was # '--skin' # But someone decided that it would be fun to change this to # '--tool' for no good reason set skin skin end complete -xc valgrind -l $skin --description "Skin" -a " memcheck\tHeavyweight\ memory\ checker cachegrind\tCache-miss\ profiler addrcheck\tLightweight\ memory\ checker helgrind\tData-race\ detector massif\tHeap\ profiler " eval " function __fish_valgrind_skin --argument tool set -l cmd (commandline -cpo) if contains -- --$skin=\$tool \$cmd return 0 end test \$tool = memcheck and echo \$cmd | grep -qve $skin end " complete -c valgrind -l help --description "Display help and exit" complete -c valgrind -l help-debug --description "Display help and debug options" complete -c valgrind -l version --description "Display version and exit" complete -c valgrind -s q -l quiet --description "Quiet mode" complete -c valgrind -s v -l verbose --description "Verbose mode" complete -xc valgrind -l trace-children --description "Valgrind-ise children" -a "yes no" complete -xc valgrind -l track-fds --description "Track file descriptors" -a "yes no" complete -xc valgrind -l logfile-fd --description "Log to file descriptor" -a "0 1 2 3 4 5 6 7 8 9" complete -rc valgrind -l logfile --description "Log to file" complete -xc valgrind -l logsocket --description "Log to socket" complete -c valgrind -l demangle -xd "Demangle C++ names" -a "yes no" complete -xc valgrind -l num-callers --description "Callers in stack trace" complete -xc valgrind -l error-limit --description "Stop showing errors if too many" -a "yes no" complete -xc valgrind -l show-below-main --description "Continue trace below main()" -a "yes no" complete -rc valgrind -l supressions --description "Supress errors from file" complete -c valgrind -l gen-supressions --description "Print suppressions for detected errors" complete -xc valgrind -l db-attach --description "Start debugger on error" -a "yes no" complete -rc valgrind -l db-command --description "Debugger command" complete -xc valgrind -l input-fd --description "File descriptor for input" -a "0 1 2 3 4 5 6 7 8 9" # Memcheck-specific options complete -n "__fish_valgrind_skin memcheck" -xc valgrind -l leak-check --description "Check for memory leaks" -a "no\tDon\'t\ check\ for\ memory\ leaks summary\t'Show a leak summary' full\t'Describe memory leaks in detail'" complete -n "__fish_valgrind_skin memcheck" -xc valgrind -l show-reachable --description "Show reachable leaked memory" -a "yes\t'Show reachable leaked memory' no\t'Do not show reachable leaked memory'" complete -n "__fish_valgrind_skin memcheck" -xc valgrind -l leak-resolution --description "Determines how willing Memcheck is to consider different backtraces to be the same" -a "low\t'Two entries need to match' med\t'Four entries need to match' high\t'All entries need to match'" complete -n "__fish_valgrind_skin memcheck" -xc valgrind -l freelist-vol --description "Set size of freed memory pool" complete -n "__fish_valgrind_skin memcheck" -xc valgrind -l partial-loads-ok -d 'How to handle loads of words that are partially addressible' -a 'yes\t"Do not emit errors on partial loads" no\t"Emit errors on partial loads"' complete -n "__fish_valgrind_skin memcheck" -xc valgrind -l avoid-strlen-errors -d 'Whether to skip error reporting for the strlen function' -a 'yes no' # Addrcheck-specific options complete -n "__fish_valgrind_skin addrcheck" -xc valgrind -l leak-check --description "Check for memory leaks" -a "no\t'Do not check for memory leaks' summary\t'Show a leak summary' full\t'Describe memory leaks in detail'" complete -n "__fish_valgrind_skin addrcheck" -xc valgrind -l show-reachable --description "Show reachable leaked memory" -a "yes\t'Show reachable leaked memory' no\t'Do not show reachable leaked memory'" complete -n "__fish_valgrind_skin addrcheck" -xc valgrind -l leak-resolution --description "Determines how willing Addrcheck is to consider different backtraces to be the same" -a "low\t'Two entries need to match' med\t'Four entries need to match' high\t'All entries need to match'" complete -n "__fish_valgrind_skin addrcheck" -xc valgrind -l freelist-vol --description "Set size of freed memory pool" complete -n "__fish_valgrind_skin addrcheck" -xc valgrind -l partial-loads-ok -d 'How to handle loads of words that are partially addressible' -a 'yes\t"Do not emit errors on partial loads" no\t"Emit errors on partial loads"' complete -n "__fish_valgrind_skin addrcheck" -xc valgrind -l avoid-strlen-errors -d 'Whether to skip error reporting for the strlen function' -a 'yes no' # Cachegrind-specific options complete -n "__fish_valgrind_skin cachegrind" -xc valgrind -l I1 --description "Type of L1 instruction cache" complete -n "__fish_valgrind_skin cachegrind" -xc valgrind -l D1 --description "Type of L1 data cache" complete -n "__fish_valgrind_skin cachegrind" -xc valgrind -l L2 --description "Type of L2 cache" # Massif-specific options complete -c valgrind -n "__fish_valgrind_skin massif" -l alloc-fn --description "Specify a function that allocates memory" -x -a "(__fish_print_function_prototypes)" complete -c valgrind -n "__fish_valgrind_skin massif" -x -l heap -d 'Profile heap usage' -a 'yes\t"Profile heap usage" no\t"Do not profile heap usage"' complete -c valgrind -n "__fish_valgrind_skin massif" -x -l heap-admin --description "The number of bytes of heap overhead per allocation" complete -c valgrind -n "__fish_valgrind_skin massif" -x -l stacks --description "Profile stack usage" -a 'yes\t"Profile stack usage" no\t"Do not profile stack usage"' complete -c valgrind -n "__fish_valgrind_skin massif" -x -l depth --description "Depth of call chain" complete -c valgrind -n "__fish_valgrind_skin massif" -x -l format --description "Profiling output format" -a "html\t'Produce html output' text\t'Produce text output'" fish/share/completions/vared.fish000066400000000000000000000002031214535744100174220ustar00rootroot00000000000000complete -c vared -x -a "(set|sed -e 's/ /'\t'Variable: /')" complete -c vared -s h -l help --description "Display help and exit" fish/share/completions/vi.fish000066400000000000000000000000531214535744100167420ustar00rootroot00000000000000# completion for vi __fish_complete_vi vi fish/share/completions/vim.fish000066400000000000000000000000551214535744100171210ustar00rootroot00000000000000# completion for vim __fish_complete_vi vim fish/share/completions/vimdiff.fish000066400000000000000000000000651214535744100177530ustar00rootroot00000000000000# completion for vimdiff __fish_complete_vi vimdiff fish/share/completions/w.fish000066400000000000000000000005671214535744100166040ustar00rootroot00000000000000complete -c w -s h --description "Dont print header" complete -c w -s u --description "Ignore username for time calculations" complete -c w -s s --description "Short format" complete -c w -s f --description "Toggle printing of remote hostname" complete -c w -s V --description "Display version and exit" complete -c w -x -a "(__fish_complete_users)" --description "Username" fish/share/completions/wajig.fish000066400000000000000000000432251214535744100174350ustar00rootroot00000000000000function __fish_wajig_no_subcommand --description 'Test if wajig has yet to be given the subcommand' for i in (commandline -opc) if contains -- $i addcdrom auto-alts auto-clean auto-download auto-install available bug build build-depend changelog clean commands daily-upgrade dependents describe describe-new detail detail-new dist-upgrade docs download file-download file-install file-remove find-file find-pkg fix-configure fix-install fix-missing force help hold init install installr installrs installs integrity large last-update list list-all list-alts list-cache list-commands list-daemons list-files list-hold list-installed list-log list-names list-orphans list-scripts list-section list-section list-status list-wide local-dist-upgrade local-upgrade madison move new news new-upgrades non-free orphans package policy purge purge-depend purge-orphans readme recursive recommended reconfigure reinstall reload remove remove-depend remove-orphans repackage reset restart rpminstall rpmtodeb search search-apt setup show showdistupgrade showinstall showremove showupgrade size sizes snapshot source start status status-match status-search stop suggested tasksel toupgrade unhold unofficial update update-alts update-pci-ids update-usb-ids upgrade versions whatis whichpkg return 1 end end return 0 end function __fish_wajig_use_package --description 'Test if wajig command should have packages as potential completion' for i in (commandline -opc) if contains -- $i contains bug build build-depend changelog dependents describe detail hold install installr installrs installs list list-files news package purge purge-depend readme recursive recommended reconfigure reinstall remove remove-depend repackage show showinstall showremove showupgrade size sizes source suggested unhold upgrade versions whatis return 0 end end return 1 end complete -c wajig -n '__fish_wajig_use_package' -a '(__fish_print_packages)' --description 'Package'h complete -c wajig -s q -l quiet --description 'Do system commands everything quietly.' complete -c wajig -s n -l noauth --description 'Allow packages from unathenticated archives.' complete -c wajig -s s -l simulate --description 'Trace but don\'t execute the sequence of underlying commands.' complete -c wajig -s t -l teaching --description 'Trace the sequence of commands performed.' complete -c wajig -s y -l yes --description 'Assume yes for any questions asked.' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'addcdrom' --description 'Add a CD-ROM to the list of available sources of packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'auto-alts' --description 'Mark the alternative to be auto set (using set priorities)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'auto-clean' --description 'Remove superseded deb files from the download cache' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'auto-download' --description 'Do an update followed by a download of all updated packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'auto-install' --description 'Perform an install without asking questions (non-interactive)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'available' --description 'List versions of packages available for installation' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'bug' --description 'Check reported bugs in package using the Debian Bug Tracker' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'build' --description 'Retrieve/unpack sources and build .deb for the named packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'build-depend' --description 'Retrieve packages required to build listed packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'changelog' --description 'Retrieve latest changelog for the package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'clean' --description 'Remove all deb files from the download cache' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'commands' --description 'List all the JIG commands and one line descriptions for each' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'daily-upgrade' --description 'Perform an update then a dist-upgrade' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'dependents' --description 'List of packages which depend/recommend/suggest the package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'describe' --description 'One line description of packages (-v and -vv for more detail)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'describe-new' --description 'One line description of new packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'detail' --description 'Provide a detailed description of package (describe -vv)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'detail-new' --description 'Provide a detailed description of new packages (describe -vv)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'dist-upgrade' --description 'Upgrade to new distribution (installed and new rqd packages)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'docs' --description 'Equivalent to help with -verbose=2' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'download' --description 'Download package files ready for an install' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'file-download' --description 'Download packages listed in file ready for an install' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'file-install' --description 'Install packages listed in a file' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'file-remove' --description 'Remove packages listed in a file' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'find-file' --description 'Search for a file within installed packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'find-pkg' --description 'Search for an unofficial Debian package at apt-get.org' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'fix-configure' --description 'Perform dpkg --configure -a (to fix interrupted configure)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'fix-install' --description 'Perform apt-get -f install (to fix broken dependencies)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'fix-missing' --description 'Perform apt-get --fix-missing upgrade' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'force' --description 'Install packages and ignore file overwrites and depends' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'help' --description 'Print documentation (detail depends on --verbose)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'hold' --description 'Place listed packages on hold so they are not upgraded' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'init' --description 'Initialise or reset the JIG archive files' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'install' --description 'Install (or upgrade) one or more packages or .deb files' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'installr' --description 'Install package and associated recommended packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'installrs' --description 'Install package and recommended and suggested packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'installs' --description 'Install package and associated suggested packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'integrity' --description 'Check the integrity of installed packages (through checksums)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'large' --description 'List size of all large (>10MB) installed packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'last-update' --description 'Identify when an update was last performed' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list' --description 'List the status and description of installed packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-all' --description 'List a one line description of given or all packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-alts' --description 'List the objects that can have alternatives configured' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-cache' --description 'List the contents of the download cache' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-commands' --description 'List all the JIG commands and one line descriptions for each' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-daemons' --description 'List the daemons that JIG can start/stop/restart' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-files' --description 'List the files that are supplied by the named package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-hold' --description 'List those packages on hold' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-installed' --description 'List packages (with optional argument substring) installed' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-log' --description 'List the contents of the install/remove log file (filtered)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-names' --description 'List all known packages or those containing supplied string' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-orphans' --description 'List libraries not required by any installed package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-scripts' --description 'List the control scripts of the package of deb file' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-section' --description 'List packages that belong to a specific section' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-section' --description 'List the sections that are available' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-status' --description 'Same as list but only prints first two columns, not truncated' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'list-wide' --description 'Same as list but avoids truncating package names' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'local-dist-upgrade' --description 'Dist-upgrade using packages already downloaded' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'local-upgrade' --description 'Upgrade using packages already downloaded, but not any others' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'madison' --description 'Runs the madison command of apt-cache.' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'move' --description 'Move packages in the download cache to a local Debian mirror' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'new' --description 'List packages that became available since last update' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'news' --description 'Obtain the latest news about the package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'new-upgrades' --description 'List packages newly available for upgrading' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'non-free' --description 'List installed packages that do not meet the DFSG' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'orphans' --description 'List libraries not required by any installed package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'package' --description 'Generate a .deb file for an installed package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'policy' --description 'From preferences file show priorities/policy (available)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'purge' --description 'Remove one or more packages and configuration files' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'purge-depend' --description 'Purge package and those it depend on and not required by others' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'purge-orphans' --description 'Purge orphaned libraries (not required by installed packages)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'readme' --description 'Display the package\'s README file from /usr/share/doc' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'recursive' --description 'Download package and any packages it depends on' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'recommended' --description 'Install package and associated recommended packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'reconfigure' --description 'Reconfigure the named installed packages or run gkdebconf' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'reinstall' --description 'Reinstall each of the named packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'reload' --description 'Reload daemon configs, e.g., gdm, apache (see list-daemons)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'remove' --description 'Remove one or more packages (see also purge)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'remove-depend' --description 'Remove package and its dependees not required by others' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'remove-orphans' --description 'Remove orphaned libraries (not required by installed packages)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'repackage' --description 'Generate a .deb file for an installed package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'reset' --description 'Initialise or reset the JIG archive files' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'restart' --description 'Stop then start a daemon, e.g., gdm, apache (see list-daemons)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'rpminstall' --description 'Install a RedHat .rpm package' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'rpmtodeb' --description 'Convert a RedHat .rpm file to a Debian .deb file' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'search' --description 'Search for packages containing listed words' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'search-apt' --description 'Find local Debian archives suitable for sources.list' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'setup' --description 'Configure the sources.list file which locates Debian archives' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'show' --description 'Provide a detailed description of package [same as detail]' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'showdistupgrade' --description 'Trace the steps that a dist-upgrade would perform' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'showinstall' --description 'Trace the steps that an install would perform' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'showremove' --description 'Trace the steps that a remove would perform' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'showupgrade' --description 'Trace the steps that an upgrade would perform' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'size' --description 'Print out the size (in K) of all, or listed, installed packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'sizes' --description 'Print out the size (in K) of all, or listed, installed packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'snapshot' --description 'Generates list of package=version for all installed packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'source' --description 'Retrieve and unpack sources for the named packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'start' --description 'Start a daemon, e.g., gdm, apache (see list-daemons)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'status' --description 'Show the version and available version of packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'status-match' --description 'Show the version and available version of matching packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'status-search' --description 'Show the version and available version of matching packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'stop' --description 'Stop a daemon, e.g., gdm, apache (see list-daemons)' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'suggested' --description 'Install package and associated suggested packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'tasksel' --description 'Run the Gnome task selector to install groups of packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'toupgrade' --description 'List packages with newer versions available for upgrading' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'unhold' --description 'Remove listed packages from hold so they are again upgraded' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'unofficial' --description 'Search for an unofficial Debian package at apt-get.org' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'update' --description 'Update the list of down-loadable packages' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'update-alts' --description 'Update default alternative for things like x-window-manager' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'update-pci-ids' --description 'Updates the local list of PCI ids from the internet master list' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'update-usb-ids' --description 'Updates the local list of USB ids from the internet master list' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'upgrade' --description 'Upgrade all of the installed packages or just those listed' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'versions' --description 'List version and distribution of (all) packages.' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'whatis' --description 'A synonym for describe' complete -f -n '__fish_wajig_no_subcommand' -c wajig -a 'whichpkg' --description 'Find the package that supplies the given command or file' fish/share/completions/watch.fish000066400000000000000000000020411214535744100174310ustar00rootroot00000000000000complete -c watch -s b -l beep -d 'Beep if command has a non-zero exit' complete -c watch -s c -l color -d 'Interpret ANSI color sequences' complete -c watch -s d -l differences -d 'Highlight changes between updates' complete -c watch -s d -l differences=permanent -d 'Highlight changes between updates' complete -c watch -s e -l errexit -d 'Exit if command has a non-zero exit' complete -c watch -s g -l chgexit -d 'Exit when output from command changes' complete -c watch -s n -l interval -d 'Seconds to wait between updates' -x complete -c watch -s p -l precise -d 'Attempt run command in precise intervals' complete -c watch -s t -l no-title -d 'Turn off header' complete -c watch -s x -l exec -d 'Pass command to exec instead of "sh -c"' complete -c watch -s h -l help -d 'Display this help and exit' complete -c watch -s v -l version -d 'Output version information and exit' complete -c watch -xa '(__fish_complete_subcommand -- -n --interval)' fish/share/completions/wc.fish000066400000000000000000000007301214535744100167370ustar00rootroot00000000000000complete -c wc -s c -l bytes --description "Print byte counts" complete -c wc -s m -l chars --description "Print character counts" complete -c wc -s l -l lines --description "Print newline counts" complete -c wc -s L -l max-line-length --description "Print length of longest line" complete -c wc -s w -l words --description "Print word counts" complete -c wc -l help --description "Display help and exit" complete -c wc -l version --description "Display version and exit" fish/share/completions/wesnoth.fish000066400000000000000000000057601214535744100200250ustar00rootroot00000000000000# # Command specific completions for the wesnoth command. # These completions where generated from the commands # man page by the make_completions.py script, and # have been hand edited since. # complete -c wesnoth -l bpp --description 'Number sets BitsPerPixel value' complete -c wesnoth -l compress --description ' compresses a savefile (infile) that is in text WML format into binary WML format (outfile)' complete -c wesnoth -s d -l debug --description 'Shows extra debugging information and enables additional command mode options in-game' complete -c wesnoth -l decompress --description ' decompresses a savefile (infile) that is in binary WML format into text WML format (outfile)' complete -c wesnoth -s f -l fullscreen --description 'Runs the game in full screen mode' complete -c wesnoth -l fps --description 'Displays the number of frames per second the game is currently running at, in a corner of the screen' complete -c wesnoth -s h -l help --description 'Displays a summary of command line options to standard output, and exits' complete -c wesnoth -l load --description 'Savegame loads the file savegame from the standard save game directory' complete -c wesnoth -l log-error -l log-warning -l log-info --description 'Set the severity level of debugging domains' complete -c wesnoth -l multiplayer --description 'Runs a multiplayer game' complete -c wesnoth -l nocache --description 'Disables caching of game data' complete -c wesnoth -l nosound --description 'Runs the game without sounds and music' complete -c wesnoth -l path --description 'Prints the name of the game data directory and exits' complete -c wesnoth -s r -l resolution --description 'XxY sets the screen resolution' complete -c wesnoth -s t -l test --description 'Runs the game in a small test scenario' complete -c wesnoth -s v -l version --description 'Shows the version number and exits' complete -c wesnoth -s w -l windowed --description 'Runs the game in windowed mode' complete -c wesnoth -l no-delay --description 'Runs the game without any delays for graphic benchmarking' complete -c wesnoth -l exit-at-end --description 'Exits once the scenario is over, without displaying victory/defeat dialog which requires the user to click OK' #complete -c wesnoth -l algorithm --description 'Selects a non-standard algorithm to be used by the AI controller for this side' #complete -c wesnoth -l controller --description 'Selects the controller for this side' complete -c wesnoth -l era --description 'Use this option to play in the selected era instead of the "Default" era' complete -c wesnoth -l nogui --description 'Runs the game without the GUI' complete -c wesnoth -l parm --description 'Sets additional parameters for this side' complete -c wesnoth -l scenario --description 'Selects a multiplayer scenario' complete -c wesnoth -l side --description 'Selects a faction of the current era for this side' complete -c wesnoth -l turns --description 'Sets the number of turns for the chosen scenario' fish/share/completions/wget.fish000066400000000000000000000204041214535744100172740ustar00rootroot00000000000000# # Completions for the wget command # complete -c wget -s V -l version --description "Display version and exit" complete -c wget -s h -l help --description "Display help and exit" complete -c wget -s b -l background --description "Go to background immediately after startup" complete -c wget -s e -l execute --description "Execute command as if part of .wgetrc" -x complete -c wget -s o -l output-file --description "Log all messages to logfile" -r complete -c wget -s a -l append-output --description "Append all messages to logfile" complete -c wget -s d -l debug --description "Turn on debug output" complete -c wget -s q -l quiet --description "Quiet mode" complete -c wget -s v -l verbose --description "Verbose mode" complete -c wget -l non-verbose --description "Turn off verbose without being completely quiet" complete -c wget -o nv --description "Turn off verbose without being completely quiet" complete -c wget -s i -l input-file --description "Read URLs from file" -r complete -c wget -s F -l force-html --description "Force input to be treated as HTML" complete -c wget -s B -l base --description "Prepend string to relative links" -x complete -c wget -l bind-adress --description "Bind address on local machine" -xa "(__fish_print_addresses; __fish_print_hostnames)" complete -c wget -s t -l tries --description "Set number of retries to number" -xa "0 1 2 4 8 16 32 64 128" complete -c wget -s O -l output-document --description "Concatenate output to file" -r complete -c wget -l no-clobber --description "Never overwrite files with same name" complete -c wget -o nc --description "Never overwrite files with same name" complete -c wget -s c -l continue --description "Continue getting a partially-downloaded file" complete -c wget -l progress --description "Select progress meter type" -a " dot\t'Print one dot for every kB of data, 50 dots per line' dot:default\t'Print one dot for every kB of data, 50 dots per line' dot:binary\t'Print one dot for every 8 kB of data, 48 dots per line' dot:mega\t'Print one dot for every 64 kB of data, 48 dots per line' bar\t'Print progress bar' " complete -c wget -s N -l timestamping --description "Turn on time-stamping" complete -c wget -s S -l server-response --description "Print the headers/responses sent by servers" complete -c wget -l spider --description "Do not download the pages, just check that they are there" complete -c wget -s T -l timeout --description "Set the network timeout" -x complete -c wget -l dns-timeout --description "Set the DNS lookup timeout" -x complete -c wget -l connect-timeout --description "Set the connect timeout" -x complete -c wget -l read-timeout --description "Set the read (and write) timeout" -x complete -c wget -l limit-rate --description "Limit the download speed" -x complete -c wget -s w -l wait --description "Wait the specified number of seconds between the retrievals" -x complete -c wget -l waitretry --description "Wait time between retries" -x complete -c wget -l random-wait --description "Wait random amount of time between retrievals" complete -c wget -s Y -l proxy --description "Toggle proxy support" -xa "on off" complete -c wget -s Q -l quota --description "Specify download quota for automatic retrievals" -x complete -c wget -l dns-cache --description "Turn off caching of DNS lookups" -xa "off" complete -c wget -l restrict-file-names --description "Change which characters found in remote URLs may show up in local file names" -a " unix\t'Escape slash and non-printing characters' windows\t'Escape most non-alphabetical characters' " # HTTP options complete -c wget -l no-directories --description "Do not create a hierarchy of directories" complete -c wget -o nd --description "Do not create a hierarchy of directories" complete -c wget -s x -l force-directories --description "Force creation of a hierarchy of directories" complete -c wget -l no-host-directories --description "Disable generation of host-prefixed directories" complete -c wget -o nH --description "Disable generation of host-prefixed directories" complete -c wget -l protocal-directories --description "Use the protocol name as a directory component" complete -c wget -l cut-dirs --description "Ignore specified number of directory components" -xa "1 2 3 4 5" complete -c wget -s P -l directory-prefix --description "Set directory prefix" -r complete -c wget -s E -l html-extension --description "Force html files to have html extension" complete -c wget -l http-user --description "Specify the http username" -xa "(__fish_complete_users)" complete -c wget -l http-passwd --description "Specify the http password" -x complete -c wget -l no-cache --description "Disable server-side cache" complete -c wget -l no-cookies --description "Disable the use of cookies" complete -c wget -l load-cookies --description "Load cookies from file" -r complete -c wget -l save-cookies --description "Save cookies to file" complete -c wget -l keep-session-cookies --description "Save session cookies" complete -c wget -l ignore-length --description "Ignore 'Content-Length' header" complete -c wget -l header --description "Define an additional-header to be passed to the HTTP servers" -x complete -c wget -l proxy-user --description "Specify the proxy username" -xa "(__fish_complete_users)" complete -c wget -l proxy-password --description "Specify the proxy password" -x complete -c wget -l referer --description "Set referer URL" -x complete -c wget -l save-headers --description "Save the headers sent by the HTTP server" complete -c wget -s U -l user-agent --description "Identify as agent-string" -x complete -c wget -l post-data --description "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 --description "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 --description "Turn off keep-alive for http downloads" #FTP options complete -c wget -l no-remove-listing --description "Don't remove the temporary .listing files generated" complete -c wget -l no-glob --description "Turn off FTP globbing" complete -c wget -l passive-ftp --description "Use the passive FTP retrieval scheme" complete -c wget -l retr-symlinks --description "Traverse symlinks and retrieve pointed-to files" # Recursive options complete -c wget -s r -l recursive --description "Turn on recursive retrieving" complete -c wget -n '__fish_contains_opt -s r recursive' -s l -l level --description "Specify recursion maximum depth" -x complete -c wget -l delete-after --description "Delete every single file downloaded" complete -c wget -s k -l convert-links --description "Convert the links in the document to make them suitable for local viewing" complete -c wget -s K -l backup-converted --description "Back up the original version" complete -c wget -s m -l mirror --description "Turn on options suitable for mirroring" complete -c wget -s p -l page-requisites --description "Download all the files that are necessary to properly display a given HTML page" complete -c wget -l strict-comments --description "Turn on strict parsing of HTML comments" #Recursive accept/reject options complete -c wget -s A -l accept --description "Comma-separated lists of file name suffixes or patterns to accept" -x complete -c wget -s R -l reject --description "Comma-separated lists of file name suffixes or patterns to reject" -x complete -c wget -s D -l domains --description "Set domains to be followed" -x complete -c wget -l exclude-domains --description "Specify the domains that are not to be followed" -x complete -c wget -l follow-ftp --description "Follow FTP links from HTML documents" complete -c wget -l follow-tags --description "HTML tags to follow" -x complete -c wget -l ignore-tags --description "HTML tags to ignore" -x complete -c wget -s H -l span-hosts --description "Enable spanning across hosts" complete -c wget -s L -l relative --description "Follow relative links only" complete -c wget -s I -l include-directories --description "Specify a comma-separated list of directories you wish to follow" -x complete -c wget -s X -l exclude-directories --description "Specify a comma-separated list of directories you wish to exclude" -x complete -c wget -l no-parent --description "Do not ever ascend to the parent directory" complete -c wget -o np --description "Do not ever ascend to the parent directory" fish/share/completions/whatis.fish000066400000000000000000000000601214535744100176210ustar00rootroot00000000000000 complete -xc whatis -a "(__fish_complete_man)" fish/share/completions/which.fish000066400000000000000000000024521214535744100174330ustar00rootroot00000000000000 complete -c which -s a -l all --description "Print all matching executables in PATH, not just the first" complete -c which -s i -l read-alias --description "Read aliases from stdin, reporting matching ones on stdout" complete -c which -l skip-alias --description "Ignore option '--read-alias'" complete -c which -l read-functions --description "Read shell function definitions from stdin, reporting matching ones on stdout" complete -c which -l skip-functions --description "Ignore option '--read-functions'" complete -c which -l skip-dot --description "Skip directories in PATH that start with a dot" complete -c which -l skip-tilde --description "Skip directories in PATH that start with a tilde and executables which reside in the HOME directory" complete -c which -l show-dot --description "If a directory in PATH starts with a dot and a matching executable was found for that path, then print './programname'" complete -c which -l show-tilde --description "Output a tilde when a directory matches the HOME directory" complete -c which -l tty-only --description "Stop processing options on the right if not on tty" complete -c which -s v -s V -l version --description "Display version and exit" complete -c which -l help --description "Display help and exit" complete -c which -a "(complete -C(commandline -ct))" -x fish/share/completions/who.fish000066400000000000000000000026131214535744100171250ustar00rootroot00000000000000complete -c who -s a -l all --description "Same as -b -d --login -p -r -t -T -u" complete -c who -s b -l boot --description "Print time of last boot" complete -c who -s d -l dead --description "Print dead processes" complete -c who -s H -l heading --description "Print line of headings" complete -c who -s i -l idle --description "Print idle time" complete -c who -s l -l login --description "Print login process" complete -c who -l lookup --description "Canonicalize hostnames via DNS" complete -c who -s m --description "Print hostname and user for stdin" complete -c who -s p -l process --description "Print active processes spawned by init" complete -c who -s q -l count --description "Print all login names and number of users logged on" complete -c who -s r -l runlevel --description "Print current runlevel" complete -c who -s s -l short --description "Print name, line, and time" complete -c who -s t -l time --description "Print last system clock change" complete -c who -s T -l mesg --description "Print users message status as +, - or ?" complete -c who -s w -l writable --description "Print users message status as +, - or ?" complete -c who -l message --description "Print users message status as +, - or ?" complete -c who -s u -l users --description "List users logged in" complete -c who -l help --description "Display help and exit" complete -c who -l version --description "Display version and exit" fish/share/completions/wicd-cli.fish000066400000000000000000000025411214535744100200230ustar00rootroot00000000000000complete -c wicd-cli -s h -l help -d 'Print help and exit' complete -c wicd-cli -s S -l scan -d 'Scan for networks' complete -c wicd-cli -s l -l list-networks -d 'List networks' complete -c wicd-cli -s d -l network-details -d 'Show network details' complete -c wicd-cli -s x -l disconnect -d 'Disconnect' complete -c wicd-cli -s c -l connect -d 'Connect' complete -c wicd-cli -s e -l list-encryption-types -d 'List encription types' complete -c wicd-cli -s y -l wireless -d 'Perform operation on wireless network' complete -c wicd-cli -s z -l wired -d 'Perform operation on wired network' complete -c wicd-cli -s w -l save -d 'Save profile' complete -c wicd-cli -s o -l load-profile -d 'Load profile' complete -c wicd-cli -s m -l name -d 'Set name for profile to save/load' #-xa '(wicd-cli -zl | sed "/^#/d; s/\S\+\s\+\(\S\+\)/\1/")' #complete -c wicd-cli -n '__fish_contains_opt wireless -s y' -s n -l network -xa '(wicd-cli -ySl | sed "/^#/d; s/\(\S\+\)\s\+\S\+\s\+\(\S\+\)\s\+\(.\+\)/\1\t\3, \2/")' #complete -c wicd-cli -n '__fish_contains_opt wired -s z' -s n -l network -xa '(wicd-cli -zl | grep -v "^#")' complete -c wicd-cli -s p -l network-property -r -d 'Get or set network property' complete -c wicd-cli -s s -l set-to -r -d 'Set network property to' complete -c wicd-cli -s n -l network -d 'Set the network' fish/share/completions/wicd-client.fish000066400000000000000000000006641214535744100205360ustar00rootroot00000000000000complete -c wicd-client -s t -l tray -d 'Run the wicd tray icon only.' complete -c wicd-client -s n -l no-tray -d 'Run wicd without the tray icon.' complete -c wicd-client -s h -l help -d 'Print this help information.' complete -c wicd-client -s a -l no-animate -d 'Run the tray without network traffic tray animations.' complete -c wicd-client -s o -l only-notifications -d 'Don\'t display anything except notifications.' fish/share/completions/wicd-gtk.fish000066400000000000000000000006451214535744100200440ustar00rootroot00000000000000complete -c wicd-gtk -s t -l tray -d 'Run the wicd tray icon only.' complete -c wicd-gtk -s n -l no-tray -d 'Run wicd without the tray icon.' complete -c wicd-gtk -s h -l help -d 'Print this help information.' complete -c wicd-gtk -s a -l no-animate -d 'Run the tray without network traffic tray animations.' complete -c wicd-gtk -s o -l only-notifications -d 'Don\'t display anything except notifications.' fish/share/completions/wpa_cli.fish000066400000000000000000000056701214535744100177540ustar00rootroot00000000000000 #completions for wpa_cli complete -x -c wpa_cli -a status --description 'get current WPA/EAPOL/EAP status' complete -x -c wpa_cli -a mib --description 'get MIB variables (dot1x, dot11)' complete -x -c wpa_cli -a help --description 'show this usage help' complete -x -c wpa_cli -a interface --description 'show interfaces/select interface' complete -x -c wpa_cli -a level --description 'change debug level' complete -x -c wpa_cli -a license --description 'show full wpa_cli license' complete -x -c wpa_cli -a logoff --description 'IEEE 802.1X EAPOL state machine logoff' complete -x -c wpa_cli -a logon --description 'IEEE 802.1X EAPOL state machine logon' complete -x -c wpa_cli -a set --description 'set/list variables' complete -x -c wpa_cli -a pmksa --description 'show PMKSA cache' complete -x -c wpa_cli -a reassociate --description 'force reassociation' complete -x -c wpa_cli -a reconfigure --description 'force wpa_supplicant to re-read its config file' complete -x -c wpa_cli -a preauthenticate --description 'force preauthentication' complete -x -c wpa_cli -a identity --description 'configure identity for an SSID' complete -x -c wpa_cli -a password --description 'configure password for an SSID' complete -x -c wpa_cli -a new_password --description 'change password for an SSID' complete -x -c wpa_cli -a pin --description 'configure pin for an SSID' complete -x -c wpa_cli -a otp --description 'configure one-time-password for an SSID' complete -x -c wpa_cli -a passphrase --description 'configure private key passphrase for an SSID' complete -x -c wpa_cli -a bssid --description 'set preferred BSSID for an SSID' complete -x -c wpa_cli -a list_networks --description 'list configured networks' complete -x -c wpa_cli -a select_network --description 'select a network (disable others)' complete -x -c wpa_cli -a enable_network --description 'enable a network' complete -x -c wpa_cli -a disable_network --description 'disable a network' complete -x -c wpa_cli -a add_network --description 'add a network' complete -x -c wpa_cli -a remove_network --description 'remove a network' complete -x -c wpa_cli -a set_network --description 'set/list network variables' complete -x -c wpa_cli -a get_network --description 'get network variables' complete -x -c wpa_cli -a save_config --description 'save the current configuration' complete -x -c wpa_cli -a disconnect --description 'disconnect and wait for reassociate command before connecting' complete -x -c wpa_cli -a scan --description 'request new BSS scan' complete -x -c wpa_cli -a scan_results --description 'get latest scan results' complete -x -c wpa_cli -a get_capability --description 'get capabilies' complete -x -c wpa_cli -a stakey-request --description 'request STAKey negotiation with ' complete -x -c wpa_cli -a ap_scan --description 'set ap_scan parameter' complete -x -c wpa_cli -a stkstart --description 'request STK negotiation with ' complete -x -c wpa_cli -a terminate --description 'terminate wpa_supplicant' fish/share/completions/wvdial.fish000066400000000000000000000005141214535744100176140ustar00rootroot00000000000000complete -c wvdial -xa "(__fish_complete_wvdial_peers)" --description "wvdial connections" complete -c wvdial -s c -l chat -d 'Run wvdial as chat replacement from within pppd' complete -c wvdial -s C -l config -r -d 'Run wvdial with alternative config file' complete -c wvdial -s n -l no-syslog -d 'Don\'t output debug information' fish/share/completions/xargs.fish000066400000000000000000000033251214535744100174550ustar00rootroot00000000000000# #Completions for xargs # complete -c xargs -s 0 -l null --description "Input filenames are terminated by a null character instead of by whitespace, and the quotes and backslash are not special" complete -c xargs -s e -l eof --description "Set the end of file string to eof-str" complete -c xargs -s E -r -f --description "Set the end of file string to eof-str" complete -c xargs -l help --description "Display help and exit" complete -c xargs -s i -l replace --description "Replace replace-str in the initial arguments with names from standard input" complete -c xargs -s I -r -f --description "Replace replace-str in the initial arguments with names from standard input" complete -c xargs -s l -l max-lines --description "Use at most max-lines nonblank input lines per command line" complete -c xargs -s L -r -f --description "Use at most max-lines nonblank input lines per command line" complete -c xargs -s n -l max-args -r -f --description "Use at most max-args arguments per command line" complete -c xargs -s p -l interactive --description "Prompt the user about whether to run each command line and read a line from the terminal" complete -c xargs -s r -l no-run-if-empty --description "If the standard input does not contain any nonblanks, do not run the command" complete -c xargs -s s -l max-chars -r -f --description "Use at most max-chars characters per command line" complete -c xargs -s t -l verbose --description "Print the command line on the standard error output before executing it" complete -c xargs -l version --description "Display version and exit" complete -c xargs -s x -l exit --description "Exit if the size is exceeded" complete -c xargs -s P -l max-procs -r -f --description "Run up to max-procs processes at a time" fish/share/completions/xdg-mime.fish000066400000000000000000000036341214535744100200430ustar00rootroot00000000000000 # main completion complete -c xdg-mime -n 'not __fish_seen_subcommand_from query default install uninstall' -xa 'query default install uninstall' # complete xdg-mime query complete -c xdg-mime -n '__fish_seen_subcommand_from query; and not __fish_seen_subcommand_from filetype default' -xa 'filetype default' -d 'Query information' # complete xdg-mime query default complete -c xdg-mime -d 'Query default application for type' -n 'contains_seq query default -- (commandline -cop)' -xa '(__fish_print_xdg_mimetypes)' # complete xdg-mime query filetype complete -c xdg-mime -d 'Query file\'s filetype' -n 'contains_seq query filetype -- (commandline -cop)' -r # complete xdg-mime default complete -c xdg-mime -d 'Choose application' -n '__fish_seen_subcommand_from default; and __fish_is_token_n 3' -xa '(__fish_print_xdg_mimeapps)' complete -c xdg-mime -d 'Mimetype' -n '__fish_seen_subcommand_from default; and __fish_is_token_n 4' -xa '(__fish_print_xdg_mimetypes)' # complete xdg-mime install complete -c xdg-mime -d 'Add filetype description' -n 'contains_seq xdg-mime install -- (commandline -cop)' -r complete -c xdg-mime -d 'Set mode' -n 'contains_seq xdg-mime install -- (commandline -cop)' -l mode -xa 'user system' complete -c xdg-mime -d 'Disable vendor check' -n 'contains_seq xdg-mime install -- (commandline -cop)' -l novendor # complete xdg-mime uninstall complete -c xdg-mime -d 'Remove filetype description' -n 'contains_seq xdg-mime uninstall -- (commandline -cop)' -r complete -c xdg-mime -d 'Set mode' -n 'contains_seq xdg-mime uninstall -- (commandline -cop)' -l mode -xa 'user system' #complete -c xdg-mime install [--mode mode] [--novendor] mimetypes-file #complete -c xdg-mime uninstall [--mode mode] mimetypes-file complete -c xdg-mime -l help -d 'Display help' complete -c xdg-mime -l manual -d 'Diplay long help' complete -c xdg-mime -l version -d 'Print version' fish/share/completions/xdvi.fish000066400000000000000000000000671214535744100173030ustar00rootroot00000000000000complete -c xdvi -x -a "(__fish_complete_suffix .dvi)" fish/share/completions/xelatex.fish000066400000000000000000000000351214535744100177760ustar00rootroot00000000000000__fish_complete_tex xelatex fish/share/completions/xgettext.fish000066400000000000000000000100771214535744100202070ustar00rootroot00000000000000# # Command specific completions for the xgettext command. # These completions where generated from the commands # man page by the make_completions.py script, but may # have been hand edited since. # complete -c xgettext -s f -l files-from --description 'Get list of input files from FILE' complete -c xgettext -s D -l directory --description 'Add DIRECTORY to list for input files search' complete -c xgettext -s d -l default-domain --description 'Use NAME' complete -c xgettext -s o -l output --description 'Write output to specified file' complete -c xgettext -s p -l output-dir --description 'Output files will be placed in directory DIR' complete -c xgettext -s L -l language --description 'Recognise the specified language (C, C++, ObjectiveC, PO, Shell, Python, Lisp, EmacsLisp, librep, Scheme, Smalltalk, Java, JavaProperties, C#, awk, YCP, Tcl, Perl, PHP, GCC-source, NXStringTable, RST, Glade)' complete -c xgettext -s C -l c++ --description 'Shorthand for --language=C++' complete -c xgettext -l from-code --description 'Encoding of input files (except for Python, Tcl, Glade)' complete -c xgettext -s j -l join-existing --description 'Join messages with existing file' complete -c xgettext -s x -l exclude-file --description 'Entries from FILE' complete -c xgettext -s c -l add-comments --description 'Place comment block with TAG (or those preceding keyword lines) in output file' complete -c xgettext -s a -l extract-all --description 'Extract all strings (only languages C, C++, ObjectiveC, Shell, Python, Lisp, EmacsLisp, librep, Scheme, Java, C#, awk, Tcl, Perl, PHP, GCC-source, Glade)' complete -c xgettext -s k -l keyword --description 'Additional keyword to be looked for (without WORD means not to use default keywords)' complete -c xgettext -l flag --description 'Additional flag for strings inside the argument number ARG of keyword WORD' complete -c xgettext -s T -l trigraphs --description 'Understand ANSI C trigraphs for input (only languages C, C++, ObjectiveC)' complete -c xgettext -l qt --description 'Recognize Qt format strings (only language C++)' complete -c xgettext -l boost --description 'Recognize Boost format strings (only language C++)' complete -c xgettext -l debug --description 'More detailed formatstring recognition result' complete -c xgettext -s e -l no-escape --description 'Do not use C escapes in output (default)' complete -c xgettext -s E -l escape --description 'Use C escapes in output, no extended chars' complete -c xgettext -l force-po --description 'Write PO file even if empty' complete -c xgettext -s i -l indent --description 'Write the' complete -c xgettext -l no-location --description 'Do not write #: filename:line lines' complete -c xgettext -s n -l add-location --description 'Generate #: filename:line lines (default)' complete -c xgettext -l strict --description 'Write out strict Uniforum conforming' complete -c xgettext -l properties-output --description 'Write out a Java' complete -c xgettext -l stringtable-output --description 'Write out a NeXTstep/GNUstep' complete -c xgettext -s w -l width --description 'Set output page width' complete -c xgettext -l no-wrap --description 'Do not break long message lines, longer than the output page width, into several lines' complete -c xgettext -s s -l sort-output --description 'Generate sorted output' complete -c xgettext -s F -l sort-by-file --description 'Sort output by file location' complete -c xgettext -l omit-header --description 'Dont write header with msgid "" entry' complete -c xgettext -l copyright-holder --description 'Set copyright holder in output' complete -c xgettext -l foreign-user --description 'Omit FSF copyright in output for foreign user' complete -c xgettext -l msgid-bugs-address --description 'Set report address for msgid bugs' complete -c xgettext -s m -l msgstr-prefix --description 'Use STRING or "" as prefix for msgstr entries' complete -c xgettext -s M -l msgstr-suffix --description 'Use STRING or "" as suffix for msgstr entries' complete -c xgettext -s h -l help --description 'Display this help and exit' complete -c xgettext -s V -l version --description 'Output version information and exit' fish/share/completions/xmms.fish000066400000000000000000000015751214535744100173220ustar00rootroot00000000000000# # Completions for the xmms command # Vikas Gorur # complete -c xmms -s h -l help --description "Show summary of options" complete -c xmms -s n -l session --description "Select XMMS session (Default: 0)" complete -c xmms -s r -l rew --description "Skip backwards in playlist" complete -c xmms -s p -l play --description "Start playing current playlist" complete -c xmms -s u -l pause --description "Pause current song" complete -c xmms -s s -l stop --description "Stop current song" complete -c xmms -s t -l play-pause --description "Pause if playing, play otherwise" complete -c xmms -s f -l fwd --description "Skip forward in playlist" complete -c xmms -s e -l enqueue --description "Don't clear the playlist" complete -c xmms -s m -l show-main-window --description "Show the main window" complete -c xmms -s v -l version --description "Print the version number and exit"fish/share/completions/xpdf.fish000066400000000000000000000050441214535744100172720ustar00rootroot00000000000000# # Completions for the xpdf command # Vikas Gorur # complete -c xpdf -x -a "(__fish_complete_suffix .pdf)" complete -c xpdf -s g --description "Set the initial window geometry" complete -c xpdf -o title --description "Set the window title" complete -c xpdf -o cmap --description "Install a private colormap" complete -c xpdf -o rgb --description "Set the size of the largest RGB cube xpdf will try to allocate" complete -c xpdf -o rv --description "Set reverse video mode" complete -c xpdf -o papercolor --description "Set the background of the page display" complete -c xpdf -o mattecolor --description "Set the color for background outside the page area" complete -c xpdf -s z --description "Set the initial zoom factor" complete -c xpdf -o cont --description "Start in continuous view mode" complete -c xpdf -o t1lib -a "yes no" --description "Enable or disable t1lib (Default: yes)" complete -c xpdf -o freetype -a "yes no" --description "Enable or disable FreeType (Default: yes)" complete -c xpdf -o aa -a "yes no" --description "Enable or disable font anti-aliasing (Default: yes)" complete -c xpdf -o ps --description "Set the default file name for PostScript output" complete -c xpdf -o paper -a "letter legal A4 A3 match" --description "Set the paper size" complete -c xpdf -o paperw --description "Set the paper width, in points" complete -c xpdf -o paperh --description "Set the paper height, in points" complete -c xpdf -o level1 --description "Generate Level 1 PostScript" complete -c xpdf -o enc --description "Sets the encoding to use for text output" complete -c xpdf -o eol -a "unix dos mac" --description "Sets the end-of-line convention to use" complete -c xpdf -o opw --description "Specify the owner password for the PDF file" complete -c xpdf -o upw --description "Specify the user password for the PDF file" complete -c xpdf -o fullscreen --description "Open xpdf in full-screen mode" complete -c xpdf -o remote --description "Start/contact xpdf remote server" complete -c xpdf -o reload --description "Reload xpdf remote server window" complete -c xpdf -o raise --description "Raise xpdf remote server window" complete -c xpdf -o quit --description "Kill xpdf remote server" complete -c xpdf -o cmd --description "Print commands as they're executed" complete -c xpdf -s q --description "Don't print any messages or errors" complete -c xpdf -o cfg --description "Specify config file to use instead of ~/.xpdfrc" complete -c xpdf -s v --description "Print copyright and version information" complete -c xpdf -s h --description "Print usage information" fish/share/completions/xprop.fish000066400000000000000000000022631214535744100175010ustar00rootroot00000000000000 complete -c xprop -o help --description "Display help and exit" complete -c xprop -o grammar --description "Display grammar and exit" complete -c xprop -o id -x --description "Select window by id" complete -c xprop -o name --description "Select window by name" complete -c xprop -o font -x --description "Display font properties" complete -c xprop -o root --description "Select root window" complete -c xprop -o display --description "Specify X server" complete -c xprop -o len -x --description "Maximum display length" complete -c xprop -o notype --description "Do not show property type" complete -c xprop -o fs -r --description "Set format file" complete -c xprop -o frame --description "Select a window by clicking on its frame" complete -c xprop -o remove --description "Remove property" -x -a " ( xprop -root -notype|cut -d ' ' -f 1|cut -d \t -f 1 ) " complete -c xprop -o set --description "Set property" -x -a " ( xprop -root -notype|cut -d ' ' -f 1|cut -d \t -f 1 ) " complete -c xprop -o spy --description "Examine property updates forever" complete -c xprop -o f --description "Set format" complete -c xprop -d Property -x -a " ( xprop -root -notype|cut -d ' ' -f 1|cut -d \t -f 1 ) " fish/share/completions/xrandr.fish000066400000000000000000000102761214535744100176320ustar00rootroot00000000000000complete -c xrandr -l verbose -d 'Be more verbose' complete -c xrandr -l dryrun -d 'Make no changes' complete -c xrandr -l nograb -d 'Apply modifications without grabbing the screen' complete -c xrandr -o help -d 'Print out a summary of the usage and exit' complete -c xrandr -s v -l version -d 'Print out the RandR version reported by the X server and exit' complete -c xrandr -s q -l query -d 'Display the current state of the system' complete -c xrandr -s d -o display -d 'Select X display to use' -x complete -c xrandr -l screen -d 'Select which screen to manipulate' -x complete -c xrandr -l q1 -d 'Use RandR version 1.1 protocol' complete -c xrandr -l q12 -d 'Use RandR version 1.2 protocol' set -l ver (xrandr -v | grep RandR | sed 's/^.\+\s\([0-9\.]\+\)$/\1/') if not expr match $ver '^[0-9.]*$' >/dev/null set ver 10 end # Version 1.1 options complete -c xrandr -s s -l size -d 'Set the screen size (index or width x height)' -x complete -c xrandr -s r -l rate -l refresh -d 'Set the refresh rate closest to the specified value' -x complete -c xrandr -s o -l orientation -d 'Specify the orientation of the screen' -xa 'normal inverted left right' complete -c xrandr -s x -d 'Reflect across the X axis' complete -c xrandr -s y -d 'Reflect across the Y axis' if expr $ver '>' 1.1 complete -c xrandr -l prop -l properties -d 'Display the contents of properties for each output' complete -c xrandr -l fb -d 'Set screen size' -x complete -c xrandr -l fbmm -d 'Set reported physical screen size' -x complete -c xrandr -l dpi -d 'Set dpi to calculate reported physical screen size' complete -c xrandr -l newmode -d 'Add new mode' -r complete -c xrandr -l rmmode -d 'Removes a mode from the server' -xa '(__fish_print_xrandr_modes)' complete -c xrandr -l addmode -d 'Add a mode to the set of valid modes for an output' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l delmode -d 'Remove a mode from the set of valid modes for an output' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l output -d 'Selects an output to reconfigure' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l auto -d 'Enable connected but disabled outputs' complete -c xrandr -l mode -d 'This selects a mode' -xa '(__fish_print_xrandr_modes)' complete -c xrandr -l preferred -d 'Select the same mode as --auto, but it do not automatically enable or disable the output' complete -c xrandr -l pos -d 'Set output position within the secreen in pixels' -x complete -c xrandr -l rate -d 'Set refresh rate' -x complete -c xrandr -l reflect -d 'Set reflection' -xa 'normal x y xy' complete -c xrandr -l rotate -d 'Set rotation' -xa 'normal left right inverted' complete -c xrandr -l left-of -d 'Set position relative to the output' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l right-of -d 'Set position relative to the output' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l above -d 'Set position relative to the output' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l below -d 'Set position relative to the output' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l same-as -d 'Set position relative to the output' -xa '(__fish_print_xrandr_outputs)' complete -c xrandr -l set -d 'Set the property value: --set ' -x complete -c xrandr -l off -d 'Disables the output' complete -c xrandr -l crtc -d 'Set the crtc' -x complete -c xrandr -l gamma -d 'Set gamma correction [red:green:blue]' -x complete -c xrandr -l brightness -d 'Set brightness. Multiplies gamma galues by brightness value' end if expr $ver '>' 1.2 complete -c xrandr -l noprimary -d 'Don\'t define a primary output.' complete -c xrandr -l current -d 'Print current screen configuration' complete -c xrandr -l panning -d 'Set panning: widthxheight[+x+y[/track_widthxtrack_height+track_x+track_y[/border_left/border_top/border_right/border_bottom]]]' -x complete -c xrandr -l transform -d 'Set transformation matrix: a,b,c,d,e,f,g,h,i for [ [a,b,c], [d,e,f], [g,h,i] ]' -x complete -c xrandr -l scale -d 'Set scren scale' -x complete -c xrandr -l primary -d 'Set the output as primary' end fish/share/completions/xrdb.fish000066400000000000000000000026021214535744100172650ustar00rootroot00000000000000complete -c xrdb -o display -d 'display to use' complete -c xrdb -o all -d 'do all resources [default]' complete -c xrdb -o global -d 'do screen-independent resources' complete -c xrdb -o screen -d 'do screen-specific resources for one screen' complete -c xrdb -o screens -d 'do screen-specific resources for all screens' complete -c xrdb -o n -d 'show but don\'t do changes' complete -c xrdb -o cpp -r -d 'preprocessor to use [/usr/bin/mcpp]' complete -c xrdb -o nocpp -d 'do not use a preprocessor' complete -c xrdb -o query -d 'query resources' complete -c xrdb -o load -d 'load resources from file [default]' complete -c xrdb -o override -d 'add in resources from file' complete -c xrdb -o merge -d 'merge resources from file & sort' complete -c xrdb -o edit -r -d 'edit resources into file' complete -c xrdb -o backup -x -d 'backup suffix for -edit [.bak]' complete -c xrdb -o symbols -d 'show preprocessor symbols' complete -c xrdb -o remove -d 'remove resources' complete -c xrdb -o retain -d 'avoid server reset (avoid using this)' complete -c xrdb -o quiet -d 'don\'t warn about duplicates' #complete -c xrdb -s Dname[=value], #complete -c xrdb -s Uname, #complete -c xrdb -s Idirectory -d 'passed to preprocessor' fish/share/completions/xsel.fish000066400000000000000000000025111214535744100173000ustar00rootroot00000000000000complete -c xsel -s a -l append --description "Append input to selection" complete -c xsel -s f -l follow --description "Append to selection as input grows" complete -c xsel -s i -l input --description "Read into selection" complete -c xsel -s o -l output --description "Write selection" complete -c xsel -s c -l clear --description "Clear selection" complete -c xsel -s d -l delete --description "Delete selection" complete -c xsel -s p -l primary --description "Use primary selection" complete -c xsel -s s -l secondary --description "Use secondary selection" complete -c xsel -s b -l clipboard --description "Use clipboard selection" complete -c xsel -s k -l keep --description "Make current selections persistent after program exit" complete -c xsel -s x -l exchange --description "Exchange primary and secondary selections" complete -c xsel -l display -x --description "X server display" complete -c xsel -s t -l selectionTimeout --description "Timeout for retrieving selection" complete -c xsel -s l -l logfile -f --description "Error log" complete -c xsel -s n -l nodetach --description "Do not detach from the controlling terminal" complete -c xsel -s h -l help --description "Display help and exit" complete -c xsel -s v -l verbose --description "Print informative messages" complete -c xsel -l version --description "Display version and exit" fish/share/completions/xterm.fish000066400000000000000000000262161214535744100174740ustar00rootroot00000000000000# completion for xterm complete -c xterm -n '__fish_test_arg "+*"' -a +ah --description 'Never highlight the text cursor' complete -c xterm -n '__fish_test_arg "+*"' -a +ai --description 'Enable active icon support' complete -c xterm -n '__fish_test_arg "+*"' -a +aw --description 'Disallow auto wraparound' complete -c xterm -n '__fish_test_arg "+*"' -a +bc --description 'Turn off cursor blinking' complete -c xterm -n '__fish_test_arg "+*"' -a +bdc --description 'Enable the display of bold characters' complete -c xterm -n '__fish_test_arg "+*"' -a +cb --description 'Set the vt100 resource cutToBeginningOfLine to \'true\'' complete -c xterm -n '__fish_test_arg "+*"' -a +cjk_width --description 'Set the cjkWidth resource to \'false\'' complete -c xterm -n '__fish_test_arg "+*"' -a +cm --description 'Enable recognition of ANSI color-change escape sequences' complete -c xterm -n '__fish_test_arg "+*"' -a +cn --description 'Cut newlines in line-mode selections' complete -c xterm -n '__fish_test_arg "+*"' -a +cu --description 'Don\'t workaround the bug in more(1)' complete -c xterm -n '__fish_test_arg "+*"' -a +dc --description 'Disable dynamic color changing' complete -c xterm -n '__fish_test_arg "+*"' -a +fbb --description 'Don\'t ensure compatibility between normal and bold fonts bounding boxes' complete -c xterm -n '__fish_test_arg "+*"' -a +fbx --description 'Normal and bold fonts have VT100 line-drawing characters' complete -c xterm -n '__fish_test_arg "+*"' -a +hf --description 'Don\'t generate HP Function Key escape codes for function keys' complete -c xterm -n '__fish_test_arg "+*"' -a +hold --description 'Close xterm\'s window after the shell exits' complete -c xterm -n '__fish_test_arg "+*"' -a +ie --description 'Don\'t use pseudo-terminal\'s sense of the stty erase value' complete -c xterm -n '__fish_test_arg "+*"' -a +im --description 'Don\'t force insert mode' complete -c xterm -n '__fish_test_arg "+*"' -a +j --description 'Don\'t use jump scrolling' complete -c xterm -n '__fish_test_arg "+*"' -a +k8 --description 'Don\'t treat C1 control characters as printable' complete -c xterm -n '__fish_test_arg "+*"' -a +l --description 'Turn off logging' complete -c xterm -n '__fish_test_arg "+*"' -a +lc --description 'Turn off support for encodings according the locale setting' complete -c xterm -n '__fish_test_arg "+*"' -a +ls --description 'The shell in xterm\'s window will not be login shell' complete -c xterm -n '__fish_test_arg "+*"' -a +mb --description 'Don\'t ring bell if the user types near the end of line' complete -c xterm -n '__fish_test_arg "+*"' -a +mesg --description 'Allow write access to the terminal' complete -c xterm -n '__fish_test_arg "+*"' -a +mk_width --description 'Don\'t use builtin version for the wide-character calculation' complete -c xterm -n '__fish_test_arg "+*"' -a +nul --description 'Enable underlining' complete -c xterm -n '__fish_test_arg "+*"' -a +pc --description 'Disable PC style bold colors' complete -c xterm -n '__fish_test_arg "+*"' -a +pob --description 'Don\'t raise window on Control-G' complete -c xterm -n '__fish_test_arg "+*"' -a +rvc --description 'Enable characters with reverse attribute as color' complete -c xterm -n '__fish_test_arg "+*"' -a +rw --description 'Disable reverse-wraparound' complete -c xterm -n '__fish_test_arg "+*"' -a +s --description 'Turn off asynchronous scrolling' complete -c xterm -n '__fish_test_arg "+*"' -a +samename --description 'Send title/icon change requests always' complete -c xterm -n '__fish_test_arg "+*"' -a +sb --description 'Don\'t display scrollbar' complete -c xterm -n '__fish_test_arg "+*"' -a +sf --description 'Don\'t generate Sun Function Key escape codes for function keys' complete -c xterm -n '__fish_test_arg "+*"' -a +si --description 'Move the screen to the bottom on input' complete -c xterm -n '__fish_test_arg "+*"' -a +sk --description 'Don\'t move the screen to the bottom on key press while scrolling' complete -c xterm -n '__fish_test_arg "+*"' -a +sm --description 'Don\'t setup session manager callbacks' complete -c xterm -n '__fish_test_arg "+*"' -a +sp --description 'Don\'t assume Sun/PC keyboard' complete -c xterm -n '__fish_test_arg "+*"' -a +t --description 'VT102 mode' complete -c xterm -n '__fish_test_arg "+*"' -a +tb --description 'Don\'t display toolbar or menubar' complete -c xterm -n '__fish_test_arg "+*"' -a +u8 --description 'Don\'t use UTF-8' complete -c xterm -n '__fish_test_arg "+*"' -a +ulc --description 'Display characters with underline attribute as color' complete -c xterm -n '__fish_test_arg "+*"' -a +ut --description 'Write to the system utmp log file' complete -c xterm -n '__fish_test_arg "+*"' -a +vb --description 'Don\'t use visual bell insead of audio bell' complete -c xterm -n '__fish_test_arg "+*"' -a +wc --description 'Don\'t use wide characters' complete -c xterm -n '__fish_test_arg "+*"' -a +wf --description 'Don\'t wait the first time for the window to be mapped' complete -c xterm -o version --description 'Print version number to the standard output' complete -c xterm -o help --description 'Print out a verbose message describing the options' complete -c xterm -o 123 --description 'Don\'t ignore the VT102 DECCOLM escape sequence' complete -c xterm -o ah --description 'Always highlight the text cursor' complete -c xterm -o ai --description 'Disable active icon support' complete -c xterm -o aw --description 'Allow auto wraparound' complete -c xterm -o bc --description 'Turn on cursor blinking' complete -c xterm -o bdc --description 'Disable the display of bold characters' complete -c xterm -o cb --description 'Set the vt100 resource cutToBeginningOfLine to \'false\'' complete -c xterm -o cc --description 'Set character class' complete -c xterm -o cjk_width --description 'Set the cjkWidth resource to \'true\'' complete -c xterm -o cm --description 'Disable recognition of ANSI color-change escape sequences' complete -c xterm -o cn --description 'Don\'t cut newlines in line-mode selections' complete -c xterm -o cu --description 'Workaround for bug in more(1)' complete -c xterm -o dc --description 'Enable dynamic color changing' complete -c xterm -o fbb --description 'Ensure compatibility between normal and bold fonts bounding boxes' complete -c xterm -o fbx --description 'Normal and bold fonts don\'t have VT100 line-drawing characters' complete -c xterm -o hf --description 'Generate HP Function Key escape codes for function keys' complete -c xterm -o hold --description 'Don\'t close xterm\'s window after the shell exits' complete -c xterm -o ie --description 'Use pseudo-terminal\'s sense of the stty erase value' complete -c xterm -o im --description 'Force insert mode' complete -c xterm -o k8 --description 'Treat C1 control characters as printable' complete -c xterm -o lc --description 'Turn on support for encodings according the locale setting' complete -c xterm -o leftbar --description 'Force scrollbar to the left side' complete -c xterm -o ls --description 'The shell in xterm\'s window will be login shell' complete -c xterm -o mb --description 'Ring bell if the user types near the end of line' complete -c xterm -o mesg --description 'Disallow write access to the terminal' complete -c xterm -o mk_width --description 'Use builtin version for the wide-character calculation' complete -c xterm -o nul --description 'Disable underlining' complete -c xterm -o pc --description 'Enable PC style bold colors' complete -c xterm -o pob --description 'Raise window on Control-G' complete -c xterm -o rightbar --description 'Force scrollbar to the right side' complete -c xterm -o rvc --description 'Disable characters with reverse attribute as color' complete -c xterm -o rw --description 'Enable reverse-wraparound' complete -c xterm -o samename --description 'Don\'t send title/icon change requests always' complete -c xterm -o sb --description 'Display scrollbar' complete -c xterm -o sf --description 'Generate Sun Function Key escape codes for function keys' complete -c xterm -o si --description 'Don\'t move the screen to the bottom on input' complete -c xterm -o sk --description 'Move the screen to the bottom on key press while scrolling' complete -c xterm -o sm --description 'Setup session manager callbacks' complete -c xterm -o sp --description 'Assume Sun/PC keyboard' complete -c xterm -o tb --description 'Display toolbar or menubar' complete -c xterm -o u8 --description 'Use UTF-8' complete -c xterm -o ulc --description 'Don\'t display characters with underline attribute as color' complete -c xterm -o ut --description 'Don\'t write to the system utmp log file' complete -c xterm -o vb --description 'Use visual bell insead of audio bell' complete -c xterm -o wc --description 'Use wide characters' complete -c xterm -o wf --description 'Wait the first time for the window to be mapped' complete -c xterm -o Sccn --description 'Use as input/output channel for an existing program' complete -c xterm -s e -a "(complete -C(commandline -ct))" -x --description 'Run program in xterm' complete -r -c xterm -o bcf --description 'Blinking cursor will be off for that many milliseconds' complete -r -c xterm -o bcn --description 'Blinking cursor will be on for that many milliseconds' complete -r -c xterm -o class --description 'Override xterm resource class' complete -r -c xterm -o cr --description 'Color for the text cursor' complete -r -c xterm -o en -xa "(__fish_print_encodings)" --description 'xterm encoding' complete -r -c xterm -o fb --description 'Bold font' complete -r -c xterm -o fa --description 'FreeType font pattern' complete -r -c xterm -o fd --description 'FreeType double-width font pattern' complete -r -c xterm -o fi --description 'Font for active icons' complete -r -c xterm -o fs --description 'Font size for FreeType font' complete -r -c xterm -o fw --description 'Font for displaying wide text' complete -r -c xterm -o fwb --description 'Font for displaying bold wide text' complete -r -c xterm -o fx --description 'Font for the preedit string in "OverTheSpot"' complete -r -c xterm -o hc --description 'Color for highlighted text' complete -r -c xterm -o into --description 'Embed xterm into window' complete -r -c xterm -o kt --description 'Set keyboard type' -a "unknown default hp sco sun vt220" complete -r -c xterm -o lcc --description 'File name for the encoding converter' complete -r -c xterm -o lf --description 'Log filename' complete -r -c xterm -o mc --description 'Maximum time in milliseconds between multi-click selections' complete -r -c xterm -o ms --description 'Color for the pointer cursor' complete -r -c xterm -o nb --description 'Distance from the right end for ringing the margin bell' complete -r -c xterm -o sl --description 'Number of scrolled off lines' complete -r -c xterm -o ti --description 'Terminal identification' -a "vt52 vt100 vt101 vt102 vt220" complete -r -c xterm -o tm --description 'Terminal name for $TERM' complete -r -c xterm -o ziconbeep --description 'zIconBeep percentage' complete -r -c xterm -s b --description 'Size of the inner border' complete -c xterm -s j --description 'Use jump scrolling' complete -c xterm -s l --description 'Turn on logging' complete -c xterm -s s --description 'Turn on asynchronous scrolling' complete -c xterm -s t --description 'Tektronix mode' complete -c xterm -s C --description 'This window should receive console output' fish/share/completions/yaourt.fish000066400000000000000000000000401214535744100176430ustar00rootroot00000000000000 __fish_complete_pacman yaourt fish/share/completions/yum.fish000066400000000000000000000067671214535744100171600ustar00rootroot00000000000000# # Completions for the yum command # # All yum commands # Test if completing using package names is appropriate function __fish_yum_package_ok for i in (commandline -poc) if contains $i update upgrade remove erase install reinstall return 0 end end return 1 end complete -c yum -n '__fish_use_subcommand' -xa install --description "Install the latest version of a package" complete -c yum -n '__fish_use_subcommand' -xa 'update upgrade' --description "Update specified packages (defaults to all packages)" complete -c yum -n '__fish_use_subcommand' -xa check-update --description "Print list of available updates" complete -c yum -n '__fish_use_subcommand' -xa 'remove erase' --description "Remove the specified packages and packages that depend on them" complete -c yum -n '__fish_use_subcommand' -xa list --description "List available packages" complete -c yum -n '__fish_use_subcommand' -xa info --description "Describe available packages" complete -c yum -n '__fish_use_subcommand' -xa 'provides whatprovides' --description "Find package providing a feature or file" complete -c yum -n '__fish_use_subcommand' -xa search --description "find packages matching description regexp" complete -c yum -n '__fish_use_subcommand' -xa clean --description "Clean up cache directory" complete -c yum -n '__fish_use_subcommand' -xa generate-rss --description "Generate rss changelog" complete -c yum -n '__fish_yum_package_ok' -a "(__fish_print_packages)" complete -c yum -s h -l help --description "Display help and exit" complete -c yum -s y --description "Assume yes to all questions" complete -c yum -s c --description "Configuration file" -r complete -c yum -s d --description "Set debug level" -x complete -c yum -s e --description "Set error level" -x complete -c yum -s t -l tolerant --description "Be tolerant of errors in commandline" complete -c yum -s R --description "Set maximum delay between commands" -x complete -c yum -s c --description "Run commands from cache" complete -c yum -l version --description "Display version and exit" complete -c yum -l installroot --description "Specify installroot" -r complete -c yum -l enablerepo --description "Enable repository" -r complete -c yum -l disablerepo --description "Disable repository" -r complete -c yum -l obsoletes --description "Enables obsolets processing logic" complete -c yum -l rss-filename --description "Output rss-data to file" -r complete -c yum -l exclude --description "Exclude specified package from updates" -a "(__fish_print_packages)" complete -c yum -n 'contains list (commandline -poc)' -a all --description 'List all packages' complete -c yum -n 'contains list (commandline -poc)' -a available --description 'List packages available for installation' complete -c yum -n 'contains list (commandline -poc)' -a updates --description 'List packages with updates available' complete -c yum -n 'contains list (commandline -poc)' -a installed --description 'List installed packages' complete -c yum -n 'contains list (commandline -poc)' -a extras --description 'List packages not available in repositories' complete -c yum -n 'contains list (commandline -poc)' -a obsoletes --description 'List packages that are obsoleted by packages in repositories' complete -c yum -n 'contains clean (commandline -poc)' -x -a packages --description 'Delete cached package files' complete -c yum -n 'contains clean (commandline -poc)' -x -a headers --description 'Delete cached header files' complete -c yum -n 'contains clean (commandline -poc)' -x -a all --description 'Delete all cache contents' fish/share/completions/zcat.fish000066400000000000000000000005361214535744100172730ustar00rootroot00000000000000complete -c zcat -x -a "( __fish_complete_suffix .gz __fish_complete_suffix .tgz ) " complete -c zcat -s f -l force --description "Overwrite" complete -c zcat -s h -l help --description "Display help and exit" complete -c zcat -s L -l license --description "Print license" complete -c zcat -s V -l version --description "Display version and exit" fish/share/completions/zip.fish000066400000000000000000000035211214535744100171310ustar00rootroot00000000000000# Completions for zip complete -c zip -s f --description "Freshen: only changed files" complete -c zip -s d --description "Delete entries in zipfile" complete -c zip -s u --description "Update: only changed or newer files" complete -c zip -s m --description "Move into zipfile (delete files)" complete -c zip -s r --description "Operate recursively" complete -c zip -s j --description "Do not store directory names" complete -c zip -s 0 --description "Do not compress at all" complete -c zip -s l --description "Convert LF to CR LF" complete -c zip -o ll --description "Convert CR LF to LF" complete -c zip -s 1 --description "Compress faster" complete -c zip -s 9 --description "Compress better" complete -c zip -s q --description "Quiet mode" complete -c zip -s v --description "Verbose mode" complete -c zip -s c --description "Add one-line comments" complete -c zip -s z --description "Add zipfile comments" complete -c zip -s @ --description "Read names from stdin" complete -c zip -s o --description "Make zipfile as old as the latest entry" complete -c zip -s x -r --description "Exclude the following names" complete -c zip -s i -r --description "Include only the following names" complete -c zip -s F --description "Fix zipfile" complete -c zip -o FF --description "Fix zipfile (try harder)" complete -c zip -s A --description "Adjust offsets to suit self-extracting exe" complete -c zip -s J --description "Strip prepended data" complete -c zip -s T --description "Test zipfile integrity" complete -c zip -s X --description "Exclude extra file attributes" complete -c zip -s y --description "Store symbolic links as links" complete -c zip -s R --description "PKZIP recursion" complete -c zip -s e --description "Encrypt" complete -c zip -s n -r --description "Don\'t compress files with these suffixes" complete -c zip -s h --description "Display help and exit" fish/share/config.fish000066400000000000000000000066311214535744100152450ustar00rootroot00000000000000# # 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. # # # Set default field separators # set -g IFS \n\ \t # # Set default search paths for completions and shellscript functions # unless they already exist # set -l configdir ~/.config if set -q XDG_CONFIG_HOME set configdir $XDG_CONFIG_HOME end # __fish_datadir, __fish_sysconfdir, __fish_help_dir, __fish_bin_dir # are expected to have been set up by read_init from fish.cpp # Set up function and completion paths. Make sure that the fish # default functions/completions are included in the respective path. if not set -q fish_function_path set fish_function_path $configdir/fish/functions $__fish_sysconfdir/functions $__fish_datadir/functions end if not contains $__fish_datadir/functions $fish_function_path set fish_function_path[-1] $__fish_datadir/functions end if not set -q fish_complete_path set fish_complete_path $configdir/fish/completions $__fish_sysconfdir/completions $__fish_datadir/completions $configdir/fish/generated_completions end if not contains $__fish_datadir/completions $fish_complete_path set fish_complete_path[-1] $__fish_datadir/completions end # # This is a Solaris-specific test to modify the PATH so that # Posix-conformant tools are used by default. It is separate from the # other PATH code because this directory needs to be prepended, not # appended, since it contains POSIX-compliant replacements for various # system utilities. # if test -d /usr/xpg4/bin if not contains /usr/xpg4/bin $PATH set PATH /usr/xpg4/bin $PATH end end # Add a handler for when fish_user_path changes, so we can apply the same changes to PATH # Invoke it immediately to apply the current value of fish_user_path function __fish_reconstruct_path -d "Update PATH when fish_user_paths changes" --on-variable fish_user_paths set -l local_path $PATH set -l x for x in $__fish_added_user_paths if set -l idx (contains --index $x $local_path) set -e local_path[$idx] end end set -e __fish_added_user_paths for x in $fish_user_paths if not contains $x $local_path set local_path $local_path $x set -g __fish_added_user_paths $__fish_added_user_paths $x end end set -xg PATH $local_path end __fish_reconstruct_path # OS X-ism: Load the path files out of /etc/paths and /etc/paths.d/* function __fish_load_path_helper_paths while read -l new_path_comp if not contains $new_path_comp $PATH set PATH $PATH $new_path_comp end end end if test -r /etc/paths ; __fish_load_path_helper_paths < /etc/paths ; end for pathfile in /etc/paths.d/* ; __fish_load_path_helper_paths < $pathfile ; end functions -e __fish_load_path_helper_paths # # Launch debugger on SIGTRAP # function fish_sigtrap_handler --on-signal TRAP --no-scope-shadowing --description "Signal handler for the TRAP signal. Launches a debug prompt." breakpoint end # # Whenever a prompt is displayed, make sure that interactive # mode-specific initializations have been performed. # This handler removes itself after it is first called. # function __fish_on_interactive --on-event fish_prompt __fish_config_interactive functions -e __fish_on_interactive end fish/share/functions/000077500000000000000000000000001214535744100151275ustar00rootroot00000000000000fish/share/functions/N_.fish000066400000000000000000000000741214535744100163370ustar00rootroot00000000000000 function N_ --description "No-op" printf "%s" $argv end fish/share/functions/_.fish000066400000000000000000000004611214535744100162210ustar00rootroot00000000000000 # # Alias for gettext (or a fallback if gettext isn't installed) # set -l path (which gettext ^/dev/null) if test -x (echo $path) function _ --description "Alias for the gettext command" gettext fish $argv end else function _ --description "Alias for the gettext command" echo -n $argv end end fish/share/functions/__fish_append.fish000066400000000000000000000004751214535744100205660ustar00rootroot00000000000000function __fish_append -d "Internal completion function for appending string to the commandline" --argument separator set -e argv[1] set str (commandline -tc| sed -ne "s/\(.*$separator\)[^$separator]*/\1/p"|sed -e "s/--.*=//") printf "%s\n" "$str"$argv "$str"(printf "%s\n" $argv|sed -e "s/\(\t\|\$\)/,\1/") end fish/share/functions/__fish_bind_test1.fish000066400000000000000000000006451214535744100213520ustar00rootroot00000000000000 function __fish_bind_test1 set -l args set -l use_keys no for i in (commandline -poc) switch $i case -k --k --ke --key set use_keys yes case "-*" case "*" set args $args $i end end switch $use_keys case yes switch (count $args) case 1 return 0 end end return 1 end fish/share/functions/__fish_bind_test2.fish000066400000000000000000000003201214535744100213410ustar00rootroot00000000000000 function __fish_bind_test2 set -l args for i in (commandline -poc) switch $i case "-*" case "*" set args $args $i end end switch (count $args) case 2 return 0 end return 1 end fish/share/functions/__fish_commandline_test.fish000066400000000000000000000005611214535744100226400ustar00rootroot00000000000000 function __fish_commandline_test set -l is_function no for i in (commandline -poc) switch $i case -f --f --fu --fun --func --funct --functi --functio --function set is_function yes case -- break end end switch $is_function case yes return 0 end return 1 end fish/share/functions/__fish_complete_abook_formats.fish000066400000000000000000000005151214535744100240300ustar00rootroot00000000000000function __fish_complete_abook_formats --description 'Complete abook formats' set -l pat switch $argv[1] case in set pat '/output:/,$d; /input:\|^$/d' case out set pat '/input:/,/output:/d; /^$/d' case '*' return 1 end abook --formats | sed -e $pat -e 's/^\s\+//' end fish/share/functions/__fish_complete_ant_targets.fish000066400000000000000000000007111214535744100235130ustar00rootroot00000000000000function __fish_complete_ant_targets -d "Print list of targets from build.xml and imported files" set -l buildfile "build.xml" if test -f $buildfile # show ant targets __fish_filter_ant_targets $buildfile # find files with buildfile set files (sed -n "s/^.*]* file=[\"']\([^\"']*\)[\"'].*\$/\1/p" < $buildfile) # iterate through files and display their targets for file in $files; __fish_filter_ant_targets $file end end end fish/share/functions/__fish_complete_atool.fish000066400000000000000000000047761214535744100223350ustar00rootroot00000000000000function __fish_complete_atool --description 'Complete atool' --argument-names cmd complete -c $cmd -r -d 'Manage file archives of various types' ##Commands: complete -c $cmd -s l -l list -d 'list files in archive (als)' complete -c $cmd -s x -l extract -d 'extract files from archive (aunpack)' complete -c $cmd -s X -l extract-to -r -d 'extract archive to specified directory' complete -c $cmd -s a -l add -d 'create archive (apack)' complete -c $cmd -s c -l cat -d 'extract file to standard out (acat)' complete -c $cmd -s d -l diff -d 'generate a diff between two archives (adiff)' complete -c $cmd -s r -l repack -d 'repack archives to a different format (arepack)' complete -c $cmd -l help -d 'display this help and exit' complete -c $cmd -l version -d 'output version information and exit' ##Options: complete -c $cmd -s e -l each -d 'execute command above for each file specified' complete -c $cmd -s F -l format -d 'override archive format (see below)' -xa "(man atool | sgrep -E '^\s+(\S+)\s+\(\..+\)' | sed -r 's/\s+(\S+)\s+\((.+)\)/\1\t\2/')" complete -c $cmd -s O -l format-option -x -d 'give specific options to the archiver' complete -c $cmd -s D -l subdir -d 'always create subdirectory when extracting' complete -c $cmd -s f -l force -d 'allow overwriting of local files' complete -c $cmd -s q -l quiet -d 'decrease verbosity level by one' complete -c $cmd -s v -l verbose -d 'increase verbosity level by one' complete -c $cmd -s V -l verbosity -d 'specify verbosity (0, 1 or 2)' -xa '(seq 0 2)' complete -c $cmd -s p -l page -d 'send output through pager' complete -c $cmd -s 0 -l null -d 'filenames from standard in are null-byte separated' complete -c $cmd -s E -l explain -d 'explain what is being done by atool' complete -c $cmd -s S -l simulate -d 'simulation mode - no filesystem changes are made' complete -c $cmd -s o -l option -x -d 'override a configuration option (KEY=VALUE)' complete -c $cmd -l config -r -d 'load configuration defaults from file' switch $cmd case als aunpack acat complete -c $cmd -a '(__fish_complete_atool_archive_contents)' -d 'Archive content' end #man -P cat atool | grep '(default')' end fish/share/functions/__fish_complete_atool_archive_contents.fish000066400000000000000000000005711214535744100257400ustar00rootroot00000000000000function __fish_complete_atool_archive_contents --description 'List archive contents' set -l cmd (commandline -cop) set -e cmd[1] set -l file for arg in $cmd switch $arg case '-*' case '*' if test -f $arg set file $arg break end end end if not set -q file[1] return end als $file -qq | sed -r 's/^\s*[0-9]+\s+[0-9-]+\s+[0-9:]+\s+(.*)$/\1/' end fish/share/functions/__fish_complete_bittorrent.fish000066400000000000000000000052031214535744100233750ustar00rootroot00000000000000# Bittorrent commands function __fish_complete_bittorrent complete -c $argv -l max_uploads -x --description "Maximum uploads at once" complete -c $argv -l keepalive_interval -x --description "Number of seconds between keepalives" complete -c $argv -l download_slice_size -x --description "Bytes per request" complete -c $argv -l request_backlog -x --description "Requests per pipe" complete -c $argv -l max_message_length -x --description "Maximum length prefix encoding" complete -c $argv -l ip --description "IP to report to the tracker" -x -a "(__fish_print_addresses)" complete -c $argv -l minport --description "Minimum port to listen to" complete -c $argv -l maxport --description "Maximum port to listen to" complete -c $argv -l responsefile -r --description "File for server response" complete -c $argv -l url -x --description "URL to get file from" complete -c $argv -l saveas -r --description "Local file target" complete -c $argv -l timeout -x --description "Time to close inactive socket" complete -c $argv -l timeout_check_interval -x --description "Time between checking timeouts" complete -c $argv -l max_slice_length -x --description "Maximum outgoing slice length" complete -c $argv -l max_rate_period -x --description "Maximum time to guess rate" complete -c $argv -l bind -x --description "IP to bind to locally" -a "(__fish_print_addresses)" complete -c $argv -l display_interval -x --description "Time between screen updates" complete -c $argv -l rerequest_interval -x --description "Time to wait between requesting more peers" complete -c $argv -l min_peers -x --description "Minimum number of peers to not do requesting" complete -c $argv -l http_timeout -x --description "Number of seconds before assuming http timeout" complete -c $argv -l max_initiate -x --description "Number of peers at which to stop initiating new connections" complete -c $argv -l max_allow_in -x --description "Maximum number of connections to allow" complete -c $argv -l check_hashes -x --description "Whether to check hashes on disk" complete -c $argv -l max_upload_rate -x --description "Maximum kB/s to upload at" complete -c $argv -l snub_time -x --description "Seconds to wait for data to come in before assuming choking" complete -c $argv -l spew -x --description "Whether to display diagnostic info" complete -c $argv -l rarest_first_cutoff -x --description "Number of downloads at which to switch from random to rarest first" complete -c $argv -l min_uploads -x --description "Number of uploads to fill out to with optimistic unchokes" complete -c $argv -l report_hash_failiures -x --description "Whether to inform the user that hash failures occur" end fish/share/functions/__fish_complete_cabal.fish000066400000000000000000000004701214535744100222440ustar00rootroot00000000000000function __fish_complete_cabal if type -f cabal >/dev/null set cmd (commandline -poc) if test (count $cmd) -gt 1 cabal $cmd[2..-1] --list-options else cabal --list-options end end end fish/share/functions/__fish_complete_cd.fish000066400000000000000000000023041214535744100215660ustar00rootroot00000000000000function __fish_complete_cd -d "Completions for the cd command" # # We can't simply use __fish_complete_directories because of the CDPATH # set -l wd $PWD # Check if CDPATH is set set -l mycdpath if test -z $CDPATH[1] set mycdpath . else set mycdpath $CDPATH end # Note how this works: we evaluate $ctoken*/ # That trailing slash ensures that we only expand directories set -l ctoken (commandline -ct) if echo $ctoken | sgrep '^/\|^\./\|^\.\./\|^~/' >/dev/null # This is an absolute search path # Squelch descriptions per issue 254 eval printf '\%s\\n' $ctoken\*/ else # This is a relative search path # Iterate over every directory in CDPATH # and check for possible completions for i in $mycdpath # Move to the initial directory first, # in case the CDPATH directory is relative builtin cd $wd builtin cd $i # What we would really like to do is skip descriptions if all # valid paths are in the same directory, but we don't know how to # do that yet; so instead skip descriptions if CDPATH is just . if test "$mycdpath" = . eval printf '"%s\n"' $ctoken\*/ else eval printf '"%s\tin "'$i'"\n"' $ctoken\*/ end end end builtin cd $wd end fish/share/functions/__fish_complete_command.fish000066400000000000000000000007001214535744100226140ustar00rootroot00000000000000function __fish_complete_command --description 'Complete using all available commands' set -l ctoken (commandline -ct) switch $ctoken case '*=*' # Some seds (e.g. on Mac OS X), don't support \n in the RHS # Use a literal newline instead # http://sed.sourceforge.net/sedfaq4.html#s4.1 set ctoken (echo $ctoken | sed 's/=/\\ /') printf '%s\n' $ctoken[1]=(complete -C$ctoken[2]) case '*' complete -C$ctoken end end fish/share/functions/__fish_complete_convert_options.fish000066400000000000000000000010601214535744100244310ustar00rootroot00000000000000function __fish_complete_convert_options --description 'Complete Convert options' --argument what switch $what case format Format convert -list Format | sed '1,/----/d; /^$/,$d; /^$/d; s/^\s*\([a-zA-Z0-9-]\+\)\**\s*\S\+\s\+\\(\S\+\)\s\+\(.\+\S\)\s*$/\1\t\2 \3/' case color Color convert -list color | awk '{ print $1"\t"$2" "$3} ' | sed '1,/----/d' case family convert -list Font | grep family | sed 's/^\s*.\+: //' | sort -u case font Font convert -list Font | grep Font | sed 's/^\s*.\+: //' | sort -u case '*' convert -list $what end end fish/share/functions/__fish_complete_diff.fish000066400000000000000000000043701214535744100221150ustar00rootroot00000000000000 function __fish_complete_diff -d 'Complete diff/colordiff' --argument-names diff complete -c $diff -s i -l ignore-case --description "Ignore case differences" complete -c $diff -l ignore-file-name-case --description "Ignore case when comparing file names" complete -c $diff -l no-ignore-file-name-case --description "Consider case when comparing file names" complete -c $diff -s E -l ignore-tab-expansion --description "Ignore changes due to tab expansion" complete -c $diff -s b -l ignore-space-change --description "Ignore changes in the amount of white space" complete -c $diff -s w -l ignore-all-space --description "Ignore all white space" complete -c $diff -s B -l ignore-blank-lines --description "Ignore changes whose lines are all blank" complete -c $diff -s I -l ignore-matching-lines -x --description "Ignore changes whose lines match the REGEX" complete -c $diff -s a -l text --description "Treat all files as text" complete -c $diff -s r -l recursive --description "Recursively compare subdirectories" complete -c $diff -s N -l new-file --description "Treat absent files as empty" complete -c $diff -s C -l context -x --description "Output NUM lines of copied context" complete -c $diff -s c --description "Output 3 lines of copied context" complete -c $diff -s U -l unified -x --description "Output NUM lines of unified context" complete -c $diff -s u --description "Output 3 lines of unified context" complete -c $diff -s q -l brief --description "Output only whether the files differ" complete -c $diff -l normal --description "Output a normal diff" complete -c $diff -s y -l side-by-side --description "Output in two columns" complete -c $diff -s W -l width -x --description "Output at most NUM print columns" complete -c $diff -s d -l minimal --description "Try to find a smaller set of changes" complete -c $diff -l from-file -r --description "Compare FILE1 to all operands" complete -c $diff -l to-file -r --description "Compare FILE2 to all operands" complete -c $diff -s l -l paginate --description "Pass the output through 'pr'" complete -c $diff -s v -l version --description "Display version and exit" complete -c $diff -l help --description "Display help and exit" end fish/share/functions/__fish_complete_directories.fish000066400000000000000000000006111214535744100235130ustar00rootroot00000000000000# # Find directories that complete $argv[1], output them as completions # with description $argv[2] if defined, otherwise use 'Directory' # function __fish_complete_directories -d "Complete using directories" --argument comp set desc (_ Directory) if test (count $argv) -gt 1 set desc $argv[2] end eval "set dirs "$comp"*/" if test $dirs[1] printf "%s\t$desc\n" $dirs end end fish/share/functions/__fish_complete_file_url.fish000066400000000000000000000005011214535744100227760ustar00rootroot00000000000000 function __fish_complete_file_url set -l comp if set -q argv[1] set comp $argv[1] else set comp (commandline -ct) end set -l prefix (echo $comp|cut -c 1-7) if test file:// = $prefix set -l stripped (echo $comp|cut -c 8-) printf "%s\n" file://(complete -C"echo $stripped") else echo file:// end end fish/share/functions/__fish_complete_ftp.fish000066400000000000000000000017421214535744100217760ustar00rootroot00000000000000function __fish_complete_ftp -d 'Complete ftp, pftp' --argument-names ftp complete -c $ftp -xa "(__fish_print_hostnames)" -d 'Hostname' tname' complete -c $ftp -s 4 -d 'Use only IPv4 to contact any host' host' complete -c $ftp -s 6 -d 'Use IPv6 only' only' complete -c $ftp -s p -d 'Use passive mode for data transfers' sfers' complete -c $ftp -s A -d 'Use active mode for data transfers' sfers' complete -c $ftp -s i -d 'Turn off interactive prompting during multiple file transfers' complete -c $ftp -s n -d 'Restrain ftp from attempting "auto-login" upon initial connection' complete -c $ftp -s e -d 'Disable command editing and history support' complete -c $ftp -s g -d 'Disable file name globbing' Disable file name globbing' m -d 'Do not explicitly bind data and control channels to same interface' channels to same interface' v -d 'Verbose. Show all server responses and data transfer stats' es and data transfer stats' d -d 'Enable debugging' end fish/share/functions/__fish_complete_grep.fish000066400000000000000000000105501214535744100221370ustar00rootroot00000000000000function __fish_complete_grep -d 'Complete grep, egrep, fgrep, rgrep' --argument-names grep complete -c $grep -s A -l after-context --description "Print NUM lines of trailing context" complete -c $grep -s a -l text --description "Process binary file as text" complete -c $grep -s B -l before-context --description "Print NUM lines of leading context" complete -c $grep -s C -l context --description "Print NUM lines of context" complete -c $grep -s b -l byte-offset --description "Print byte offset of matches" complete -c $grep -l binary-files --description "Assume data type for binary files" -x -a "binary text" complete -c $grep -l colour -x -a "never always auto" complete -c $grep -l color -x -a "never always auto" complete -c $grep -s c -l count --description "Only print number of matches" complete -c $grep -s D -l devices -x -a "read skip" --description "Action for devices" complete -c $grep -s d -l directories -x -a "read skip recurse" --description "Action for directories" complete -c $grep -s E -l extended-regexp --description "Pattern is extended regexp" complete -xc $grep -s e -l regexp --description "Pattern is a regexp" complete -rc $grep -l exclude-from --description "Read pattern list from file. Skip files whose base name matches list" complete -rc $grep -l exclude-dir --description "Exclude matching directories from recursive searches" complete -c $grep -s F -l fixed-strings --description "Pattern is a fixed string" complete -rc $grep -s f -l file -r --description "Use patterns from a file" complete -c $grep -s G -l basic-regexp --description "Pattern is basic regex" complete -c $grep -s H -l with-filename --description "Print filename" complete -c $grep -s h -l no-filename --description "Suppress printing filename" complete -c $grep -l help --description "Display help and exit" complete -c $grep -s I --description "Skip binary files" complete -c $grep -s i -l ignore-case --description "Ignore case" complete -c $grep -s L -l files-without-match --description "Print first non-matching file" complete -c $grep -s l -l files-with-match --description "Print first matching file" complete -c $grep -s m -l max-count --description "Stop reading after NUM matches" complete -c $grep -l mmap --description "Use the mmap system call to read input" complete -c $grep -s n -l line-number --description "Print line number" complete -c $grep -s o -l only-matching --description "Show only matching part" complete -c $grep -l label --description "Rename stdin" complete -c $grep -l line-buffered --description "Use line buffering" complete -c $grep -s P -l perl-regexp --description "Pattern is a Perl regexp (PCRE) string" complete -c $grep -s q -l quiet --description "Do not write anything" complete -c $grep -l silent --description "Do not write anything" complete -c $grep -s R -l recursive --description "Read files under each directory, recursively" complete -c $grep -s r --description "Read files under each directory, recursively" complete -c $grep -l include --description "Search only files matching PATTERN" complete -c $grep -l exclude --description "Skip files matching PATTERN" complete -c $grep -s s -l no-messages --description "Suppress error messages" complete -c $grep -s T -l initial-tab --description "Ensure first character of actual line content lies on a tab stop" complete -c $grep -s U -l binary --description "Treat files as binary" complete -c $grep -s u -l unix-byte-offsets --description "Report Unix-style byte offsets" complete -c $grep -s V -l version --description "Display version and exit" complete -c $grep -s v -l invert-match --description "Invert the sense of matching" complete -c $grep -s w -l word-regexp --description "Only whole matching words" complete -c $grep -s x -l line-regexp --description "Only whole matching lines" complete -c $grep -s y --description "Obsolete synonym for -i" complete -c $grep -s z -l null-data --description 'treat input as a set of lines each terminated by a zero byte' complete -c $grep -s Z -l null --description "Output a zero byte after filename" end fish/share/functions/__fish_complete_groups.fish000066400000000000000000000004021214535744100225140ustar00rootroot00000000000000 function __fish_complete_groups --description "Print a list of local groups, with group members as the description" if test -x /usr/bin/getent getent group | cut -d ':' -f 1,4 | sed 's/:/\t/' else cut -d ':' -f 1,4 /etc/group | sed 's/:/\t/' end end fish/share/functions/__fish_complete_list.fish000066400000000000000000000014231214535744100221540ustar00rootroot00000000000000function __fish_complete_list --argument div cmd prefix iprefix if not set -q cmd[1] echo "Usage: __fish_complete_list where: separator - a symbol, separating individual entries function - a function which prints a completion list to complete each entry prefix - a prefix, which is printed before the list itemprefix - a prefix, which is printed before each item" > /dev/stderr return 1 end set -q iprefix[1] or set -l iprefix "" set -q prefix[1] or set -l prefix "" set -l pat (commandline -t) #set -l pat $argv[5] switch $pat case "*$div*" for i in (echo $pat | sed "s/^\(.\+$div\)$iprefix.*\$/\1/")$iprefix(eval $cmd) echo $i end case '*' for i in $prefix$iprefix(eval $cmd) echo $i end end end fish/share/functions/__fish_complete_lpr.fish000066400000000000000000000040171214535744100220000ustar00rootroot00000000000000function __fish_complete_lpr -d 'Complete lpr common options' --argument-names cmd complete -c $cmd -s E -d 'Forces encryption when connecting to the server' complete -c $cmd -s U -d 'Specifies an alternate username' -xa '(__fish_complete_users)' switch $cmd case lpr lpq lprm complete -c $cmd -s P -d 'Specifies an alternate printer or class name' -xa '(__fish_print_lpr_printers)' end switch $cmd case lpq cancel complete -c $cmd -s a -d 'Apply command to all printers' end switch $cmd case lpq cancel lpmove lpstat lprm lpoptions lp reject accept cupsaccept cupsreject cupsenable cupsdisable complete -c $cmd -s h -d 'Specifies an alternate server' -xa '(__fish_print_hostnames)' end switch $cmd case lp lpr complete -c $cmd -s o -d 'Sets a job option' -xa '(__fish_complete_lpr_option)' complete -c $cmd -s m -d 'Send an email on job completion' complete -c $cmd -s o -xa landscape -d 'Landscape mode' complete -c $cmd -s o -xa "media=a4 media=letter media=legal" -d 'Media size' complete -c $cmd -s o -xa page-ranges= -d 'Page ranges' complete -c $cmd -s o -xa orientation-requested= -d 'Choose orientation (4-landscape)' complete -c $cmd -s o -xa 'sides-one-sided two-sided-long-edge two-sided-short-edge' -d 'Choose between one/two sided modes' complete -c $cmd -s o -xa fitplot -d 'Scale the print file to fit on the page' complete -c $cmd -s o -xa 'number-up=2 number-up=4 number-up=6 number-up=9' -d 'Print multiple document pages on each output page' complete -c $cmd -s o -xa 'scaling=' -d 'Scale image files to use up to number percent of the page' complete -c $cmd -s o -xa 'cpi=' -d 'Set the number of characters per inch to use' complete -c $cmd -s o -xa 'lpi=' -d 'Set the number of lines per inch to use' complete -c $cmd -s o -xa 'page-bottom= page-left= page-right= page-top=' -d 'Set the page margins when printing text files' end end fish/share/functions/__fish_complete_lpr_option.fish000066400000000000000000000013661214535744100233740ustar00rootroot00000000000000function __fish_complete_lpr_option --description 'Complete lpr option' set -l optstr (commandline -t) switch $optstr case '*=*' set -l IFS = echo $optstr | read -l opt val set -l descr # Some seds (e.g. on Mac OS X), don't support \n in the RHS # Use a literal newline instead # http://sed.sourceforge.net/sedfaq4.html#s4.1 for l in (lpoptions -l ^ /dev/null | grep $opt | sed 's+\(.*\)/\(.*\):\s*\(.*\)$+\2 \3+; s/ /\\ /g;') if not set -q descr[1] set descr $l continue end set -l default '' if test (expr substr $l 1 1) = '*' set default 'Default ' set l (echo $l | sed 's/\*//') end echo $opt=$l\t$default$descr end case '*' lpoptions -l ^ /dev/null | sed 's+\(.*\)/\(.*\):.*$+\1=\t\2+' end end fish/share/functions/__fish_complete_ls.fish000066400000000000000000000140221214535744100216160ustar00rootroot00000000000000# # Completions for the ls command and its aliases # # Test if we are using GNU ls function __fish_complete_ls -d "Compleletions for ls and its aliases" set -l is_gnu command ls --version >/dev/null ^/dev/null; and set is_gnu --is-gnu set -l cmds -c $argv # Shared ls switches __fish_gnu_complete $cmds -s a -l all --description "Show hidden" $is_gnu __fish_gnu_complete $cmds -s A -l almost-all --description "Show hidden except . and .." $is_gnu __fish_gnu_complete $cmds -s F -l classify --description "Append filetype indicator" $is_gnu __fish_gnu_complete $cmds -s H -l dereference-command-line --description "Follow symlinks" $is_gnu __fish_gnu_complete $cmds -s L -l dereference --description "Follow symlinks" $is_gnu __fish_gnu_complete $cmds -s R -l recursive --description "List subdirectory recursively" $is_gnu __fish_gnu_complete $cmds -s b -l escape --description "Octal escapes for non graphic characters" $is_gnu __fish_gnu_complete $cmds -s d -l directory --description "List directories, not their content" $is_gnu __fish_gnu_complete $cmds -s h -l human-readable --description "Human readable sizes" $is_gnu __fish_gnu_complete $cmds -s i -l inode --description "Print inode number of files" $is_gnu __fish_gnu_complete $cmds -s n -l numeric-uid-gid --description "Long format, numeric IDs" $is_gnu __fish_gnu_complete $cmds -s p -l file-type --description "Append filetype indicator" $is_gnu __fish_gnu_complete $cmds -s q -l hide-control-chars --description "Replace non-graphic characters with '?'" $is_gnu __fish_gnu_complete $cmds -s r -l reverse --description "Reverse sort order" $is_gnu __fish_gnu_complete $cmds -s s -l size --description "Print size of files" $is_gnu complete $cmds -s C --description "List by columns" complete $cmds -s S --description "Sort by size" complete $cmds -s c --description "Show and sort by ctime" complete $cmds -s f --description "Don't sort" complete $cmds -s g --description "Long format without owner" complete $cmds -s k --description "Set blocksize to 1kB" complete $cmds -s l --description "Long format" complete $cmds -s m --description "Comma separated format" complete $cmds -s t --description "Sort by modification time" complete $cmds -s u --description "Show access time" complete $cmds -s x --description "List entries by lines" complete $cmds -s 1 --description "List one file per line" if test -n "$is_gnu" # GNU specific ls switches complete $cmds -l hide --description "Do not list implied entries matching specified shell pattern" -r complete $cmds -l lcontext --description "Display security context" complete $cmds -l context -s Z --description "Display security context so it fits on most displays" complete $cmds -l scontext --description "Display only security context and file name" complete $cmds -l author --description "Print author" complete $cmds -l blocksize -x --description "Set block size" complete $cmds -s B -l ignore-backups --description "Ignore files ending with ~" complete $cmds -l color -f -a "never always auto" --description "Use colors" complete $cmds -s D -l dired --description "Generate dired output" complete $cmds -l format -x -a "across commas horizontal long single-column verbose vertical" --description "List format" complete $cmds -l full-time --description "Long format, full-iso time" complete $cmds -s G -l no-group --description "Don't print group information" complete $cmds -l si --description "Human readable sizes, powers of 1000" complete $cmds -l dereference-command-line-symlink-to-dir #--description "Follow directory symlinks from command line" complete $cmds -l indicator-style -x -a "none classify file-type" --description "Append filetype indicator" complete $cmds -s I -l ignore -r --description "Skip entries matching pattern" complete $cmds -s N -l literal --description "Print raw entry names" complete $cmds -s o --description "Long format without groups" complete $cmds -l show-control-chars --description "Non graphic as-is" complete $cmds -s Q -l quote-name --description "Enclose entry in quotes" complete $cmds -l quoting-style -x -a "literal locale shell shell-always c escape" --description "Select quoting style" complete $cmds -l sort -x --description "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 --description "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" --description "Select time style" complete $cmds -s T -l tabsize -x -a "1 2 3 4 5 6 7 8 9 10 11 12" --description "Assume tab stops at each COLS" complete $cmds -s U --description "Do not sort" complete $cmds -s v --description "Sort by version" complete $cmds -s w -l width -x --description "Assume screen width" complete $cmds -s X --description "Sort by extension" complete $cmds -l help --description "Display help and exit" complete $cmds -l version --description "Display version and exit" else # If not a GNU system, assume we have standard BSD ls features instead complete $cmds -s B --description "Octal escapes for non graphic characters" complete $cmds -s G --description "Use colors" complete $cmds -s I --description "Prevent -A from being automatically set for root" complete $cmds -s P --description "Don't follow symlinks" complete $cmds -s T --description "Show modification time" complete $cmds -s W --description "Show whiteouts when scanning directories" complete $cmds -s Z --description "Display each file's MAC label" complete $cmds -s o --description "Include the file flags in a long (-l) output" complete $cmds -s w --description "Print raw entry names" end end fish/share/functions/__fish_complete_man.fish000066400000000000000000000010501214535744100217500ustar00rootroot00000000000000 function __fish_complete_man if test (commandline -ct) # Try to guess what section to search in. If we don't know, we # use [^)]*, which should match any section set section "" set prev (commandline -poc) set -e prev[1] while count $prev switch $prev[1] case '-**' case '*' set section $prev[1] end set -e prev[1] end set section $section"[^)]*" # Do the actual search apropos (commandline -ct) ^/dev/null | sgrep \^(commandline -ct) | sed -n -e 's/\([^ ]*\).*(\('$section'\)) *- */\1'\t'\2: /p' end end fish/share/functions/__fish_complete_mime.fish000066400000000000000000000010611214535744100221260ustar00rootroot00000000000000 function __fish_complete_mime -d "Complete using text files" # Find all possible file completions set -l all set -l comp (commandline -ct) set -l base (echo $comp | sed -e 's/\.[a-zA-Z0-9]*$//') set -l mimetype $argv[1] eval "set all $base*" # Select text files only set -l files (__fish_filter_mime $mimetype $all) # Get descriptions for files set desc (mimedb -d $files) # Format completions and descriptions set -l res for i in (seq (count $files)) set res $res $files[$i]\t$desc[$i] end if test $res[1] printf "%s\n" $res end end fish/share/functions/__fish_complete_pacman.fish000066400000000000000000000162671214535744100224540ustar00rootroot00000000000000function __fish_complete_pacman -d 'Complete pacman (ARCH package manager)' --argument-names progname # Completions for pacman # Author: Giorgio Lando # Updated by maxfl, SanskritFritz. set -q progname[1]; or set -l progname pacman set -l listinstalled "(pacman -Q | tr ' ' \t)" set -l listall "(pacman -Sl | cut --delim ' ' --fields 2- | tr ' ' \t)" set -l listrepos "(cat /etc/pacman.conf | grep '^\[.\+\]' | sed 's/[]\[]//g')" set -l listgroups "(pacman -Sg | sed 's/\(.*\)/\1\tPackage group/g')" set -l noopt 'commandline | not sgrep -qe "-[a-z]*[DQRSTU]\|--database\|--query\|--sync\|--remove\|--upgrade\|--deptest"' set -l database 'commandline | sgrep -qe "-[a-z]*D\|--database"' set -l query 'commandline | sgrep -qe "-[a-z]*Q\|--query"' set -l remove 'commandline | sgrep -qe "-[a-z]*R\|--remove"' set -l sync 'commandline | sgrep -qe "-[a-z]*S\|--sync"' set -l upgrade 'commandline | sgrep -qe "-[a-z]*U\|--upgrade"' # By default fish expands the arguments with the option which is not desired # due to performance reasons. # This will make sure we are expanding an argument and not an option: set -l argument 'not expr -- (commandline --current-token) : "^-.*" > /dev/null' # Primary operations complete -c $progname -s D -f -l database -n $noopt -d 'Modify the package database' complete -c $progname -s Q -f -l query -n $noopt -d 'Query the package database' complete -c $progname -s R -f -l remove -n $noopt -d 'Remove packages from the system' complete -c $progname -s S -f -l sync -n $noopt -d 'Synchronize packages' complete -c $progname -s T -f -l deptest -n $noopt -d 'Check dependencies' complete -c $progname -s U -f -l upgrade -n $noopt -d 'Upgrade or add a local package' complete -c $progname -s V -f -l version -d 'Display version and exit' complete -c $progname -s h -f -l help -d 'Display help' # General options complete -c $progname -s b -l dbpath -d 'Alternative database location' -xa '(__fish_complete_directories)' complete -c $progname -s r -l root -d 'Alternative installation root' complete -c $progname -s v -l verbose -d 'Output more status messages' complete -c $progname -l arch -d 'Alternate architecture' complete -c $progname -l cachedir -d 'Alternative package cache location' complete -c $progname -l config -d 'Alternate config file' complete -c $progname -l debug -d 'Display debug messages' complete -c $progname -l gpgdir -d 'GPG directory to verify signatures' complete -c $progname -l logfile -d 'Specify alternative log file' complete -c $progname -l noconfirm -d 'Bypass any question' # Transaction options (sync, remove, upgrade) for condition in sync remove upgrade complete -c $progname -n $$condition -s d -l nodeps -d 'Skip [all] dependency checks' complete -c $progname -n $$condition -l dbonly -d 'Modify database entry only' complete -c $progname -n $$condition -l noprogressbar -d 'Do not display progress bar' complete -c $progname -n $$condition -l noscriptlet -d 'Do not execute install script' complete -c $progname -n $$condition -s p -l print -d 'Dry run, only print targets' complete -c $progname -n $$condition -l print-format -x -d 'Specify printf-like format' end # Database and upgrade options (database, sync, upgrade) for condition in database sync upgrade complete -c $progname -n $$condition -l asdeps -d 'Mark PACKAGE as dependency' complete -c $progname -n $$condition -l asexplicit -d 'Mark PACKAGE as explicitly installed' end # Upgrade options (sync, upgrade) for condition in sync upgrade complete -c $progname -n $$condition -s f -l force -d 'Bypass file conflict checks' complete -c $progname -n $$condition -l ignore -d 'Ignore upgrade of PACKAGE' -xa "$listinstalled" complete -c $progname -n $$condition -l ignoregroup -d 'Ignore upgrade of GROUP' -xa "$listgroups" complete -c $progname -n $$condition -l needed -d 'Do not reinstall up-to-date targets' complete -c $progname -n $$condition -l recursive -d 'Recursively reinstall all dependencies' end # Query and sync options for condition in query sync complete -c $progname -n $$condition -s g -l groups -d 'Display all packages in GROUP' -xa "$listgroups" complete -c $progname -n $$condition -s i -l info -d 'Display information on PACKAGE' complete -c $progname -n $$condition -s q -l quiet -d 'Show less information' complete -c $progname -n $$condition -s s -l search -r -d 'Search packages for regexp' end # Query options complete -c $progname -n $query -s c -l changelog -d 'View the change log of PACKAGE' complete -c $progname -n $query -s d -l deps -d 'List only non-explicit packages (dependencies)' complete -c $progname -n $query -s e -l explicit -d 'List only explicitly installed packages' complete -c $progname -n $query -s k -l check -d 'Check if all files owned by PACKAGE are present' complete -c $progname -n $query -s l -l list -d 'List all files owned by PACKAGE' complete -c $progname -n $query -s m -l foreign -d 'List all packages not in the database' complete -c $progname -n $query -s o -l owns -r -d 'Search for the package that owns FILE' -xa '' complete -c $progname -n $query -s p -l file -d 'Apply the query to a package file, not package' -xa '' complete -c $progname -n $query -s t -l unrequired -d 'List only unrequired packages' complete -c $progname -n $query -s u -l upgrades -d 'List only out-of-date packages' complete -c $progname -n "$query; and $argument" -xa $listinstalled -d 'Installed package' # Remove options complete -c $progname -n $remove -s c -l cascade -d 'Also remove packages depending on PACKAGE' complete -c $progname -n $remove -s n -l nosave -d 'Ignore file backup designations' complete -c $progname -n $remove -s s -l recursive -d 'Also remove dependencies of PACKAGE' complete -c $progname -n $remove -s u -l unneeded -d 'Only remove targets not required by PACKAGE' complete -c $progname -n "$remove; and $argument" -xa $listinstalled -d 'Installed package' # Sync options complete -c $progname -n $sync -s c -l clean -d 'Remove [all] packages from cache' complete -c $progname -n $sync -s l -l list -xa "$listrepos" -d 'List all packages in REPOSITORY' complete -c $progname -n $sync -s u -l sysupgrade -d 'Upgrade all packages that are out of date' complete -c $progname -n $sync -s w -l downloadonly -d 'Only download the target packages' complete -c $progname -n $sync -s y -l refresh -d 'Download fresh copy of the package list' complete -c $progname -n "$argument; and $sync" -xa "$listall $listgroups" # Upgrade options complete -c $progname -n "$upgrade; and $argument" -xa '(__fish_complete_suffix pkg.tar.xz)' -d 'Package file' complete -c $progname -n "$upgrade; and $argument" -xa '(__fish_complete_suffix pkg.tar.gz)' -d 'Package file' end fish/share/functions/__fish_complete_pgrep.fish000066400000000000000000000030231214535744100223140ustar00rootroot00000000000000 function __fish_complete_pgrep -d 'Complete pgrep/pkill' --argument-names cmd complete -c $cmd -xa '(__fish_complete_proc)' complete -c $cmd -s f -d 'Match pattern against full command line' complete -c $cmd -s g -d 'Only match processes in the process group' -xa '(__fish_complete_list , __fish_complete_groups)' complete -c $cmd -s G -d "Only match processes whose real group ID is listed. Group 0 is translated into $cmd\'s own process group" -xa '(__fish_complete_list , __fish_complete_groups)' complete -c $cmd -s n -d 'Select only the newest process' complete -c $cmd -s o -d 'Select only the oldest process' complete -c $cmd -s P -d 'Only match processes whose parent process ID is listed' -xa '(__fish_complete_list , __fish_complete_pids)' complete -c $cmd -s s -d "Only match processes whose process session ID is listed. Session ID 0 is translated into $cmd\'s own session ID." complete -c $cmd -s t -d 'Only match processes whose controlling terminal is listed. The terminal name should be specified without the "/dev/" prefix' -r complete -c $cmd -s u -d 'Only match processes whose effective user ID is listed' -xa '(__fish_complete_list , __fish_complete_users)' complete -c $cmd -s U -d 'Only match processes whose real user ID is listed' -xa '(__fish_complete_list , __fish_complete_users)' complete -c $cmd -s v -d 'Negates the matching' complete -c $cmd -s x -d ' Only match processes whose name (or command line if -f is specified) exactly match the pattern' end fish/share/functions/__fish_complete_pids.fish000066400000000000000000000012001214535744100221310ustar00rootroot00000000000000function __fish_complete_pids -d "Print a list of process identifiers along with brief descriptions" # This may be a bit slower, but it's nice - having the tty displayed is really handy # 'tail -n +2' deletes the first line, which contains the headers # 'grep -v...' removes self from the output set -l SELF %self # Display the tty if available set -l sed_cmds 's/ *([0-9]+) +([^ ].*[^ ]|[^ ]) +([^ ]+) *$/\1'\t'\2 [\3]/' # But not if it's just question marks, meaning no tty set -l sed_cmds $sed_cmds 's/ *\[\?*\] *$//' ps axc -o pid,ucomm,tty | grep -v '^\s*'$SELF'\s' | tail -n +2 | sed -E "-e "$sed_cmds ^/dev/null end fish/share/functions/__fish_complete_ppp_peer.fish000066400000000000000000000002031214535744100230060ustar00rootroot00000000000000function __fish_complete_ppp_peer --description 'Complete isp name for pon/poff' find /etc/ppp/peers/ -type f -printf '%f\n' end fish/share/functions/__fish_complete_proc.fish000066400000000000000000000034051214535744100221460ustar00rootroot00000000000000function __fish_complete_proc --description 'Complete by list of running processes' # Our function runs ps, followed by a massive list of commands passed to sed set -l ps_cmd set -l sed_cmds if test (uname) = Linux # comm and ucomm return a truncated name, so parse it from the command line field, # which means we have to trim off the arguments. # Unfortunately, it doesn't seem to escape spaces - so we can't distinguish # between the command name, and the first argument. Still, processes with spaces # in the name seem more common on OS X than on Linux, so prefer to parse out the # command line rather than using the stat data. # If the command line is unavailable, you get the stat data in brackets - so # parse out brackets too. set ps_cmd 'ps -A -o command' # Erase everything after the first space set sed_cmds $sed_cmds 's/ .*//' # Erases weird stuff Linux gives like kworker/0:0 set sed_cmds $sed_cmds 's|/[0-9]:[0-9]]$||g' # Retain the last path component only set sed_cmds $sed_cmds 's|.*/||g' # Strip off square brackets. Cute, huh? set sed_cmds $sed_cmds 's/[][]//g' # Erase things that are just numbers set sed_cmds $sed_cmds 's/^[0-9]*$//' else # OS X, BSD. Preserve leading spaces. set ps_cmd 'ps axc -o comm' # Delete parenthesized (zombie) processes set sed_cmds $sed_cmds '/(.*)/d' end # Append sed command to delete first line (the header) set sed_cmds $sed_cmds '1d' # Append sed commands to delete leading dashes and trailing spaces # In principle, commands may have trailing spaces, but ps emits space padding on OS X set sed_cmds $sed_cmds 's/^-//' 's/ *$//' # Run ps, pipe it through our massive set of sed commands, then sort and unique eval $ps_cmd | sed '-e '$sed_cmds | sort -u end fish/share/functions/__fish_complete_python.fish000066400000000000000000000044151214535744100225260ustar00rootroot00000000000000function __fish_complete_python -d 'Make completion for python' --argument-names cmd complete -c $cmd -s B --description 'Don\'t write .py[co] files on import' complete -c $cmd -s c -x --description "Execute argument as command" complete -c $cmd -s d --description "Debug on" complete -c $cmd -s E --description "Ignore environment variables" complete -c $cmd -s h -l help --description "Display help and exit" complete -c $cmd -s i --description "Interactive mode after executing commands" complete -c $cmd -s m -d 'Run library module as a script (terminates option list)' -xa "( find /usr/lib/(eval $cmd -V 2>| sed 's/ //; s/\..\$//; s/P/p/') \$PYTHONPATH -maxdepth 1 -name '*.py' -printf '%f\n' | sed 's/.py//')" complete -c $cmd -s O --description "Enable optimizations" complete -c $cmd -o OO --description "Remove doc-strings in addition to the -O optimizations" complete -c $cmd -s s --description 'Don\'t add user site directory to sys.path' complete -c $cmd -s S --description "Disable import of site module" complete -c $cmd -s u --description "Unbuffered input and output" complete -c $cmd -s v --description "Verbose mode" complete -c $cmd -s V --description "Display version and exit" complete -c $cmd -s W -x --description "Warning control" -a "ignore default all module once error" complete -c $cmd -s x -d 'Skip first line of source, allowing use of non-Unix forms of #!cmd' complete -c $cmd -a "(__fish_complete_suffix .py)" complete -c $cmd -a '-' -d 'Read program from stdin' switch (eval $cmd -V 2>| sed 's/^.*\s\(.\).*/\1/') case 2 complete -c $cmd -s 3 -d 'Warn about Python 3.x incompatibilities that 2to3 cannot trivially fix' complete -c $cmd -s t --description "Warn on mixed tabs and spaces" complete -c $cmd -s Q -x -a "old new warn warnall" --description "Division control" case 3 complete -c $cmd -s q --description 'Don\'t print version and copyright messages on interactive startup' complete -c $cmd -s X -x -d 'Set implementation-specific option' complete -c $cmd -s b -d 'Issue warnings about str(bytes_instance), str(bytearray_instance) and comparing bytes/bytearray with str' complete -c $cmd -o bb -d 'Issue errors' end end fish/share/functions/__fish_complete_setxkbmap.fish000066400000000000000000000003231214535744100231750ustar00rootroot00000000000000function __fish_complete_setxkbmap --description 'Complete setxkb options' --argument-names what sed -e "1,/! $what/d" -e '/^\s*$/,$d' /usr/share/X11/xkb/rules/xorg.lst | sed -r 's/\s+(\S+)\s+(.+)/\1\t\2/' end fish/share/functions/__fish_complete_ssh.fish000066400000000000000000000030401214535744100217730ustar00rootroot00000000000000 function __fish_complete_ssh -d "common completions for ssh commands" --argument command complete -c $command -s 1 --description "Protocol version 1 only" complete -c $command -s 2 --description "Protocol version 2 only" complete -c $command -s 4 --description "IPv4 addresses only" complete -c $command -s 6 --description "IPv6 addresses only" complete -c $command -s C --description "Compress all data" complete -xc $command -s c --description "Encryption algorithm" -a "blowfish 3des des" complete -r -c $command -s F --description "Configuration file" complete -r -c $command -s i --description "Identity file" complete -x -c $command -s o --description "Options" -a " AddressFamily BatchMode BindAddress ChallengeResponseAuthentication CheckHostIP Cipher Ciphers Compression CompressionLevel ConnectionAttempts ConnectTimeout ControlMaster ControlPath GlobalKnownHostsFile GSSAPIAuthentication GSSAPIDelegateCredentials Host HostbasedAuthentication HostKeyAlgorithms HostKeyAlias HostName IdentityFile IdentitiesOnly LogLevel MACs NoHostAuthenticationForLocalhost NumberOfPasswordPrompts PasswordAuthentication Port PreferredAuthentications Protocol ProxyCommand PubkeyAuthentication RhostsRSAAuthentication RSAAuthentication SendEnv ServerAliveInterval ServerAliveCountMax SmartcardDevice StrictHostKeyChecking TCPKeepAlive UsePrivilegedPort User UserKnownHostsFile VerifyHostKeyDNS " complete -c $command -s v --description "Verbose mode" end fish/share/functions/__fish_complete_subcommand.fish000066400000000000000000000013571214535744100233370ustar00rootroot00000000000000function __fish_complete_subcommand -d "Complete subcommand" set -l skip_next 1 set -l test switch "$argv[1]" case '--fcs-skip=*' set -l rest echo $argv[1] | tr = ' ' | read test skip_next set -e argv[1] end set -l res "" set -l had_cmd 0 set -l cmd (commandline -cop) (commandline -ct) for i in $cmd if test $skip_next -gt 0 set skip_next (expr $skip_next - 1) continue end if test "$had_cmd" = 1 set res "$res $i" else if contains -- $i $argv set skip_next (expr $skip_next + 1) continue end switch $i case '-*' case '*=*' case '*' set had_cmd 1 set res $i end end end printf "%s\n" (complete -C$res) end fish/share/functions/__fish_complete_subcommand_root.fish000066400000000000000000000003221214535744100243710ustar00rootroot00000000000000 function __fish_complete_subcommand_root -d "Run the __fish_complete_subcommand function using a PATH containing /sbin and /usr/sbin" set -lx PATH /sbin /usr/sbin $PATH __fish_complete_subcommand $argv end fish/share/functions/__fish_complete_suffix.fish000066400000000000000000000017071214535744100225120ustar00rootroot00000000000000# # Find files that complete $argv[1], has the suffix $argv[2], and # output them as completions with the description $argv[3] Both # $argv[1] and $argv[3] are optional, if only one is specified, it is # assumed to be the argument to complete. # function __fish_complete_suffix -d "Complete using files" # Variable declarations set -l comp set -l suff set -l desc set -l files switch (count $argv) case 1 set comp (commandline -ct) set suff $argv set desc (mimedb -d $suff) case 2 set comp $argv[1] set suff $argv[2] set desc (mimedb -d $suff) case 3 set comp $argv[1] set suff $argv[2] set desc $argv[3] end # Perform the completion set base (echo $comp |sed -e 's/\.[a-zA-Z0-9]*$//') eval "set files $base*$suff" if test $files[1] printf "%s\t$desc\n" $files end # # Also do directory completion, since there might be files # with the correct suffix in a subdirectory # __fish_complete_directories $comp end fish/share/functions/__fish_complete_svn.fish000066400000000000000000000414431214535744100220150ustar00rootroot00000000000000 function __fish_complete_svn -d 'Complete svn and its wrappers' --argument-names svn function _svn_cmpl_ -d 'Make a completion for a subcommand' --no-scope-shadowing --argument-names subcommand set -e argv[1] complete -c $svn -n "__fish_seen_subcommand_from $subcommand" $argv end # # subcommands # set -l add add set -l blame 'blame ann annotate praise' set -l cat cat set -l changelist 'cl changelist' set -l checkout 'co checkout' set -l cleanup cleanup set -l commit 'ci commit' set -l copy 'cp copy' set -l diff 'di diff' set -l export export set -l help '\? h help' set -l import import set -l info info set -l list 'ls list' set -l lock lock set -l log log set -l merge merge set -l mergeinfo mergeinfo set -l mkdir mkdir set -l move 'mv move ren rename' set -l patch patch set -l propdel 'pd pdel propdel' set -l propedit 'pe pedit propedit' set -l propget 'pg pget propget' set -l proplist 'pl plist proplist' set -l propset 'ps pset propset' set -l relocate relocate set -l remove 'rm remove del delete' set -l resolve resolve set -l resolved resolved set -l revert revert set -l stat 'st stat status' set -l switch 'sw switch' set -l unlock unlock set -l update 'up update' set -l upgrade upgrade complete -c $svn -n '__fish_use_subcommand' -x -a $add --description 'Put files and directories under version control, scheduling them for addition to repository. They will be added in next commit.' complete -c $svn -n '__fish_use_subcommand' -x -a $blame --description 'Output the content of specified files or URLs with revision and author information in-line.' complete -c $svn -n '__fish_use_subcommand' -x -a $cat --description 'Output the content of specified files or URLs.' complete -c $svn -n '__fish_use_subcommand' -x -a $changelist --description 'Output the content of specified files or URLs with revision and author information in-line.' complete -c $svn -n '__fish_use_subcommand' -x -a $checkout --description 'Check out a working copy from a repository.' complete -c $svn -n '__fish_use_subcommand' -x -a $cleanup --description 'Recursively clean up the working copy, removing locks, resuming unfinished operations, etc.' complete -c $svn -n '__fish_use_subcommand' -x -a $commit --description 'Send changes from your working copy to the repository.' complete -c $svn -n '__fish_use_subcommand' -x -a $copy --description 'Duplicate something in working copy or repository, remembering history.' complete -c $svn -n '__fish_use_subcommand' -x -a $diff --description 'Display the differences between two revisions or paths.' complete -c $svn -n '__fish_use_subcommand' -x -a $export --description 'Create an unversioned copy of a tree.' complete -c $svn -n '__fish_use_subcommand' -x -a $help --description 'Describe the usage of this program or its subcommands.' complete -c $svn -n '__fish_use_subcommand' -x -a $import --description 'Commit an unversioned file or tree into the repository.' complete -c $svn -n '__fish_use_subcommand' -x -a $info --description 'Display information about a local or remote item.' complete -c $svn -n '__fish_use_subcommand' -x -a $list --description 'List directory entries in the repository.' complete -c $svn -n '__fish_use_subcommand' -x -a $lock --description 'Lock working copy paths or URLs in the repository, so that no other user can commit changes to them.' complete -c $svn -n '__fish_use_subcommand' -x -a $log --description 'Show the log messages for a set of revision(s) and/or file(s).' complete -c $svn -n '__fish_use_subcommand' -x -a $merge --description 'Apply the differences between two sources to a working copy path.' complete -c $svn -n '__fish_use_subcommand' -x -a $mergeinfo --description 'Display information related to merges' complete -c $svn -n '__fish_use_subcommand' -x -a $mkdir --description 'Create a new directory under version control.' complete -c $svn -n '__fish_use_subcommand' -x -a $move --description 'Move and/or rename something in working copy or repository.' complete -c $svn -n '__fish_use_subcommand' -x -a $patch --description 'Apply a unidiff patch to the working copy' complete -c $svn -n '__fish_use_subcommand' -x -a $propdel --description 'Remove a property from files, dirs, or revisions.' complete -c $svn -n '__fish_use_subcommand' -x -a $propedit --description 'Edit a property with an external editor.' complete -c $svn -n '__fish_use_subcommand' -x -a $propget --description 'Print the value of a property on files, dirs, or revisions.' complete -c $svn -n '__fish_use_subcommand' -x -a $proplist --description 'List all properties on files, dirs, or revisions.' complete -c $svn -n '__fish_use_subcommand' -x -a $propset --description 'Set the value of a property on files, dirs, or revisions.' complete -c $svn -n '__fish_use_subcommand' -x -a $relocate --description 'Rewrite working copy url metadata' complete -c $svn -n '__fish_use_subcommand' -x -a $remove --description 'Remove files and directories from version control.' complete -c $svn -n '__fish_use_subcommand' -x -a $resolve --description 'Remove conflicts on working copy files or directories.' complete -c $svn -n '__fish_use_subcommand' -x -a $resolved --description 'Remove \'conflicted\' state on working copy files or directories.' complete -c $svn -n '__fish_use_subcommand' -x -a $revert --description 'Restore pristine working copy file (undo most local edits).' complete -c $svn -n '__fish_use_subcommand' -x -a $stat --description 'Print the status of working copy files and directories.' complete -c $svn -n '__fish_use_subcommand' -x -a $switch --description 'Update the working copy to a different URL.' complete -c $svn -n '__fish_use_subcommand' -x -a $unlock --description 'Unlock working copy paths or URLs.' complete -c $svn -n '__fish_use_subcommand' -x -a $update --description 'Bring changes from the repository into the working copy.' complete -c $svn -n '__fish_use_subcommand' -x -a $upgrade --description 'Upgrade the metadata storage format for a working copy.' # # Global commands # complete -c $svn -n 'not __fish_use_subcommand' -l username -x --description 'Specify a username ARG' complete -c $svn -n 'not __fish_use_subcommand' -l password -x --description 'Specify a password ARG' complete -c $svn -n 'not __fish_use_subcommand' -l no-auth-cache --description 'Do not cache authentication tokens' complete -c $svn -n 'not __fish_use_subcommand' -l non-interactive --description 'Do no interactive prompting' complete -c $svn -n 'not __fish_use_subcommand' -l trust-server-cert --description 'Accept SSL server certificates from unknown authorities (ony with --non-interactive)' complete -c $svn -n 'not __fish_use_subcommand' -l config-dir -x --description 'Read user configuration files from directory ARG' complete -c $svn -n 'not __fish_use_subcommand' -l config-option -x --description 'Set user configuration option in the format: FILE:SECTION:OPTION=[VALUE]' # # local commands # for cmd in $commit $copy $import $lock $mkdir $move $propedit $remove if not test $cmd = lock _svn_cmpl_ $cmd -l editor-cmd -x --description 'Use ARG as external editor' end _svn_cmpl_ $cmd -l message -s m --description 'Specify log message' _svn_cmpl_ $cmd -l encoding -x --description 'Treat value as being in charset encoding ARG' _svn_cmpl_ $cmd -l file -s F --description 'Read log message from file' _svn_cmpl_ $cmd -l force-log --description 'Force validity of log message source' end for cmd in $merge $resolve $switch $update _svn_cmpl_ $cmd -l accept -d 'Specify automatic conflict resolution source' -xa 'base working mine-conflict theirs-conflict mine-full theirs-full' end for cmd in $add $changelist $checkout $commit $diff $export $import $info $list $log $merge $mergeinfo $propdel $propget $proplist $propset $resolve $resolved $revert $stat $switch $update _svn_cmpl_ $cmd -l depth -d 'Limit operation by depth' -xa 'empty files immediates infinity' end for cmd in $add $changelist $checkout $commit $copy $delete $elog $export $import $merge $mkdir $move $patch $propdel $proplist $propset $resolve $resolved $revert $stat $switch $update $upgrade _svn_cmpl_ $cmd -l quiet -s q --description 'Print nothing, or only summary information' end for cmd in $add $blame $checkout $delete $diff $export $import $lock $merge $move $propedit $propset $remove $switch $unlock $update _svn_cmpl_ $cmd -l force --description 'Force operation to run' end for cmd in $add $changelist $commit $delete $info $lock $log $propset $resolve $resolved $revert $unlock _svn_cmpl_ $cmd -l targets --description 'Process contents of file ARG as additional args' -r end for cmd in $changelist $commit $diff $info $propdel $propget $proplist $propset $revert $stat $update _svn_cmpl_ $cmd -l changelist -l cl --description 'Operate only on members of changelist' -r end for cmd in $blame $diff $info $list $log $propget $proplist $stat _svn_cmpl_ $cmd -l xml --description 'Output in xml' end for cmd in $commit $copy $delete $import $log $mkdir $move $propedit _svn_cmpl_ $cmd -l with-revprop --description 'Retrieve revision property' -x end for cmd in $diff $log $merge _svn_cmpl_ $cmd -l change -s c -d 'The change made in revision ARG' -xa '(__fish_print_svn_rev)' end for cmd in $blame $cat $checkout $copy $diff $export $info $list $log $merge $mergeinfo $move $propedit $propget $propdel $proplist $propset $switch $update _svn_cmpl_ $cmd -l revision -s r -d 'Which revision the target is first looked up' -xa '(__fish_print_svn_rev)' end for cmd in $checkout $copy $export $relocate $stat $switch $update _svn_cmpl_ $cmd -l ignore-externals --description 'Ignore externals definitions' end for cmd in $blame $list $log $propget $proplist $stat _svn_cmpl_ $cmd -l verbose -s v --description 'Print extra information' end for cmd in $propdel $propedit $propget $proplist $propset _svn_cmpl_ $cmd -l revprop --description 'Operate on a revision property (use with -r)' end for cmd in $add $copy $mkdir $move $update _svn_cmpl_ $cmd -l parents --description 'Add intermediate parents' end for cmd in $blame $diff $log $merge _svn_cmpl_ $cmd -l extensions -s x -d 'Output 3 lines of unified context' -xa '-u --unified' _svn_cmpl_ $cmd -l extensions -s x -d 'Ignore changes in amount of whitespace' -xa '-b --ignore-space-change' _svn_cmpl_ $cmd -l extensions -s x -d 'Ignore all whitespace' -xa '-w --ignore-all-space' _svn_cmpl_ $cmd -l extensions -s x -d 'Ignore eol style' -xa '-w --ignore-eol-style' _svn_cmpl_ $cmd -l extensions -s x -d 'Show C function name' -xa '-p --shoe-c-function' # Next completion doesn't work, since fish doesn't respect -x key #_svn_cmpl_ $cmd -l extensions -n '__fish_seen_subcommand_from --diff-cmd' -xa '(__fish_complete_svn_diff)' end for cmd in $cleanup $merge $switch $update _svn_cmpl_ $cmd -l diff3-cmd -d 'Use as merge command' -xa "(complete -C(commandline -ct))" end for cmd in $blame $info $list $log $stat _svn_cmpl_ $cmd -l incremental -d 'Give output suitable for concatenation' end for cmd in $add $import $stat _svn_cmpl_ $cmd -l no-ignore -d 'Disregard default and svn:ignore property ignores' end for cmd in $merge $patch _svn_cmpl_ $cmd -l dry-run --description 'Try operation but make no changes' end for cmd in $merge $switch _svn_cmpl_ $cmd -l ignore-ancestry --description 'Ignore ancestry when calculating merges' end for cmd in $diff $log _svn_cmpl_ $cmd -l internal-diff --description 'Override diff-cmd specified in config file' _svn_cmpl_ $cmd -l diff-cmd --description 'Use external diff command' -xa "(complete -C(commandline -ct))" end for cmd in $add $import _svn_cmpl_ $cmd -l no-auto-props --description 'Disable automatic properties' end for cmd in $switch $update _svn_cmpl_ $cmd -l set-depth --description 'Set new working copy depth' -xa 'exclude empty files immediates infinity' end for cmd in $blame $log _svn_cmpl_ $cmd -l use-merge-history -s g -d 'Use/display additional information from merge history' end # # Individual commands # # # Completions for the 'checkout', 'co' subcommands # _svn_cmpl_ $checkout -xa 'http:// ftp:// svn+ssh:// svn+ssh://(__fish_print_hostnames)' # # Completions for the 'changelist', 'cl' subcommands # _svn_cmpl_ $changelist -l remove -d 'Remove changelist association' # # Completions for the 'commit', 'ci' subcommands # _svn_cmpl_ $commit -l keep-changelists --description 'don\'t delete changelists after commit' _svn_cmpl_ $commit -l no-unlock --description 'Don\'t unlock the targets' # # Completions for the 'remove', 'rm', 'delete', 'del' subcommands # _svn_cmpl_ $remove -l keep-local -x --description 'Keep path in working copy' # # Completions for the 'diff', 'di' subcommands # _svn_cmpl_ $diff -l old --description 'Use ARG as the older target' -xa '(__fish_print_svn_rev)' _svn_cmpl_ $diff -l new --description 'Use ARG as the newer target' -xa '(__fish_print_svn_rev)' _svn_cmpl_ $diff -l no-diff-deleted --description 'Do not print differences for deleted files' _svn_cmpl_ $diff -l notice-ancestry --description 'Notice ancestry when calculating differences' _svn_cmpl_ $diff -l summarize --description 'Show a summary of the results' _svn_cmpl_ $diff -l git -d 'Use git\'s extended diff format' _svn_cmpl_ $diff -l show-copies-as-adds -d 'Don\'t diff copied or moved files with their source' # # Completions for the 'export' subcommand # _svn_cmpl_ $export -l native-eol -x --description 'Use a different EOL marker than the standard' # # Completions for the 'log' subcommand # _svn_cmpl_ $log -l stop-on-copy --description 'Do not cross copies while traversing history' _svn_cmpl_ $log -l limit -s l -x --description 'Maximum number of log entries' _svn_cmpl_ $log -l diff --description 'Produce diff output' _svn_cmpl_ $log -l with-all-revprops -d 'Retrieve all revision properties' _svn_cmpl_ $log -l with-no-revprops -d 'Retrieve no revision properties' # # Completions for the 'merge' subcommand # _svn_cmpl_ $merge -l allow-mixed-variables -d 'Allow merge into mixed-revision working copy' _svn_cmpl_ $merge -l record-only -d 'Merge only mergeinfo differences' _svn_cmpl_ $merge -l reintegrate -d 'Merge a branch back into its parent branch' # # Completions for the 'patch' subcommand # _svn_cmpl_ $patch -l reverse-diff -d 'Apply the unidiff in reverse' _svn_cmpl_ $patch -l strip -x -d 'Number of leading path components to strip from paths' # # Completions for the 'propget', 'pget', 'pg' subcommands # _svn_cmpl_ $propget -l strict --description 'Use strict semantics' # # Complete pget, pset, pedit options with svn props # set -l props svn:{ignore,keywords,executable,eol-style,mime-type,externals,need-lock} _svn_cmpl_ $propget -a "$props" _svn_cmpl_ $propedit -a "$props" _svn_cmpl_ $propdel -a "$props" _svn_cmpl_ $propset -a "$props" _svn_cmpl_ svn:eol-style -a "native LF CR CRLF" _svn_cmpl_ svn:mime-type -a "(__fish_print_xdg_mimetypes)" _svn_cmpl_ svn:keywords -a "URL" -d 'The URL for the head version of the object' _svn_cmpl_ svn:keywords -a "Author" -d 'The last person to modify the file' _svn_cmpl_ svn:keywords -a "Date" -d 'Last changed date' _svn_cmpl_ svn:keywords -a "Rev" -d 'The last revision the object changed' _svn_cmpl_ svn:keywords -a "Id" -d 'A compressed summary of all keywords' # # Completions for the 'relocate' subcommand # _svn_cmpl_ $relocate -xa '( svn info | grep URL: | cut --delimiter " " --fields 2 ) http:// ftp:// svn+ssh:// svn+ssh://(__fish_print_hostnames)' # # Completions for the 'switch', 'sw' subcommands # _svn_cmpl_ $switch -l relocate --description 'Relocate via URL-rewriting' -xa '( svn info | grep URL: | cut --delimiter " " --fields 2 ) http:// ftp:// svn+ssh:// svn+ssh://(__fish_print_hostnames)' # # Completions for the 'status', 'st' subcommands # _svn_cmpl_ $stat -l show-updates -s u -d 'Display update information' # # Completions for the 'update', 'up' subcommand # _svn_cmpl_ $update -l editor-cmd -x --description 'Use ARG as external editor' functions -e _svn_cmpl_ end fish/share/functions/__fish_complete_svn_diff.fish000066400000000000000000000007311214535744100230000ustar00rootroot00000000000000function __fish_complete_svn_diff --description 'Complete "svn diff" arguments' set -l cmdl (commandline -cop) #set -l cmdl svn diff --diff-cmd diff --extensions '-a -b' set -l diff diff set -l args while set -q cmdl[1] switch $cmdl[1] case --diff-cmd if set -q cmdl[2] set diff $cmdl[2] set -e cmd[2] end case --extensions if set -q cmdl[2] set args $cmdl[2] set -e cmdl[2] end end set -e cmdl[1] end set -l token (commandline -cpt) complete -C"$diff $args $token" end fish/share/functions/__fish_complete_tar.fish000066400000000000000000000012171214535744100217700ustar00rootroot00000000000000 function __fish_complete_tar -d "Peek inside of archives and list all files" set -l cmd (commandline -poc) set -e cmd[1] for i in $cmd switch $i case '-*' continue case '*.tar.bz' '*.tar.bz2' '*.tbz' '*.tbz2' if test -f $i set -l file_list (tar -jt <$i) printf (_ "%s\tArchived file\n") $file_list end return case '*.tar.gz' '*.tgz' if test -f $i set -l file_list (tar -it <$i) printf (_ "%s\tArchived file\n") $file_list end return case '*.tar' if test -f $i set -l file_list (tar -t <$i) printf (_ "%s\tArchived file\n") $file_list end return end end end fish/share/functions/__fish_complete_tex.fish000066400000000000000000000023351214535744100220040ustar00rootroot00000000000000 function __fish_complete_tex -d "Common completions for all tex commands" complete -c $argv -o help --description "Display help and exit" complete -c $argv -o version --description "Display version and exit" complete -c $argv -x -a "( __fish_complete_suffix (commandline -ct) .tex '(La)TeX file' )" complete -c $argv -o file-line-error -d "Show errors in style file:line" complete -c $argv -o no-file-line-error -d "Show errors not in style file:line" complete -c $argv -o halt-on-error -d "Stop processing at the first error" complete -c $argv -o interaction=batchmode -d "Set interaction mode" complete -c $argv -o interaction=nonstopmode -d "Set interaction mode" complete -c $argv -o interaction=scrollmode -d "Set interaction mode" complete -c $argv -o interaction=errorstopmode -d "Set interaction mode" complete -c $argv -o output-directory= -x -a "(__fish_complete_directories (commandline -ct))" -d "Output directory" complete -c $argv -o shell-escape -d "Enable \write18{SHELL COMMAND}" complete -c $argv -o no-shell-escape -d "Disable \write18{SHELL COMMAND}" complete -c $argv -o src-specials -d "Insert source specials into the DVI file" end fish/share/functions/__fish_complete_unrar.fish000066400000000000000000000005201214535744100223250ustar00rootroot00000000000000 function __fish_complete_unrar -d "Peek inside of archives and list all files" set -l cmd (commandline -poc) set -e cmd[1] for i in $cmd switch $i case '-*' continue case '*.rar' if test -f $i set -l file_list (unrar vb $i) printf (_ "%s\tArchived file\n") $file_list end return end end end fish/share/functions/__fish_complete_users.fish000066400000000000000000000004221214535744100223400ustar00rootroot00000000000000 function __fish_complete_users --description "Print a list of local users, with the real user name as a description" if test -x /usr/bin/getent getent passwd | cut -d : -f 1,5 | sed 's/:/\t/' else sgrep -ve '^#' /etc/passwd | cut -d : -f 1,5 | sed 's/:/\t/' end end fish/share/functions/__fish_complete_vi.fish000066400000000000000000000132141214535744100216200ustar00rootroot00000000000000#completion for vi/vim function __fish_complete_vi -d "Compleletions for vi and its aliases" --argument-names cmd set -l is_vim if type $cmd > /dev/null eval command $cmd --version >/dev/null ^/dev/null; and set -l is_vim vim end # vim set -l cmds -c $cmd if test -n "$is_vim" # these don't work #complete $cmds -a - --description 'The file to edit is read from stdin. Commands are read from stderr, which should be a tty' # todo # +[num] : Position the cursor on line number # +/{pat} : Position the cursor on the first occurence of {pat} # +{command} : Execute Ex command after the first file has been read complete $cmds -s c -r --description 'Execute Ex command after the first file has been read' complete $cmds -s S -r --description 'Source file after the first file has been read' complete $cmds -l cmd -r --description 'Execute Ex command before loading any vimrc' complete $cmds -s d -r --description 'Use device as terminal (Amiga only)' complete $cmds -s i -r --description 'Set the viminfo file location' complete $cmds -s o -r --description 'Open stacked windows for each file' complete $cmds -s O -r --description 'Open side by side windows for each file' complete $cmds -s p -r --description 'Open tab pages for each file' complete $cmds -s q -r --description 'Start in quickFix mode' complete $cmds -s r -r --description 'Use swap files for recovery' complete $cmds -s s -r --description 'Source and execute script file' complete $cmds -s t -r --description 'Set the cursor to tag' complete $cmds -s T -r --description 'Terminal name' complete $cmds -s u -r --description 'Use alternative vimrc' complete $cmds -s U -r --description 'Use alternative vimrc in GUI mode' complete $cmds -s w -r --description 'Record all typed characters' complete $cmds -s W -r --description 'Record all typed characters (overwrite file)' complete $cmds -s A --description 'Start in Arabic mode' complete $cmds -s b --description 'Start in binary mode' complete $cmds -s C --description 'Behave mostly like vi' complete $cmds -s d --description 'Start in diff mode' complete $cmds -s D --description 'Debugging mode' complete $cmds -s e --description 'Start in Ex mode' complete $cmds -s E --description 'Start in improved Ex mode' complete $cmds -s f --description 'Start in foreground mode' complete $cmds -s F --description 'Start in Farsi mode' complete $cmds -s g --description 'Start in GUI mode' complete $cmds -s h --description 'Print help message and exit' complete $cmds -s H --description 'Start in Hebrew mode' complete $cmds -s L --description 'List swap files' complete $cmds -s l --description 'Start in lisp mode' complete $cmds -s m --description 'Disable file modification' complete $cmds -s M --description 'Disallow file modification' complete $cmds -s N --description 'Reset compatibility mode' complete $cmds -s n --description 'Don\'t use swap files' complete $cmds -s R --description 'Read only mode' complete $cmds -s r --description 'List swap files' complete $cmds -s s --description 'Start in silent mode' complete $cmds -s V --description 'Start in verbose mode' complete $cmds -s v --description 'Start in vi mode' complete $cmds -s x --description 'Use encryption when writing files' complete $cmds -s X --description 'Don\'t connect to X server' complete $cmds -s y --description 'Start in easy mode' complete $cmds -s Z --description 'Start in restricted mode' complete $cmds -o nb --description 'Become an editor server for NetBeans' complete $cmds -l no-fork --description 'Start in foreground mode' complete $cmds -l echo-wid --description 'Echo the Window ID on stdout (GTK GUI only)' complete $cmds -l help --description 'Print help message and exit' complete $cmds -l literal --description 'Do not expand wildcards' complete $cmds -l noplugin --description 'Skip loading plugins' complete $cmds -l remote --description 'Edit files on Vim server' complete $cmds -l remote-expr --description 'Evaluate expr on Vim server' complete $cmds -l remote-send --description 'Send keys to Vim server' complete $cmds -l remote-silent --description 'Edit files on Vim server' complete $cmds -l remote-wait --description 'Edit files on Vim server' complete $cmds -l remote-wait-silent --description 'Edit files on Vim server' complete $cmds -l serverlist --description 'List all Vim servers that can be found' complete $cmds -l servername --description 'Set server name' complete $cmds -l version --description 'Print version information and exit' complete $cmds -l socketid -r --description 'Run gvim in another window (GTK GUI only)' # plain vi (as bundled with SunOS 5.8) else # todo: # -wn : Set the default window size to n # +command : same as -c command complete $cmds -s s --description 'Suppress all interactive user feedback' complete $cmds -s C --description 'Encrypt/decrypt text' complete $cmds -s l --description 'Set up for editing LISP programs' complete $cmds -s L --description 'List saved file names after crash' complete $cmds -s R --description 'Read-only mode' complete $cmds -s S --description 'Use linear search for tags if tag file not sorted' complete $cmds -s v --description 'Start in display editing state' complete $cmds -s V --description 'Verbose mode' complete $cmds -s x --description 'Encrypt/decrypt text' complete $cmds -r -s r --description 'Recover file after crash' complete $cmds -r -s t --description 'Edit the file containing a tag' complete $cmds -r -c t --description 'Begin editing by executing the specified editor command' end end fish/share/functions/__fish_complete_wvdial_peers.fish000066400000000000000000000012341214535744100236650ustar00rootroot00000000000000function __fish_complete_wvdial_peers --description 'Complete wvdial peers' --argument cfgfiles set -q cfgfiles[0] or set -l cfgfiles /etc/wvdial.conf ~/.wvdialrc # test if there is an alternative config file specified set -l store_next for opt in (commandline -cpo) if set -q store_next[1] set store_next set cfgfiles $opt continue end switch $opt case -C --config set store_next true case '--config=*' set cfgfiles (echo $opt | sed 's/--config=//') end end for file in $cfgfiles if test -f $file cat $file | grep '\[Dialer' | sed 's/\[Dialer \(.\+\)\]/\1/' end end | sort -u | grep -v Defaults end fish/share/functions/__fish_complete_xsum.fish000066400000000000000000000015411214535744100221760ustar00rootroot00000000000000function __fish_complete_xsum --description 'Complete md5sum sha1 etc' --argument-names cmd complete -c $cmd -d "Compute and check $cmd message digest" -r complete -c $cmd -s b -l binary -d 'Read in binary mode' complete -c $cmd -s c -l check -d "Read $cmd sums from files and check them" complete -c $cmd -s t -l text -d 'Read in text mode' complete -c $cmd -l quiet -d 'Don\'t print OK for each successfully verified file' complete -c $cmd -l status -d 'Don\'t output anything, status code shows success' complete -c $cmd -s w -l warn -d 'Warn about improperly formatted checksum lines' complete -c $cmd -l strict -d 'With --check, exit non-zero for any invalid input' complete -c $cmd -l help -d 'Display help text' complete -c $cmd -l version -d 'Output version information and exit' end fish/share/functions/__fish_config_interactive.fish000066400000000000000000000165671214535744100231720ustar00rootroot00000000000000# Initializations that should only be performed when entering # interactive mode. # This function is called by the __fish_on_interactive function, which # is defined in config.fish. function __fish_config_interactive -d "Initializations that should be performed when entering interactive mode" # Make sure this function is only run once if set -q __fish_config_interactive_done return end set -g __fish_config_interactive_done # Set the correct configuration directory set -l configdir ~/.config if set -q XDG_CONFIG_HOME set configdir $XDG_CONFIG_HOME end # Migrate old (pre 1.22.0) init scripts if they exist if not set -q __fish_init_1_22_0 if test -f ~/.fish_history -o -f ~/.fish -o -d ~/.fish.d -a ! -d $configdir/fish # Perform upgrade of configuration file hierarchy if not test -d $configdir command mkdir $configdir >/dev/null end if test -d $configdir if command mkdir $configdir/fish # These files are sometimes overwritten to by fish, so # we want backups of them in case something goes wrong cp ~/.fishd.(hostname) $configdir/fish/fishd.(hostname).backup cp ~/.fish_history $configdir/fish/fish_history.backup # Move the files mv ~/.fish_history $configdir/fish/fish_history mv ~/.fish $configdir/fish/config.fish mv ~/.fish_inputrc $configdir/fish/fish_inputrc mv ~/.fish.d/functions $configdir/fish/functions mv ~/.fish.d/completions $configdir/fish/completions # # Move the fishd stuff from another shell to avoid concurrency problems # /bin/sh -c mv\ \~/.fishd.(hostname)\ $configdir/fish/fishd.(hostname)\;kill\ -9\ (echo %fishd) # Update paths to point to new configuration locations set fish_function_path (printf "%s\n" $fish_function_path|sed -e "s|/usr/local/etc/fish.d/|/usr/local/etc/fish/|") set fish_complete_path (printf "%s\n" $fish_complete_path|sed -e "s|/usr/local/etc/fish.d/|/usr/local/etc/fish/|") set fish_function_path (printf "%s\n" $fish_function_path|sed -e "s|$HOME/.fish.d/|$configdir/fish/|") set fish_complete_path (printf "%s\n" $fish_complete_path|sed -e "s|$HOME/.fish.d/|$configdir/fish/|") printf (_ "\nWARNING\n\nThe location for fish configuration files has changed to %s.\nYour old files have been moved to this location.\nYou can change to a different location by changing the value of the variable \$XDG_CONFIG_HOME.\n\n") $configdir end ^/dev/null end end # Make sure this is only done once set -U __fish_init_1_22_0 end # # If we are starting up for the first time, set various defaults # if not set -q __fish_init_1_50_0 if not set -q fish_greeting set -l line1 (printf (_ 'Welcome to fish, the friendly interactive shell') ) set -l line2 (printf (_ 'Type %shelp%s for instructions on how to use fish') (set_color green) (set_color normal)) set -U fish_greeting $line1\n$line2 end set -U __fish_init_1_50_0 # # Set various defaults using these throwaway functions # function set_default -d "Set a universal variable, unless it has already been set" if not set -q $argv[1] set -U -- $argv end end # Regular syntax highlighting colors set_default fish_color_normal normal set_default fish_color_command 005fd7 purple set_default fish_color_param 00afff cyan set_default fish_color_redirection normal set_default fish_color_comment red set_default fish_color_error red --bold set_default fish_color_escape cyan set_default fish_color_operator cyan set_default fish_color_quote brown set_default fish_color_autosuggestion 555 yellow set_default fish_color_valid_path --underline set_default fish_color_cwd green set_default fish_color_cwd_root red # Background color for matching quotes and parenthesis set_default fish_color_match cyan # Background color for search matches set_default fish_color_search_match --background=purple # Pager colors set_default fish_pager_color_prefix cyan set_default fish_pager_color_completion normal set_default fish_pager_color_description 555 yellow set_default fish_pager_color_progress cyan # # Directory history colors # set_default fish_color_history_current cyan # # Remove temporary functions for setting default variable values # functions -e set_default end # # Print a greeting # if functions -q fish_greeting fish_greeting else if set -q fish_greeting switch "$fish_greeting" case '' # If variable is empty, don't print anything, saves us a fork case '*' echo $fish_greeting end end end # # This event handler makes sure the prompt is repainted when # fish_color_cwd changes value. Like all event handlers, it can't be # autoloaded. # function __fish_repaint --on-variable fish_color_cwd --description "Event handler, repaints the prompt when fish_color_cwd changes" if status --is-interactive set -e __fish_prompt_cwd commandline -f repaint ^/dev/null end end function __fish_repaint_root --on-variable fish_color_cwd_root --description "Event handler, repaints the prompt when fish_color_cwd_root changes" if status --is-interactive set -e __fish_prompt_cwd commandline -f repaint ^/dev/null end end # # Completions for SysV startup scripts. These aren't bound to any # specific command, so they can't be autoloaded. # complete -x -p "/etc/init.d/*" -a start --description 'Start service' complete -x -p "/etc/init.d/*" -a stop --description 'Stop service' complete -x -p "/etc/init.d/*" -a status --description 'Print service status' complete -x -p "/etc/init.d/*" -a restart --description 'Stop and then start service' complete -x -p "/etc/init.d/*" -a reload --description 'Reload service configuration' # Make sure some key bindings are set if not set -q fish_key_bindings set -U fish_key_bindings fish_default_key_bindings end # Reload key bindings when binding variable change function __fish_reload_key_bindings -d "Reload key bindings when binding variable change" --on-variable fish_key_bindings # Do something nasty to avoid two forks if test "$fish_key_bindings" = fish_default_key_bindings fish_default_key_bindings #Load user key bindings if they are defined if functions --query fish_user_key_bindings > /dev/null fish_user_key_bindings end else eval $fish_key_bindings ^/dev/null end end # Load key bindings __fish_reload_key_bindings # Repaint screen when window changes size function __fish_winch_handler --on-signal winch commandline -f repaint end # The first time a command is not found, look for command-not-found # This is not cheap so we try to avoid doing it during startup function fish_command_not_found_setup --on-event fish_command_not_found # Remove fish_command_not_found_setup so we only execute this once functions --erase fish_command_not_found_setup # First check in /usr/lib, this is where modern Ubuntus place this command if test -f /usr/lib/command-not-found function fish_command_not_found_handler --on-event fish_command_not_found /usr/lib/command-not-found $argv end fish_command_not_found_handler $argv else # Ubuntu Feisty places this command in the regular path instead if type -p command-not-found > /dev/null 2> /dev/null function fish_command_not_found_handler --on-event fish_command_not_found command-not-found $argv end fish_command_not_found_handler $argv end end end end fish/share/functions/__fish_contains_opt.fish000066400000000000000000000014461214535744100220160ustar00rootroot00000000000000 function __fish_contains_opt -d "Checks if a specific option has been given in the current commandline" set -l next_short set -l short_opt set -l long_opt for i in $argv if test $next_short set next_short set short_opt $short_opt $i else switch $i case -s set next_short 1 case '-*' echo __fish_contains_opt: Unknown option $i return 1 case '**' set long_opt $long_opt $i end end end for i in $short_opt if test -z $i continue end if commandline -cpo | sgrep -- "^-"$i"\|^-[^-]*"$i >/dev/null return 0 end if commandline -ct | sgrep -- "^-"$i"\|^-[^-]*"$i >/dev/null return 0 end end for i in $long_opt if test -z $i continue end if contains -- --$i (commandline -cpo) return 0 end end return 1 end fish/share/functions/__fish_crux_packages.fish000066400000000000000000000002631214535744100221310ustar00rootroot00000000000000# a function to obtain a list of installed packages with CRUX pkgutils function __fish_crux_packages -d 'Obtain a list of installed packages' pkginfo -i|cut -d' ' -f1 end fish/share/functions/__fish_describe_command.fish000066400000000000000000000006771214535744100226010ustar00rootroot00000000000000# # This function is used internally by the fish command completion code # function __fish_describe_command -d "Command used to find descriptions for commands" apropos $argv ^/dev/null | awk -v FS=" +- +" '{ split($1, names, ", "); for (name in names) if (names[name] ~ /^'"$argv"'.* *\([18]\)/ ) { sub( "( |\t)*\\\([18]\\\)", "", names[name] ); sub( " \\\[.*\\\]", "", names[name] ); print names[name] "\t" $2; } }' end fish/share/functions/__fish_filter_ant_targets.fish000066400000000000000000000002471214535744100231740ustar00rootroot00000000000000function __fish_filter_ant_targets -d "Display targets within an ant build.xml file" sed -n "s/^.*]* name=[\"']\([^\"']*\)[\"'].*\$/\1/p" < $argv[1] end fish/share/functions/__fish_filter_mime.fish000066400000000000000000000010031214535744100215770ustar00rootroot00000000000000# # $argv[1] is a mimetype. The mimetype may contain wildcards. All # following arguments are filenames. Filenames matching the mimetype # are returned. # function __fish_filter_mime -d "Select files with a specific mimetype" set -l mime_search $argv[1] set -e argv[1] if not set -l mime (mimedb -f $argv) return 1 end if count $mime > /dev/null set -l res for i in (seq (count $mime)) switch $mime[$i] case $mime_search set res $res $argv[$i] end end printf "%s\n" $res end end fish/share/functions/__fish_git_prompt.fish000066400000000000000000000532301214535744100215000ustar00rootroot00000000000000# based off of the git-completion script that ships with git # # Written by Kevin Ballard # # This is heavily based off of the git-completion.bash script that ships with # git, which is Copyright (C) 2006,2007 Shawn O. Pearce . # The act of porting the code, along with any new code, are Copyright (C) 2012 # Kevin Ballard . # # By virtue of being based on the git-completion.bash script, this script is # distributed under the GNU General Public License, version 2.0. # # This script vends a function __fish_git_prompt which takes a format string, # exactly how the bash script works. This can be used in your fish_prompt # function. # # The behavior of __fish_git_prompt is very heavily based off of the bash # script's __fish_git_prompt function. As such, usage and customization is very # similar, although some extra flexibility is provided in this script. # # The argument to __fish_git_prompt will be displayed only if you are currently # in a git repository. The %s token will be the name of the branch. If HEAD is # not a branch, it attempts to show the relevant tag. The tag search is # controlled by the __fish_git_prompt_describe_style variable, with the # following values: # default (or unset) Any tag that exactly matches HEAD # contains Nearest annotated tag that contains HEAD # branch Nearest tag/branch that contains HEAD # describe Output of `git describe` # # In addition, if you set __fish_git_prompt_showdirtystate to a nonempty value, # unstaged (*) and staged (+) changes will be shown next to the branch name. # You can configure this per-repository with the bash.showDirtyState variable, # which defaults to true once __fish_git_prompt_showdirtystate is enabled. The # choice to leave the variable as 'bash' instead of renaming to 'fish' is done # to preserve compatibility with existing configured repositories. # # You can also see if currently something is stashed, by setting # __fish_git_prompt_showstashstate to a nonempty value. If something is # stashed, then a '$' will be shown next to the branch name. # # If you would like to see if there are untracked files, then you can set # __fish_git_prompt_showuntrackedfiles to a nonempty value. If there are # untracked files, then a '%' will be shown next to the branch name. # # If you would like to see the difference between HEAD and its upstream, set # __fish_git_prompt_showupstream to 'auto'. A "<" indicates you are behind, ">" # indicates you are ahead, and "<>" indicates you have diverged. You can # further control behavior by setting __fish_git_prompt_showupstream to a # space-separated list of values: # verbose show number of commits head/behind (+/-) upstream # legacy don't use the '--count' option available in recent versions # of git-rev-list # git always compare HEAD to @{upstream} # svn always compare HEAD to your SVN upstream # By default, __fish_git_prompt will compare HEAD to your SVN upstream if it # can find one, or @{upstream} otherwise. Once you have set # __fish_git_prompt_showupstream, you can override it on a per-repository basis # by setting the bash.showUpstream config variable. As before, this variable # remains named 'bash' to preserve compatibility. # # This fish-compatible version of __fish_git_prompt includes some additional # features on top of the above-documented bash-compatible features: # # The color for the branch name and each individual optional component can be # specified using __fish_git_prompt_color_, where is 'prefix', # 'suffix', 'bare', 'merging', 'branch', 'dirtystate', 'stagedstate', # 'invalidstate', 'stashstate', 'untrackedfiles', and 'upstream'. The variable # __fish_git_prompt_color is used for any component that does not have an # individual color set. Colors are specified as arguments to `set_color`. # # The characters used for the optional features can be configured using # __fish_git_prompt_char_, where is one of 'dirtystate', # 'stagedstate', 'invalidstate', 'stashstate', 'untrackedfiles', # 'upstream_equal', 'upstream_behind', 'upstream_ahead', and # 'upstream_diverged'. function __fish_git_prompt_show_upstream --description "Helper function for __fish_git_prompt" # Ask git-config for some config options set -l svn_remote set -l svn_prefix set -l upstream git set -l legacy set -l verbose set -l svn_url_pattern set -l show_upstream $__fish_git_prompt_showupstream git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showUpstream)$' ^/dev/null | tr '\0\n' '\n ' | while read -l key value switch $key case bash.showUpstream bash.showupstream set show_upstream $value test -n "$show_upstream"; or return case svn-remote.'*'.url set svn_remote $svn_remote $value set -l remote_prefix (/bin/sh -c 'echo "${1%.url}"' -- $key) set svn_prefix $svn_prefix $remote_prefix if test -n "$svn_url_pattern" set svn_url_pattern $svn_url_pattern"\|$value" else set svn_url_pattern $value end set upstream svn+git # default upstream is SVN if available, else git end end # parse configuration variables for option in $show_upstream switch $option case git svn set upstream $option case verbose set verbose 1 case legacy set legacy 1 end end # Find our upstream switch $upstream case git set upstream '@{upstream}' case svn\* # get the upstream from the 'git-svn-id: ...' in a commit message # (git-svn uses essentially the same procedure internally) set -l svn_upstream (git log --first-parent -1 --grep="^git-svn-id: \($svn_url_pattern\)" ^/dev/null) if test (count $svn_upstream) -ne 0 echo $svn_upstream[-1] | read -l _ svn_upstream _ set svn_upstream (/bin/sh -c 'echo "${1%@*}"' -- $svn_upstream) set -l cur_prefix for i in (seq (count $svn_remote)) set -l remote $svn_remote[$i] set -l mod_upstream (/bin/sh -c 'echo "${1#$2}"' -- $svn_upstream $remote) if test "$svn_upstream" != "$mod_upstream" # we found a valid remote set svn_upstream $mod_upstream set cur_prefix $svn_prefix[$i] break end end if test -z "$svn_upstream" # default branch name for checkouts with no layout: if test -n "$GIT_SVN_ID" set upstream $GIT_SVN_ID else set upstream git-svn end else set upstream (/bin/sh -c 'val=${1#/branches}; echo "${val#/}"' -- $svn_upstream) set -l fetch_val (git config "$cur_prefix".fetch) if test -n "$fetch_val" set -l IFS : echo "$fetch_val" | read -l trunk pattern set upstream (/bin/sh -c 'echo "${1%/$2}"' -- $pattern $trunk)/$upstream end end else if test $upstream = svn+git set upstream '@{upstream}' end end # Find how many commits we are ahead/behind our upstream set -l count if test -z "$legacy" set count (git rev-list --count --left-right $upstream...HEAD ^/dev/null) else # produce equivalent output to --count for older versions of git set -l os set -l commits (git rev-list --left-right $upstream...HEAD ^/dev/null; set os $status) if test $os -eq 0 set -l behind (count (for arg in $commits; echo $arg; end | grep '^<')) set -l ahead (count (for arg in $commits; echo $arg; end | grep -v '^<')) set count "$behind $ahead" else set count end end # calculate the result if test -z "$verbose" switch "$count" case '' # no upstream case "0 0" # equal to upstream echo $___fish_git_prompt_char_upstream_equal case "0 *" # ahead of upstream echo $___fish_git_prompt_char_upstream_ahead case "* 0" # behind upstream echo $___fish_git_prompt_char_upstream_behind case '*' # diverged from upstream echo $___fish_git_prompt_char_upstream_diverged end else echo $count | read -l behind ahead switch "$count" case '' # no upstream case "0 0" # equal to upstream echo " u=" case "0 *" # ahead of upstream echo " u+$ahead" case "* 0" # behind upstream echo " u-$behind" case '*' # diverged from upstream echo " u+$ahead-$behind" end end end function __fish_git_prompt --description "Prompt function for Git" # find the enclosing git dir set -l git_dir if test -d .git set git_dir .git else set git_dir (git rev-parse --git-dir ^/dev/null) end test -n "$git_dir"; or return set -l r set -l b if test -f $git_dir/rebase-merge/interactive set r "|REBASE-i" set b (cat $git_dir/rebase-merge/head-name) else if test -d $git_dir/rebase-merge set r "|REBASE-m" set b (cat $git_dir/rebase-merge/head-name) else if test -d $git_dir/rebase-apply if test -f $git_dir/rebase-apply/rebasing set r "|REBASE" else if test -f $git_dir/rebase-apply/applying set r "|AM" else set r "|AM/REBASE" end else if test -f $git_dir/MERGE_HEAD set r "|MERGING" else if test -f $git_dir/CHERRY_PICK_HEAD set r "|CHERRY-PICKING" else if test -f $git_dir/BISECT_LOG set r "|BISECTING" end set -l os set b (git symbolic-ref HEAD ^/dev/null; set os $status) if test $os -ne 0 set b (switch "$__fish_git_prompt_describe_style" case contains git describe --contains HEAD case branch git describe --contains --all HEAD case describe git describe HEAD case default '*' git describe --tags --exact-match HEAD end ^/dev/null; set os $status) if test $os -ne 0 set b (cut -c1-7 $git_dir/HEAD ^/dev/null; set os $status) if test $os -ne 0 set b unknown end end set b "($b)" end end set -l w set -l i set -l s set -l u set -l c set -l p __fish_git_prompt_validate_chars if test "true" = (git rev-parse --is-inside-git-dir ^/dev/null) if test "true" = (git rev-parse --is-bare-repository ^/dev/null) set c "BARE:" else set b "GIT_DIR!" end else if test "true" = (git rev-parse --is-inside-work-tree ^/dev/null) if test -n "$__fish_git_prompt_showdirtystate" set -l config (git config --bool bash.showDirtyState) if test "$config" != "false" git diff --no-ext-diff --quiet --exit-code; or set w $___fish_git_prompt_char_dirtystate if git rev-parse --quiet --verify HEAD >/dev/null git diff-index --cached --quiet HEAD --; or set i $___fish_git_prompt_char_stagedstate else set i $___fish_git_prompt_char_invalidstate end end end if test -n "$__fish_git_prompt_showstashstate" git rev-parse --verify refs/stash >/dev/null ^&1; and set s $___fish_git_prompt_char_stashstate end if test -n "$__fish_git_prompt_showuntrackedfiles" set -l files (git ls-files --others --exclude-standard) if test -n "$files" set u $___fish_git_prompt_char_untrackedfiles end end if test -n "$__fish_git_prompt_showupstream" set p (__fish_git_prompt_show_upstream) end end __fish_git_prompt_validate_colors if test -n "$w" set w "$___fish_git_prompt_color_dirtystate$w$___fish_git_prompt_color_dirtystate_done" end if test -n "$i" set i "$___fish_git_prompt_color_stagedstate$i$___fish_git_prompt_color_stagedstate_done" end if test -n "$s" set s "$___fish_git_prompt_color_stashstate$s$___fish_git_prompt_color_stashstate_done" end if test -n "$u" set u "$___fish_git_prompt_color_untrackedfiles$u$___fish_git_prompt_color_untrackedfiles_done" end set -l f "$w$i$s$u" set -l format $argv[1] if test -z "$format" set format " (%s)" end if test -n "$f" set f " $f" end set b (/bin/sh -c 'echo "${1#refs/heads/}"' -- $b) if test -n "$b" set b "$___fish_git_prompt_color_branch$b$___fish_git_prompt_color_branch_done" end if test -n "$c" set c "$___fish_git_prompt_color_bare$c$___fish_git_prompt_color_bare_done" end if test -n "$r" set r "$___fish_git_prompt_color_merging$r$___fish_git_prompt_color_merging_done" end if test -n "$p" set p "$___fish_git_prompt_color_upstream$p$___fish_git_prompt_color_upstream_done" end printf "%s$format%s" "$___fish_git_prompt_color_prefix" "$___fish_git_prompt_color_prefix_done$c$b$f$r$p$___fish_git_prompt_color_suffix" "$___git_ps_color_suffix_done" end ### helper functions function __fish_git_prompt_validate_chars --description "__fish_git_prompt helper, checks char variables" if not set -q ___fish_git_prompt_char_dirtystate set -g ___fish_git_prompt_char_dirtystate (set -q __fish_git_prompt_char_dirtystate; and echo $__fish_git_prompt_char_dirtystate; or echo '*') end if not set -q ___fish_git_prompt_char_stagedstate set -g ___fish_git_prompt_char_stagedstate (set -q __fish_git_prompt_char_stagedstate; and echo $__fish_git_prompt_char_stagedstate; or echo '+') end if not set -q ___fish_git_prompt_char_invalidstate set -g ___fish_git_prompt_char_invalidstate (set -q __fish_git_prompt_char_invalidstate; and echo $__fish_git_prompt_char_invalidstate; or echo '#') end if not set -q ___fish_git_prompt_char_stashstate set -g ___fish_git_prompt_char_stashstate (set -q __fish_git_prompt_char_stashstate; and echo $__fish_git_prompt_char_stashstate; or echo '$') end if not set -q ___fish_git_prompt_char_untrackedfiles set -g ___fish_git_prompt_char_untrackedfiles (set -q __fish_git_prompt_char_untrackedfiles; and echo $__fish_git_prompt_char_untrackedfiles; or echo '%') end if not set -q ___fish_git_prompt_char_upstream_equal set -g ___fish_git_prompt_char_upstream_equal (set -q __fish_git_prompt_char_upstream_equal; and echo $__fish_git_prompt_char_upstream_equal; or echo '=') end if not set -q ___fish_git_prompt_char_upstream_behind set -g ___fish_git_prompt_char_upstream_behind (set -q __fish_git_prompt_char_upstream_behind; and echo $__fish_git_prompt_char_upstream_behind; or echo '<') end if not set -q ___fish_git_prompt_char_upstream_ahead set -g ___fish_git_prompt_char_upstream_ahead (set -q __fish_git_prompt_char_upstream_ahead; and echo $__fish_git_prompt_char_upstream_ahead; or echo '>') end if not set -q ___fish_git_prompt_char_upstream_diverged set -g ___fish_git_prompt_char_upstream_diverged (set -q __fish_git_prompt_char_upstream_diverged; and echo $__fish_git_prompt_char_upstream_diverged; or echo '<>') end end function __fish_git_prompt_validate_colors --description "__fish_git_prompt helper, checks color variables" if not set -q ___fish_git_prompt_color if test -n "$__fish_git_prompt_color" set -g ___fish_git_prompt_color (set_color $__fish_git_prompt_color) set -g ___fish_git_prompt_color_done (set_color normal) else set -g ___fish_git_prompt_color '' set -g ___fish_git_prompt_color_done '' end end if not set -q ___fish_git_prompt_color_prefix if test -n "$__fish_git_prompt_color_prefix" set -g ___fish_git_prompt_color_prefix (set_color $__fish_git_prompt_color_prefix) set -g ___fish_git_prompt_color_prefix_done (set_color normal) else set -g ___fish_git_prompt_color_prefix $___fish_git_prompt_color set -g ___fish_git_prompt_color_prefix_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_suffix if test -n "$__fish_git_prompt_color_suffix" set -g ___fish_git_prompt_color_suffix (set_color $__fish_git_prompt_color_suffix) set -g ___fish_git_prompt_color_suffix_done (set_color normal) else set -g ___fish_git_prompt_color_suffix $___fish_git_prompt_color set -g ___fish_git_prompt_color_suffix_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_bare if test -n "$__fish_git_prompt_color_bare" set -g ___fish_git_prompt_color_bare (set_color $__fish_git_prompt_color_bare) set -g ___fish_git_prompt_color_bare_done (set_color normal) else set -g ___fish_git_prompt_color_bare $___fish_git_prompt_color set -g ___fish_git_prompt_color_bare_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_merging if test -n "$__fish_git_prompt_color_merging" set -g ___fish_git_prompt_color_merging (set_color $__fish_git_prompt_color_merging) set -g ___fish_git_prompt_color_merging_done (set_color normal) else set -g ___fish_git_prompt_color_merging $___fish_git_prompt_color set -g ___fish_git_prompt_color_merging_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_branch if test -n "$__fish_git_prompt_color_branch" set -g ___fish_git_prompt_color_branch (set_color $__fish_git_prompt_color_branch) set -g ___fish_git_prompt_color_branch_done (set_color normal) else set -g ___fish_git_prompt_color_branch $___fish_git_prompt_color set -g ___fish_git_prompt_color_branch_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_dirtystate if test -n "$__fish_git_prompt_color_dirtystate" set -g ___fish_git_prompt_color_dirtystate (set_color $__fish_git_prompt_color_dirtystate) set -g ___fish_git_prompt_color_dirtystate_done (set_color normal) else set -g ___fish_git_prompt_color_dirtystate $___fish_git_prompt_color set -g ___fish_git_prompt_color_dirtystate_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_stagedstate if test -n "$__fish_git_prompt_color_stagedstate" set -g ___fish_git_prompt_color_stagedstate (set_color $__fish_git_prompt_color_stagedstate) set -g ___fish_git_prompt_color_stagedstate_done (set_color normal) else set -g ___fish_git_prompt_color_stagedstate $___fish_git_prompt_color set -g ___fish_git_prompt_color_stagedstate_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_invalidstate if test -n "$__fish_git_prompt_color_invalidstate" set -g ___fish_git_prompt_color_invalidstate (set_color $__fish_git_prompt_color_invalidstate) set -g ___fish_git_prompt_color_invalidstate_done (set_color normal) else set -g ___fish_git_prompt_color_invalidstate $___fish_git_prompt_color set -g ___fish_git_prompt_color_invalidstate_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_stashstate if test -n "$__fish_git_prompt_color_stashstate" set -g ___fish_git_prompt_color_stashstate (set_color $__fish_git_prompt_color_stashstate) set -g ___fish_git_prompt_color_stashstate_done (set_color normal) else set -g ___fish_git_prompt_color_stashstate $___fish_git_prompt_color set -g ___fish_git_prompt_color_stashstate_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_untrackedfiles if test -n "$__fish_git_prompt_color_untrackedfiles" set -g ___fish_git_prompt_color_untrackedfiles (set_color $__fish_git_prompt_color_untrackedfiles) set -g ___fish_git_prompt_color_untrackedfiles_done (set_color normal) else set -g ___fish_git_prompt_color_untrackedfiles $___fish_git_prompt_color set -g ___fish_git_prompt_color_untrackedfiles_done $___fish_git_prompt_color_done end end if not set -q ___fish_git_prompt_color_upstream if test -n "$__fish_git_prompt_color_upstream" set -g ___fish_git_prompt_color_upstream (set_color $__fish_git_prompt_color_upstream) set -g ___fish_git_prompt_color_upstream_done (set_color normal) else set -g ___fish_git_prompt_color_upstream $___fish_git_prompt_color set -g ___fish_git_prompt_color_upstream_done $___fish_git_prompt_color_done end end end set -l varargs for var in repaint describe_style showdirtystate showstashstate showuntrackedfiles showupstream set varargs $varargs --on-variable __fish_git_prompt_$var end function __fish_git_prompt_repaint $varargs --description "Event handler, repaints prompt when functionality changes" if status --is-interactive commandline -f repaint ^/dev/null end end set -l varargs for var in '' _prefix _suffix _bare _merging _branch _dirtystate _stagedstate _invalidstate _stashstate _untrackedfiles _upstream set varargs $varargs --on-variable __fish_git_prompt_color$var end function __fish_git_prompt_repaint_color $varargs --description "Event handler, repaints prompt when any color changes" if status --is-interactive set -l var $argv[3] set -e _$var set -e _{$var}_done if test $var = __fish_git_prompt_color # reset all the other colors too for name in prefix suffix bare merging branch dirtystate stagedstate invalidstate stashstate untrackedfiles upstream set -e ___fish_git_prompt_color_$name set -e ___fish_git_prompt_color_{$name}_done end end commandline -f repaint ^/dev/null end end set -l varargs for var in dirtystate stagedstate invalidstate stashstate untrackedfiles upstream_equal upstream_behind upstream_ahead upstream_diverged set varargs $varargs --on-variable __fish_git_prompt_char_$var end function __fish_git_prompt_repaint_char $varargs --description "Event handler, repaints prompt when any char changes" if status --is-interactive set -e _$argv[3] commandline -f repaint ^/dev/null end end fish/share/functions/__fish_gnu_complete.fish000066400000000000000000000013031214535744100217670ustar00rootroot00000000000000function __fish_gnu_complete -d "Wrapper for the complete built-in. Skips the long completions on non-GNU systems" set is_gnu 0 set -l argv_out # Check if we are using a gnu system for i in $argv switch $i case -g --is-gnu set is_gnu 1 case '*' set argv_out $argv_out $i end end set argv $argv_out set argv_out set -l skip_next 0 # Remove long option if not on a gnu system switch $is_gnu case 0 for i in $argv switch $skip_next case 1 set skip_next 0 continue end switch $i case -l --long set skip_next 1 continue end set argv_out $argv_out $i end set argv $argv_out end complete $argv end fish/share/functions/__fish_is_first_token.fish000066400000000000000000000003431214535744100223330ustar00rootroot00000000000000 function __fish_is_first_token -d 'Test if no non-switch argument has been specified yet' set cmd (commandline -poc) set -e cmd[1] for i in $cmd switch $i case '-*' case '*' return 1; end end return 0 end fish/share/functions/__fish_is_token_n.fish000066400000000000000000000003521214535744100214410ustar00rootroot00000000000000function __fish_is_token_n --description 'Test if current token is on Nth place' --argument n set -l num (count (commandline -poc)) #if test $cur expr $n = $num + 1 > /dev/null #else #expr $n '=' $num + 1 > /dev/null #end end fish/share/functions/__fish_list_current_token.fish000066400000000000000000000007071214535744100232320ustar00rootroot00000000000000 # # This function is bound to Alt-L, it is used to list the contents of # the directory under the cursor # function __fish_list_current_token -d "List contents of token under the cursor if it is a directory, otherwise list the contents of the current directory" set val (eval echo (commandline -t)) if test -d $val ls $val else set dir (dirname $val) if test $dir != . -a -d $dir ls $dir else ls end end commandline -f repaint end fish/share/functions/__fish_make_completion_signals.fish000066400000000000000000000015751214535744100242070ustar00rootroot00000000000000function __fish_make_completion_signals --description 'Make list of kill signals for completion' set -q __kill_signals; and return 0 if kill -L ^/dev/null >/dev/null # Debian and some related systems use 'kill -L' to write out a numbered list # of signals. Use this to complete on both number _and_ on signal name. complete -c kill -s L --description "List codes and names of available signals" set -g __kill_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/^ \+//' | sgrep -E '^[^ ]+') else # Posix systems print out the name of a signal using 'kill -l # SIGNUM', so we use this instead. complete -c kill -s l --description "List names of available signals" for i in (seq 31) set -g __kill_signals $signals $i" "(kill -l $i) end end end fish/share/functions/__fish_move_last.fish000066400000000000000000000011231214535744100212770ustar00rootroot00000000000000function __fish_move_last -d "Move the last element of a directory history from src to dest" set -l src $argv[1] set -l dest $argv[2] set -l size_src (count $$src) if test $size_src = 0 # Cannot make this step printf (_ "Hit end of history...\n") return 1 end # Append current dir to the end of the destination set -g (echo $dest) $$dest (command pwd) set ssrc $$src # Change dir to the last entry in the source dir-hist builtin cd $ssrc[$size_src] # Keep all but the last from the source dir-hist set -e (echo $src)\[$size_src] # All ok, return success return 0 end fish/share/functions/__fish_no_arguments.fish000066400000000000000000000003271214535744100220140ustar00rootroot00000000000000 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 fish/share/functions/__fish_not_contain_opt.fish000066400000000000000000000014421214535744100225070ustar00rootroot00000000000000function __fish_not_contain_opt -d "Checks that a specific option is not in the current command line" set -l next_short set -l short_opt set -l long_opt for i in $argv if test $next_short set next_short set short_opt $short_opt $i else switch $i case -s set next_short 1 case '-*' echo __fish_contains_opt: Unknown option $i return 1 case '**' set long_opt $long_opt $i end end end for i in $short_opt if test -z $i continue end if commandline -cpo | sgrep -- "^-"$i"\|^-[^-]*"$i >/dev/null return 1 end if commandline -ct | sgrep -- "^-"$i"\|^-[^-]*"$i >/dev/null return 1 end end for i in $long_opt if test -z $i continue end if contains -- --$i (commandline -cpo) return 1 end end return 0 end fish/share/functions/__fish_paginate.fish000066400000000000000000000003521214535744100211010ustar00rootroot00000000000000function __fish_paginate -d "Paginate the current command using the users default pager" set -l cmd less if set -q PAGER set cmd $PAGER end if commandline -j|grep -v "$cmd *\$" >/dev/null commandline -aj "|$cmd;" end end fish/share/functions/__fish_ports_dirs.fish000066400000000000000000000002251214535744100215000ustar00rootroot00000000000000# a function to print a list of ports local collections function __fish_ports_dirs -d 'Obtain a list of ports local collections' ls /usr/ports end fish/share/functions/__fish_print_abook_emails.fish000066400000000000000000000002001214535744100231420ustar00rootroot00000000000000function __fish_print_abook_emails --description 'Print email addresses (abook)' abook --mutt-query "" | egrep -v '^\s*$' end fish/share/functions/__fish_print_addresses.fish000066400000000000000000000002361214535744100225030ustar00rootroot00000000000000function __fish_print_addresses --description "Print a list of known network addresses" /sbin/ifconfig |sgrep 'inet addr'|cut -d : -f 2|cut -d ' ' -f 1 end fish/share/functions/__fish_print_arch_daemons.fish000066400000000000000000000001771214535744100231550ustar00rootroot00000000000000function __fish_print_arch_daemons --description 'Print arch daemons' find /etc/rc.d/ -executable -type f -printf '%f\n' end fish/share/functions/__fish_print_commands.fish000066400000000000000000000003311214535744100223230ustar00rootroot00000000000000function __fish_print_commands --description "Print a list of documented fish commands" if test -d $__fish_datadir/man/man1/ find $__fish_datadir/man/man1/ -type f -name \*.1 -execdir basename '{}' .1 ';' end end fish/share/functions/__fish_print_debian_services.fish000066400000000000000000000002601214535744100236500ustar00rootroot00000000000000function __fish_print_debian_services --description 'Prints services installed' for service in /etc/init.d/* if [ -x $service ] basename $service end end end fish/share/functions/__fish_print_encodings.fish000066400000000000000000000001671214535744100225020ustar00rootroot00000000000000function __fish_print_encodings -d "Complete using available character encodings" iconv --list|sed -e 's|//||' end fish/share/functions/__fish_print_filesystems.fish000066400000000000000000000005211214535744100230720ustar00rootroot00000000000000 function __fish_print_filesystems -d "Print a list of all known filesystem types" set -l fs adfs affs autofs coda coherent cramfs devpts efs ext ext2 ext3 set fs $fs hfs hpfs iso9660 jfs minix msdos ncpfs nfs ntfs proc qnx4 ramfs set fs $fs reiserfs romfs smbfs sysv tmpfs udf ufs umsdos vfat xenix xfs xiafs printf "%s\n" $fs end fish/share/functions/__fish_print_function_prototypes.fish000066400000000000000000000003461214535744100246650ustar00rootroot00000000000000 function __fish_print_function_prototypes -d "Prints the names of all function prototypes found in the headers in the current directory" cat *.h*|sed -n "s/^\(.*[^[a-zA-Z_0-9]\|\)\([a-zA-Z_][a-zA-Z_0-9]*\) *(.*);.*\$/\2/p" end fish/share/functions/__fish_print_help.fish000066400000000000000000000023361214535744100214610ustar00rootroot00000000000000 function __fish_print_help --description "Print help message for the specified fish function or builtin" --argument item switch $argv[1] case '.' set item source case '*' set item $argv[1] end # Do nothing if the file does not exist if not test -e "$__fish_datadir/man/man1/$item.1" return end # These two expressions take care of underlines (Should be italic) set -l cmd1 s/_\x08'\(.\)'/(set_color --underline)\\1(set_color normal)/g set -l cmd2 s/'\(.\)'\x08_/(set_color --underline)\\1(set_color normal)/g # This expression should take care of bold characters. It's not # waterproof, since it doesn't check that the same character is # used both before and after the backspace, since regular # languages don't allow backreferences. set -l cmd3 s/.\x08'\(.\)'/(set_color --bold)\\1(set_color normal)/g # Combine all expressions in a single variable set -l sed_cmd -e $cmd1 -e $cmd2 -e $cmd3 # Render help output, save output into the variable 'help' set -l help (nroff -man "$__fish_datadir/man/man1/$item.1" ^ /dev/null ) set -l lines (count $help) # Print an empty line first echo # Filter and print help printf "%s\n" $help| tail -n (expr $lines - 5) | head -n (expr $lines - 8) | sed $sed_cmd end fish/share/functions/__fish_print_hostnames.fish000066400000000000000000000013521214535744100225270ustar00rootroot00000000000000 function __fish_print_hostnames -d "Print a list of known hostnames" # Print all hosts from /etc/hosts if test -x /usr/bin/getent getent hosts | tr -s ' ' ' ' | cut -d ' ' -f 2- | tr ' ' '\n' else if test -r /etc/hosts tr -s ' \t' ' ' < /etc/hosts | sed 's/ *#.*//' | cut -s -d ' ' -f 2- | sgrep -o '[^ ]*' end # Print nfs servers from /etc/fstab if test -r /etc/fstab sgrep 2'|awk '{print $1}' end fish/share/functions/__fish_print_lpr_options.fish000066400000000000000000000002071214535744100230740ustar00rootroot00000000000000function __fish_print_lpr_options --description 'Print lpr options' lpoptions -l ^ /dev/null | sed 's+\(.*\)/\(.*\):.*$+\1\t\2+' end fish/share/functions/__fish_print_lpr_printers.fish000066400000000000000000000002141214535744100232450ustar00rootroot00000000000000function __fish_print_lpr_printers --description 'Print lpr printers' lpstat -p ^ /dev/null | sed 's/^\S*\s\(\S*\)\s\(.*\)$/\1\t\2/' end fish/share/functions/__fish_print_lsblk_columns.fish000066400000000000000000000002431214535744100233730ustar00rootroot00000000000000function __fish_print_lsblk_columns --description 'Print available lsblk columns' lsblk --help | sed '1,/Available columns:/d; /^$/,$d; s/^\s\+//; s/\s/\t/' end fish/share/functions/__fish_print_make_targets.fish000066400000000000000000000005331214535744100231740ustar00rootroot00000000000000function __fish_print_make_targets set files Makefile makefile GNUmakefile # Some seds (e.g. on Mac OS X), don't support \n in the RHS # Use a literal newline instead # http://sed.sourceforge.net/sedfaq4.html#s4.1 sgrep -h -E '^[^#%=$[:space:]][^#%=$]*:([^=]|$)' $files | cut -d ":" -f 1 | sed -e 's/^ *//;s/ *$//;s/ */\\ /g' ^/dev/null end fish/share/functions/__fish_print_mounted.fish000066400000000000000000000002341214535744100221770ustar00rootroot00000000000000function __fish_print_mounted --description 'Print mounted devices' cat /etc/mtab | cut -d " " -f 1-2|tr " " \n|sed -e "s/[0-9\.]*:\//\//"|sgrep "^/" end fish/share/functions/__fish_print_packages.fish000066400000000000000000000050451214535744100223070ustar00rootroot00000000000000 function __fish_print_packages # apt-cache is much, much faster than rpm, and can do this in real # time. We use it if available. switch (commandline -tc) case '-**' return end #Get the word 'Package' in the current language set -l package (_ Package) if type -f apt-cache >/dev/null # Apply the following filters to output of apt-cache: # 1) Remove package names with parentesis in them, since these seem to not correspond to actual packages as reported by rpm # 2) Remove package names that are .so files, since these seem to not correspond to actual packages as reported by rpm # 3) Remove path information such as /usr/bin/, as rpm packages do not have paths apt-cache --no-generate pkgnames (commandline -tc)|sgrep -v \( |sgrep -v '\.so\(\.[0-9]\)*$'|sed -e 's/\/.*\///'|sed -e 's/$/'\t$package'/' return end # yum is slow, just like rpm, so go to the background if type -f /usr/share/yum-cli/completion-helper.py >/dev/null # If the cache is less than six hours old, we do not recalculate it set cache_file /tmp/.yum-cache.$USER if test -f $cache_file cat $cache_file set age (math (date +%s) - (stat -c '%Y' $cache_file)) set max_age 21600 if test $age -lt $max_age return end end # Remove package version information from output and pipe into cache file /usr/share/yum-cli/completion-helper.py list all -d 0 -C >$cache_file | cut -d '.' -f 1 | sed '1d' | sed '/^\s/d' | sed -e 's/$/'\t$package'/' & end # Rpm is too slow for this job, so we set it up to do completions # as a background job and cache the results. if type -f rpm >/dev/null # If the cache is less than five minutes old, we do not recalculate it set cache_file /tmp/.rpm-cache.$USER if test -f $cache_file cat $cache_file set age (math (date +%s) - (stat -c '%Y' $cache_file)) set max_age 250 if test $age -lt $max_age return end end # 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 # eix is MUCH faster than emerge so use it if it is available if type -f eix > /dev/null eix --only-names "^"(commandline -tc) | cut -d/ -f2 return else # FIXME? Seems to be broken if type -f emerge >/dev/null emerge -s \^(commandline -tc) |sgrep "^*" |cut -d\ -f3 |cut -d/ -f2 return end end end fish/share/functions/__fish_print_svn_rev.fish000066400000000000000000000005361214535744100222130ustar00rootroot00000000000000function __fish_print_svn_rev --description 'Print svn revisions' svn info | grep "Last Changed Rev" | cut --delimiter " " --fields 4 echo \{\tRevision at start of the date echo HEAD\tLatest in repository echo BASE\tBase rev of item\'s working copy echo COMMITTED\tLatest commit at or befor base echo PREV\tRevision just before COMMITTED end fish/share/functions/__fish_print_users.fish000066400000000000000000000003021214535744100216610ustar00rootroot00000000000000 function __fish_print_users --description "Print a list of local users" if test -x /usr/bin/getent getent passwd | cut -d : -f 1 else sgrep -ve '^#' /etc/passwd | cut -d : -f 1 end end fish/share/functions/__fish_print_xdg_mimeapps.fish000066400000000000000000000003241214535744100232010ustar00rootroot00000000000000function __fish_print_xdg_mimeapps --description 'Print xdg mime applications' find ~/.local/share/applications/ /usr/share/applications/ -name \*.desktop \( -type f -or -type l \) -printf '%P\n' | sort -u end fish/share/functions/__fish_print_xdg_mimetypes.fish000066400000000000000000000003671214535744100234110ustar00rootroot00000000000000function __fish_print_xdg_mimetypes --description 'Print XDG mime types' cat ~/.local/share/applications/mimeinfo.cache | grep -v "\[MIME Cache\]" | tr = \t cat /usr/share/applications/mimeinfo.cache | grep -v "\[MIME Cache\]" | tr = \t end fish/share/functions/__fish_print_xrandr_modes.fish000066400000000000000000000004541214535744100232150ustar00rootroot00000000000000function __fish_print_xrandr_modes --description 'Print xrandr modes' set -l out xrandr | sed '/^Screen/d; s/^ \+/mode: /' | while read -l output mode misc switch $output case mode: echo $mode\t(echo $misc | sed 's/\(^ \+\)\|\( *$\)//') [$out] case '*' set out $output end end end fish/share/functions/__fish_print_xrandr_outputs.fish000066400000000000000000000002161214535744100236250ustar00rootroot00000000000000function __fish_print_xrandr_outputs --description 'Print xrandr outputs' xrandr | sed '/^Screen\|^ /d; s/^\(\S\+\) \+\(.\+\)/\1\t\2/' end fish/share/functions/__fish_print_xwindows.fish000066400000000000000000000003021214535744100224020ustar00rootroot00000000000000function __fish_print_xwindows --description 'Print X windows' xwininfo -root -children | grep '^\s\+0x' | sed '/(has no name)/d; s/^\s*\(\S\+\)\s\+"\(.\+\)":\s\+(\(.*\)).*$/\1\t\2 (\3)/' end fish/share/functions/__fish_prt_no_subcommand.fish000066400000000000000000000010321214535744100230160ustar00rootroot00000000000000# A function to verify if prt-get (the crux package management tool) needs to be completed by a further command function __fish_prt_no_subcommand -d 'Test if prt-get has yet to be given the command' for i in (commandline -opc) if contains -- $i install depinst grpinst update remove sysup lock unlock listlocked diff quickdiff search dsearch fsearch info path readme depends quickdep dependent deptree dup list printf listinst listorphans isinst current ls cat edit help dumpconfig version cache return 1 end end return 0 end fish/share/functions/__fish_prt_packages.fish000066400000000000000000000002441214535744100217540ustar00rootroot00000000000000# a function to obtain a list of installed packages with prt-get function __fish_prt_packages -d 'Obtain a list of installed packages' prt-get listinst end fish/share/functions/__fish_prt_ports.fish000066400000000000000000000001751214535744100213500ustar00rootroot00000000000000# a function to obtain a list of ports with prt-get function __fish_prt_ports -d 'Obtain a list of ports' prt-get list end fish/share/functions/__fish_prt_use_package.fish000066400000000000000000000004511214535744100224450ustar00rootroot00000000000000# a function to verify if prt-get should have packages as potential completion function __fish_prt_use_package -d 'Test if prt-get should have packages as potential completion' for i in (commandline -opc) if contains -- $i update remove lock unlock current return 0 end end return 1 end fish/share/functions/__fish_prt_use_port.fish000066400000000000000000000005411214535744100220360ustar00rootroot00000000000000# a function to test if prt-get should have ports as potential completions function __fish_prt_use_port -d 'Test if prt-get should have ports as potential completion' for i in (commandline -opc) if contains -- $i install depinst grpinst diff depends quickdep dependent deptree isinst info path readme ls cat edit return 0 end end return 1 end fish/share/functions/__fish_seen_subcommand_from.fish000066400000000000000000000005411214535744100234760ustar00rootroot00000000000000# # Test to see if we've seen a subcommand from a list. # This logic may seem backwards, but the commandline will often be much shorter # than the list # function __fish_seen_subcommand_from set -l cmd (commandline -poc) set -e cmd[1] for i in $cmd if contains -- $i $argv return 0 end end return 1 end fish/share/functions/__fish_test_arg.fish000066400000000000000000000003171214535744100211220ustar00rootroot00000000000000 function __fish_test_arg --description "Test if the token under the cursor matches the specified wildcard" switch (commandline -ct) case $argv return 0 end return 1 end fish/share/functions/__fish_use_subcommand.fish000066400000000000000000000003651214535744100223210ustar00rootroot00000000000000 function __fish_use_subcommand -d "Test if a non-switch argument has been given in the current commandline" set -l cmd (commandline -poc) set -e cmd[1] for i in $cmd switch $i case '-*' continue end return 1 end return 0 end fish/share/functions/__terlar_git_prompt.fish000066400000000000000000000037761214535744100220520ustar00rootroot00000000000000set -gx fish_color_git_clean green set -gx fish_color_git_staged yellow set -gx fish_color_git_dirty red set -gx fish_color_git_added green set -gx fish_color_git_modified blue set -gx fish_color_git_renamed magenta set -gx fish_color_git_copied magenta set -gx fish_color_git_deleted red set -gx fish_color_git_untracked yellow set -gx fish_color_git_unmerged red set -gx fish_prompt_git_status_added '✚' set -gx fish_prompt_git_status_modified '*' set -gx fish_prompt_git_status_renamed 'âžœ' set -gx fish_prompt_git_status_copied '⇒' set -gx fish_prompt_git_status_deleted '✖' set -gx fish_prompt_git_status_untracked '?' set -gx fish_prompt_git_status_unmerged '!' set -gx fish_prompt_git_status_order added modified renamed copied deleted untracked unmerged function __terlar_git_prompt --description 'Write out the git prompt' set -l branch (git rev-parse --abbrev-ref HEAD ^/dev/null) if test -z $branch return end echo -n '|' set -l index (git status --porcelain ^/dev/null|cut -c 1-2|sort -u) if test -z "$index" set_color $fish_color_git_clean echo -n $branch'✓' set_color normal return end set -l gs set -l staged for i in $index if echo $i | grep '^[AMRCD]' >/dev/null set staged 1 end switch $i case 'A ' ; set gs $gs added case 'M ' ' M' ; set gs $gs modified case 'R ' ; set gs $gs renamed case 'C ' ; set gs $gs copied case 'D ' ' D' ; set gs $gs deleted case '\?\?' ; set gs $gs untracked case 'U*' '*U' 'DD' 'AA'; set gs $gs unmerged end end if set -q staged[1] set_color $fish_color_git_staged else set_color $fish_color_git_dirty end echo -n $branch'âš¡' for i in $fish_prompt_git_status_order if contains $i in $gs set -l color_name fish_color_git_$i set -l status_name fish_prompt_git_status_$i set_color $$color_name echo -n $$status_name end end set_color normal end fish/share/functions/alias.fish000066400000000000000000000023711214535744100170760ustar00rootroot00000000000000 function alias --description "Legacy function for creating shellscript functions using an alias-like syntax" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help alias return 0 end end set -l name set -l body set -l prefix switch (count $argv) case 0 echo "Fish implements aliases using functions. Use 'functions' builtin to see list of functions and 'functions function_name' to see function definition, type 'help alias' for more information." return 1 case 1 # Some seds (e.g. on Mac OS X), don't support \n in the RHS # Use a literal newline instead # http://sed.sourceforge.net/sedfaq4.html#s4.1 set -l tmp (echo $argv|sed -e "s/\([^=]\)=/\1\\ /") set name $tmp[1] set body $tmp[2] case 2 set name $argv[1] set body $argv[2] case \* printf ( _ "%s: Expected one or two arguments, got %d\n") alias (count $argv) return 1 end # Prevent the alias from immediately running into an infinite recursion if # $body starts with the same command as $name. switch $body case $name $name\ \* $name\t\* if contains $name (builtin --names) set prefix builtin else set prefix command end end eval "function $name; $prefix $body \$argv; end" end fish/share/functions/cd.fish000066400000000000000000000011551214535744100163720ustar00rootroot00000000000000# # The following functions add support for a directory history # function cd --description "Change directory" # Skip history in subshells if status --is-command-substitution builtin cd $argv return $status end # Avoid set completions set -l previous $PWD if test $argv[1] = - ^/dev/null if test "$__fish_cd_direction" = next ^/dev/null nextd else prevd end return $status end builtin cd $argv[1] set -l cd_status $status if test $cd_status = 0 -a "$PWD" != "$previous" set -g dirprev $dirprev $previous set -e dirnext set -g __fish_cd_direction prev end return $cd_status end fish/share/functions/contains_seq.fish000066400000000000000000000015361214535744100204750ustar00rootroot00000000000000function contains_seq --description 'Return true if array contains a sequence' set -l printnext switch $argv[1] case --printnext set printnext[1] 1 set -e argv[1] end set -l pattern set -l string set -l dest pattern for i in $argv if test "$i" = -- set dest string continue end set $dest $$dest $i end set -l nomatch 1 set -l i 1 for s in $string if set -q printnext[2] #echo $s return 0 end #echo a $nomatch if test "$s" = "$pattern[$i]" #echo b $nomatch #echo c $nomatch[1] set -e nomatch[1] set i (expr $i + 1) if not set -q pattern[$i] if set -q printnext[1] set printnext[2] 1 continue end return 0 end else if not set -q nomatch[1] set nomatch 1 set i 1 end end end if set -q printnext[1] echo '' end set -q printnext[2] end fish/share/functions/delete-or-exit.fish000066400000000000000000000005341214535744100206330ustar00rootroot00000000000000# # This function deletes a character from the commandline if it is # non-empty, and exits the shell otherwise. Implementing this # functionality has been a longstanding request from various # fish-users. # function delete-or-exit set -l cmd (commandline) switch "$cmd" case '' exit 0 case '*' commandline -f delete-char end end fish/share/functions/dirh.fish000066400000000000000000000015151214535744100167320ustar00rootroot00000000000000 function dirh --description "Print the current directory history (the back- and fwd- lists)" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help dirh return 0 end end # Avoid set comment set -l current (command pwd) set -l separator " " set -l line_len (math (count $dirprev) + (echo $dirprev $current $dirnext | wc -m) ) if test $line_len -gt $COLUMNS # Print one entry per line if history is long set separator "\n" end for i in $dirprev echo -n -e $i$separator end set_color $fish_color_history_current echo -n -e $current$separator set_color normal # BSD seq 0 outputs '1 0' instead of nothing if count $dirnext > /dev/null for i in (seq (echo (count $dirnext)) -1 1) echo -n -e $dirnext[$i]$separator end end echo end fish/share/functions/dirs.fish000066400000000000000000000002051214535744100167400ustar00rootroot00000000000000function dirs --description "Print directory stack" echo -n (command pwd)" " for i in $dirstack echo -n $i" " end echo end fish/share/functions/down-or-search.fish000066400000000000000000000010511214535744100206270ustar00rootroot00000000000000function down-or-search -d "Depending on cursor position and current mode, either search forward or move down one line" # If we are already in search mode, continue if commandline --search-mode commandline -f history-search-forward return end # We are not already in search mode. # If we are on the bottom line, start search mode, # otherwise move down set lineno (commandline -L) set line_count (commandline|wc -l) switch $lineno case $line_count commandline -f history-search-forward case '*' commandline -f down-line end end fish/share/functions/eval.fish000066400000000000000000000012131214535744100167260ustar00rootroot00000000000000 function eval -S -d "Evaluate parameters as a command" # If we are in an interactive shell, eval should enable full # job control since it should behave like the real code was # executed. If we don't do this, commands that expect to be # used interactively, like less, wont work using eval. set -l mode if status --is-interactive-job-control set mode interactive else if status --is-full-job-control set mode full else set mode none end end if status --is-interactive status --job-control full end echo "begin; $argv ;end eval2_inner <&3 3<&-" | . 3<&0 set -l res $status status --job-control $mode return $res end fish/share/functions/fish_config.fish000066400000000000000000000004361214535744100202630ustar00rootroot00000000000000function fish_config --description "Launch fish's web based configuration" # Support passing an initial tab like "colors" or "functions" set -l initial_tab if count $argv >/dev/null set initial_tab $argv[1] end eval $__fish_datadir/tools/web_config/webconfig.py $initial_tab end fish/share/functions/fish_default_key_bindings.fish000066400000000000000000000056251214535744100231740ustar00rootroot00000000000000 function fish_default_key_bindings -d "Default (Emacs-like) key bindings for fish" # Clear earlier bindings, if any bind --erase --all # This is the default binding, i.e. the one used if no other binding matches bind "" self-insert bind \n execute bind \ck kill-line bind \cy yank bind \t complete bind \e\n "commandline -i \n" bind \e\[A up-or-search bind \e\[B down-or-search bind -k down down-or-search bind -k up up-or-search bind \e\[C forward-char bind \e\[D backward-char bind -k right forward-char bind -k left backward-char bind -k dc delete-char bind -k backspace backward-delete-char bind \x7f backward-delete-char bind \e\[H beginning-of-line bind \e\[F end-of-line # OS X SnowLeopard doesn't have these keys. Don't show an annoying error message. bind -k home beginning-of-line 2> /dev/null bind -k end end-of-line 2> /dev/null bind \e\eOC nextd-or-forward-word bind \e\eOD prevd-or-backward-word bind \e\e\[C nextd-or-forward-word bind \e\e\[D prevd-or-backward-word bind \eO3C nextd-or-forward-word bind \eO3D prevd-or-backward-word bind \e\[3C nextd-or-forward-word bind \e\[3D prevd-or-backward-word bind \e\[1\;3C nextd-or-forward-word bind \e\[1\;3D prevd-or-backward-word bind \e\eOA history-token-search-backward bind \e\eOB history-token-search-forward bind \e\e\[A history-token-search-backward bind \e\e\[B history-token-search-forward bind \eO3A history-token-search-backward bind \eO3B history-token-search-forward bind \e\[3A history-token-search-backward bind \e\[3B history-token-search-forward bind \e\[1\;3A history-token-search-backward bind \e\[1\;3B history-token-search-forward bind \ca beginning-of-line bind \ce end-of-line bind \ey yank-pop bind \ch backward-delete-char bind \cw backward-kill-word bind \cp history-search-backward bind \cn history-search-forward bind \cf forward-char bind \cb backward-char bind \e\x7f backward-kill-word bind \eb backward-word bind \ef forward-word bind \e\[1\;5C forward-word bind \e\[1\;5D backward-word bind \ed forward-kill-word bind -k ppage beginning-of-history bind -k npage end-of-history bind \e\< beginning-of-buffer bind \e\> end-of-buffer bind \el __fish_list_current_token bind \ew 'set tok (commandline -pt); if test $tok[1]; echo; whatis $tok[1]; commandline -f repaint; end' bind \cl 'clear; commandline -f repaint' bind \cc 'commandline ""' bind \cu backward-kill-line bind \ed kill-word bind \cw backward-kill-path-component bind \ed 'set -l cmd (commandline); if test -z "$cmd"; echo; dirh; commandline -f repaint; else; commandline -f kill-word; end' bind \cd delete-or-exit # This will make sure the output of the current command is paged using the less pager when you press Meta-p bind \ep '__fish_paginate' # term-specific special bindings switch "$TERM" case 'rxvt*' bind \e\[8~ end-of-line bind \eOc forward-word bind \eOd backward-word end end fish/share/functions/fish_indent.fish000066400000000000000000000003161214535744100202740ustar00rootroot00000000000000function fish_indent --description 'Indenter and prettifier for fish code' # This is wrapped in a function so that fish_indent does not need to be found in PATH eval $__fish_bin_dir/fish_indent $argv end fish/share/functions/fish_prompt.fish000066400000000000000000000020601214535744100203320ustar00rootroot00000000000000# Set the default prompt command. Make sure that every terminal escape # string has a newline before and after, so that fish will know how # long it is. function fish_prompt --description "Write out the prompt" # 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 switch $USER case root if not set -q __fish_prompt_cwd if set -q fish_color_cwd_root set -g __fish_prompt_cwd (set_color $fish_color_cwd_root) else set -g __fish_prompt_cwd (set_color $fish_color_cwd) end end echo -n -s "$USER" @ "$__fish_prompt_hostname" ' ' "$__fish_prompt_cwd" (prompt_pwd) "$__fish_prompt_normal" '# ' case '*' if not set -q __fish_prompt_cwd set -g __fish_prompt_cwd (set_color $fish_color_cwd) end echo -n -s "$USER" @ "$__fish_prompt_hostname" ' ' "$__fish_prompt_cwd" (prompt_pwd) "$__fish_prompt_normal" '> ' end end fish/share/functions/fish_update_completions.fish000066400000000000000000000003241214535744100227100ustar00rootroot00000000000000function fish_update_completions --description "Update man-page based completions" eval \"$__fish_datadir/tools/create_manpage_completions.py\" --manpath --progress --cleanup-in '~/.config/fish/completions' end fish/share/functions/funced.fish000066400000000000000000000054641214535744100172570ustar00rootroot00000000000000function funced --description 'Edit function definition' set -l editor $EDITOR set -l interactive set -l funcname while set -q argv[1] switch $argv[1] case -h --help __fish_print_help funced return 0 case -e --editor set editor $argv[2] set -e argv[2] case -i --interactive set interactive 1 case -- set funcname $funcname $argv[2] set -e argv[2] case '-*' set_color red printf (_ "%s: Unknown option %s\n") funced $argv[1] set_color normal return 1 case '*' '.*' set funcname $funcname $argv[1] end set -e argv[1] end if begin; set -q funcname[2]; or not test "$funcname[1]"; end set_color red _ "funced: You must specify one function name " set_color normal return 1 end set -l init switch $funcname case '-*' set init function -- $funcname\n\nend case '*' set init function $funcname\n\nend end # Break editor up to get its first command (i.e. discard flags) if test -n "$editor" set -l editor_cmd eval set editor_cmd $editor if not type -f "$editor_cmd[1]" >/dev/null _ "funced: The value for \$EDITOR '$editor' could not be used because the command '$editor_cmd[1]' could not be found " set editor fish end end # If no editor is specified, use fish if test -z "$editor" set editor fish end if begin; set -q interactive[1]; or test "$editor" = fish; end set -l IFS if functions -q -- $funcname # Shadow IFS here to avoid array splitting in command substitution set init (functions -- $funcname | fish_indent --no-indent) end set -l prompt 'printf "%s%s%s> " (set_color green) '$funcname' (set_color normal)' # Unshadow IFS since the fish_title breaks otherwise set -e IFS if read -p $prompt -c "$init" -s cmd # Shadow IFS _again_ to avoid array splitting in command substitution set -l IFS eval (echo -n $cmd | fish_indent) end return 0 end set -q TMPDIR; or set -l TMPDIR /tmp set -l tmpname (printf "$TMPDIR/fish_funced_%d_%d.fish" %self (random)) while test -f $tmpname set tmpname (printf "$TMPDIR/fish_funced_%d_%d.fish" %self (random)) end if functions -q -- $funcname functions -- $funcname > $tmpname else echo $init > $tmpname end if eval $editor $tmpname . $tmpname end set -l stat $status rm -f $tmpname >/dev/null return $stat end fish/share/functions/funcsave.fish000066400000000000000000000015721214535744100176210ustar00rootroot00000000000000 function funcsave --description "Save the current definition of all specified functions to file" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help funcsave return 0 end else printf (_ "%s: Expected function name\n") funcsave __fish_print_help funcsave return 1 end set -l res 0 set -l configdir ~/.config if set -q XDG_CONFIG_HOME set configdir $XDG_CONFIG_HOME end for i in $configdir $configdir/fish $configdir/fish/functions if not test -d $i if not command mkdir $i >/dev/null printf (_ "%s: Could not create configuration directory\n") funcsave return 1 end end end for i in $argv if functions -q -- $i functions -- $i > $configdir/fish/functions/$i.fish functions -e -- $i else printf (_ "%s: Unknown function '%s'\n") funcsave $i set res 1 end end return $res end fish/share/functions/grep.fish000066400000000000000000000003551214535744100167420ustar00rootroot00000000000000# # Match colors for grep, if supported # if command grep --color=auto --help 1>/dev/null 2>/dev/null if not set -q GREP_COLOR set -gx GREP_COLOR '97;45' end if not set -q GREP_OPTIONS set -gx GREP_OPTIONS --color=auto end end fish/share/functions/help.fish000066400000000000000000000073111214535744100167340ustar00rootroot00000000000000function help --description 'Show help for the fish shell' # Declare variables to set correct scope set -l fish_browser set -l 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 # 'help -h' should launch 'help help' if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help help return 0 end end # # Find a suitable browser for viewing the help pages. This is needed # by the help function defined below. # set -l graphical_browsers htmlview x-www-browser firefox galeon mozilla konqueror epiphany opera netscape rekonq 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 # If browser is known to be graphical, put into background if contains -- $BROWSER $graphical_browsers set fish_browser_bg 1 end else # Check for a text-based browser. for i in $text_browsers if type -f $i >/dev/null set fish_browser $i break end end # 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 type -f $i >/dev/null set fish_browser $i set fish_browser_bg 1 break end end end # If xdg-open is available, just use that if type xdg-open > /dev/null set fish_browser xdg-open end # On OS X, we go through osascript by default if test (uname) = Darwin if type osascript >/dev/null set fish_browser osascript end end end if test -z $fish_browser printf (_ '%s: Could not find a web browser.\n') help printf (_ 'Please set the variable $BROWSER to a suitable browser and try again\n\n') return 1 end set -l fish_help_item $argv[1] switch "$fish_help_item" case "" set fish_help_page index.html case "." set fish_help_page "commands.html\#source" case difference set fish_help_page difference.html case globbing set fish_help_page "index.html\#expand" case (__fish_print_commands) set fish_help_page "commands.html\#$fish_help_item" case $help_topics set fish_help_page "index.html\#$fish_help_item" case "*" if type -f $fish_help_item >/dev/null # Prefer to use fish's man pages, to avoid # the annoying useless "builtin" man page bash # installs on OS X set -l man_arg "$__fish_datadir/man/man1/$fish_help_item.1" if test -f "$man_arg" man $man_arg return end end set fish_help_page "index.html" end set -l page_url if test -f $__fish_help_dir/index.html # Help is installed, use it set page_url file://$__fish_help_dir/$fish_help_page else # Go to the web. Only include one dot in the version string set -l version_string (echo $FISH_VERSION| cut -d . -f 1,2) set page_url http://fishshell.com/docs/$version_string/$fish_help_page end # OS X /usr/bin/open swallows fragments (anchors), so use osascript # Eval is just a cheesy way of removing the hash escaping if test "$fish_browser" = osascript osascript -e 'open location "'(eval echo $page_url)'"' return end if test $fish_browser_bg switch $fish_browser case 'htmlview' 'x-www-browser' printf (_ 'help: Help is being displayed in your default browser\n') case '*' printf (_ 'help: Help is being displayed in %s\n') $fish_browser end eval "$fish_browser $page_url &" else eval $fish_browser $page_url end end fish/share/functions/history.fish000066400000000000000000000060551214535744100175110ustar00rootroot00000000000000# #Deletes an item from history # function history --description "Deletes an item from history" set -l argc (count $argv) set -l prefix_args "" set -l contains_args "" set -l cmd print set -l search_mode none if test $argc -gt 0 for i in (seq $argc) switch $argv[$i] case --delete set cmd delete case --prefix set search_mode prefix set prefix_args $argv[(math $i + 1)] case --contains set search_mode contains set contains_args $argv[(math $i + 1)] case --save set cmd save case --clear set cmd clear case --search set cmd print end end else #Execute history builtin without any argument builtin history return end switch $cmd case print # Print matching items # Note this may end up passing --search twice to the builtin, # but that's harmless builtin history --search $argv case delete # Interactively delete history set -l found_items "" switch $search_mode case prefix set found_items (builtin history --search --prefix $prefix_args) case contains set found_items (builtin history --search --contains $contains_args) case none builtin history $argv #Save changes after deleting item builtin history --save return 0 end set found_items_count (count $found_items) if test $found_items_count -gt 0 echo "[0] cancel" echo "[1] all" echo for i in (seq $found_items_count) printf "[%s] %s \n" (math $i + 1) $found_items[$i] end read --local --prompt "echo 'Delete which entries? > '" choice set choice (echo $choice | tr " " "\n") for i in $choice # Skip empty input, for example, if the user just hits return if test -z $i continue end #Following two validations could be embedded with "and" but I find the syntax kind of weird. if not echo $i | grep -E -q "^[0-9]+\$" printf "Invalid input: %s\n" $i continue end if test $i -gt (math $found_items_count + 1) printf "Invalid input : %s\n" $i continue end if test $i = "0" printf "Cancel\n" return else if test $i = "1" for item in $found_items builtin history --delete $item end printf "Deleted all!\n" else builtin history --delete $found_items[(math $i - 1)] end end end #Save changes after deleting item(s) builtin history --save end case save #Save changes to history file builtin history $argv case clear # Erase the entire history echo "Are you sure you want to clear history ? (y/n)" read ch if test $ch = "y" builtin history $argv echo "History cleared!" end end end fish/share/functions/isatty.fish000066400000000000000000000005471214535744100173250ustar00rootroot00000000000000 function isatty -d "Tests if a file descriptor is a tty" set -l fd 0 if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help isatty return 0 case stdin set fd 0 case stdout set fd 1 case stderr set fd 2 case '*' set fd $argv[1] end end eval "tty 0>&$fd >/dev/null" end fish/share/functions/la.fish000066400000000000000000000002511214535744100163740ustar00rootroot00000000000000# # These are very common and useful # function la --description "List contents of directory, including hidden files in directory using long format" ls -lah $argv end fish/share/functions/ll.fish000066400000000000000000000002031214535744100164040ustar00rootroot00000000000000# # These are very common and useful # function ll --description "List contents of directory using long format" ls -lh $argv end fish/share/functions/ls.fish000066400000000000000000000011641214535744100164220ustar00rootroot00000000000000# # Make ls use colors if we are on a system that supports this # if command ls --version 1>/dev/null 2>/dev/null # This is GNU ls function ls --description "List contents of directory" set -l param --color=auto if isatty 1 set param $param --indicator-style=classify end command ls $param $argv end if not set -q LS_COLORS if type -f dircolors >/dev/null eval (dircolors -c) end end else # BSD, OS X and a few more support colors through the -G switch instead if command ls -G / 1>/dev/null 2>/dev/null function ls --description "List contents of directory" command ls -G $argv end end end fish/share/functions/man.fish000066400000000000000000000014271214535744100165610ustar00rootroot00000000000000function man --description "Format and display the on-line manual pages" # Work around OS X's "builtin" manpage that everything symlinks to, # by prepending our fish datadir to man. This also ensures that man gives fish's # man pages priority, without having to put fish's bin directories first in $PATH # Temporarily set a MANPATH, unless one is set already if not set -q MANPATH set -l fish_manpath (dirname $__fish_datadir)/fish/man if test -d "$fish_manpath" # Notice local but exported variable set -lx MANPATH "$fish_manpath":(command man --path) # Invoke man with this manpath, and we're done command man $argv return end end # If MANPATH is set explicitly, or fish's man pages could not be found, # just invoke man normally command man $argv end fish/share/functions/math.fish000066400000000000000000000004601214535744100167330ustar00rootroot00000000000000 function math --description "Perform math calculations in bc" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help math return 0 end set -l out (echo $argv|bc) echo $out switch $out case 0 return 1 end return 0 end return 2 end fish/share/functions/mimedb.fish000066400000000000000000000007041214535744100172400ustar00rootroot00000000000000# Wrap mimedb in a function so it does not have to be found in PATH # But only if it's installed if test -x $__fish_bin_dir/mimedb eval "function mimedb --description 'Look up file information via the mimedb database' \"$__fish_bin_dir/mimedb\" \$argv end" else function mimedb --description 'Look up file information via the mimedb database' # Create a function that simply fails, because mimedb not installed return 1 end end fish/share/functions/nextd-or-forward-word.fish000066400000000000000000000002101214535744100221460ustar00rootroot00000000000000 function nextd-or-forward-word if test -z (commandline) nextd commandline -f repaint else commandline -f forward-word end end fish/share/functions/nextd.fish000066400000000000000000000031021214535744100171200ustar00rootroot00000000000000 function nextd --description "Move forward in the directory history" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help nextd return 0 end end # Parse arguments set -l show_hist 0 set -l times 1 if count $argv > /dev/null for i in (seq (count $argv)) switch $argv[$i] case '-l' --l --li --lis --list set show_hist 1 continue case '-*' 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 printf (_ "%s: The number of positions to skip must be a non-negative integer\n" ) nextd return 1 end continue end end end # Traverse history set -l code 1 if count $times > /dev/null for i in (seq $times) # Try one step backward if __fish_move_last dirnext dirprev; # We consider it a success if we were able to do at least 1 step # (low expectations are the key to happiness ;) set code 0 else break end end end # Show history if needed if test $show_hist = 1 dirh end # Set direction for 'cd -' if test $code = 0 ^/dev/null set -g __fish_cd_direction prev end # All done return $code end fish/share/functions/open.fish000066400000000000000000000007131214535744100167440ustar00rootroot00000000000000 # # This allows us to use 'open FILENAME' to open a given file in the default # application for the file. # if not test (uname) = Darwin function open --description "Open file in default application" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help open return 0 end end if type -f xdg-open >/dev/null for i in $argv xdg-open $i end else mimedb -l -- $argv end end end fish/share/functions/popd.fish000066400000000000000000000005031214535744100167420ustar00rootroot00000000000000 function popd --description "Pop dir from stack" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help popd return 0 end end if test $dirstack[1] cd $dirstack[1] else printf (_ "%s: Directory stack is empty...\n") popd return 1 end set -e dirstack[1] end fish/share/functions/prevd-or-backward-word.fish000066400000000000000000000002371214535744100222670ustar00rootroot00000000000000function prevd-or-backward-word if test -z (commandline) prevd commandline -f repaint else commandline -f backward-word end end fish/share/functions/prevd.fish000066400000000000000000000030611214535744100171220ustar00rootroot00000000000000 function prevd --description "Move back in the directory history" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help prevd return 0 end end # Parse arguments set -l show_hist 0 set -l times 1 if count $argv > /dev/null for i in (seq (count $argv)) switch $argv[$i] case '-l' --l --li --lis --list set show_hist 1 continue case '-*' printf (_ "%s: Unknown option %s\n" ) prevd $argv[$i] return 1 case '*' if test $argv[$i] -ge 0 ^/dev/null set times $argv[$i] else printf (_ "The number of positions to skip must be a non-negative integer\n") return 1 end continue end end end # Traverse history set -l code 1 if count $times > /dev/null for i in (seq $times) # Try one step backward if __fish_move_last dirprev dirnext; # We consider it a success if we were able to do at least 1 step # (low expectations are the key to happiness ;) set code 0 else break end end end # Show history if needed if test $show_hist = 1 dirh end # Set direction for 'cd -' if test $code = 0 ^/dev/null set -g __fish_cd_direction next end # All done return $code end fish/share/functions/prompt_pwd.fish000066400000000000000000000006101214535744100201720ustar00rootroot00000000000000 if test (uname) = Darwin function prompt_pwd --description "Print the current working directory, shortend to fit the prompt" echo $PWD | sed -e "s|^$HOME|~|" -e 's|^/private||' -e 's-\([^/]\)[^/]*/-\1/-g' end else function prompt_pwd --description "Print the current working directory, shortend to fit the prompt" echo $PWD | sed -e "s|^$HOME|~|" -e 's-\([^/]\)[^/]*/-\1/-g' end end fish/share/functions/psub.fish000066400000000000000000000027661214535744100167660ustar00rootroot00000000000000 function psub --description "Read from stdin into a file and output the filename. Remove the file when the command that called psub exits." set -l filename set -l funcname set -l use_fifo 1 set -l shortopt -o hf set -l longopt -l help,file if getopt -T >/dev/null set longopt end if not getopt -n psub -Q $shortopt $longopt -- $argv >/dev/null return 1 end set -l tmp (getopt $shortopt $longopt -- $argv) eval set opt $tmp while count $opt >/dev/null switch $opt[1] case -h --help __fish_print_help psub return 0 case -f --file set use_fifo 0 case -- set -e opt[1] break end set -e opt[1] end if not status --is-command-substitution echo psub: Not inside of command substitution >&2 return end # Find unique file name for writing output to while true set filename /tmp/.psub.(echo %self).(random); if not test -e $filename break; end end if test use_fifo = 1 # Write output to pipe. This needs to be done in the background so # that the command substitution exits without needing to wait for # all the commands to exit mkfifo $filename cat >$filename & else cat >$filename end # Write filename to stdout echo $filename # Find unique function name while true set funcname __fish_psub_(random); if not functions $funcname >/dev/null ^/dev/null break; end end # Make sure we erase file when caller exits eval function $funcname --on-job-exit caller\; command rm $filename\; functions -e $funcname\; end end fish/share/functions/pushd.fish000066400000000000000000000004331214535744100171250ustar00rootroot00000000000000 function pushd --description "Push directory to stack" if count $argv >/dev/null switch $argv[1] case -h --h --he --hel --help __fish_print_help pushd return 0 end end # Comment to avoid set completions set -g dirstack (command pwd) $dirstack cd $argv[1] end fish/share/functions/seq.fish000066400000000000000000000021751214535744100165770ustar00rootroot00000000000000# If seq is not installed, then define a function that invokes __fish_fallback_seq # test -x in /usr/bin/seq because that's where it usually is and # that's substantially cheaper than the type function if begin ; not test -x /usr/bin/seq ; and not type -f seq > /dev/null; end # No seq command function seq --description "Print sequences of numbers" __fish_fallback_seq $argv end function __fish_fallback_seq --description "Fallback implementation of the seq command" set -l from 1 set -l step 1 set -l to 1 switch (count $argv) case 1 set to $argv[1] case 2 set from $argv[1] set to $argv[2] case 3 set from $argv[1] set step $argv[2] set to $argv[3] case '*' printf (_ "%s: Expected 1, 2 or 3 arguments, got %d\n") seq (count $argv) exit 1 end for i in $from $step $to if not echo $i | grep -E '^-?[0-9]*([0-9]*|\.[0-9]+)$' >/dev/null printf (_ "%s: '%s' is not a number\n") seq $i exit 1 end end if [ $step -ge 0 ] echo "for( i=$from; i<=$to ; i+=$step ) i;" | bc else echo "for( i=$from; i>=$to ; i+=$step ) i;" | bc end end end fish/share/functions/setenv.fish000066400000000000000000000001661214535744100173110ustar00rootroot00000000000000 function setenv --description 'Set global variable. Alias for set -g, made for csh compatibility' set -gx $argv end fish/share/functions/sgrep.fish000066400000000000000000000001631214535744100171220ustar00rootroot00000000000000 function sgrep -d "Call grep without honoring GREP_OPTIONS settings" set -l GREP_OPTIONS command grep $argv end fish/share/functions/trap.fish000066400000000000000000000042501214535744100167510ustar00rootroot00000000000000 function __trap_translate_signal set upper (echo $argv[1]|tr a-z A-Z) if expr $upper : 'SIG.*' >/dev/null echo $upper | cut -c 4- else echo $upper end end function __trap_switch switch $argv[1] case EXIT echo --on-exit %self case '*' echo --on-signal $argv[1] end end function trap -d 'Perform an action when the shell receives a signal' set -l mode set -l cmd set -l sig set -l options set -l longopt set -l shortopt lph if not getopt -T > /dev/null # GNU getopt set longopt print,help,list-signals set options -o $shortopt -l $longopt -- # Verify options if not getopt -n type $options $argv >/dev/null return 1 end else # Old getopt, used on OS X set options $shortopt # Verify options if not getopt $options $argv >/dev/null return 1 end end # Do the real getopt invocation set -l tmp (getopt $options $argv) # Break tmp up into an array set -l opt eval set opt $tmp while count $opt >/dev/null switch $opt[1] case -h --help __fish_print_help trap return 0 case -p --print set mode print case -l --list-signals set mode list case -- set -e opt[1] break end set -e opt[1] end if not count $mode >/dev/null switch (count $opt) case 0 set mode print case 1 set mode clear case '*' if test opt[1] = - set -e opt[1] set mode clear else set mode set end end end switch $mode case clear for i in $opt set sig (__trap_translate_signal $i) if test $sig functions -e __trap_handler_$sig end end case set set -l cmd $opt[1] set -e opt[1] for i in $opt set -l sig (__trap_translate_signal $i) set sw (__trap_switch $sig) if test $sig eval "function __trap_handler_$sig $sw; $cmd; end" else return 1 end end case print set -l names if count $opt >/dev/null set names $opt else set names (functions -na|sgrep "^__trap_handler_"|sed -e 's/__trap_handler_//' ) end for i in $names set sig (__trap_translate_signal $i) if test sig functions __trap_handler_$i else return 1 end end case list kill -l end end fish/share/functions/type.fish000066400000000000000000000043411214535744100167650ustar00rootroot00000000000000 function type --description "Print the type of a command" # Initialize set -l res 1 set -l mode normal set -l selection all # # Get options # set -l options set -l shortopt tpPafh if not getopt -T > /dev/null # GNU getopt set -l longopt type,path,force-path,all,no-functions,help set options -o $shortopt -l $longopt -- # Verify options if not getopt -n type $options $argv >/dev/null return 1 end else # Old getopt, used on OS X set options $shortopt # Verify options if not getopt $options $argv >/dev/null return 1 end end # Do the real getopt invocation set -l tmp (getopt $options $argv) # Break tmp up into an array set -l opt eval set opt $tmp for i in $opt switch $i case -t --type set mode type case -p --path set mode path case -P --force-path set mode path set selection files case -a --all set selection multi case -f --no-functions set selection files case -h --help __fish_print_help type return 0 case -- break end end # Check all possible types for the remaining arguments for i in $argv switch $i case '-*' continue end # Found will be set to 1 if a match is found set found 0 if test $selection != files if contains -- $i (functions -na) set res 0 set found 1 switch $mode case normal printf (_ '%s is a function with definition\n') $i functions $i case type echo (_ 'function') case path echo end if test $selection != multi continue end end if contains -- $i (builtin -n) set res 0 set found 1 switch $mode case normal printf (_ '%s is a builtin\n') $i case type echo (_ 'builtin') case path echo end if test $selection != multi continue end end end set -l path (which $i ^/dev/null) if test -x (echo $path) set res 0 set found 1 switch $mode case normal printf (_ '%s is %s\n') $i $path case type echo (_ 'file') case path echo $path end if test $selection != multi continue end end if test $found = 0 printf (_ "%s: Could not find '%s'\n") type $i end end return $res end fish/share/functions/umask.fish000066400000000000000000000074751214535744100171370ustar00rootroot00000000000000 function __fish_umask_parse -d "Internal umask function" # Test if already a valid octal mask, and pad it with zeros if echo $argv | sgrep -E '^(0|)[0-7]{1,3}$' >/dev/null set -l char_count (echo $argv| wc -c) for i in (seq (math 5 - $char_count)); set argv 0$argv; end echo $argv else # Test if argument really is a valid symbolic mask if not echo $argv | sgrep -E '^(((u|g|o|a|)(=|\+|-)|)(r|w|x)*)(,(((u|g|o|a|)(=|\+|-)|)(r|w|x)*))*$' >/dev/null printf (_ "%s: Invalid mask '%s'\n") umask $argv >&2 return 1 end set -l implicit_all # Insert inverted umask into res variable 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 -l char_count (echo $tmp|cut -c 1) set res[$i] (math 7 - $char_count) end 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-) case 'g*' set idx 2 set i (echo $i| cut -c 2-) case 'o*' set idx 3 set i (echo $i| cut -c 2-) case 'a*' set idx 1 2 3 set i (echo $i| cut -c 2-) case '*' set implicit_all 1 set idx 1 2 3 end switch $i case '=*' set mode set set i (echo $i| cut -c 2-) case '+*' set mode add set i (echo $i| cut -c 2-) case '-*' set mode remove set i (echo $i| cut -c 2-) case '*' 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|sgrep -E '^(r|w|x)*$' >/dev/null printf (_ "%s: Invalid mask '%s'\n") umask $argv >&2 return end set val 0 if echo $i |sgrep 'r' >/dev/null set val 4 end if echo $i |sgrep 'w' >/dev/null set val (math $val + 2) end if echo $i |sgrep 'x' >/dev/null set val (math $val + 1) end for j in $idx switch $mode case set set res[$j] $val case add set res[$j] (perl -e 'print( ( '$res[$j]'|'$val[$j]' )."\n" )') case remove set res[$j] (perl -e 'print( ( (7-'$res[$j]')&'$val[$j]' )."\n" )') end end end for i in 1 2 3 set res[$i] (math 7 - $res[$i]) end echo 0$res[1]$res[2]$res[3] end end function __fish_umask_print_symbolic set -l res "" set -l letter a u g o for i in 2 3 4 set res $res,$letter[$i]= set val (echo $umask|cut -c $i) if contains $val 0 1 2 3 set res {$res}r end if contains $val 0 1 4 5 set res {$res}w end if contains $val 0 2 4 6 set res {$res}x end end echo $res|cut -c 2- end function umask --description "Set default file permission mask" set -l as_command 0 set -l symbolic 0 set -l options set -l shortopt pSh if not getopt -T >/dev/null # GNU getopt set longopt -l as-command,symbolic,help set options -o $shortopt $longopt -- # Verify options if not getopt -n umask $options $argv >/dev/null return 1 end else # Old getopt, used on OS X set options $shortopt # Verify options if not getopt $options $argv >/dev/null return 1 end end set -l tmp (getopt $options $argv) eval set opt $tmp while count $opt >/dev/null switch $opt[1] case -h --help __fish_print_help umask return 0 case -p --as-command set as_command 1 case -S --symbolic set symbolic 1 case -- set -e opt[1] break end set -e opt[1] end switch (count $opt) case 0 if not set -q umask set -g umask 113 end if test $as_command -eq 1 echo umask $umask else if test $symbolic -eq 1 __fish_umask_print_symbolic $umask else echo $umask end end case 1 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 end end fish/share/functions/up-or-search.fish000066400000000000000000000007631214535744100203150ustar00rootroot00000000000000function up-or-search -d "Depending on cursor position and current mode, either search backward or move up one line" # If we are already in search mode, continue if commandline --search-mode commandline -f history-search-backward return end # We are not already in search mode. # If we are on the top line, start search mode, # otherwise move up set lineno (commandline -L) switch $lineno case 1 commandline -f history-search-backward case '*' commandline -f up-line end end fish/share/functions/vared.fish000066400000000000000000000025371214535744100171120ustar00rootroot00000000000000 # # This is a neat function, stolen from zsh. It allows you to edit the # value of a variable interactively. # function vared --description "Edit variable value" if test (count $argv) = 1 switch $argv case '-h' '--h' '--he' '--hel' '--help' __fish_print_help vared return 0 case '-*' printf (_ "%s: Unknown option %s\n") vared $argv return 1 case '*' if test (count $$argv ) -lt 2 set -l init '' if test $$argv set init $$argv end set -l prompt 'set_color green; echo '$argv'; set_color normal; echo "> "' if read -p $prompt -c $init tmp # If variable already exists, do not add any # switches, so we don't change export rules. But # if it does not exist, we make the variable # global, so that it will not die when this # function dies if test $$argv set $argv $tmp else set -g $argv $tmp end end else printf (_ '%s: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of %s\n') vared $argv (set_color $fish_color_command) (set_color $fish_color_normal) $argv $argv end end else 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 fish/share/tools/000077500000000000000000000000001214535744100142575ustar00rootroot00000000000000fish/share/tools/create_manpage_completions.py000077500000000000000000001125351214535744100222120ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # Run me like this: ./create_manpage_completions.py /usr/share/man/man1/* > man_completions.fish """ = Siteshwar Vashisht = 2012 Copyright (c) 2012, Siteshwar Vashisht All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ import string, sys, re, os.path, gzip, traceback, getopt, errno, codecs from deroff import Deroffer # Whether we're Python 3 IS_PY3 = sys.version_info[0] >= 3 # This gets set to the name of the command that we are currently executing CMDNAME = "" # Information used to track which of our parsers were successful PARSER_INFO = {} # built_command writes into this global variable, yuck built_command_output = [] # Diagnostic output diagnostic_output = [] diagnostic_indent = 0 # Three diagnostic verbosity levels VERY_VERBOSE, BRIEF_VERBOSE, NOT_VERBOSE = 2, 1, 0 # Pick some reasonable default values for settings global VERBOSITY, WRITE_TO_STDOUT, DEROFF_ONLY VERBOSITY, WRITE_TO_STDOUT, DEROFF_ONLY = NOT_VERBOSE, False, False def add_diagnostic(dgn, msg_verbosity = VERY_VERBOSE): # Add a diagnostic message, if msg_verbosity <= VERBOSITY if msg_verbosity <= VERBOSITY: diagnostic_output.append(' '*diagnostic_indent + dgn) def flush_diagnostics(where): if diagnostic_output: output_str = '\n'.join(diagnostic_output) + '\n' where.write(output_str) diagnostic_output[:] = [] # Make sure we don't output the same completion multiple times, which can happen # For example, xsubpp.1.gz and xsubpp5.10.1.gz # This maps commands to lists of completions already_output_completions = {} def compileAndSearch(regex, input): options_section_regex = re.compile(regex , re.DOTALL) options_section_matched = re.search( options_section_regex, input) return options_section_matched def unquoteDoubleQuotes(data): if (len(data) < 2): return data if data[0] == '"' and data[len(data)-1] == '"': data = data[1:len(data)-1] return data def unquoteSingleQuotes(data): if (len(data) < 2): return data if data[0] == '`' and data[len(data)-1] == '\'': data = data[1:len(data)-1] return data # Make a string of characters that are deemed safe in fish without needing to be escaped # Note that space is not included g_fish_safe_chars = frozenset(string.ascii_letters + string.digits + '_+-|/:=@~') def fish_escape_single_quote(str): # Escape a string if necessary so that it can be put in single quotes # If it has no non-safe chars, there's nothing to do if g_fish_safe_chars.issuperset(str): return str str = str.replace('\\', '\\\\') # Replace one backslash with two str = str.replace("'", "\\'") # Replace one single quote with a backslash-single-quote return "'" + str + "'" # Make a string Unicode by attempting to decode it as latin-1, or UTF8. See #658 def lossy_unicode(s): # All strings are unicode in Python 3 if IS_PY3 or isinstance(s, unicode): return s try: return s.decode('latin-1') except UnicodeEncodeError: pass try: return s.decode('utf-8') except UnicodeEncodeError: pass return s.decode('latin-1', 'ignore') def output_complete_command(cmdname, args, description, output_list): comps = ['complete -c', cmdname] comps.extend(args) if description: comps.append('--description') comps.append(description) output_list.append(lossy_unicode(' ').join([lossy_unicode(c) for c in comps])) def built_command(options, description): # print "Options are: ", options man_optionlist = re.split(" |,|\"|=|[|]", options) fish_options = [] for option in man_optionlist: option = option.strip() # Skip some problematic cases if option in ['-', '--']: continue if option.startswith('--'): # New style long option (--recursive) fish_options.append('-l ' + fish_escape_single_quote(option[2:])) elif option.startswith('-') and len(option) == 2: # New style short option (-r) fish_options.append('-s ' + fish_escape_single_quote(option[1:])) elif option.startswith('-') and len(option) > 2: # Old style long option (-recursive) fish_options.append('-o ' + fish_escape_single_quote(option[1:])) # Determine which options are new (not already in existing_options) # Then add those to the existing options existing_options = already_output_completions.setdefault(CMDNAME, set()) fish_options = [opt for opt in fish_options if opt not in existing_options] existing_options.update(fish_options) # Maybe it's all for naught if not fish_options: return # Here's what we'll use to truncate if necessary max_description_width = 63 if IS_PY3: truncation_suffix = '… [See Man Page]' else: ELLIPSIS_CODE_POINT = 0x2026 truncation_suffix = unichr(ELLIPSIS_CODE_POINT) + unicode(' [See Man Page]') # Try to include as many whole sentences as will fit # Clean up some probably bogus escapes in the process clean_desc = description.replace("\\'", "'").replace("\\.", ".") sentences = clean_desc.split('.') # Clean up "sentences" that are just whitespace # But don't let it be empty sentences = [x for x in sentences if x.strip()] if not sentences: sentences = [''] udot = lossy_unicode('.') uspace = lossy_unicode(' ') truncated_description = lossy_unicode(sentences[0]) + udot for line in sentences[1:]: if not line: continue proposed_description = lossy_unicode(truncated_description) + uspace + lossy_unicode(line) + udot if len(proposed_description) <= max_description_width: # It fits truncated_description = proposed_description else: # No fit break # If the first sentence does not fit, truncate if necessary if len(truncated_description) > max_description_width: prefix_len = max_description_width - len(truncation_suffix) truncated_description = truncated_description[:prefix_len] + truncation_suffix # Escape some more things truncated_description = fish_escape_single_quote(truncated_description) escaped_cmd = fish_escape_single_quote(CMDNAME) output_complete_command(escaped_cmd, fish_options, truncated_description, built_command_output) def removeGroffFormatting(data): # data = data.replace("\fI","") # data = data.replace("\fP","") data = data.replace("\\fI","") data = data.replace("\\fP","") data = data.replace("\\f1","") data = data.replace("\\fB","") data = data.replace("\\fR","") data = data.replace("\\e","") data = re.sub(".PD( \d+)","",data) data = data.replace(".BI","") data = data.replace(".BR","") data = data.replace("0.5i","") data = data.replace(".rb","") data = data.replace("\\^","") data = data.replace("{ ","") data = data.replace(" }","") data = data.replace("\ ","") data = data.replace("\-","-") data = data.replace("\&","") data = data.replace(".B","") data = data.replace("\-","-") data = data.replace(".I","") data = data.replace("\f","") return data class ManParser: def isMyType(self, manpage): return False def parseManPage(self, manpage): return False def name(self): return "no-name" class Type1ManParser(ManParser): def isMyType(self, manpage): # print manpage options_section_matched = compileAndSearch("\.SH \"OPTIONS\"(.*?)", manpage) if options_section_matched == None: return False else: return True def parseManPage(self, manpage): options_section_regex = re.compile( "\.SH \"OPTIONS\"(.*?)(\.SH|\Z)", re.DOTALL) options_section_matched = re.search( options_section_regex, manpage) options_section = options_section_matched.group(0) # print options_section options_parts_regex = re.compile("\.PP(.*?)\.RE", re.DOTALL) options_matched = re.search(options_parts_regex, options_section) # print options_matched add_diagnostic('Command is ' + CMDNAME) if options_matched == None: add_diagnostic('Unable to find options') if( self.fallback(options_section) ): return True elif (self.fallback2(options_section) ): return True return False while (options_matched != None): # print len(options_matched.groups()) # print options_matched.group() data = options_matched.group(1) last_dotpp_index = data.rfind(".PP") if (last_dotpp_index != -1): data = data[last_dotpp_index+3:] data = removeGroffFormatting(data) data = data.split(".RS 4") # print data if (len (data) > 1): #and len(data[1]) <= 300): optionName = data[0].strip() if ( optionName.find("-") == -1): add_diagnostic(optionName + " doesn't contain - ") # return False else: optionName = unquoteDoubleQuotes(optionName) optionName = unquoteSingleQuotes(optionName) optionDescription = data[1].strip().replace("\n"," ") # print >> sys.stderr, "Option: ", optionName," Description: ", optionDescription , '\n' built_command(optionName, optionDescription) else: add_diagnostic('Unable to split option from description') return False options_section = options_section[options_matched.end()-3:] options_matched = re.search(options_parts_regex, options_section) def fallback(self, options_section): add_diagnostic('Falling Back') options_parts_regex = re.compile("\.TP( \d+)?(.*?)\.TP", re.DOTALL) options_matched = re.search(options_parts_regex, options_section) if options_matched == None: add_diagnostic('Still not found') return False while options_matched != None: data = options_matched.group(2) data = removeGroffFormatting(data) data = data.strip() data = data.split("\n",1) if (len(data)>1 and len(data[1].strip())>0): # and len(data[1])<400): optionName = data[0].strip() if ( optionName.find("-") == -1): add_diagnostic(optionName + "doesn't contains -") else: optionName = unquoteDoubleQuotes(optionName) optionName = unquoteSingleQuotes(optionName) optionDescription = data[1].strip().replace("\n"," ") # print "Option: ", optionName," Description: ", optionDescription , '\n' built_command(optionName, optionDescription) else: add_diagnostic('Unable to split option from description') return False options_section = options_section[options_matched.end()-3:] options_matched = re.search(options_parts_regex, options_section) return True def fallback2(self, options_section): add_diagnostic('Falling Back2') ix_remover_regex = re.compile("\.IX.*") trailing_num_regex = re.compile('\\d+$') options_parts_regex = re.compile("\.IP (.*?)\.IP", re.DOTALL) options_section = re.sub(ix_remover_regex, "", options_section) options_matched = re.search(options_parts_regex, options_section) if options_matched == None: add_diagnostic('Still not found2') return False while options_matched != None: data = options_matched.group(1) # print "Data is : ", data data = removeGroffFormatting(data) data = data.strip() data = data.split("\n",1) if (len(data)>1 and len(data[1].strip())>0): # and len(data[1])<400): # print "Data[0] is: ", data[0] # data = re.sub(trailing_num_regex, "", data) optionName = re.sub(trailing_num_regex, "", data[0].strip()) if ('-' not in optionName): add_diagnostic(optionName + " doesn't contain -") else: optionName = optionName.strip() optionName = unquoteDoubleQuotes(optionName) optionName = unquoteSingleQuotes(optionName) optionDescription = data[1].strip().replace("\n"," ") # print "Option: ", optionName," Description: ", optionDescription , '\n' built_command(optionName, optionDescription) else: # print data add_diagnostic('Unable to split option from description') return False options_section = options_section[options_matched.end()-3:] options_matched = re.search(options_parts_regex, options_section) return True def name(self): return "Type1" class Type2ManParser(ManParser): def isMyType(self, manpage): options_section_matched = compileAndSearch("\.SH OPTIONS(.*?)", manpage) if options_section_matched == None: return False else: return True def parseManPage(self, manpage): options_section_regex = re.compile( "\.SH OPTIONS(.*?)(\.SH|\Z)", re.DOTALL) options_section_matched = re.search( options_section_regex, manpage) # if (options_section_matched == None): # print "Falling Back" # options_section_regex = re.compile( "\.SH OPTIONS(.*?)$", re.DOTALL) # options_section_matched = re.search( options_section_regex, manpage) # print manpage options_section = options_section_matched.group(1) # print options_section # print options_section # sys.exit(1) # options_parts_regex = re.compile("\.TP(.*?)\.TP", re.DOTALL) options_parts_regex = re.compile("\.[I|T]P( \d+(\.\d)?i?)?(.*?)\.[I|T]P", re.DOTALL) # options_parts_regex = re.compile("\.TP(.*?)[(\.TP)|(\.SH)]", re.DOTALL) options_matched = re.search(options_parts_regex, options_section) add_diagnostic('Command is ' + CMDNAME) if options_matched == None: add_diagnostic(self.name() + ': Unable to find options') return False while (options_matched != None): # print len(options_matched.groups()) data = options_matched.group(3) data = removeGroffFormatting(data) data = data.strip() data = data.split("\n",1) # print >> sys.stderr, data if (len(data)>1 and len(data[1].strip())>0): # and len(data[1])<400): optionName = data[0].strip() if '-' not in optionName: add_diagnostic(optionName + " doesn't contain -") else: optionName = unquoteDoubleQuotes(optionName) optionName = unquoteSingleQuotes(optionName) optionDescription = data[1].strip().replace("\n"," ") # print "Option: ", optionName," Description: ", optionDescription , '\n' built_command(optionName, optionDescription) else: # print >> sys.stderr, data add_diagnostic('Unable to split option from description') # return False options_section = options_section[options_matched.end()-3:] options_matched = re.search(options_parts_regex, options_section) def name(self): return "Type2" class Type3ManParser(ManParser): def isMyType(self, manpage): options_section_matched = compileAndSearch("\.SH DESCRIPTION(.*?)", manpage) if options_section_matched == None: return False else: return True def parseManPage(self, manpage): options_section_regex = re.compile( "\.SH DESCRIPTION(.*?)(\.SH|\Z)", re.DOTALL) options_section_matched = re.search( options_section_regex, manpage) options_section = options_section_matched.group(1) # print options_section # sys.exit(1) options_parts_regex = re.compile("\.TP(.*?)\.TP", re.DOTALL) options_matched = re.search(options_parts_regex, options_section) add_diagnostic('Command is ' + CMDNAME) if options_matched == None: add_diagnostic('Unable to find options section') return False while (options_matched != None): # print len(options_matched.groups()) data = options_matched.group(1) data = removeGroffFormatting(data) data = data.strip() data = data.split("\n",1) if (len(data)>1): # and len(data[1])<400): optionName = data[0].strip() if ( optionName.find("-") == -1): add_diagnostic(optionName + "doesn't contain -") else: optionName = unquoteDoubleQuotes(optionName) optionName = unquoteSingleQuotes(optionName) optionDescription = data[1].strip().replace("\n"," ") # print >> sys.stderr, "Option: ", optionName," Description: ", optionDescription , '\n' built_command(optionName, optionDescription) else: add_diagnostic('Unable to split option from description') return False options_section = options_section[options_matched.end()-3:] options_matched = re.search(options_parts_regex, options_section) def name(self): return "Type3" class Type4ManParser(ManParser): def isMyType(self, manpage): options_section_matched = compileAndSearch("\.SH FUNCTION LETTERS(.*?)", manpage) if options_section_matched == None: return False else: return True def parseManPage(self, manpage): options_section_regex = re.compile( "\.SH FUNCTION LETTERS(.*?)(\.SH|\Z)", re.DOTALL) options_section_matched = re.search( options_section_regex, manpage) options_section = options_section_matched.group(1) # print options_section # sys.exit(1) options_parts_regex = re.compile("\.TP(.*?)\.TP", re.DOTALL) options_matched = re.search(options_parts_regex, options_section) add_diagnostic('Command is ' + CMDNAME) if options_matched == None: print >> sys.stderr, "Unable to find options section" return False while (options_matched != None): # print len(options_matched.groups()) data = options_matched.group(1) data = removeGroffFormatting(data) data = data.strip() data = data.split("\n",1) if (len(data)>1): # and len(data[1])<400): optionName = data[0].strip() if ( optionName.find("-") == -1): add_diagnostic(optionName + " doesn't contain - ") else: optionName = unquoteDoubleQuotes(optionName) optionName = unquoteSingleQuotes(optionName) optionDescription = data[1].strip().replace("\n"," ") # print "Option: ", optionName," Description: ", optionDescription , '\n' built_command(optionName, optionDescription) else: add_diagnostic('Unable to split option from description') return False options_section = options_section[options_matched.end()-3:] options_matched = re.search(options_parts_regex, options_section) return True def name(self): return "Type4" class TypeDarwinManParser(ManParser): def isMyType(self, manpage): options_section_matched = compileAndSearch("\.S[hH] DESCRIPTION", manpage) return options_section_matched != None def trim_groff(self, line): # Remove initial period if line.startswith('.'): line = line[1:] # Skip leading groff crud while re.match('[A-Z][a-z]\s', line): line = line[3:] # If the line ends with a space and then a period or comma, then erase the space # This hack handles lines of the form '.Ar projectname .' if line.endswith(' ,') or line.endswith(' .'): line = line[:-2] + line[-1] return line def count_argument_dashes(self, line): # Determine how many dashes the line has using the following regex hack # Look for the start of a line, followed by a dot, then a sequence of # one or more dashes ('Fl') result = 0 if line.startswith('.'): line = line[4:] while line.startswith('Fl '): result = result + 1 line = line[3:] return result # Replace some groff escapes. There's a lot we don't bother to handle. def groff_replace_escapes(self, line): line = line.replace('.Nm', CMDNAME) line = line.replace('\\ ', ' ') line = line.replace('\& ', '') line = line.replace(r'.\"', '') return line def is_option(self, line): return line.startswith('.It Fl') def parseManPage(self, manpage): got_something = False lines = manpage.splitlines() # Discard lines until we get to ".sh Description" while lines and not (lines[0].startswith('.Sh DESCRIPTION') or lines[0].startswith('.SH DESCRIPTION')): lines.pop(0) while lines: # Pop until we get to the next option while lines and not self.is_option(lines[0]): lines.pop(0) if not lines: continue # Get the line and clean it up line = lines.pop(0) # Try to guess how many dashes this argument has dash_count = self.count_argument_dashes(line) line = self.groff_replace_escapes(line) line = self.trim_groff(line) line = line.strip() if not line: continue # Extract the name name = line.split(None, 2)[0] # Extract the description desc_lines = [] while lines and not self.is_option(lines[0]): line = lines.pop(0).strip() if line.startswith('.'): line = self.groff_replace_escapes(line) line = self.trim_groff(line).strip() if line: desc_lines.append(line) desc = ' '.join(desc_lines) # print "name: ", name # print "desc: ", desc if name == '-': # Skip double -- arguments continue elif len(name) > 1: # Output the command built_command(('-' * dash_count) + name, desc) got_something = True elif len(name) == 1: built_command('-' + name, desc) got_something = True return got_something def name(self): return "Darwin man parser" class TypeDeroffManParser(ManParser): def isMyType(self, manpage): return True # We're optimists def is_option(self, line): return line.startswith('-') def could_be_description(self, line): return len(line) > 0 and not line.startswith('-') def parseManPage(self, manpage): d = Deroffer() d.deroff(manpage) output = d.get_output() lines = output.split('\n') got_something = False # Discard lines until we get to DESCRIPTION or OPTIONS while lines and not (lines[0].startswith('DESCRIPTION') or lines[0].startswith('OPTIONS') or lines[0].startswith('COMMAND OPTIONS')): lines.pop(0) # Look for BUGS and stop there for idx in range(len(lines)): line = lines[idx] if line.startswith('BUGS'): # Drop remaining elements lines[idx:] = [] break while lines: # Pop until we get to the next option while lines and not self.is_option(lines[0]): line = lines.pop(0) if not lines: continue options = lines.pop(0) # Pop until we get to either an empty line or a line starting with - description = '' while lines and self.could_be_description(lines[0]): if description: description += ' ' description += lines.pop(0) built_command(options, description) got_something = True return got_something def name(self): return "Deroffing man parser" # Return whether the file at the given path is overwritable # Raises IOError if it cannot be opened def file_is_overwritable(path): result = False file = open(path, 'r') for line in file: # Skip leading empty lines line = line.strip() if not line: continue # We look in the initial run of lines that start with # if not line.startswith('#'): break # See if this contains the magic word if 'Autogenerated' in line: result = True break file.close() return result # Remove any and all autogenerated completions in the given directory def cleanup_autogenerated_completions_in_directory(dir): try: for filename in os.listdir(dir): # Skip non .fish files if not filename.endswith('.fish'): continue path = os.path.join(dir, filename) try: if file_is_overwritable(path): os.unlink(path) except IOError: pass except OSError: pass except OSError as err: return False # Delete the file if it is autogenerated def cleanup_autogenerated_file(path): try: if file_is_overwritable(path): os.remove(path) except (OSError, IOError): pass def parse_manpage_at_path(manpage_path, output_directory): filename = os.path.basename(manpage_path) # Clear diagnostics global diagnostic_indent diagnostic_output[:] = [] diagnostic_indent = 0 # Set up some diagnostics add_diagnostic('Considering ' + manpage_path) diagnostic_indent += 1 if manpage_path.endswith('.gz'): fd = gzip.open(manpage_path, 'r') manpage = fd.read() if IS_PY3: manpage = manpage.decode('latin-1') else: if IS_PY3: fd = open(manpage_path, 'r', encoding='latin-1') else: fd = open(manpage_path, 'r') manpage = fd.read() fd.close() manpage = str(manpage) # Get the "base" command, e.g. gcc.1.gz -> gcc cmd_base = CMDNAME.split('.', 1)[0] ignoredcommands = ["cc", "g++", "gcc", "c++", "cpp", "emacs", "gprof", "wget", "ld", "awk"] if cmd_base in ignoredcommands: return # Ignore perl's gazillion man pages ignored_prefixes = ['perl', 'zsh'] for prefix in ignored_prefixes: if cmd_base.startswith(prefix): return # Ignore the millions of links to BUILTIN(1) if manpage.find('BUILTIN 1') != -1: return # Clear the output list built_command_output[:] = [] if DEROFF_ONLY: parsers = [TypeDeroffManParser()] else: parsers = [Type1ManParser(), Type2ManParser(), Type4ManParser(), Type3ManParser(), TypeDarwinManParser(), TypeDeroffManParser()] parsersToTry = [p for p in parsers if p.isMyType(manpage)] success = False if not parsersToTry: add_diagnostic(manpage_path + ": Not supported") else: for parser in parsersToTry: parser_name = parser.name() add_diagnostic('Trying parser ' + parser_name) diagnostic_indent += 1 success = parser.parseManPage(manpage) diagnostic_indent -= 1 # Make sure empty files aren't reported as success if not built_command_output: success = False if success: PARSER_INFO.setdefault(parser_name, []).append(CMDNAME) break if success: if WRITE_TO_STDOUT: output_file = sys.stdout else: fullpath = os.path.join(output_directory, CMDNAME + '.fish') try: output_file = codecs.open(fullpath, "w", encoding="utf-8") except IOError as err: add_diagnostic("Unable to open file '%s': error(%d): %s" % (fullpath, err.errno, err.strerror)) return False built_command_output.insert(0, "# " + CMDNAME) # Output the magic word Autogenerated so we can tell if we can overwrite this built_command_output.insert(1, "# Autogenerated from man page " + manpage_path) built_command_output.insert(2, "# using " + parser_name) for line in built_command_output: output_file.write(line) output_file.write('\n') output_file.write('\n') add_diagnostic(manpage_path + ' parsed successfully') if output_file != sys.stdout: output_file.close() else: parser_names = ', '.join(p.name() for p in parsersToTry) #add_diagnostic('%s contains no options or is unparsable' % manpage_path, BRIEF_VERBOSE) add_diagnostic('%s contains no options or is unparsable (tried parser %s)' % (manpage_path, parser_names), BRIEF_VERBOSE) # Make sure we delete any old completion if not WRITE_TO_STDOUT: fullpath = os.path.join(output_directory, CMDNAME + '.fish') try: os.remove(fullpath) except (OSError, IOError): # Ignore failure pass return success def parse_and_output_man_pages(paths, output_directory, show_progress): global diagnostic_indent, CMDNAME paths.sort() total_count = len(paths) successful_count, index = 0, 0 padding_len = len(str(total_count)) last_progress_string_length = 0 if show_progress and not WRITE_TO_STDOUT: print("Parsing man pages and writing completions to {0}".format(output_directory)) for manpage_path in paths: index += 1 # Get the "base" command, e.g. gcc.1.gz -> gcc man_file_name = os.path.basename(manpage_path) CMDNAME = man_file_name.split('.', 1)[0] output_file_name = CMDNAME + '.fish' # Show progress if we're doing that if show_progress: progress_str = ' {0} / {1} : {2}'.format((str(index).rjust(padding_len)), total_count, man_file_name) # Pad on the right with spaces so we overwrite whatever we wrote last time padded_progress_str = progress_str.ljust(last_progress_string_length) last_progress_string_length = len(progress_str) sys.stdout.write("\r{0}\r".format(padded_progress_str)) sys.stdout.flush() # Maybe we want to skip this item skip = False if not WRITE_TO_STDOUT: # Compute the path that we would write to output_path = os.path.join(output_directory, output_file_name) # Now skip if requested if skip: continue try: if parse_manpage_at_path(manpage_path, output_directory): successful_count += 1 except IOError: diagnostic_indent = 0 add_diagnostic('Cannot open ' + manpage_path) except (KeyboardInterrupt, SystemExit): raise except: add_diagnostic('Error parsing %s: %s' % (manpage_path, sys.exc_info()[0]), BRIEF_VERBOSE) flush_diagnostics(sys.stderr) traceback.print_exc(file=sys.stderr) flush_diagnostics(sys.stderr) print("") #Newline after loop add_diagnostic("Successfully parsed %d / %d pages" % (successful_count, total_count), BRIEF_VERBOSE) flush_diagnostics(sys.stderr) def get_paths_from_manpath(): # Return all the paths to man(1) files in the manpath import subprocess, os proc = subprocess.Popen(['manpath'], stdout=subprocess.PIPE) manpath, err_data = proc.communicate() parent_paths = manpath.decode().strip().split(':') if not parent_paths: sys.stderr.write("Unable to get the manpath (tried manpath)\n") sys.exit(-1) result = [] for parent_path in parent_paths: directory_path = os.path.join(parent_path, 'man1') try: names = os.listdir(directory_path) except OSError as e: names = [] names.sort() for name in names: result.append(os.path.join(directory_path, name)) return result def usage(script_name): print("Usage: {0} [-v, --verbose] [-s, --stdout] [-d, --directory] [-p, --progress] files...".format(script_name)) print("""Command options are: -h, --help\t\tShow this help message -v, --verbose [0, 1, 2]\tShow debugging output to stderr. Larger is more verbose. -s, --stdout\tWrite all completions to stdout (trumps the --directory option) -d, --directory [dir]\tWrite all completions to the given directory, instead of to ~/.config/fish/generated_completions -m, --manpath\tProcess all man1 files available in the manpath (as determined by manpath) -p, --progress\tShow progress """) if __name__ == "__main__": script_name = sys.argv[0] try: opts, file_paths = getopt.gnu_getopt(sys.argv[1:], 'v:sd:hmpc:z', ['verbose=', 'stdout', 'directory=', 'cleanup-in=', 'help', 'manpath', 'progress']) except getopt.GetoptError as err: print(err.msg) # will print something like "option -a not recognized" usage(script_name) sys.exit(2) # Directories within which we will clean up autogenerated completions # This script originally wrote completions into ~/.config/fish/completions # Now it writes them into a separate directory cleanup_directories = [] use_manpath, show_progress, custom_dir = False, False, False output_directory = '' for opt, value in opts: if opt in ('-v', '--verbose'): VERBOSITY = int(value) elif opt in ('-s', '--stdout'): WRITE_TO_STDOUT = True elif opt in ('-d', '--directory'): output_directory = value elif opt in ('-h', '--help'): usage(script_name) sys.exit(0) elif opt in ('-m', '--manpath'): use_manpath = True elif opt in ('-p', '--progress'): show_progress = True elif opt in ('-c', '--cleanup-in'): cleanup_directories.append(value) elif opt in ('-z'): DEROFF_ONLY = True else: assert False, "unhandled option" if use_manpath: # Fetch all man1 files from the manpath file_paths.extend(get_paths_from_manpath()) if cleanup_directories: for cleanup_dir in cleanup_directories: cleanup_autogenerated_completions_in_directory(cleanup_dir) if not file_paths: print("No paths specified") sys.exit(0) if not WRITE_TO_STDOUT and not output_directory: # Default to ~/.config/fish/generated_completions/ # Create it if it doesn't exist output_directory = os.path.expanduser('~/.config/fish/generated_completions/') try: os.makedirs(output_directory) except OSError as e: if e.errno != errno.EEXIST: raise if True: parse_and_output_man_pages(file_paths, output_directory, show_progress) else: # Profiling code import cProfile, pstats cProfile.run('parse_and_output_man_pages(file_paths, output_directory, show_progress)', 'fooprof') p = pstats.Stats('fooprof') p.sort_stats('cumulative').print_stats(100) # Here we can write out all the parser infos if False: for name in PARSER_INFO: print('Parser ' + name + ':') print('\t' + ', '.join(PARSER_INFO[name])) print('') fish/share/tools/deroff.py000077500000000000000000000767421214535744100161210ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ Deroff.py, ported to Python from the venerable deroff.c """ import sys, re, string IS_PY3 = sys.version_info[0] >= 3 class Deroffer: g_specs_specletter = { # Output composed latin1 letters '-D': '\320', 'Sd': '\360', 'Tp': '\376', 'TP': '\336', 'AE': '\306', 'ae': '\346', 'OE': "OE", 'oe': "oe", ':a': '\344', ':A': '\304', ':e': '\353', ':E': '\313', ':i': '\357', ':I': '\317', ':o': '\366', ':O': '\326', ':u': '\374', ':U': '\334', ':y': '\377', 'ss': '\337', '\'A': '\301', '\'E': '\311', '\'I': '\315', '\'O': '\323', '\'U': '\332', '\'Y': '\335', '\'a': '\341', '\'e': '\351', '\'i': '\355', '\'o': '\363', '\'u': '\372', '\'y': '\375', '^A': '\302', '^E': '\312', '^I': '\316', '^O': '\324', '^U': '\333', '^a': '\342', '^e': '\352', '^i': '\356', '^o': '\364', '^u': '\373', '`A': '\300', '`E': '\310', '`I': '\314', '`O': '\322', '`U': '\331', '`a': '\340', '`e': '\350', '`i': '\354', '`o': '\362', '`u': '\371', '~A': '\303', '~N': '\321', '~O': '\325', '~a': '\343', '~n': '\361', '~o': '\365', ',C': '\307', ',c': '\347', '/l': "/l", '/L': "/L", '/o': '\370', '/O': '\330', 'oA': '\305', 'oa': '\345', # Ligatures 'fi': 'fi', 'ff': 'ff', 'fl': 'fl', 'Fi': 'ffi', 'Ff': 'fff', 'Fl': 'ffl' } g_specs = { 'mi': '-', 'en': '-', 'hy': '-', 'em': "--", 'lq': "\"", # PCA: This used to be left and right smart quotes, but they look dumb 'rq': "\"", # So just use ordinary double quotes 'Bq': ",,", 'oq': '`', 'cq': '\'', 'aq': '\'', 'dq': '"', 'or': '|', 'at': '@', 'sh': '#', 'Eu': '\244', 'eu': '\244', 'Do': '$', 'ct': '\242', 'Fo': '\253', 'Fc': '\273', 'fo': '<', 'fc': '>', 'r!': '\241', 'r?': '\277', 'Of': '\252', 'Om': '\272', 'pc': '\267', 'S1': '\271', 'S2': '\262', 'S3': '\263', '<-': "<-", '->': "->", '<>': "<->", 'ua': '^', 'da': 'v', 'lA': "<=", 'rA': "=>", 'hA': "<=>", 'uA': "^^", 'dA': "vv", 'ba': '|', 'bb': '|', 'br': '|', 'bv': '|', 'ru': '_', 'ul': '_', 'ci': 'O', 'bu': 'o', 'co': '\251', 'rg': '\256', 'tm': "(TM)", 'dd': "||", 'dg': '|', 'ps': '\266', 'sc': '\247', 'de': '\260', '%0': "0/00", '14': '\274', '12': '\275', '34': '\276', 'f/': '/', 'sl': '/', 'rs': '\\', 'sq': "[]", 'fm': '\'', 'ha': '^', 'ti': '~', 'lB': '[', 'rB': ']', 'lC': '{', 'rC': '}', 'la': '<', 'ra': '>', 'lh': "<=", 'rh': "=>", 'tf': "therefore", '~~': "~~", '~=': "~=", '!=': "!=", '**': '*', '+-': '\261', '<=': "<=", '==': "==", '=~': "=~", '>=': ">=", 'AN': "\\/", 'OR': "/\\", 'no': '\254', 'te': "there exists", 'fa': "for all", 'Ah': "aleph", 'Im': "imaginary", 'Re': "real", 'if': "infinity", 'md': "\267", 'mo': "member of", 'mu': '\327', 'nm': "not member of", 'pl': '+', 'eq': '=', 'pt': "oc", 'pp': "perpendicular", 'sb': "(=", 'sp': "=)", 'ib': "(-", 'ip': "-)", 'ap': '~', 'is': 'I', 'sr': "root", 'pd': 'd', 'c*': "(x)", 'c+': "(+)", 'ca': "cap", 'cu': 'U', 'di': '\367', 'gr': 'V', 'es': "{}", 'CR': "_|", 'st': "such that", '/_': "/_", 'lz': "<>", 'an': '-', # Output Greek '*A': "Alpha", '*B': "Beta", '*C': "Xi", '*D': "Delta", '*E': "Epsilon", '*F': "Phi", '*G': "Gamma", '*H': "Theta", '*I': "Iota", '*K': "Kappa", '*L': "Lambda", '*M': "Mu", '*N': "Nu", '*O': "Omicron", '*P': "Pi", '*Q': "Psi", '*R': "Rho", '*S': "Sigma", '*T': "Tau", '*U': "Upsilon", '*W': "Omega", '*X': "Chi", '*Y': "Eta", '*Z': "Zeta", '*a': "alpha", '*b': "beta", '*c': "xi", '*d': "delta", '*e': "epsilon", '*f': "phi", '+f': "phi", '*g': "gamma", '*h': "theta", '+h': "theta", '*i': "iota", '*k': "kappa", '*l': "lambda", '*m': "\265", '*n': "nu", '*o': "omicron", '*p': "pi", '+p': "omega", '*q': "psi", '*r': "rho", '*s': "sigma", '*t': "tau", '*u': "upsilon", '*w': "omega", '*x': "chi", '*y': "eta", '*z': "zeta", 'ts': "sigma", } g_re_word = re.compile(r'[a-zA-Z_]+') # equivalent to the word() method g_re_number = re.compile(r'[+-]?\d+') # equivalent to the number() method g_re_esc_char = re.compile(r"""([a-zA-Z_]) | # Word ([+-]?\d) | # Number \\ # Backslash (for escape seq) """, re.VERBOSE) g_re_not_backslash_or_whitespace = re.compile(r'[^ \t\n\r\f\v\\]+') # Match a sequence of not backslash or whitespace g_re_newline_collapse = re.compile(r'\n{3,}') g_re_font = re.compile(r"""\\f( # Starts with backslash f (\(\S{2}) | # Open paren, then two printable chars (\[\S*?\]) | # Open bracket, zero or more printable characters, then close bracket \S) # Any printable character """, re.VERBOSE) # This gets filled in in __init__ below g_macro_dict = False def __init__(self): self.reg_table = {} self.tr_from = '' self.tr_to = '' self.tr = '' self.nls = 2 self.specletter = False self.refer = False self.macro = 0 self.nobody = False self.inlist = False self.inheader = False self.pic = False self.tbl = False self.tblstate = 0 self.tblTab = '' self.eqn = False self.skipheaders = False self.skiplists = False self.ignore_sonx = False self.output = [] self.name = '' self.OPTIONS = 0 self.FORMAT = 1 self.DATA = 2 # words is uninteresting and should be treated as false if not Deroffer.g_macro_dict: Deroffer.g_macro_dict = { 'SH': Deroffer.macro_sh, 'SS': Deroffer.macro_ss_ip, 'IP': Deroffer.macro_ss_ip, 'H ': Deroffer.macro_ss_ip, 'I ': Deroffer.macro_i_ir, 'IR': Deroffer.macro_i_ir, 'IB': Deroffer.macro_i_ir, 'B ': Deroffer.macro_i_ir, 'BR': Deroffer.macro_i_ir, 'BI': Deroffer.macro_i_ir, 'R ': Deroffer.macro_i_ir, 'RB': Deroffer.macro_i_ir, 'RI': Deroffer.macro_i_ir, 'AB': Deroffer.macro_i_ir, 'Nm': Deroffer.macro_Nm, '] ': Deroffer.macro_close_bracket, 'PS': Deroffer.macro_ps, 'PE': Deroffer.macro_pe, 'TS': Deroffer.macro_ts, 'T&': Deroffer.macro_t_and, 'TE': Deroffer.macro_te, 'EQ': Deroffer.macro_eq, 'EN': Deroffer.macro_en, 'R1': Deroffer.macro_r1, 'R2': Deroffer.macro_r2, 'de': Deroffer.macro_de, 'BL': Deroffer.macro_bl_vl, 'VL': Deroffer.macro_bl_vl, 'AL': Deroffer.macro_bl_vl, 'LB': Deroffer.macro_bl_vl, 'RL': Deroffer.macro_bl_vl, 'ML': Deroffer.macro_bl_vl, 'DL': Deroffer.macro_bl_vl, 'BV': Deroffer.macro_bv, 'LE': Deroffer.macro_le, 'LP': Deroffer.macro_lp_pp, 'PP': Deroffer.macro_lp_pp, 'P\n': Deroffer.macro_lp_pp, 'ds': Deroffer.macro_ds, 'so': Deroffer.macro_so_nx, 'nx': Deroffer.macro_so_nx, 'tr': Deroffer.macro_tr, 'sp': Deroffer.macro_sp } def flush_output(self, where): if where: where.write(self.get_output()) self.output[:] = [] def get_output(self): res = ''.join(self.output) clean_res = Deroffer.g_re_newline_collapse.sub('\n', res) return clean_res def putchar(self, c): self.output.append(c) return c # This gets swapped in in place of condputs the first time tr gets modified def condputs_tr(self, str): special = self.pic or self.eqn or self.refer or self.macro or (self.skiplists and self.inlist) or (self.skipheaders and self.inheader) if not special: self.output.append(str.translate(self.tr)) def condputs(self, str): special = self.pic or self.eqn or self.refer or self.macro or (self.skiplists and self.inlist) or (self.skipheaders and self.inheader) if not special: self.output.append(str) def str_at(self, idx): return self.s[idx:idx+1] def skip_char(self, amt=1): self.s = self.s[amt:] def skip_leading_whitespace(self): self.s = self.s.lstrip() def is_white(self, idx): # Note this returns false for empty strings (idx >= len(self.s)) return self.s[idx:idx+1].isspace() def str_eq(offset, other, len): return self.s[offset:offset+len] == other[:len] def prch(self, idx): # Note that this return False for the empty string (idx >= len(self.s)) ch = self.s[idx:idx+1] return ch not in ' \t\n' def font(self): match = Deroffer.g_re_font.match(self.s) if not match: return False self.skip_char(match.end()) return True def font2(self): if self.s[0:2] == '\\f': c = self.str_at(2) if c == '(' and self.prch(3) and self.prch(4): self.skip_char(5) return True elif c == '[': self.skip_char(2) while self.prch(0) and self.str_at(0) != ']': self.skip_char() if self.str_at(0) == ']': self.skip_char() elif self.prch(2): self.skip_char(3) return True return False def comment(self): # Here we require that the string start with \" while self.str_at(0) and self.str_at(0) != '\n': self.skip_char() return True def numreq(self): # We require that the string starts with backslash if self.str_at(1) in 'hvwud' and self.str_at(2) == '\'': self.macro += 1 self.skip_char(3) while self.str_at(0) != '\'' and self.esc_char(): pass # Weird if self.str_at(0) == '\'': self.skip_char() self.macro -= 1 return True return False def var(self): reg = '' s0s1 = self.s[0:2] if s0s1 == '\\n': if self.s[3:5] == 'dy': self.skip_char(5) return True elif self.str_at(2) == '(' and self.prch(3) and self.prch(4): self.skip_char(5) return True elif self.str_at(2) == '[' and self.prch(3): self.skip_char(3) while self.str_at(0) and self.str_at(0) != ']': self.skip_char() return True elif self.prch(2): self.skip_char(3) return True elif s0s1 == '\\*': if self.str_at(2) == '(' and self.prch(3) and self.prch(4): reg = self.s[3:5] self.skip_char(5) elif self.str_at(2) == '[' and self.prch(3): self.skip_char(3) while self.str_at(0) and self.str_at(0) != ']': reg = reg + self.str_at(0) self.skip_char() if self.s[0:1] == ']': self.skip_char() else: return False elif self.prch(2): reg = self.str_at(2) self.skip_char(3) else: return False if reg in self.reg_table: old_s = self.s self.s = self.reg_table[reg] self.text_arg() return True return False def size(self): # We require that the string starts with \s if self.digit(2) or (self.str_at(2) in '-+' and self.digit(3)): self.skip_char(3) while self.digit(0): self.skip_char() return True return False def spec(self): self.specletter = False if self.s[0:2] == '\\(' and self.prch(2) and self.prch(3): key = self.s[2:4] if key in Deroffer.g_specs_specletter: self.condputs(Deroffer.g_specs_specletter[key]) self.specletter = True elif key in Deroffer.g_specs: self.condputs(Deroffer.g_specs[key]) self.skip_char(4) return True elif self.s.startswith('\\%'): self.specletter = True self.skip_char(2) return True else: return False def esc(self): # We require that the string start with backslash c = self.s[1:2] if not c: return False if c in 'eE': self.condputs('\\') elif c in 't': self.condputs('\t') elif c in '0~': self.condputs(' ') elif c in '|^&:': pass else: self.condputs(c) self.skip_char(2) return True def word(self): got_something = False while True: match = Deroffer.g_re_word.match(self.s) if not match: break got_something = True self.condputs(match.group(0)) self.skip_char(match.end(0)) # Consume all specials while self.spec(): if not self.specletter: break return got_something def text(self): while True: idx = self.s.find('\\') if idx == -1: self.condputs(self.s) self.s = '' break else: self.condputs(self.s[:idx]) self.skip_char(idx) if not self.esc_char_backslash(): self.condputs(self.str_at(0)) self.skip_char() return True def letter(self, idx): ch = self.str_at(idx) return ch.isalpha() or ch == '_' # underscore is used in C identifiers def digit(self, idx): ch = self.str_at(idx) return ch.isdigit() def number(self): match = Deroffer.g_re_number.match(self.s) if not match: return False else: self.condputs(match.group(0)) self.skip_char(match.end()) return True def esc_char_backslash(self): # Like esc_char, but we know the string starts with a backslash c = self.s[1:2] if c == '"': return self.comment() elif c == 'f': return self.font() elif c == 's': return self.size() elif c in 'hvwud': return self.numreq() elif c in 'n*': return self.var() elif c == '(': return self.spec() else: return self.esc() def esc_char(self): if self.s[0:1] == '\\': return self.esc_char_backslash() return self.word() or self.number() def quoted_arg(self): if self.str_at(0) == '"': self.skip_char() while self.s and self.str_at(0) != '"': if not self.esc_char(): if self.s: self.condputs(self.str_at(0)) self.skip_char() return True else: return False def text_arg(self): # PCA: The deroff.c textArg() disallowed quotes at the start of an argument # I'm not sure if this was a bug or not got_something = False while True: match = Deroffer.g_re_not_backslash_or_whitespace.match(self.s) if match: # Output the characters in the match self.condputs(match.group(0)) self.skip_char(match.end(0)) got_something = True # Next is either an escape, or whitespace, or the end # If it's the whitespace or the end, we're done if not self.s or self.is_white(0): return got_something # Try an escape if not self.esc_char(): # Some busted escape? Just output it self.condputs(self.str_at(0)) self.skip_char() got_something = True def text_arg2(self): if not self.esc_char(): if self.s and not self.is_white(0): self.condputs(self.str_at(0)) self.skip_char() else: return False while True: if not self.esc_char(): if self.s and not self.is_white(0): self.condputs(self.str_at(0)) self.skip_char() else: return True # Macro functions def macro_sh(self): for header_str in [' SYNOPSIS', ' "SYNOPSIS', ' ‹BERSICHT', ' "‹BERSICHT']: if self.s[2:].startswith(header_str): self.inheader = True break else: # Did not find a header string self.inheader = False self.nobody = True def macro_ss_ip(self): self.nobody = True return False def macro_i_ir(self): pass return False def macro_Nm(self): if self.s == 'Nm\n': self.condputs(self.name) else: self.name = self.s[3:].strip() + ' ' return True def macro_close_bracket(self): self.refer = False return False def macro_ps(self): if self.is_white(2): self.pic = True self.condputs('\n') return True def macro_pe(self): if self.is_white(2): self.pic = False self.condputs('\n') return True def macro_ts(self): if self.is_white(2): self.tbl, self.tblstate = True, self.OPTIONS self.condputs('\n') return True def macro_t_and(self): if self.is_white(2): self.tbl, self.tblstate = True, self.FORMAT self.condputs('\n') return True def macro_te(self): if self.is_white(2): self.tbl = False self.condputs('\n') return True def macro_eq(self): if self.is_white(2): self.eqn = True self.condputs('\n') return True def macro_en(self): if self.is_white(2): self.eqn = False self.condputs('\n') return True def macro_r1(self): if self.is_white(2): self.refer2 = True self.condputs('\n') return True def macro_r2(self): if self.is_white(2): self.refer2 = False self.condputs('\n') return True def macro_de(self): macro=True self.condputs('\n') return True def macro_bl_vl(self): if self.is_white(2): self.inlist = True self.condputs('\n') return True def macro_bv(self): if self.str_at(2) == 'L' and self.white(self.str_at(3)): self.inlist = True self.condputs('\n') return True def macro_le(self): if self.is_white(2): self.inlist = False self.condputs('\n') return True def macro_lp_pp(self): self.condputs('\n') return True def macro_ds(self): self.skip_char(2) self.skip_leading_whitespace() if self.str_at(0): # Split at whitespace comps = self.s.split(None, 2) if len(comps) is 2: name, value = comps value = value.rstrip() self.reg_table[name] = value self.condputs('\n') return True def macro_so_nx(self): # We always ignore include directives # deroff.c for some reason allowed this to fall through to the 'tr' case # I think that was just a bug so I won't replicate it return True def macro_tr(self): self.skip_char(2) self.skip_leading_whitespace() while self.s and self.str_at(0) != '\n': c = self.str_at(0) ns = self.str_at(1) self.skip_char(2) if not ns or ns == '\n': ns = ' ' self.tr_from += c self.tr_to += ns # Update our table, then swap in the slower tr-savvy condputs try: #Python2 self.tr = string.maketrans(self.tr_from, self.tr_to) except AttributeError: #Python3 self.tr = "".maketrans(self.tr_from, self.tr_to) self.condputs = self.condputs_tr return True def macro_sp(self): self.condputs('\n') return True def macro_other(self): self.condputs('\n') return True def request_or_macro(self): # s[0] is period or open single quote self.skip_char() s0 = self.s[1:2] if s0 == '\\': if self.str_at(1) == '"': self.condputs('\n') return True else: pass elif s0 == '[': self.refer = True self.condputs('\n') return True elif s0 == ']': self.refer = False self.skip_char() return self.text() elif s0 == '.': self.macro = False self.condputs('\n') return True self.nobody = False s0s1 = self.s[0:2] macro_func = Deroffer.g_macro_dict.get(s0s1, Deroffer.macro_other) if macro_func(self): return True if self.skipheaders and self.nobody: return True self.skip_leading_whitespace() while self.s and not self.is_white(0): self.skip_char() self.skip_leading_whitespace() while True: if not self.quoted_arg() and not self.text_arg(): if self.s: self.condputs(self.str_at(0)) self.skip_char() else: return True def request_or_macro2(self): self.skip_char() s0 = self.s[0:1] if s0 == '\\': if self.str_at(1) == '"': self.condputs('\n') return True else: pass elif s0 == '[': self.refer = True self.condputs('\n') return True elif s0 == ']': self.refer = False self.skip_char() return self.text() elif s0 == '.': self.macro = False self.condputs('\n') return True self.nobody = False s0s1 = self.s[0:2] if s0s1 == 'SH': for header_str in [' SYNOPSIS', ' "SYNOPSIS', ' ‹BERSICHT', ' "‹BERSICHT']: if self.s[2:].startswith(header_str): self.inheader = True break else: # Did not find a header string self.inheader = False self.nobody = True elif s0s1 in ['SS', 'IP', 'H ']: self.nobody = True elif s0s1 in ['I ', 'IR', 'IB', 'B ', 'BR', 'BI', 'R ', 'RB', 'RI', 'AB']: pass elif s0s1 in ['] ']: self.refer = False elif s0s1 in ['PS']: if self.is_white(2): self.pic = True self.condputs('\n') return True elif s0s1 in ['PE']: if self.is_white(2): self.pic = False self.condputs('\n') return True elif s0s1 in ['TS']: if self.is_white(2): self.tbl, self.tblstate = True, self.OPTIONS self.condputs('\n') return True elif s0s1 in ['T&']: if self.is_white(2): self.tbl, self.tblstate = True, self.FORMAT self.condputs('\n') return True elif s0s1 in ['TE']: if self.is_white(2): self.tbl = False self.condputs('\n') return True elif s0s1 in ['EQ']: if self.is_white(2): self.eqn = True self.condputs('\n') return True elif s0s1 in ['EN']: if self.is_white(2): self.eqn = False self.condputs('\n') return True elif s0s1 in ['R1']: if self.is_white(2): self.refer2 = True self.condputs('\n') return True elif s0s1 in ['R2']: if self.is_white(2): self.refer2 = False self.condputs('\n') return True elif s0s1 in ['de']: macro=True self.condputs('\n') return True elif s0s1 in ['BL', 'VL', 'AL', 'LB', 'RL', 'ML', 'DL']: if self.is_white(2): self.inlist = True self.condputs('\n') return True elif s0s1 in ['BV']: if self.str_at(2) == 'L' and self.white(self.str_at(3)): self.inlist = True self.condputs('\n') return True elif s0s1 in ['LE']: if self.is_white(2): self.inlist = False self.condputs('\n') return True elif s0s1 in ['LP', 'PP', 'P\n']: self.condputs('\n') return True elif s0s1 in ['ds']: self.skip_char(2) self.skip_leading_whitespace() if self.str_at(0): # Split at whitespace comps = self.s.split(None, 2) if len(comps) is 2: name, value = comps value = value.rstrip() self.reg_table[name] = value self.condputs('\n') return True elif s0s1 in ['so', 'nx']: # We always ignore include directives # deroff.c for some reason allowed this to fall through to the 'tr' case # I think that was just a bug so I won't replicate it return True elif s0s1 in ['tr']: self.skip_char(2) self.skip_leading_whitespace() while self.s and self.str_at(0) != '\n': c = self.str_at(0) ns = self.str_at(1) self.skip_char(2) if not ns or ns == '\n': ns = ' ' self.tr_from += c self.tr_to += ns # Update our table, then swap in the slower tr-savvy condputs try: #Python2 self.tr = string.maketrans(self.tr_from, self.tr_to) except AttributeError: #Python3 self.tr = "".maketrans(self.tr_from, self.tr_to) self.condputs = self.condputs_tr return True elif s0s1 in ['sp']: self.condputs('\n') return True else: self.condputs('\n') return True if self.skipheaders and self.nobody: return True self.skip_leading_whitespace() while self.s and not self.is_white(0): self.skip_char() self.skip_leading_whitespace() while True: if not self.quoted_arg() and not self.text_arg(): if self.s: self.condputs(self.str_at(0)) self.skip_char() else: return True def do_tbl(self): if self.tblstate == self.OPTIONS: while self.s and self.str_at(0) != ';' and self.str_at(0) != '\n': self.skip_leading_whitespace() if not self.str_at(0).isalpha(): # deroff.c has a bug where it can loop forever here...we try to work around it self.skip_char() else: # Parse option option = self.s arg = '' idx = 0 while option[idx:idx+1].isalpha(): idx += 1 if option[idx:idx+1] == '(': option = option[:idx] self.s = self.s[idx+1:] arg = self.s else: self.s = '' if arg: idx = arg.find(')') if idx != -1: arg = arg[:idx] self.s = self.s[idx+1:] else: #self.skip_char() pass if option.lower() == 'tab': self.tblTab = arg[0:1] self.tblstate = self.FORMAT self.condputs('\n') elif self.tblstate == self.FORMAT: while self.s and self.str_at(0) != '.' and self.str_at(0) != '\n': self.skip_leading_whitespace() if self.str_at(0): self.skip_char() if self.str_at(0) == '.': self.tblstate = self.DATA self.condputs('\n') elif self.tblstate == self.DATA: if self.tblTab: self.s = self.s.replace(self.tblTab, '\t') self.text() return True def do_line(self): if self.s[0:1] in ".'": if not self.request_or_macro(): return False elif self.tbl: self.do_tbl() else: self.text() return True def deroff(self, str): lines = str.split('\n') for line in lines: self.s = line + '\n' if not self.do_line(): break #self.putchar('\n') def deroff_files(files): for arg in files: sys.stderr.write(arg + '\n') if arg.endswith('.gz'): f = gzip.open(arg, 'r') str = f.read() if IS_PY3: str = str.decode('latin-1') else: f = open(arg, 'r') str = f.read() d = Deroffer() d.deroff(str) d.flush_output(sys.stdout) f.close() if __name__ == "__main__": import gzip paths = sys.argv[1:] if True: deroff_files(paths) else: import cProfile, profile, pstats profile.run('deroff_files(paths)', 'fooprof') p = pstats.Stats('fooprof') p.sort_stats('time').print_stats(100) #p.sort_stats('calls').print_callers(.5, 'startswith') fish/share/tools/web_config/000077500000000000000000000000001214535744100163615ustar00rootroot00000000000000fish/share/tools/web_config/delete.png000066400000000000000000000046321214535744100203360ustar00rootroot00000000000000‰PNG  IHDR‰ ðiCCPICC Profile(‘UÝoÛT?‰o\¤? ±Ž‹¯US[¹­ÆI“¥éB¹ÍØ*¤ÉunS×6¶ÓmUŸöo ø€²xB Äö²í´ISAÕ$¤=tÚ@h“ö‚ªp®¯S»]Ƹ‘¯9çw>ïÑ5@ÇWšã˜I`Þò]5Ÿ‘Ÿ˜–;V! ÏA'ô@§¦{Nº\..Æ…GÖÃ_!ÁÞ7ÚëÿsuV©§$žBlW=}ñi€”©;® ÞFùð)ßAÜñ<â.&ˆXax–ã,Ã38Sê(b–‹¤×µ*â%Äý31ùl ó‚µ#O-êºÌzQvíšaÒXºOPÿÏ5o6Zñzñéòæ&â»Õ^wÇÔ®k¹IÄ/#¾æø&ñ½Æ\%x/@ò™š{¤ÂùÉ7ëSï Þ‰¸jø…©P¾hÍ”&¸mryÎ>ª†œkº7Š=ƒߪÓB‘ç#@•fs¬_ˆ{ë±Ð¿0î-LæZ~ë£%îGpßÓÆËˆ{èÚêÏYX¦f^åþ…+Ž_sÖ-³Tä>‰D½ Æ@îקƸ-9àã!r[2]3ŽBþ’c³ˆ¹‘ónC­„œš›Ës?ä>µ*¡ÏÔ®ª–e½D|Ž%4 `à î:X°2¨‡ ¾pQSL”PÔR”‰§aeíyå€ÃqĘ ¬×™5FiÏáî„›t…ìÇç )’Cd˜Œ€LÞ$o‘Ã$‹ÒrpÓ¶‹ÏbÝÙôó>4Ð+ãƒÌ¹žF_ï¬{ÒЯô÷kû‘œi+ŸxÀô˜ñú¯.ý°+ò±B.¼{³ëêL<©¿©Û©õÔ î«©µˆ‘ú=µ†¿UHcnfÑ<>F‡Ë ^Ãe||ÐpÿyvŒ·%bÍ:×iX'襇%8ÛI•ß”?•å å¼rw[—ÛvIøTøVøQøNø^ødá’pYøI¸"|#\ŒÕãçcóìƒz[Õ2M»^S0¥Œ´[zIÊJ/H¯HÅÈŸÔ- IcÒÔìÞ<·x¼x-œÀ½ÕÕö±8¯‚ZNxA‡-8³mþCkÒK†HaÛÔ³Yn1Äœ˜Ó ‹{ÅqHg¸•Ÿ¸u#¸ç¶Lþ˜ hŒ¯s ˜:6«Ìz!Ðy@}zÚgí¨íœqÙº/ïS”×å4~ª¨\°ôÁ~Y3M9Py²K=ê.Ðê °ï ¿¢¨Á÷-±óz$óß8ôÞY7"Ùtàk ûµHÖ‡wⳟ\8 7Ü…ðÎO$~ðjû÷ñ]¼›n5›ð¾êø`ããfóŸåfsãKô¿pÉüYqxÄ(Â@ pHYs  šœPIDAT8]”kL“g†ï÷ýN-¥”EÉ)KP¸HMØ œSSæ4‹šˆœfÆcÄ&›ŽeËœK6“9‡Ù˜e.fÑMõ0qˆdà(ÈIÆÇ¡…ök¿ï}÷cbÜž¿Ož+Ïܹç³ãñxD—Ë¥@}}ý\תU.“ 8 Æâ ÃÐ5MëSUµ¹Àé¼Ê9>9£Ø,ƒ<èGplÛ·ïl¦~ÔôÐêÑf²a†Òž1Uý¬¸¨è p{5>Ÿú7ŒqÇëë%gf`±X`´Âl6Ã’œkî"Hê0YL dI9 “ÙlЮ{…(&&``ÆÃ~$nyéUïbLÓÆ—˜»Ã‘sÄæåÁùõiX‰P~˜á–”T*DZ1íó RUU›a³AZ²HwÜçño¿…¬Ý{0á÷#èóÁ‘”v»d`ö„¡¹¹È9}ö8HýÝ<.¿BTÔèŽM›:hÓy5 =é6’À¸®ƒ50B›ÜiÅý-[ñ`ï.hÂ…RІQD„Fòê5SÚÀ9,pÎõö{÷Xê¢ìW‡š®é“—=B`b ÏBooƒw{LK‚ŒbÊã}ù hý}Þ½ÂõfûñG"Š]ü§sç¶<µÍµ›7=fU-þ½¬L#€U°|x¢$ä(0É ä€1q°ˆ"”+M,ººŠÏ9þ¥ÐÜÖöa~NÎA”pÎ)V4ÏãþîÇ_-““KºŽ}bèžë\±ƒÊö$"K2‘)…™® >àf F‚»NJÜ»]^ï· RR¶!„ˆ˜ÛíoôOª„ߟ?:iïþ5’?hiéëŸPd4)…ÚÊדy«×P-%•·´wYšuÜn7圳§‘g}ÇOœXkµÙªeÃxÞ.Ë–(Y†)"¢Õ j³† i¸ÑÐp¬¦¦¦yV[[Ëþoìÿ,`sMMZnvö‚¨˜‡Él6~ÿàžÊÊçgõOáüÈ?sýt­T IEND®B`‚fish/share/tools/web_config/index.html000066400000000000000000001017461214535744100203670ustar00rootroot00000000000000 fish shell configuration
fish

colors
prompt
functions
variables
history
Text
Background
Underline
use prompt
fish/share/tools/web_config/jquery.js000066400000000000000000002711701214535744100202460ustar00rootroot00000000000000/*! jQuery v1.7.2 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);fish/share/tools/web_config/sample_prompts/000077500000000000000000000000001214535744100214265ustar00rootroot00000000000000fish/share/tools/web_config/sample_prompts/classic.fish000066400000000000000000000016451214535744100237300ustar00rootroot00000000000000# name: Classic function fish_prompt --description "Write out the prompt" # 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 switch $USER case root if not set -q __fish_prompt_cwd if set -q fish_color_cwd_root set -g __fish_prompt_cwd (set_color $fish_color_cwd_root) else set -g __fish_prompt_cwd (set_color $fish_color_cwd) end end echo -n -s "$USER" @ "$__fish_prompt_hostname" ' ' "$__fish_prompt_cwd" (prompt_pwd) "$__fish_prompt_normal" '# ' case '*' if not set -q __fish_prompt_cwd set -g __fish_prompt_cwd (set_color $fish_color_cwd) end echo -n -s "$USER" @ "$__fish_prompt_hostname" ' ' "$__fish_prompt_cwd" (prompt_pwd) "$__fish_prompt_normal" '> ' end end fish/share/tools/web_config/sample_prompts/classic_git.fish000066400000000000000000000051131214535744100245650ustar00rootroot00000000000000# name: Classic + Git # author: Kevin Ballard function fish_prompt --description 'Write out the prompt' set -l last_status $status # 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 if not set -q -g __fish_classic_git_functions_defined set -g __fish_classic_git_functions_defined function __fish_repaint_user --on-variable fish_color_user --description "Event handler, repaint when fish_color_user changes" if status --is-interactive set -e __fish_prompt_user commandline -f repaint ^/dev/null end end function __fish_repaint_host --on-variable fish_color_host --description "Event handler, repaint when fish_color_host changes" if status --is-interactive set -e __fish_prompt_host commandline -f repaint ^/dev/null end end function __fish_repaint_status --on-variable fish_color_status --description "Event handler; repaint when fish_color_status changes" if status --is-interactive set -e __fish_prompt_status commandline -f repaint ^/dev/null end end end set -l delim '>' switch $USER case root if not set -q __fish_prompt_cwd if set -q fish_color_cwd_root set -g __fish_prompt_cwd (set_color $fish_color_cwd_root) else set -g __fish_prompt_cwd (set_color $fish_color_cwd) end end case '*' if not set -q __fish_prompt_cwd set -g __fish_prompt_cwd (set_color $fish_color_cwd) end end set -l prompt_status if test $last_status -ne 0 if not set -q __fish_prompt_status set -g __fish_prompt_status (set_color $fish_color_status) end set prompt_status "$__fish_prompt_status [$last_status]$__fish_prompt_normal" end if not set -q __fish_prompt_user set -g __fish_prompt_user (set_color $fish_color_user) end if not set -q __fish_prompt_host set -g __fish_prompt_host (set_color $fish_color_host) end echo -n -s "$__fish_prompt_user" "$USER" "$__fish_prompt_normal" @ "$__fish_prompt_host" "$__fish_prompt_hostname" "$__fish_prompt_normal" ' ' "$__fish_prompt_cwd" (prompt_pwd) (__fish_git_prompt) "$__fish_prompt_normal" "$prompt_status" "$delim" ' ' end # initialize our new variables # in theory this would be in a fish_prompt event, but this file isn't sourced # until the fish_prompt function is called anyway. if not set -q __prompt_initialized_2 set -U fish_color_user -o green set -U fish_color_host -o cyan set -U fish_color_status red set -U __prompt_initialized_2 end fish/share/tools/web_config/sample_prompts/classic_status.fish000066400000000000000000000030461214535744100253300ustar00rootroot00000000000000# name: Classic + Status # author: David Frascone function fish_prompt --description 'Write out the prompt' # Save our status set -l last_status $status set -l last_status_string "" if [ $last_status -ne 0 ] printf "%s(%d)%s " (set_color red --bold) $last_status (set_color normal) end # 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 user_prompt '>' switch $USER # Set our root colors, if we're root :) case root set user_prompt '#' if not set -q __fish_prompt_cwd if set -q fish_color_cwd_root set -g __fish_prompt_cwd (set_color $fish_color_cwd_root) else set -g __fish_prompt_cwd (set_color $fish_color_cwd) end end case '*' if not set -q __fish_prompt_cwd set -g __fish_prompt_cwd (set_color $fish_color_cwd) end end #printf '%s@%s %s%s%s# ' $USER $__fish_prompt_hostname "$__fish_prompt_cwd" (prompt_pwd) "$__fish_prompt_normal" #printf "LAST STATUS STRING: $last_status_string \n" printf '%s@%s %s%s%s%s%s ' $USER $__fish_prompt_hostname "$__fish_prompt_cwd" (prompt_pwd) "$__fish_prompt_normal" $user_prompt end function fish_title echo $_ ' ' (prompt_pwd) end fish/share/tools/web_config/sample_prompts/informative.fish000066400000000000000000000027611214535744100246320ustar00rootroot00000000000000# name: Informative # http://michal.karzynski.pl/blog/2009/11/19/my-informative-shell-prompt/ function fish_prompt --description 'Write out the prompt' #Save the return status of the previous command set stat $status # 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 if not set -q __fish_color_blue set -g __fish_color_blue (set_color -o blue) end #Set the color for the status depending on the value set __fish_color_status (set_color -o green) if test $stat -gt 0 set __fish_color_status (set_color -o red) end switch $USER case root if not set -q __fish_prompt_cwd if set -q fish_color_cwd_root set -g __fish_prompt_cwd (set_color $fish_color_cwd_root) else set -g __fish_prompt_cwd (set_color $fish_color_cwd) end end printf '%s@%s %s%s%s# ' $USER $__fish_prompt_hostname "$__fish_prompt_cwd" (prompt_pwd) "$__fish_prompt_normal" case '*' if not set -q __fish_prompt_cwd set -g __fish_prompt_cwd (set_color $fish_color_cwd) end printf '[%s] %s%s@%s %s%s %s(%s)%s \f\r> ' (date "+%H:%M:%S") "$__fish_color_blue" $USER $__fish_prompt_hostname "$__fish_prompt_cwd" (pwd) "$__fish_color_status" "$stat" "$__fish_prompt_normal" end endfish/share/tools/web_config/sample_prompts/justadollar.fish000066400000000000000000000000751214535744100246270ustar00rootroot00000000000000# name: Just a Dollar function fish_prompt echo -n '$ ' end fish/share/tools/web_config/sample_prompts/lonetwin.fish000066400000000000000000000011501214535744100241350ustar00rootroot00000000000000# name: lonetwin # author: Steve function fish_prompt --description 'Write out the prompt' # 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 -s) end if not set -q __fish_prompt_normal set -g __fish_prompt_normal (set_color normal) end if not set -q __fish_prompt_cwd set -g __fish_prompt_cwd (set_color $fish_color_cwd) end echo -n -s "$USER" @ "$__fish_prompt_hostname" ' ' "$__fish_prompt_cwd" (prompt_pwd) (__fish_git_prompt) "$__fish_prompt_normal" '> ' end fish/share/tools/web_config/sample_prompts/minimalist.fish000066400000000000000000000002341214535744100244460ustar00rootroot00000000000000# name: Minimalist # author: ridiculous_fish function fish_prompt set_color $fish_color_cwd echo -n (basename $PWD) set_color normal echo -n ' ) ' end fish/share/tools/web_config/sample_prompts/nim.fish000066400000000000000000000035101214535744100230630ustar00rootroot00000000000000# name: Nim # author: Guilhem "Nim" Saurel − https://github.com/nim65s/dotfiles/ function fish_prompt and set retc green; or set retc red tty|grep -q tty; and set tty tty; or set tty pts set_color $retc if [ $tty = tty ] echo -n .- else echo -n '┬─' end set_color -o green echo -n [ if [ $USER = root ] set_color -o red else set_color -o yellow end echo -n $USER set_color -o white echo -n @ if [ -z "$SSH_CLIENT" ] set_color -o blue else set_color -o cyan end echo -n (hostname) set_color -o white #echo -n :(prompt_pwd) echo -n :(pwd|sed "s=$HOME=~=") set_color -o green echo -n ']' set_color normal set_color $retc if [ $tty = tty ] echo -n '-' else echo -n '─' end set_color -o green echo -n '[' set_color normal set_color $retc echo -n (date +%X) set_color -o green echo -n ] # Check if acpi exists if not set -q __fish_nim_prompt_has_acpi if type acpi > /dev/null set -g __fish_nim_prompt_has_acpi '' else set -g __fish_nim_prompt_has_acpi '' # empty string end end if test "$__fish_nim_prompt_has_acpi" if [ (acpi -a 2> /dev/null | grep off) ] echo -n '─[' set_color -o red echo -n (acpi -b|cut -d' ' -f 4-) set_color -o green echo -n ']' end end echo set_color normal for job in (jobs) set_color $retc if [ $tty = tty ] echo -n '; ' else echo -n '│ ' end set_color brown echo $job end set_color normal set_color $retc if [ $tty = tty ] echo -n "'->" else echo -n '╰─>' end set_color -o red echo -n '$ ' set_color normal end fish/share/tools/web_config/sample_prompts/pythonista.fish000066400000000000000000000012071214535744100245030ustar00rootroot00000000000000# name: Simple Pythonista # author: davbo set normal (set_color normal) set magenta (set_color magenta) set yellow (set_color yellow) set green (set_color green) set gray (set_color -o black) function fish_prompt set_color yellow printf '%s' (whoami) set_color normal printf ' at ' set_color magenta printf '%s' (hostname|cut -d . -f 1) set_color normal printf ' in ' set_color $fish_color_cwd printf '%s' (prompt_pwd) set_color normal # Line 2 echo if test $VIRTUAL_ENV printf "(%s) " (set_color blue)(basename $VIRTUAL_ENV)(set_color normal) end printf '↪ ' set_color normal end fish/share/tools/web_config/sample_prompts/robbyrussell.fish000066400000000000000000000016411214535744100250320ustar00rootroot00000000000000# name: Robbyrussell # author: Bruno Ferreira Pinto function fish_prompt if not set -q -g __fish_robbyrussell_functions_defined set -g __fish_robbyrussell_functions_defined function _git_branch_name echo (git symbolic-ref HEAD ^/dev/null | sed -e 's|^refs/heads/||') end function _is_git_dirty echo (git status -s --ignore-submodules=dirty ^/dev/null) end end set -l cyan (set_color -o cyan) set -l yellow (set_color -o yellow) set -l red (set_color -o red) set -l blue (set_color -o blue) set -l normal (set_color normal) set -l arrow "$red➜ " set -l cwd $cyan(basename (prompt_pwd)) if [ (_git_branch_name) ] set -l git_branch $red(_git_branch_name) set git_info "$blue git:($git_branch$blue)" if [ (_is_git_dirty) ] set -l dirty "$yellow ✗" set git_info "$git_info$dirty" end end echo -n -s $arrow $cwd $git_info $normal '>' end fish/share/tools/web_config/sample_prompts/screen_savvy.fish000066400000000000000000000007451214535744100250160ustar00rootroot00000000000000# name: Screen Savvy # author: Matthias function fish_prompt -d "Write out the prompt" if test -z $WINDOW printf '%s%s@%s%s%s%s%s> ' (set_color yellow) (whoami) (set_color purple) (hostname|cut -d . -f 1) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) else printf '%s%s@%s%s%s(%s)%s%s%s> ' (set_color yellow) (whoami) (set_color purple) (hostname|cut -d . -f 1) (set_color white) (echo $WINDOW) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) end end fish/share/tools/web_config/sample_prompts/terlar.fish000066400000000000000000000011571214535744100235760ustar00rootroot00000000000000# name: Terlar # author: terlar - https://github.com/terlar set -xg fish_color_user magenta set -xg fish_color_host yellow function fish_prompt --description 'Write out the prompt' set -l last_status $status # User set_color $fish_color_user echo -n (whoami) set_color normal echo -n '@' # Host set_color $fish_color_host echo -n (hostname -s) set_color normal echo -n ':' # PWD set_color $fish_color_cwd echo -n (prompt_pwd) set_color normal __terlar_git_prompt echo if not test $last_status -eq 0 set_color $fish_color_error end echo -n '➤ ' set_color normal end fish/share/tools/web_config/sample_prompts/user_host_path.fish000066400000000000000000000007421214535744100253330ustar00rootroot00000000000000# name: User, Host, Path # author: Jon Clayden function fish_prompt -d "Write out the prompt" set -l home_escaped (echo -n $HOME | sed 's/\//\\\\\//g') set -l pwd (echo -n $PWD | sed "s/^$home_escaped/~/" | sed 's/ /%20/g') set -l prompt_symbol '' switch $USER case root; set prompt_symbol '#' case '*'; set prompt_symbol '$' end printf "[%s@%s %s%s%s]%s " $USER (hostname -s) (set_color $fish_color_cwd) $pwd (set_color normal) $prompt_symbol end fish/share/tools/web_config/webconfig.py000077500000000000000000000623431214535744100207110ustar00rootroot00000000000000#!/usr/bin/env python # Whether we're Python 2 import sys, os IS_PY2 = sys.version_info[0] == 2 if IS_PY2: import SimpleHTTPServer import SocketServer try: from urllib.parse import parse_qs except ImportError: from cgi import parse_qs else: import http.server as SimpleHTTPServer import socketserver as SocketServer from urllib.parse import parse_qs import webbrowser import subprocess import re, socket, os, sys, cgi, select, time, glob try: import json except ImportError: import simplejson as json FISH_BIN_PATH = False # will be set later def run_fish_cmd(text): from subprocess import PIPE p = subprocess.Popen([FISH_BIN_PATH], stdin=PIPE, stdout=PIPE, stderr=PIPE) if IS_PY2: out, err = p.communicate(text) else: out, err = p.communicate(bytes(text, 'utf-8')) out = str(out, 'utf-8') err = str(err, 'utf-8') return(out, err) def escape_fish_cmd(text): # Replace one backslash with two, and single quotes with backslash-quote escaped = text.replace('\\', '\\\\').replace("'", "\\'") return "'" + escaped + "'" named_colors = { 'black' : '000000', 'red' : 'FF0000', 'green' : '00FF00', 'brown' : '725000', 'yellow' : 'FFFF00', 'blue' : '0000FF', 'magenta' : 'FF00FF', 'purple' : 'FF00FF', 'cyan' : '00FFFF', 'white' : 'FFFFFF' } def parse_one_color(comp): """ A basic function to parse a single color value like 'FFA000' """ if comp in named_colors: # Named color return named_colors[comp] elif re.match(r"[0-9a-fA-F]{3}", comp) is not None or re.match(r"[0-9a-fA-F]{6}", comp) is not None: # Hex color return comp else: # Unknown return '' def better_color(c1, c2): """ Indicate which color is "better", i.e. prefer term256 colors """ if not c2: return c1 if not c1: return c2 if c1 == 'normal': return c2 if c2 == 'normal': return c1 if c2 in named_colors: return c1 if c1 in named_colors: return c2 return c1 def parse_color(color_str): """ A basic function to parse a color string, for example, 'red' '--bold' """ comps = color_str.split(' ') color = 'normal' background_color = '' bold, underline = False, False for comp in comps: # Remove quotes comp = comp.strip("'\" ") if comp == '--bold': bold = True elif comp == '--underline': underline = True elif comp.startswith('--background='): # Background color background_color = better_color(background_color, parse_one_color(comp[len('--background='):])) else: # Regular color color = better_color(color, parse_one_color(comp)) return [color, background_color, bold, underline] def parse_bool(val): val = val.lower() if val.startswith('f') or val.startswith('0'): return False if val.startswith('t') or val.startswith('1'): return True return bool(val) def html_color_for_ansi_color_index(val): arr = ['black', '#AA0000', '#00AA00', '#AA5500', '#0000AA', '#AA00AA', '#00AAAA', '#AAAAAA', '#555555', '#FF5555', '#55FF55', '#FFFF55', '#5555FF', '#FF55FF', '#55FFFF', 'white', '#000000', '#00005f', '#000087', '#0000af', '#0000d7', '#0000ff', '#005f00', '#005f5f', '#005f87', '#005faf', '#005fd7', '#005fff', '#008700', '#00875f', '#008787', '#0087af', '#0087d7', '#0087ff', '#00af00', '#00af5f', '#00af87', '#00afaf', '#00afd7', '#00afff', '#00d700', '#00d75f', '#00d787', '#00d7af', '#00d7d7', '#00d7ff', '#00ff00', '#00ff5f', '#00ff87', '#00ffaf', '#00ffd7', '#00ffff', '#5f0000', '#5f005f', '#5f0087', '#5f00af', '#5f00d7', '#5f00ff', '#5f5f00', '#5f5f5f', '#5f5f87', '#5f5faf', '#5f5fd7', '#5f5fff', '#5f8700', '#5f875f', '#5f8787', '#5f87af', '#5f87d7', '#5f87ff', '#5faf00', '#5faf5f', '#5faf87', '#5fafaf', '#5fafd7', '#5fafff', '#5fd700', '#5fd75f', '#5fd787', '#5fd7af', '#5fd7d7', '#5fd7ff', '#5fff00', '#5fff5f', '#5fff87', '#5fffaf', '#5fffd7', '#5fffff', '#870000', '#87005f', '#870087', '#8700af', '#8700d7', '#8700ff', '#875f00', '#875f5f', '#875f87', '#875faf', '#875fd7', '#875fff', '#878700', '#87875f', '#878787', '#8787af', '#8787d7', '#8787ff', '#87af00', '#87af5f', '#87af87', '#87afaf', '#87afd7', '#87afff', '#87d700', '#87d75f', '#87d787', '#87d7af', '#87d7d7', '#87d7ff', '#87ff00', '#87ff5f', '#87ff87', '#87ffaf', '#87ffd7', '#87ffff', '#af0000', '#af005f', '#af0087', '#af00af', '#af00d7', '#af00ff', '#af5f00', '#af5f5f', '#af5f87', '#af5faf', '#af5fd7', '#af5fff', '#af8700', '#af875f', '#af8787', '#af87af', '#af87d7', '#af87ff', '#afaf00', '#afaf5f', '#afaf87', '#afafaf', '#afafd7', '#afafff', '#afd700', '#afd75f', '#afd787', '#afd7af', '#afd7d7', '#afd7ff', '#afff00', '#afff5f', '#afff87', '#afffaf', '#afffd7', '#afffff', '#d70000', '#d7005f', '#d70087', '#d700af', '#d700d7', '#d700ff', '#d75f00', '#d75f5f', '#d75f87', '#d75faf', '#d75fd7', '#d75fff', '#d78700', '#d7875f', '#d78787', '#d787af', '#d787d7', '#d787ff', '#d7af00', '#d7af5f', '#d7af87', '#d7afaf', '#d7afd7', '#d7afff', '#d7d700', '#d7d75f', '#d7d787', '#d7d7af', '#d7d7d7', '#d7d7ff', '#d7ff00', '#d7ff5f', '#d7ff87', '#d7ffaf', '#d7ffd7', '#d7ffff', '#ff0000', '#ff005f', '#ff0087', '#ff00af', '#ff00d7', '#ff00ff', '#ff5f00', '#ff5f5f', '#ff5f87', '#ff5faf', '#ff5fd7', '#ff5fff', '#ff8700', '#ff875f', '#ff8787', '#ff87af', '#ff87d7', '#ff87ff', '#ffaf00', '#ffaf5f', '#ffaf87', '#ffafaf', '#ffafd7', '#ffafff', '#ffd700', '#ffd75f', '#ffd787', '#ffd7af', '#ffd7d7', '#ffd7ff', '#ffff00', '#ffff5f', '#ffff87', '#ffffaf', '#ffffd7', '#ffffff', '#080808', '#121212', '#1c1c1c', '#262626', '#303030', '#3a3a3a', '#444444', '#4e4e4e', '#585858', '#626262', '#6c6c6c', '#767676', '#808080', '#8a8a8a', '#949494', '#9e9e9e', '#a8a8a8', '#b2b2b2', '#bcbcbc', '#c6c6c6', '#d0d0d0', '#dadada', '#e4e4e4', '#eeeeee'] if val < 0 or val >= len(arr): return '' else: return arr[val] # Function to return special ANSI escapes like exit_attribute_mode g_special_escapes_dict = None def get_special_ansi_escapes(): global g_special_escapes_dict if g_special_escapes_dict is None: import curses g_special_escapes_dict = {} curses.setupterm() # Helper function to get a value for a tparm def get_tparm(key): val = None key = curses.tigetstr("sgr0") if key: val = curses.tparm(key) if val: val = val.decode('utf-8') return val # Just a few for now g_special_escapes_dict['exit_attribute_mode'] = get_tparm('sgr0') g_special_escapes_dict['bold'] = get_tparm('bold') g_special_escapes_dict['underline'] = get_tparm('smul') return g_special_escapes_dict # Given a known ANSI escape sequence, convert it to HTML and append to the list # Returns whether we have an open def append_html_for_ansi_escape(full_val, result, span_open): # Strip off the initial \x1b[ and terminating m val = full_val[2:-1] # Helper function to close a span if it's open def close_span(): if span_open: result.append('') # term256 foreground color match = re.match('38;5;(\d+)', val) if match is not None: close_span() html_color = html_color_for_ansi_color_index(int(match.group(1))) result.append('') return True # span now open # term8 foreground color if val in [str(x) for x in range(30, 38)]: close_span() html_color = html_color_for_ansi_color_index(int(val) - 30) result.append('') return True # span now open # Try special escapes special_escapes = get_special_ansi_escapes() if full_val == special_escapes['exit_attribute_mode']: close_span() return False # We don't handle bold or underline yet # Do nothing on failure return span_open def strip_ansi(val): # Make a half-assed effort to strip ANSI control sequences # We assume that all such sequences start with 0x1b and end with m, # which catches most cases return re.sub("\x1b[^m]*m", '', val) def ansi_prompt_line_width(val): # Given an ANSI prompt, return the length of its longest line, as in the number of characters it takes up # Start by stripping off ANSI stripped_val = strip_ansi(val) # Now count the longest line return max([len(x) for x in stripped_val.split('\n')]) def ansi_to_html(val): # Split us up by ANSI escape sequences # We want to catch not only the standard color codes, but also things like sgr0 # Hence this lame check # Note that Python 2.6 doesn't have a flag param to re.split, so we have to compile it first reg = re.compile(""" ( # Capture \x1b # Escape [^m]+ # One or more non-'m's m # Literal m terminates the sequence ) # End capture """, re.VERBOSE) separated = reg.split(val) # We have to HTML escape the text and convert ANSI escapes into HTML # Collect it all into this array result = [] span_open = False # Text is at even indexes, escape sequences at odd indexes for i in range(len(separated)): component = separated[i] if i % 2 == 0: # It's text, possibly empty # Clean up other ANSI junk result.append(cgi.escape(strip_ansi(component))) else: # It's an escape sequence. Close the previous escape. span_open = append_html_for_ansi_escape(component, result, span_open) # Close final escape if span_open: result.append('') # Remove empty elements result = [x for x in result if x] # Clean up empty spans, the nasty way idx = len(result) - 1 while idx >= 1: if result[idx] == '' and result[idx-1].startswith('', 'end': 'Like ; and &', 'error': 'Potential errors', 'param': 'Command parameters', 'comment': 'Comments start with #', 'match': 'Matching parenthesis', 'search_match': 'History searching', 'history_current': 'Directory history', 'operator': 'Like * and ~', 'escape': 'Escapes like \\n', 'cwd': 'Current directory', 'cwd_root': 'cwd for root user', 'valid_path': 'Valid paths', 'autosuggestion': 'Suggested completion' } out, err = run_fish_cmd('set -L') for line in out.split('\n'): for match in re.finditer(r"^fish_color_(\S+) ?(.*)", line): color_name, color_value = [x.strip() for x in match.group(1, 2)] color_desc = descriptions.get(color_name, '') result.append([color_name, color_desc, parse_color(color_value)]) remaining.discard(color_name) # Ensure that we have all the color names we know about, so that if the # user deletes one he can still set it again via the web interface for color_name in remaining: color_desc = descriptions.get(color_name, '') result.append([color_name, color_desc, parse_color('')]) # Sort our result (by their keys) result.sort() return result def do_get_functions(self): out, err = run_fish_cmd('functions') out = out.strip() # Not sure why fish sometimes returns this with newlines if "\n" in out: return out.split('\n') else: return out.strip().split(', ') def do_get_variable_names(self, cmd): " Given a command like 'set -U' return all the variable names " out, err = run_fish_cmd(cmd) return out.split('\n') def do_get_variables(self): out, err = run_fish_cmd('set -L') # Put all the variables into a dictionary vars = {} for line in out.split('\n'): comps = line.split(' ', 1) if len(comps) < 2: continue fish_var = FishVar(comps[0], comps[1]) vars[fish_var.name] = fish_var # Mark universal variables. L means don't abbreviate. for name in self.do_get_variable_names('set -nUL'): if name in vars: vars[name].universal = True # Mark exported variables. L means don't abbreviate. for name in self.do_get_variable_names('set -nxL'): if name in vars: vars[name].exported = True return [vars[key].get_json_obj() for key in sorted(vars.keys(), key=str.lower)] def do_get_history(self): # Use \x1e ("record separator") to distinguish between history items. The first # backslash is so Python passes one backslash to fish out, err = run_fish_cmd('for val in $history; echo -n $val \\x1e; end') result = out.split(' \x1e') if result: result.pop() # Trim off the trailing element return result def do_get_color_for_variable(self, name): "Return the color with the given name, or the empty string if there is none" out, err = run_fish_cmd("echo -n $" + name) return out def do_set_color_for_variable(self, name, color, background_color, bold, underline): if not color: color = 'normal' "Sets a color for a fish color name, like 'autosuggestion'" command = 'set -U fish_color_' + name if color: command += ' ' + color if background_color: command += ' --background=' + background_color if bold: command += ' --bold' if underline: command += ' --underline' out, err = run_fish_cmd(command) return out def do_get_function(self, func_name): out, err = run_fish_cmd('functions ' + func_name) return out def do_delete_history_item(self, history_item_text): # It's really lame that we always return success here out, err = run_fish_cmd('builtin history --save --delete -- ' + escape_fish_cmd(history_item_text)) return True def do_set_prompt_function(self, prompt_func): cmd = prompt_func + '\n' + 'funcsave fish_prompt' out, err = run_fish_cmd(cmd) return len(err) == 0 def do_get_prompt(self, command_to_run, prompt_function_text): # Return the prompt output by the given command prompt_demo_ansi, err = run_fish_cmd(command_to_run) prompt_demo_html = ansi_to_html(prompt_demo_ansi) prompt_demo_font_size = self.font_size_for_ansi_prompt(prompt_demo_ansi) return {'function': prompt_function_text, 'demo': prompt_demo_html, 'font_size': prompt_demo_font_size } def do_get_current_prompt(self): # Return the current prompt prompt_func, err = run_fish_cmd('functions fish_prompt') return self.do_get_prompt('cd "' + initial_wd + '" ; fish_prompt', prompt_func.strip()) def do_get_sample_prompt(self, text): # Return the prompt you get from the given text cmd = text + "\n cd \"" + initial_wd + "\" \n fish_prompt\n" return self.do_get_prompt(cmd, text.strip()) def parse_one_sample_prompt_hash(self, line, result_dict): # Allow us to skip whitespace, etc. if not line: return True if line.isspace(): return True # Parse a comment hash like '# name: Classic' match = re.match(r"#\s*(\w+?): (.+)", line, re.IGNORECASE) if match: key = match.group(1).strip() value = match.group(2).strip() result_dict[key] = value return True # Skip other hash comments return line.startswith('#') def read_one_sample_prompt(self, fd): # Read one sample prompt from fd function_lines = [] result = {} parsing_hashes = True for line in fd: # Parse hashes until parse_one_sample_prompt_hash return False if parsing_hashes: parsing_hashes = self.parse_one_sample_prompt_hash(line, result) # Maybe not we're not parsing hashes, or maybe we already were not if not parsing_hashes: function_lines.append(line) result['function'] = ''.join(function_lines).strip() return result def do_get_sample_prompts_list(self): result = [] # Start with the "Current" meta-sample result.append({'name': 'Current'}) # Read all of the prompts in sample_prompts paths = glob.iglob('sample_prompts/*.fish') for path in paths: try: fd = open(path) result.append(self.read_one_sample_prompt(fd)) fd.close() except IOError: # Ignore unreadable files, etc pass return result def font_size_for_ansi_prompt(self, prompt_demo_ansi): width = ansi_prompt_line_width(prompt_demo_ansi) # Pick a font size if width >= 70: font_size = '8pt' if width >= 60: font_size = '10pt' elif width >= 50: font_size = '11pt' elif width >= 40: font_size = '13pt' elif width >= 30: font_size = '15pt' elif width >= 25: font_size = '16pt' elif width >= 20: font_size = '17pt' else: font_size = '18pt' return font_size def do_GET(self): p = self.path if p == '/colors/': output = self.do_get_colors() elif p == '/functions/': output = self.do_get_functions() elif p == '/variables/': output = self.do_get_variables() elif p == '/history/': # start = time.time() output = self.do_get_history() # end = time.time() # print "History: ", end - start elif p == '/current_prompt/': output = self.do_get_current_prompt() elif p == '/sample_prompts/': output = self.do_get_sample_prompts_list() elif re.match(r"/color/(\w+)/", p): name = re.match(r"/color/(\w+)/", p).group(1) output = self.do_get_color_for_variable(name) else: return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) # Return valid output self.send_response(200) self.send_header('Content-type','text/html') self.write_to_wfile('\n') # Output JSON self.write_to_wfile(json.dumps(output)) def do_POST(self): p = self.path if IS_PY2: ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) else: # Python 3 ctype, pdict = cgi.parse_header(self.headers['content-type']) if ctype == 'multipart/form-data': postvars = cgi.parse_multipart(self.rfile, pdict) elif ctype == 'application/x-www-form-urlencoded': try: length = int(self.headers.getheader('content-length')) except AttributeError: length = int(self.headers['content-length']) # parse_qs borks if we give it a Unicode string in Python2. url_str = self.rfile.read(length).decode('utf-8') if IS_PY2: url_str = str(url_str) postvars = cgi.parse_qs(url_str, keep_blank_values=1) else: postvars = {} if p == '/set_color/': what = postvars.get('what') color = postvars.get('color') background_color = postvars.get('background_color') bold = postvars.get('bold') underline = postvars.get('underline') if what: # Not sure why we get lists here? output = self.do_set_color_for_variable(what[0], color[0], background_color[0], parse_bool(bold[0]), parse_bool(underline[0])) else: output = 'Bad request' elif p == '/get_function/': what = postvars.get('what') output = [self.do_get_function(what[0])] elif p == '/get_sample_prompt/': what = postvars.get('what') output = [self.do_get_sample_prompt(what[0])] elif p == '/delete_history_item/': what = postvars.get('what') if self.do_delete_history_item(what[0]): output = ["OK"] else: output = ["Unable to delete history item"] elif p == '/set_prompt/': what = postvars.get('what') if self.do_set_prompt_function(what[0]): output = ["OK"] else: output = ["Unable to set prompt"] else: return SimpleHTTPServer.SimpleHTTPRequestHandler.do_POST(self) # Return valid output self.send_response(200) self.send_header('Content-type','text/html') self.write_to_wfile('\n') # Output JSON self.write_to_wfile(json.dumps(output)) def log_request(self, code='-', size='-'): """ Disable request logging """ pass # find fish fish_bin_dir = os.environ.get('__fish_bin_dir') fish_bin_path = None if not fish_bin_dir: print('The __fish_bin_dir environment variable is not set. Looking in $PATH...') # distutils.spawn is terribly broken, because it looks in wd before PATH, # and doesn't actually validate that the file is even executabl for p in os.environ['PATH'].split(os.pathsep): proposed_path = os.path.join(p, 'fish') if os.access(proposed_path, os.X_OK): fish_bin_path = proposed_path break if not fish_bin_path: print("fish could not be found. Is fish installed correctly?") sys.exit(-1) else: print("fish found at '%s'" % fish_bin_path) else: fish_bin_path = os.path.join(fish_bin_dir, 'fish') if not os.access(fish_bin_path, os.X_OK): print("fish could not be executed at path '%s'. Is fish installed correctly?" % fish_bin_path) sys.exit(-1) FISH_BIN_PATH = fish_bin_path # We want to show the demo prompts in the directory from which this was invoked, # so get the current working directory initial_wd = os.getcwd() # Make sure that the working directory is the one that contains the script server file, # because the document root is the working directory where = os.path.dirname(sys.argv[0]) os.chdir(where) # Try to find a suitable port PORT = 8000 while PORT <= 9000: try: Handler = FishConfigHTTPRequestHandler httpd = SocketServer.TCPServer(("", PORT), Handler) # Success break; except socket.error: err_type, err_value = sys.exc_info()[:2] # str(err_value) handles Python3 correctly if 'Address already in use' not in str(err_value): break PORT += 1 if PORT > 9000: # Nobody say it print("Unable to find an open port between 8000 and 9000") sys.exit(-1) # Get any initial tab (functions, colors, etc) # Just look at the first letter initial_tab = '' if len(sys.argv) > 1: for tab in ['functions', 'prompt', 'colors', 'variables', 'history']: if tab.startswith(sys.argv[1]): initial_tab = '#' + tab break url = 'http://localhost:%d/%s' % (PORT, initial_tab) print("Web config started at '%s'. Hit enter to stop." % url) webbrowser.open(url) # Select on stdin and httpd stdin_no = sys.stdin.fileno() try: while True: ready_read = select.select([sys.stdin.fileno(), httpd.fileno()], [], []) if ready_read[0][0] < 1: print("Shutting down.") # Consume the newline so it doesn't get printed by the caller sys.stdin.readline() break else: httpd.handle_request() except KeyboardInterrupt: print("\nShutting down.") fish/signal.cpp000066400000000000000000000301251214535744100137770ustar00rootroot00000000000000/** \file signal.c The library for various signal related issues */ #include "config.h" #include #include #include #include #include #include #include #ifdef HAVE_SIGINFO_H #include #endif #include "common.h" #include "fallback.h" #include "util.h" #include "wutil.h" #include "signal.h" #include "event.h" #include "reader.h" #include "proc.h" /** Struct describing an entry for the lookup table used to convert between signal names and signal ids, etc. */ struct lookup_entry { /** Signal id */ int signal; /** Signal name */ const wchar_t *name; /** Signal description */ const wchar_t *desc; }; /** The number of signal blocks in place. Increased by signal_block, decreased by signal_unblock. */ static int block_count=0; /** Lookup table used to convert between signal names and signal ids, etc. */ static const struct lookup_entry lookup[] = { #ifdef SIGHUP { SIGHUP, L"SIGHUP", N_(L"Terminal hung up") } , #endif #ifdef SIGINT { SIGINT, L"SIGINT", N_(L"Quit request from job control (^C)") } , #endif #ifdef SIGQUIT { SIGQUIT, L"SIGQUIT", N_(L"Quit request from job control with core dump (^\\)") } , #endif #ifdef SIGILL { SIGILL, L"SIGILL", N_(L"Illegal instruction") } , #endif #ifdef SIGTRAP { SIGTRAP, L"SIGTRAP", N_(L"Trace or breakpoint trap") } , #endif #ifdef SIGABRT { SIGABRT, L"SIGABRT", N_(L"Abort") } , #endif #ifdef SIGBUS { SIGBUS, L"SIGBUS", N_(L"Misaligned address error") } , #endif #ifdef SIGFPE { SIGFPE, L"SIGFPE", N_(L"Floating point exception") } , #endif #ifdef SIGKILL { SIGKILL, L"SIGKILL", N_(L"Forced quit") } , #endif #ifdef SIGUSR1 { SIGUSR1, L"SIGUSR1", N_(L"User defined signal 1") } , #endif #ifdef SIGUSR2 { SIGUSR2, L"SIGUSR2", N_(L"User defined signal 2") } , #endif #ifdef SIGSEGV { SIGSEGV, L"SIGSEGV", N_(L"Address boundary error") } , #endif #ifdef SIGPIPE { SIGPIPE, L"SIGPIPE", N_(L"Broken pipe") } , #endif #ifdef SIGALRM { SIGALRM, L"SIGALRM", N_(L"Timer expired") } , #endif #ifdef SIGTERM { SIGTERM, L"SIGTERM", N_(L"Polite quit request") } , #endif #ifdef SIGCHLD { SIGCHLD, L"SIGCHLD", N_(L"Child process status changed") } , #endif #ifdef SIGCONT { SIGCONT, L"SIGCONT", N_(L"Continue previously stopped process") } , #endif #ifdef SIGSTOP { SIGSTOP, L"SIGSTOP", N_(L"Forced stop") } , #endif #ifdef SIGTSTP { SIGTSTP, L"SIGTSTP", N_(L"Stop request from job control (^Z)") } , #endif #ifdef SIGTTIN { SIGTTIN, L"SIGTTIN", N_(L"Stop from terminal input") } , #endif #ifdef SIGTTOU { SIGTTOU, L"SIGTTOU", N_(L"Stop from terminal output") } , #endif #ifdef SIGURG { SIGURG, L"SIGURG", N_(L"Urgent socket condition") } , #endif #ifdef SIGXCPU { SIGXCPU, L"SIGXCPU", N_(L"CPU time limit exceeded") } , #endif #ifdef SIGXFSZ { SIGXFSZ, L"SIGXFSZ", N_(L"File size limit exceeded") } , #endif #ifdef SIGVTALRM { SIGVTALRM, L"SIGVTALRM", N_(L"Virtual timer expired") } , #endif #ifdef SIGPROF { SIGPROF, L"SIGPROF", N_(L"Profiling timer expired") } , #endif #ifdef SIGWINCH { SIGWINCH, L"SIGWINCH", N_(L"Window size change") } , #endif #ifdef SIGWIND { SIGWIND, L"SIGWIND", N_(L"Window size change") } , #endif #ifdef SIGIO { SIGIO, L"SIGIO", N_(L"I/O on asynchronous file descriptor is possible") } , #endif #ifdef SIGPWR { SIGPWR, L"SIGPWR", N_(L"Power failure") } , #endif #ifdef SIGSYS { SIGSYS, L"SIGSYS", N_(L"Bad system call") } , #endif #ifdef SIGINFO { SIGINFO, L"SIGINFO", N_(L"Information request") } , #endif #ifdef SIGSTKFLT { SIGSTKFLT, L"SISTKFLT", N_(L"Stack fault") } , #endif #ifdef SIGEMT { SIGEMT, L"SIGEMT", N_(L"Emulator trap") } , #endif #ifdef SIGIOT { SIGIOT, L"SIGIOT", N_(L"Abort (Alias for SIGABRT)") } , #endif #ifdef SIGUNUSED { SIGUNUSED, L"SIGUNUSED", N_(L"Unused signal") } , #endif { 0, 0, 0 } } ; /** Test if \c name is a string describing the signal named \c canonical. */ static int match_signal_name(const wchar_t *canonical, const wchar_t *name) { if (wcsncasecmp(name, L"sig", 3)==0) name +=3; return wcscasecmp(canonical+3,name) == 0; } int wcs2sig(const wchar_t *str) { int i; wchar_t *end=0; for (i=0; lookup[i].desc ; i++) { if (match_signal_name(lookup[i].name, str)) { return lookup[i].signal; } } errno=0; int res = fish_wcstoi(str, &end, 10); if (!errno && res>=0 && !*end) return res; return -1; } const wchar_t *sig2wcs(int sig) { int i; for (i=0; lookup[i].desc ; i++) { if (lookup[i].signal == sig) { return lookup[i].name; } } return _(L"Unknown"); } const wchar_t *signal_get_desc(int sig) { int i; for (i=0; lookup[i].desc ; i++) { if (lookup[i].signal == sig) { return _(lookup[i].desc); } } return _(L"Unknown"); } /** Standard signal handler */ static void default_handler(int signal, siginfo_t *info, void *context) { if (event_is_signal_observed(signal)) { event_fire_signal(signal); } } /** Respond to a winch signal by checking the terminal size */ static void handle_winch(int sig, siginfo_t *info, void *context) { common_handle_winch(sig); default_handler(sig, 0, 0); } /** Respond to a hup signal by exiting, unless it is caught by a shellscript function, in which case we do nothing. */ static void handle_hup(int sig, siginfo_t *info, void *context) { if (event_is_signal_observed(SIGHUP)) { default_handler(sig, 0, 0); } else { reader_exit(1, 1); } } /** Handle sigterm. The only thing we do is restore the front process ID, then die. */ static void handle_term(int sig, siginfo_t *info, void *context) { restore_term_foreground_process_group(); signal(SIGTERM, SIG_DFL); raise(SIGTERM); } /** Interactive mode ^C handler. Respond to int signal by setting interrupted-flag and stopping all loops and conditionals. */ static void handle_int(int sig, siginfo_t *info, void *context) { reader_handle_int(sig); default_handler(sig, info, context); } /** sigchld handler. Does notification and calls the handler in proc.c */ static void handle_chld(int sig, siginfo_t *info, void *context) { job_handle_signal(sig, info, context); default_handler(sig, info, context); } void signal_reset_handlers() { int i; struct sigaction act; sigemptyset(& act.sa_mask); act.sa_flags=0; act.sa_handler=SIG_DFL; for (i=0; lookup[i].desc ; i++) { sigaction(lookup[i].signal, &act, 0); } } /** Sets appropriate signal handlers. */ void signal_set_handlers() { struct sigaction act; if (get_is_interactive() == -1) return; sigemptyset(& act.sa_mask); act.sa_flags=SA_SIGINFO; act.sa_sigaction = &default_handler; /* First reset everything to a use default_handler, a function whose sole action is to fire of an event */ sigaction(SIGINT, &act, 0); sigaction(SIGQUIT, &act, 0); sigaction(SIGTSTP, &act, 0); sigaction(SIGTTIN, &act, 0); sigaction(SIGTTOU, &act, 0); sigaction(SIGCHLD, &act, 0); /* Ignore sigpipe, it is generated if fishd dies, but we can recover. */ sigaction(SIGPIPE, &act, 0); if (get_is_interactive()) { /* Interactive mode. Ignore interactive signals. We are a shell, we know whats best for the user. ;-) */ act.sa_handler=SIG_IGN; sigaction(SIGINT, &act, 0); sigaction(SIGQUIT, &act, 0); sigaction(SIGTSTP, &act, 0); sigaction(SIGTTIN, &act, 0); sigaction(SIGTTOU, &act, 0); act.sa_sigaction = &handle_int; act.sa_flags = SA_SIGINFO; if (sigaction(SIGINT, &act, 0)) { wperror(L"sigaction"); FATAL_EXIT(); } act.sa_sigaction = &handle_chld; act.sa_flags = SA_SIGINFO; if (sigaction(SIGCHLD, &act, 0)) { wperror(L"sigaction"); FATAL_EXIT(); } #ifdef SIGWINCH act.sa_flags = SA_SIGINFO; act.sa_sigaction= &handle_winch; if (sigaction(SIGWINCH, &act, 0)) { wperror(L"sigaction"); FATAL_EXIT(); } #endif act.sa_flags = SA_SIGINFO; act.sa_sigaction= &handle_hup; if (sigaction(SIGHUP, &act, 0)) { wperror(L"sigaction"); FATAL_EXIT(); } // SIGTERM restores the terminal controlling process before dying act.sa_flags = SA_SIGINFO; act.sa_sigaction= &handle_term; if (sigaction(SIGTERM, &act, 0)) { wperror(L"sigaction"); FATAL_EXIT(); } } else { /* Non-interactive. Ignore interrupt, check exit status of processes to determine result instead. */ act.sa_handler=SIG_IGN; sigaction(SIGINT, &act, 0); sigaction(SIGQUIT, &act, 0); act.sa_handler=SIG_DFL; act.sa_sigaction = &handle_chld; act.sa_flags = SA_SIGINFO; if (sigaction(SIGCHLD, &act, 0)) { wperror(L"sigaction"); exit_without_destructors(1); } } } void signal_handle(int sig, int do_handle) { struct sigaction act; /* These should always be handled */ if ((sig == SIGINT) || (sig == SIGQUIT) || (sig == SIGTSTP) || (sig == SIGTTIN) || (sig == SIGTTOU) || (sig == SIGCHLD)) return; sigemptyset(&act.sa_mask); if (do_handle) { act.sa_flags = SA_SIGINFO; act.sa_sigaction = &default_handler; } else { act.sa_flags = 0; act.sa_handler = SIG_DFL; } sigaction(sig, &act, 0); } void get_signals_with_handlers(sigset_t *set) { sigemptyset(set); for (int i=0; lookup[i].desc ; i++) { struct sigaction act = {}; sigaction(lookup[i].signal, NULL, &act); if (act.sa_handler != SIG_DFL) sigaddset(set, lookup[i].signal); } } void signal_block() { ASSERT_IS_MAIN_THREAD(); sigset_t chldset; if (!block_count) { sigfillset(&chldset); VOMIT_ON_FAILURE(pthread_sigmask(SIG_BLOCK, &chldset, NULL)); } block_count++; // debug( 0, L"signal block level increased to %d", block_count ); } void signal_unblock() { ASSERT_IS_MAIN_THREAD(); sigset_t chldset; block_count--; if (block_count < 0) { debug(0, _(L"Signal block mismatch")); bugreport(); FATAL_EXIT(); } if (!block_count) { sigfillset(&chldset); VOMIT_ON_FAILURE(pthread_sigmask(SIG_UNBLOCK, &chldset, 0)); } // debug( 0, L"signal block level decreased to %d", block_count ); } bool signal_is_blocked() { return !!block_count; } fish/signal.h000066400000000000000000000022461214535744100134470ustar00rootroot00000000000000/** \file signal.h The library for various signal related issues */ #ifndef FISH_SIGNALH #define FISH_SIGNALH #include /** Get the integer signal value representing the specified signal, or -1 of no signal was found */ int wcs2sig(const wchar_t *str); /** Get string representation of a signal */ const wchar_t *sig2wcs(int sig); /** Returns a description of the specified signal. */ const wchar_t *signal_get_desc(int sig); /** Set all signal handlers to SIG_DFL */ void signal_reset_handlers(); /** Set signal handlers to fish default handlers */ void signal_set_handlers(); /** Tell fish what to do on the specified signal. \param sig The signal to specify the action of \param do_handle If true fish will catch the specified signal and fire an event, otherwise the default action (SIG_DFL) will be set */ void signal_handle(int sig, int do_handle); /** Block all signals */ void signal_block(); /** Unblock all signals */ void signal_unblock(); /** Returns true if signals are being blocked */ bool signal_is_blocked(); /** Returns signals with non-default handlers */ void get_signals_with_handlers(sigset_t *set); #endif fish/tests/000077500000000000000000000000001214535744100131575ustar00rootroot00000000000000fish/tests/gen_output.fish000077500000000000000000000005371214535744100162330ustar00rootroot00000000000000#!/usr/bin/fish # # Generate output for a test script # # It is important that you verify that the generated # output is correct! # for i in $argv set template_out (basename $i .in).out set template_err (basename $i .in).err set template_status (basename $i .in).status fish <$i >$template_out ^$template_err echo $status >$template_status endfish/tests/history_sample_bash000066400000000000000000000001421214535744100171360ustar00rootroot00000000000000echo foo history --help #1339718290 export HISTTIMEFORMAT='%F %T ' #1339718298 echo supsup #abcde fish/tests/history_sample_fish_1_x000066400000000000000000000001721214535744100177240ustar00rootroot00000000000000# 1339519901 ls / # 1339519903 cd foobar # 1339519906 function yay\ echo hi\ end # 1339520882 echo #abc # 1339520884 #def fish/tests/history_sample_fish_2_0000066400000000000000000000002251214535744100176140ustar00rootroot00000000000000- cmd: echo alpha when: 1339717374 - cmd: function foo\necho bar\nend when: 1339717377 - cmd: echo this has\\\nbackslashes when: 1339717385 fish/tests/printf.err000066400000000000000000000000001214535744100151610ustar00rootroot00000000000000fish/tests/printf.in000066400000000000000000000010241214535744100150060ustar00rootroot00000000000000printf "Hello %d %i %f %F %g %G\n" 1 2 3 4 5 6 printf "%x %X %o %llu\n" 10 11 8 -1 printf "%a %A\n" 14 15 printf "%c %s\n" a hello printf "%e %E\n" 5 6 printf "%20d\n" 50 printf "%-20d%d\n" 5 10 printf "%*d\n" 10 100 printf "%%\"\\\n" printf "%s\b%s\n" x y printf "abc\rdef\n" printf "Msg1\fMsg2\n" printf "foo\vbar\vbaz\n" printf "\111 \x50 \u0051 \U00000052" echo echo "Test escapes" # \c escape means "stop printing" printf 'a\cb' echo # Bogus printf specifier, should produce no stdout printf "%5" 10 ^ /dev/null true fish/tests/printf.out000066400000000000000000000003401214535744100152070ustar00rootroot00000000000000Hello 1 2 3.000000 4.000000 5 6 a B 10 18446744073709551615 0xep+0 0XFP+0 a hello 5.000000e+00 6.000000E+00 50 5 10 100 %"\nxy abc def Msg1 Msg2 foo bar baz I P Q R Test escapes a fish/tests/printf.status000066400000000000000000000000021214535744100157160ustar00rootroot000000000000000 fish/tests/test.fish000077500000000000000000000032201214535744100150110ustar00rootroot00000000000000#!/usr/local/bin/fish # # Main loop of the test suite. I wrote this # instad of using autotest to provide additional # testing for fish. :-) if [ "$argv" != '-n' ] # begin...end has bug in error redirecting... begin ../fish -n ./test.fish ^top.tmp.err ../fish -n ./test.fish -n ^^top.tmp.err ../fish ./test.fish -n ^^top.tmp.err end | tee top.tmp.out echo $status >top.tmp.status set res ok if diff top.tmp.out top.out >/dev/null else set res fail echo Output differs for file test.fish end if diff top.tmp.err top.err >/dev/null else set res fail echo Error output differs for file test.fish end if test (cat top.tmp.status) = (cat top.status) else set res fail echo Exit status differs for file test.fish end ../fish -p /dev/null -c 'echo testing' >/dev/null if test $status -ne 0 set res fail echo Profiling fails end if test $res = ok; echo File test.fish tested ok else echo File test.fish failed tests end; exit end echo Testing high level script functionality for i in *.in set template_out (basename $i .in).out set template_err (basename $i .in).err set template_status (basename $i .in).status ../fish <$i >tmp.out ^tmp.err echo $status >tmp.status set res ok if diff tmp.out $template_out >/dev/null else set res fail echo Output differs for file $i end if diff tmp.err $template_err >/dev/null else set res fail echo Error output differs for file $i end if test (cat tmp.status) = (cat $template_status) else set res fail echo Exit status differs for file $i end if test $res = ok; echo File $i tested ok else echo File $i failed tests end; end fish/tests/test1.err000066400000000000000000000000001214535744100147170ustar00rootroot00000000000000fish/tests/test1.in000066400000000000000000000026011214535744100145460ustar00rootroot00000000000000# #Test aliases, loops, conditionals and some basic elements # for i in 1 2 #Comment on same line as command #Comment inside loop for j in a b #Double loop echo $i$j end; end # Bracket expansion echo x-{1} echo x-{1,2} echo foo-{1,2{3,4}} # Escpaed newlines echo foo\ bar echo foo\ bar echo "foo\ bar" echo 'foo\ bar' for i in \ a b c echo $i end # Simple alias tests function foo echo >foo.txt $argv end foo hello cat foo.txt |read foo if test $foo = hello; echo Test 2 pass else echo Test 2 fail end function foo printf 'Test %s' $1; echo ' pass' end foo 3 for i in Test for continue break and switch builtins problems; switch $i case Test printf "%s " $i case "f??" printf "%s " 3 case "c*" echo pass case break continue echo fail case and break echo fail case "*" echo fail end end set -l sta if eval true if eval false set sta fail else set sta pass end else set sta fail end echo Test 4 $sta function test_builtin_status return 1 end test_builtin_status if [ $status -eq 1 ] set sta pass else set sta fail end echo Test 5 $sta # echo tests echo 'abc\ndef' echo -e 'abc\ndef' echo -e 'abc\zdef' echo -e 'abc\41def' echo -e 'abc\041def' echo -e 'abc\121def' echo -e 'abc\1212def' echo -e 'abc\cdef' # won't output a newline! echo '' echo -e Catch your breath echo -e 'abc\x21def' echo -e 'abc\x211def' fish/tests/test1.out000066400000000000000000000003561214535744100147540ustar00rootroot000000000000001a 1b 2a 2b x-1 x-1 x-2 foo-1 foo-23 foo-24 foo bar foobar foobar foo\ bar a b c Test 2 pass Test pass Test 3 pass Test 4 pass Test 5 pass abc\ndef abc def abc\zdef abc!def abc!def abcQdef abcQ2def abc Catch your breath abc!def abc!1def fish/tests/test1.status000066400000000000000000000000021214535744100154540ustar00rootroot000000000000000 fish/tests/test2.err000066400000000000000000000000001214535744100147200ustar00rootroot00000000000000fish/tests/test2.in000066400000000000000000000001641214535744100145510ustar00rootroot00000000000000#Tests complex parameter expantions set a A set aa AA set aaa AAA echo {$aa}a{1,2,3}(for a in 1 2 3; echo $a; end) fish/tests/test2.out000066400000000000000000000000661214535744100147530ustar00rootroot00000000000000AAa11 AAa21 AAa31 AAa12 AAa22 AAa32 AAa13 AAa23 AAa33 fish/tests/test2.status000066400000000000000000000000021214535744100154550ustar00rootroot000000000000000 fish/tests/test3.err000066400000000000000000000000001214535744100147210ustar00rootroot00000000000000fish/tests/test3.in000066400000000000000000000063021214535744100145520ustar00rootroot00000000000000# Environment variable tests #Test if variables can be properly set set smurf blue if test $smurf = blue echo Test 1 pass else echo Test 1 fail end # Test if variables can be erased set -e smurf if test $smurf echo Test 2 fail else echo Test 2 pass end # Test if local variables go out of scope set -e t3 if true set -l t3 bar end if test $t3 echo Test 3 fail else echo Test 3 pass end # Test if globals can be set in block scope if true set -g baz qux end if test $baz = qux echo Test 4 pass else echo Test 4 fail end #Test that scope is preserved when setting a new value set t5 a if true set t5 b end if test $t5 = b echo Test 5 pass else echo Test 5 fail end # Test that scope is preserved in double blocks for i in 1 set t6 $i for j in a if test $t6$j = 1a echo Test 6 pass else echo Test 6 fail end end end # Test if variables in for loop blocks do not go out of scope on new laps set res fail set -e t7 for i in 1 2 if test $i = 1 set t7 lala else if test $t7 set res pass end end end echo Test 7 $res # Test if variables are properly exported set -e t8 if true set -lx t8 foo if test (../fish -c "echo $t8") = foo echo Test 8 pass else echo Test 8 fail end end # Test if exported variables go out of scope if test (../fish -c "echo $t8") echo Test 9 fail else echo Test 9 pass end # Test erasing variables in specific scope set -eU foo set -g foo bar begin set -l foo baz set -eg foo end if set -q foo echo Test 10 fail else echo Test 10 pass end set foo abc def set -e foo[1] if test $foo '=' def echo Test 11 pass else echo Test 11 fail end # Test combinations of export and scope set -ge foo set -Ue foo set -Ux foo bar set foo baz if test (/bin/sh -c 'echo $foo') = baz -a (../fish -c 'echo $foo') = baz echo Test 12 pass else echo Test 12 fail end set -Ue foo set -Ux foo bar set -U foo baz if test (/bin/sh -c 'echo $foo') = baz -a (../fish -c 'echo $foo') = baz echo Test 13 pass else echo Test 13 fail end set -Ux foo bar set -u foo bar if test (/bin/sh -c 'echo $foo') = '' -a (../fish -c 'echo $foo') = bar echo Test 14 pass else echo Test 14 fail end set -Ux foo bar set -Uu foo baz if test (/bin/sh -c 'echo $foo') = '' -a (../fish -c 'echo $foo') = baz echo Test 15 pass else echo Test 15 fail end set -eU foo # test erasing variables without a specified scope set -g test16res set -U foo universal set -g foo global begin set -l foo blocklocal function test16 set -l foo function begin set -l foo functionblock set test16res $test16res (echo $foo) set -e foo set test16res $test16res (echo $foo) set -e foo set test16res $test16res (echo $foo) set -e foo set test16res $test16res (echo $foo) set -e foo set test16res $test16res (echo $foo) end set test16res $test16res (echo $foo) set -e foo end test16 set test16res $test16res (echo $foo) end set test16res $test16res (echo $foo) #echo count: (count $test16res) "content:[$test16res]" if test (count $test16res) = 8 -a "$test16res" = "functionblock function global universal blocklocal " echo Test 16 pass else echo Test 16 fail end # clear foo for other shells set -eU foo true fish/tests/test3.out000066400000000000000000000003071214535744100147520ustar00rootroot00000000000000Test 1 pass Test 2 pass Test 3 pass Test 4 pass Test 5 pass Test 6 pass Test 7 pass Test 8 pass Test 9 pass Test 10 pass Test 11 pass Test 12 pass Test 13 pass Test 14 pass Test 15 pass Test 16 pass fish/tests/test3.status000066400000000000000000000000021214535744100154560ustar00rootroot000000000000000 fish/tests/test4.err000066400000000000000000000000001214535744100147220ustar00rootroot00000000000000fish/tests/test4.in000066400000000000000000000056721214535744100145640ustar00rootroot00000000000000#Test scoping rules for functions set -e smurf function setter set smurf green end function unsetter set -e smurf end function call1 set smurf blue; setter; if test $smurf = blue; echo Test 1 pass; else; echo Test 1 fail; end end function call2 set smurf blue; unsetter; if test $smurf = blue; echo Test 2 pass; else; echo Test 2 fail; end end call1 call2 function call3 setter; if test $smurf = green; echo Test 3 pass; else; echo Test 3 fail; end end function call4 unsetter; if not set -q smurf; echo Test 4 pass; else; echo Test 4 fail; end end set -g smurf yellow call3 call4 set -l foo 1 set -g bar 2 set -U baz 3 set -l -q foo if test $status -ne 0 echo Test 5 fail else echo Test 5 pass end; if not set -g -q bar echo Test 6 fail else echo Test 6 pass end; if not set -U -q baz echo Test 7 fail else echo Test 7 pass end; set -u -l -q foo if test $status -ne 0 echo Test 8 fail else echo Test 8 pass end; if not set -u -g -q bar echo Test 9 fail else echo Test 9 pass end; if not set -u -U -q baz echo Test 10 fail else echo Test 10 pass end; set -x -l -q foo if test $status -eq 0 echo Test 11 fail else echo Test 11 pass end; if set -x -g -q bar echo Test 12 fail else echo Test 12 pass end; if set -x -U -q baz echo Test 13 fail else echo Test 13 pass end; set -x -l foo 1 set -x -g bar 2 set -x -U baz 3 set -l -q foo if test $status -ne 0 echo Test 14 fail else echo Test 14 pass end; if not set -g -q bar echo Test 15 fail else echo Test 15 pass end; if not set -U -q baz echo Test 16 fail else echo Test 16 pass end; set -u -l -q foo if test $status -ne 1 echo Test 17 fail else echo Test 17 pass end; if set -u -g -q bar echo Test 18 fail else echo Test 18 pass end; if set -u -U -q baz echo Test 19 fail else echo Test 19 pass end; set -x -l -q foo if test $status -ne 0 echo Test 20 fail else echo Test 20 pass end; if not set -x -g -q bar echo Test 21 fail else echo Test 21 pass end; if not set -x -U -q baz echo Test 22 fail else echo Test 22 pass end; set -U -e baz echo "Verify subcommand statuses" echo (false) $status (true) $status (false) $status echo "Verify that set passes through exit status, except when passed -n or -q or -e" false ; set foo bar ; echo 1 $status # passthrough true ; set foo bar ; echo 2 $status # passthrough false ; set -q foo ; echo 3 $status # no passthrough true ; set -q foo ; echo 4 $status # no passthrough false ; set -n > /dev/null ; echo 5 $status # no passthrough false ; set -e foo ; echo 6 $status # no passthrough true ; set -e foo ; echo 7 $status # no passthrough false ; set -h > /dev/null ; echo 8 $status # no passthrough true ; set -NOT_AN_OPTION 2> /dev/null ; echo 9 $status # no passthrough false ; set foo (echo A; true) ; echo 10 $status $foo true ; set foo (echo B; false) ; echo 11 $status $foo true fish/tests/test4.out000066400000000000000000000006661214535744100147630ustar00rootroot00000000000000Test 1 pass Test 2 pass Test 3 pass Test 4 pass Test 5 pass Test 6 pass Test 7 pass Test 8 pass Test 9 pass Test 10 pass Test 11 pass Test 12 pass Test 13 pass Test 14 pass Test 15 pass Test 16 pass Test 17 pass Test 18 pass Test 19 pass Test 20 pass Test 21 pass Test 22 pass Verify subcommand statuses 1 0 1 Verify that set passes through exit status, except when passed -n or -q or -e 1 1 2 0 3 0 4 0 5 0 6 0 7 1 8 0 9 1 10 0 A 11 1 B fish/tests/test4.status000066400000000000000000000000021214535744100154570ustar00rootroot000000000000000 fish/tests/test5.err000066400000000000000000000000001214535744100147230ustar00rootroot00000000000000fish/tests/test5.in000066400000000000000000000004721214535744100145560ustar00rootroot00000000000000 set smurf green switch $smurf; case "*ee*" echo Test 1 pass case "*" echo Test 1 fail end; switch $smurf case *ee* echo Test 2 fail case red green blue echo Test 2 pass case "*" echo Test 2 fail end switch $smurf case cyan magenta yellow echo Test 3 fail case "?????" echo Test 3 pass end fish/tests/test5.out000066400000000000000000000000441214535744100147520ustar00rootroot00000000000000Test 1 pass Test 2 pass Test 3 pass fish/tests/test5.status000066400000000000000000000000021214535744100154600ustar00rootroot000000000000000 fish/tests/test6.err000066400000000000000000000000001214535744100147240ustar00rootroot00000000000000fish/tests/test6.in000077500000000000000000000006151214535744100145610ustar00rootroot00000000000000 # Test that conditions that add or remove completions don't deadlock, etc. # We actually encountered some case that was effectively like this (Issue 2 in github) complete --command AAAA -l abcd --condition 'complete -c AAAA -l efgh' complete -C'AAAA -' complete -C'AAAA -' complete --command BBBB -l abcd --condition 'complete -e --command BBBB -l abcd' complete -C'BBBB -' complete -C'BBBB -' fish/tests/test6.out000066400000000000000000000000341214535744100147520ustar00rootroot00000000000000--abcd --efgh --abcd --abcd fish/tests/test6.status000066400000000000000000000000021214535744100154610ustar00rootroot000000000000000 fish/tests/test7.err000066400000000000000000000000001214535744100147250ustar00rootroot00000000000000fish/tests/test7.in000066400000000000000000000043051214535744100145570ustar00rootroot00000000000000# Test that subsequent cases do not blow away the status from previous ones for val in one two three four switch $val case one /bin/sh -c 'exit 1' case two /bin/sh -c 'exit 2' case three /bin/sh -c 'exit 3' end echo $status end echo # Test that the `switch` builtin itself does not blow away status before evaluating a case false switch one case one echo $status end # Test that non-case tokens inside `switch` don't blow away status # (why are these even allowed?) false switch one true case one echo $status end #test contains -i echo test contains -i contains -i string a b c string d contains -i string a b c d; or echo nothing contains -i -- string a b c string d contains -i -- -- a b c; or echo nothing contains -i -- -- a b c -- v # Test if, else, and else if if true echo alpha1.1 echo alpha1.2 else if false echo beta1.1 echo beta1.2 else if false echo gamma1.1 echo gamma1.2 else echo delta1.1 echo delta1.2 end if false echo alpha2.1 echo alpha2.2 else if begin ; true ; end echo beta2.1 echo beta2.2 else if begin ; echo nope2.1; false ; end echo gamma2.1 echo gamma2.2 else echo delta2.1 echo delta2.2 end if false echo alpha3.1 echo alpha3.2 else if begin ; echo yep3.1; false ; end echo beta3.1 echo beta3.2 else if begin ; echo yep3.2; true ; end echo gamma3.1 echo gamma3.2 else echo delta3.1 echo delta3.2 end if false echo alpha4.1 echo alpha4.2 else if begin ; echo yep4.1; false ; end echo beta4.1 echo beta4.2 else if begin ; echo yep4.2; false ; end echo gamma4.1 echo gamma4.2 else echo delta4.1 echo delta4.2 end if test ! -n "abc" else if test -n "def" echo "epsilon5.2" else if not_a_valid_command but it should be OK because a previous branch was taken echo "epsilon 5.3" else if test ! -n "abc" echo "epsilon 5.4" end # Ensure builtins work # https://github.com/fish-shell/fish-shell/issues/359 if not echo skip1 > /dev/null echo "zeta 6.1" else if echo skip2 > /dev/null echo "zeta 6.2" end echo '###' # Ensure 'type' works # https://github.com/fish-shell/fish-shell/issues/513 function fish_test_type_zzz true end # Should succeed type fish_test_type_zzz >/dev/null ; echo $status # Should fail type -f fish_test_type_zzz >/dev/null ; echo $status fish/tests/test7.out000066400000000000000000000002621214535744100147560ustar00rootroot000000000000001 2 3 0 1 1 test contains -i 4 nothing 4 nothing 4 alpha1.1 alpha1.2 beta2.1 beta2.2 yep3.1 yep3.2 gamma3.1 gamma3.2 yep4.1 yep4.2 delta4.1 delta4.2 epsilon5.2 zeta 6.2 ### 0 1 fish/tests/test7.status000066400000000000000000000000021214535744100154620ustar00rootroot000000000000000 fish/tests/test8.err000066400000000000000000000000001214535744100147260ustar00rootroot00000000000000fish/tests/test8.in000066400000000000000000000012121214535744100145520ustar00rootroot00000000000000# Test index ranges echo Test variable expand set n 10 set test (seq $n) echo $test[1..$n] # normal range echo $test[$n..1] # inverted range echo $test[2..5 8..6] # several ranges echo $test[-1..-2] # range with negative limits echo $test[-1..1] # range with mixed limits echo Test variable set set test1 $test set test1[-1..1] $test; echo $test1 set test1[1..$n] $test; echo $test1 set test1[$n..1] $test; echo $test1 set test1[2..4 -2..-4] $test1[4..2 -4..-2]; echo $test1 echo Test command substitution echo (seq 5)[-1..1] echo (seq $n)[3..5 -2..2] echo Test more echo $test[(count $test)..1] echo $test[1..(count $test)] fish/tests/test8.out000066400000000000000000000004731214535744100147630ustar00rootroot00000000000000Test variable expand 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 2 3 4 5 8 7 6 10 9 10 9 8 7 6 5 4 3 2 1 Test variable set 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 10 7 8 9 6 5 2 3 4 1 Test command substitution 5 4 3 2 1 3 4 5 9 8 7 6 5 4 3 2 Test more 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 fish/tests/test8.status000066400000000000000000000000021214535744100154630ustar00rootroot000000000000000 fish/tests/test9.err000066400000000000000000000000321214535744100147340ustar00rootroot00000000000000emit: expected event name fish/tests/test9.in000066400000000000000000000007251214535744100145630ustar00rootroot00000000000000# Test events. # This pattern caused a crash; github issue #449 set -g var before function test1 --on-event test set -g var $var:test1 functions -e test2 end function test2 --on-event test # this should not run, as test2 gets removed before it has a chance of running set -g var $var:test2a end emit test echo $var function test3 --on-event test3 echo received event test3 with args: $argv end emit test3 foo bar # test empty argument emitfish/tests/test9.out000066400000000000000000000000651214535744100147610ustar00rootroot00000000000000before:test1 received event test3 with args: foo bar fish/tests/test9.status000066400000000000000000000000021214535744100154640ustar00rootroot000000000000001 fish/tests/top.err000066400000000000000000000000001214535744100144610ustar00rootroot00000000000000fish/tests/top.out000066400000000000000000000004311214535744100145100ustar00rootroot00000000000000Testing high level script functionality File printf.in tested ok File test1.in tested ok File test2.in tested ok File test3.in tested ok File test4.in tested ok File test5.in tested ok File test6.in tested ok File test7.in tested ok File test8.in tested ok File test9.in tested ok fish/tests/top.status000066400000000000000000000000021214535744100152160ustar00rootroot000000000000000 fish/tokenizer.cpp000066400000000000000000000506751214535744100145500ustar00rootroot00000000000000/** \file tokenizer.c A specialized tokenizer for tokenizing the fish language. In the future, the tokenizer should be extended to support marks, tokenizing multiple strings and disposing of unused string segments. */ #include "config.h" #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "tokenizer.h" #include "common.h" /* Wow what a hack */ #define TOK_CALL_ERROR(t, e, x) do { tok_call_error((t), (e), (t)->squash_errors ? L"" : (x)); } while (0) /** Error string for unexpected end of string */ #define QUOTE_ERROR _( L"Unexpected end of string, quotes are not balanced" ) /** Error string for mismatched parenthesis */ #define PARAN_ERROR _( L"Unexpected end of string, parenthesis do not match" ) /** Error string for invalid redirections */ #define REDIRECT_ERROR _( L"Invalid input/output redirection" ) /** Error string for when trying to pipe from fd 0 */ #define PIPE_ERROR _( L"Can not use fd 0 as pipe output" ) /** Characters that separate tokens. They are ordered by frequency of occurrence to increase parsing speed. */ #define SEP L" \n|\t;#\r<>^&" /** Descriptions of all tokenizer errors */ static const wchar_t *tok_desc[] = { N_(L"Tokenizer not yet initialized"), N_(L"Tokenizer error"), N_(L"Invalid token"), N_(L"String"), N_(L"Pipe"), N_(L"End of command"), N_(L"Redirect output to file"), N_(L"Append output to file"), N_(L"Redirect input to file"), N_(L"Redirect to file descriptor"), N_(L"Redirect output to file if file does not exist"), N_(L"Run job in background"), N_(L"Comment") }; /** Set the latest tokens string to be the specified error message */ static void tok_call_error(tokenizer_t *tok, int error_type, const wchar_t *error_message) { tok->last_type = TOK_ERROR; tok->error = error_type; tok->last_token = error_message; } int tok_get_error(tokenizer_t *tok) { return tok->error; } tokenizer_t::tokenizer_t(const wchar_t *b, tok_flags_t flags) : buff(NULL), orig_buff(NULL), last_type(0), last_pos(0), has_next(false), accept_unfinished(false), show_comments(false), last_quote(0), error(0), squash_errors(false), cached_lineno_offset(0), cached_lineno_count(0) { /* We can only generate error messages on the main thread due to wgettext() thread safety issues. */ if (!(flags & TOK_SQUASH_ERRORS)) { ASSERT_IS_MAIN_THREAD(); } CHECK(b,); this->accept_unfinished = !!(flags & TOK_ACCEPT_UNFINISHED); this->show_comments = !!(flags & TOK_SHOW_COMMENTS); this->squash_errors = !!(flags & TOK_SQUASH_ERRORS); this->has_next = (*b != L'\0'); this->orig_buff = this->buff = b; this->cached_lineno_offset = 0; this->cached_lineno_count = 0; tok_next(this); } int tok_last_type(tokenizer_t *tok) { CHECK(tok, TOK_ERROR); CHECK(tok->buff, TOK_ERROR); return tok->last_type; } const wchar_t *tok_last(tokenizer_t *tok) { CHECK(tok, 0); return tok->last_token.c_str(); } int tok_has_next(tokenizer_t *tok) { /* Return 1 on broken tokenizer */ CHECK(tok, 1); CHECK(tok->buff, 1); /* fwprintf( stderr, L"has_next is %ls \n", tok->has_next?L"true":L"false" );*/ return tok->has_next; } int tokenizer_t::line_number_of_character_at_offset(size_t offset) { // we want to return (one plus) the number of newlines at offsets less than the given offset // cached_lineno_count is the number of newlines at indexes less than cached_lineno_offset const wchar_t *str = orig_buff; if (! str) return 0; // easy hack to handle 0 if (offset == 0) return 1; size_t i; if (offset > cached_lineno_offset) { for (i = cached_lineno_offset; str[i] && i': case L'&': return false; /* Conditional separator */ case L'^': return ! is_first; default: return true; } } /** Quick test to catch the most common 'non-magical' characters, makes read_string slightly faster by adding a fast path for the most common characters. This is obviously not a suitable replacement for iswalpha. */ static int myal(wchar_t c) { return (c>=L'a' && c<=L'z') || (c>=L'A'&&c<=L'Z'); } /** Read the next token as a string */ static void read_string(tokenizer_t *tok) { const wchar_t *start; long len; int do_loop=1; int paran_count=0; start = tok->buff; bool is_first = true; enum tok_mode_t { mode_regular_text = 0, // regular text mode_subshell = 1, // inside of subshell mode_array_brackets = 2, // inside of array brackets mode_array_brackets_and_subshell = 3 // inside of array brackets and subshell, like in '$foo[(ech' } mode = mode_regular_text; while (1) { if (!myal(*tok->buff)) { if (*tok->buff == L'\\') { tok->buff++; if (*tok->buff == L'\0') { if ((!tok->accept_unfinished)) { TOK_CALL_ERROR(tok, TOK_UNTERMINATED_ESCAPE, QUOTE_ERROR); return; } else { /* Since we are about to increment tok->buff, decrement it first so the increment doesn't go past the end of the buffer. https://github.com/fish-shell/fish-shell/issues/389 */ tok->buff--; do_loop = 0; } } tok->buff++; continue; } switch (mode) { case mode_regular_text: { switch (*tok->buff) { case L'(': { paran_count=1; mode = mode_subshell; break; } case L'[': { if (tok->buff != start) mode = mode_array_brackets; break; } case L'\'': case L'"': { const wchar_t *end = quote_end(tok->buff); tok->last_quote = *tok->buff; if (end) { tok->buff=(wchar_t *)end; } else { tok->buff += wcslen(tok->buff); if (! tok->accept_unfinished) { TOK_CALL_ERROR(tok, TOK_UNTERMINATED_QUOTE, QUOTE_ERROR); return; } do_loop = 0; } break; } default: { if (! tok_is_string_character(*(tok->buff), is_first)) { do_loop=0; } } } break; } case mode_array_brackets_and_subshell: case mode_subshell: switch (*tok->buff) { case L'\'': case L'\"': { const wchar_t *end = quote_end(tok->buff); if (end) { tok->buff=(wchar_t *)end; } else { tok->buff += wcslen(tok->buff); if ((!tok->accept_unfinished)) { TOK_CALL_ERROR(tok, TOK_UNTERMINATED_QUOTE, QUOTE_ERROR); return; } do_loop = 0; } break; } case L'(': paran_count++; break; case L')': paran_count--; if (paran_count == 0) { mode = (mode == mode_array_brackets_and_subshell ? mode_array_brackets : mode_regular_text); } break; case L'\0': do_loop = 0; break; } break; case mode_array_brackets: switch (*tok->buff) { case L'(': paran_count=1; mode = mode_array_brackets_and_subshell; break; case L']': mode = mode_regular_text; break; case L'\0': do_loop = 0; break; } break; } } if (!do_loop) break; tok->buff++; is_first = false; } if ((!tok->accept_unfinished) && (mode != mode_regular_text)) { TOK_CALL_ERROR(tok, TOK_UNTERMINATED_SUBSHELL, PARAN_ERROR); return; } len = tok->buff - start; tok->last_token.assign(start, len); tok->last_type = TOK_STRING; } /** Read the next token as a comment. */ static void read_comment(tokenizer_t *tok) { const wchar_t *start; start = tok->buff; while (*(tok->buff)!= L'\n' && *(tok->buff)!= L'\0') tok->buff++; size_t len = tok->buff - start; tok->last_token.assign(start, len); tok->last_type = TOK_COMMENT; } /** Read a FD redirection. */ static void read_redirect(tokenizer_t *tok, int fd) { int mode = -1; if ((*tok->buff == L'>') || (*tok->buff == L'^')) { tok->buff++; if (*tok->buff == *(tok->buff-1)) { tok->buff++; mode = 1; } else { mode = 0; } if (*tok->buff == L'|') { if (fd == 0) { TOK_CALL_ERROR(tok, TOK_OTHER, PIPE_ERROR); return; } tok->buff++; tok->last_token = to_string(fd); tok->last_type = TOK_PIPE; return; } } else if (*tok->buff == L'<') { tok->buff++; mode = 2; } else { TOK_CALL_ERROR(tok, TOK_OTHER, REDIRECT_ERROR); } tok->last_token = to_string(fd); if (*tok->buff == L'&') { tok->buff++; tok->last_type = TOK_REDIRECT_FD; } else if (*tok->buff == L'?') { tok->buff++; tok->last_type = TOK_REDIRECT_NOCLOB; } else { tok->last_type = TOK_REDIRECT_OUT + mode; } } wchar_t tok_last_quote(tokenizer_t *tok) { CHECK(tok, 0); return tok->last_quote; } /** Test if a character is whitespace. Differs from iswspace in that it does not consider a newline to be whitespace. */ static bool my_iswspace(wchar_t c) { return c != L'\n' && iswspace(c); } const wchar_t *tok_get_desc(int type) { if (type < 0 || (size_t)type >= sizeof(tok_desc)) { return _(L"Invalid token type"); } return _(tok_desc[type]); } void tok_next(tokenizer_t *tok) { CHECK(tok,); CHECK(tok->buff,); if (tok_last_type(tok) == TOK_ERROR) { tok->has_next=false; return; } if (!tok->has_next) { /* wprintf( L"EOL\n" );*/ tok->last_type = TOK_END; return; } while (1) { if (tok->buff[0] == L'\\' && tok->buff[1] == L'\n') { tok->buff += 2; } else if (my_iswspace(tok->buff[0])) { tok->buff++; } else { break; } } if (*tok->buff == L'#') { if (tok->show_comments) { tok->last_pos = tok->buff - tok->orig_buff; read_comment(tok); return; } else { while (*(tok->buff)!= L'\n' && *(tok->buff)!= L'\0') tok->buff++; } while (my_iswspace(*(tok->buff))) tok->buff++; } tok->last_pos = tok->buff - tok->orig_buff; switch (*tok->buff) { case L'\0': tok->last_type = TOK_END; /*fwprintf( stderr, L"End of string\n" );*/ tok->has_next = false; break; case 13: case L'\n': case L';': tok->last_type = TOK_END; tok->buff++; break; case L'&': tok->last_type = TOK_BACKGROUND; tok->buff++; break; case L'|': tok->last_token = L"1"; tok->last_type = TOK_PIPE; tok->buff++; break; case L'>': read_redirect(tok, 1); return; case L'<': read_redirect(tok, 0); return; case L'^': read_redirect(tok, 2); return; default: { if (iswdigit(*tok->buff)) { const wchar_t *orig = tok->buff; int fd = 0; while (iswdigit(*tok->buff)) fd = (fd*10) + (*(tok->buff++) - L'0'); switch (*(tok->buff)) { case L'^': case L'>': case L'<': read_redirect(tok, fd); return; } tok->buff = orig; } read_string(tok); } } } const wchar_t *tok_string(tokenizer_t *tok) { return tok?tok->orig_buff:0; } wcstring tok_first(const wchar_t *str) { wcstring result; if (str) { tokenizer_t t(str, TOK_SQUASH_ERRORS); switch (tok_last_type(&t)) { case TOK_STRING: { const wchar_t *tmp = tok_last(&t); if (tmp != NULL) result = tmp; break; } default: break; } } return result; } int tok_get_pos(tokenizer_t *tok) { CHECK(tok, 0); return (int)tok->last_pos; } void tok_set_pos(tokenizer_t *tok, int pos) { CHECK(tok,); tok->buff = tok->orig_buff + pos; tok->has_next = true; tok_next(tok); } bool move_word_state_machine_t::consume_char_punctuation(wchar_t c) { enum { s_always_one = 0, s_whitespace, s_alphanumeric, s_end }; bool consumed = false; while (state != s_end && ! consumed) { switch (state) { case s_always_one: /* Always consume the first character */ consumed = true; state = s_whitespace; break; case s_whitespace: if (iswspace(c)) { /* Consumed whitespace */ consumed = true; } else { state = s_alphanumeric; } break; case s_alphanumeric: if (iswalnum(c)) { /* Consumed alphanumeric */ consumed = true; } else { state = s_end; } break; case s_end: default: break; } } return consumed; } bool move_word_state_machine_t::is_path_component_character(wchar_t c) { /* Always treat separators as first. All this does is ensure that we treat ^ as a string character instead of as stderr redirection, which I hypothesize is usually what is desired. */ return tok_is_string_character(c, true) && ! wcschr(L"/={,}'\"", c); } bool move_word_state_machine_t::consume_char_path_components(wchar_t c) { enum { s_initial_punctuation, s_whitespace, s_separator, s_slash, s_path_component_characters, s_end }; //printf("state %d, consume '%lc'\n", state, c); bool consumed = false; while (state != s_end && ! consumed) { switch (state) { case s_initial_punctuation: if (! is_path_component_character(c)) { consumed = true; } state = s_whitespace; break; case s_whitespace: if (iswspace(c)) { /* Consumed whitespace */ consumed = true; } else if (c == L'/' || is_path_component_character(c)) { /* Path component */ state = s_slash; } else { /* Path separator */ state = s_separator; } break; case s_separator: if (! iswspace(c) && ! is_path_component_character(c)) { /* Consumed separator */ consumed = true; } else { state = s_end; } break; case s_slash: if (c == L'/') { /* Consumed slash */ consumed = true; } else { state = s_path_component_characters; } break; case s_path_component_characters: if (is_path_component_character(c)) { /* Consumed string character except slash */ consumed = true; } else { state = s_end; } break; /* We won't get here, but keep the compiler happy */ case s_end: default: break; } } return consumed; } bool move_word_state_machine_t::consume_char(wchar_t c) { switch (style) { case move_word_style_punctuation: return consume_char_punctuation(c); case move_word_style_path_components: return consume_char_path_components(c); default: return false; } } move_word_state_machine_t::move_word_state_machine_t(move_word_style_t syl) : state(0), style(syl) { } void move_word_state_machine_t::reset() { state = 0; } fish/tokenizer.h000066400000000000000000000125121214535744100142010ustar00rootroot00000000000000/** \file tokenizer.h A specialized tokenizer for tokenizing the fish language. In the future, the tokenizer should be extended to support marks, tokenizing multiple strings and disposing of unused string segments. */ #ifndef FISH_TOKENIZER_H #define FISH_TOKENIZER_H #include #include "common.h" /** Token types */ enum token_type { TOK_NONE, /**< Tokenizer not yet constructed */ TOK_ERROR, /**< Error reading token */ TOK_INVALID,/**< Invalid token */ TOK_STRING,/**< String token */ TOK_PIPE,/**< Pipe token */ TOK_END,/**< End token */ TOK_REDIRECT_OUT, /**< redirection token */ TOK_REDIRECT_APPEND,/**< redirection append token */ TOK_REDIRECT_IN,/**< input redirection token */ TOK_REDIRECT_FD,/**< redirection to new fd token */ TOK_REDIRECT_NOCLOB, /**, <, etc. is_first should indicate whether this is the first character in a potential string. */ bool tok_is_string_character(wchar_t c, bool is_first); /** Move tokenizer position */ void tok_set_pos(tokenizer_t *tok, int pos); /** Returns a string description of the specified token type */ const wchar_t *tok_get_desc(int type); /** Get tokenizer error type. Should only be called if tok_last_tope returns TOK_ERROR. */ int tok_get_error(tokenizer_t *tok); enum move_word_style_t { move_word_style_punctuation, //stop at punctuation move_word_style_path_components //stops at path components }; /* Our state machine that implements "one word" movement or erasure. */ class move_word_state_machine_t { private: bool consume_char_punctuation(wchar_t c); bool consume_char_path_components(wchar_t c); bool is_path_component_character(wchar_t c); int state; move_word_style_t style; public: move_word_state_machine_t(move_word_style_t st); bool consume_char(wchar_t c); void reset(); }; #endif fish/user_doc.head.html000066400000000000000000000014761214535744100154160ustar00rootroot00000000000000 fish user documentation fish/util.cpp000066400000000000000000000051311214535744100134760ustar00rootroot00000000000000/** \file util.c Generic utilities library. Contains datastructures such as automatically growing array lists, priority queues, etc. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" /** Minimum allocated size for data structures. Used to avoid excessive memory allocations for lists, hash tables, etc, which are nearly empty. */ #define MIN_SIZE 32 /** Maximum number of characters that can be inserted using a single call to sb_printf. This is needed since vswprintf doesn't tell us what went wrong. We don't know if we ran out of space or something else went wrong. We assume that any error is an out of memory-error and try again until we reach this size. After this size has been reached, it is instead assumed that something was wrong with the format string. */ #define SB_MAX_SIZE (128*1024*1024) int wcsfilecmp(const wchar_t *a, const wchar_t *b) { CHECK(a, 0); CHECK(b, 0); if (*a==0) { if (*b==0) return 0; return -1; } if (*b==0) { return 1; } long secondary_diff=0; if (iswdigit(*a) && iswdigit(*b)) { wchar_t *aend, *bend; long al; long bl; long diff; errno = 0; al = wcstol(a, &aend, 10); bl = wcstol(b, &bend, 10); if (errno) { /* Huuuuuuuuge numbers - fall back to regular string comparison */ return wcscmp(a, b); } diff = al - bl; if (diff) return diff > 0 ? 2 : -2; secondary_diff = (aend-a) - (bend-b); a=aend-1; b=bend-1; } else { int diff = towlower(*a) - towlower(*b); if (diff != 0) return (diff>0)?2:-2; secondary_diff = *a-*b; } int res = wcsfilecmp(a+1, b+1); if (abs(res) < 2) { /* No primary difference in rest of string. Use secondary difference on this element if found. */ if (secondary_diff) { return secondary_diff > 0 ? 1 :-1; } } return res; } long long get_time() { struct timeval time_struct; gettimeofday(&time_struct, 0); return 1000000ll*time_struct.tv_sec+time_struct.tv_usec; } fish/util.h000066400000000000000000000032121214535744100131410ustar00rootroot00000000000000/** \file util.h Generic utilities library. */ #ifndef FISH_UTIL_H #define FISH_UTIL_H #include #include #include /** Returns the larger of two ints */ template static inline T maxi(T a, T b) { return a>b?a:b; } /** Returns the smaller of two ints */ template static inline T mini(T a, T b) { return athe fish homepage. Extract the sourcode, copy wgetopt.c and wgetopt.h into your program directory, include wgetopt.h in your program, and use all the regular getopt functions, prefixing every function, global variable and structure with a 'w', and use only wide character strings. There are no other functional changes in this version of getopt besides using wide character strings. For examples of how to use wgetopt, see the fish builtin functions, many of which are defined in builtin.c. */ /* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #if !defined (__STDC__) || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include #include #include #include #include #include /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #endif /* GNU C library. */ /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "wgetopt.h" #include "wutil.h" #include "fallback.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ wchar_t *woptarg = NULL; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `woptind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* XXX 1003.2 says this must be 1 before any call. */ int woptind = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static wchar_t *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int wopterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int woptopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return EOF with `woptind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; /** Use translation functions if available */ #ifdef _ #undef _ #endif #ifdef HAVE_TRANSLATE_H #ifdef USE_GETTEXT #define _(string) wgettext(string) #else #define _(string) (string) #endif #else #define _(wstr) wstr #endif #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index wcschr #else /* Avoid depending on library functions or files whose names are inconsistent. */ char *getenv(); static wchar_t * my_index(const wchar_t *str, int chr) { while (*str) { if (*str == chr) return (wchar_t *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ #if !defined (__STDC__) || !__STDC__ /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int wcslen(const wchar_t *); #endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,woptind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange(wchar_t **argv) { int bottom = first_nonopt; int middle = last_nonopt; int top = woptind; wchar_t *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (woptind - last_nonopt); last_nonopt = woptind; } /* Initialize the internal data when the first call is made. */ static const wchar_t * _wgetopt_initialize(const wchar_t *optstring) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = woptind = 1; nextchar = NULL; posixly_correct = getenv("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `woptind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns `EOF'. Then `woptind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `wopterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `woptarg', otherwise `woptarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *optstring, const struct woption *longopts, int *longind, int long_only) { woptarg = NULL; if (woptind == 0) optstring = _wgetopt_initialize(optstring); if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != woptind) exchange((wchar_t **) argv); else if (last_nonopt != woptind) first_nonopt = woptind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (woptind < argc && (argv[woptind][0] != '-' || argv[woptind][1] == '\0')) woptind++; last_nonopt = woptind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (woptind != argc && !wcscmp(argv[woptind], L"--")) { woptind++; if (first_nonopt != last_nonopt && last_nonopt != woptind) exchange((wchar_t **) argv); else if (first_nonopt == last_nonopt) first_nonopt = woptind; last_nonopt = argc; woptind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (woptind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) woptind = first_nonopt; return EOF; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if ((argv[woptind][0] != '-' || argv[woptind][1] == '\0')) { if (ordering == REQUIRE_ORDER) return EOF; woptarg = argv[woptind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[woptind] + 1 + (longopts != NULL && argv[woptind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[woptind][1] == '-' || (long_only && (argv[woptind][2] || !my_index(optstring, argv[woptind][1]))))) { wchar_t *nameend; const struct woption *p; const struct woption *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; /* set to zero by Anton */ int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!wcsncmp(p->name, nextchar, nameend - nextchar)) { if ((unsigned int)(nameend - nextchar) == (unsigned int)wcslen(p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (wopterr) fwprintf(stderr, _(L"%ls: Option '%ls' is ambiguous\n"), argv[0], argv[woptind]); nextchar += wcslen(nextchar); woptind++; return '?'; } if (pfound != NULL) { option_index = indfound; woptind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) woptarg = nameend + 1; else { if (wopterr) { if (argv[woptind - 1][1] == '-') /* --option */ fwprintf(stderr, _(L"%ls: Option '--%ls' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fwprintf(stderr, _(L"%ls: Option '%lc%ls' doesn't allow an argument\n"), argv[0], argv[woptind - 1][0], pfound->name); } nextchar += wcslen(nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (woptind < argc) woptarg = argv[woptind++]; else { if (wopterr) fwprintf(stderr, _(L"%ls: Option '%ls' requires an argument\n"), argv[0], argv[woptind - 1]); nextchar += wcslen(nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += wcslen(nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[woptind][1] == '-' || my_index(optstring, *nextchar) == NULL) { if (wopterr) { if (argv[woptind][1] == '-') /* --option */ fwprintf(stderr, _(L"%ls: Unrecognized option '--%ls'\n"), argv[0], nextchar); else /* +option or -option */ fwprintf(stderr, _(L"%ls: Unrecognized option '%lc%ls'\n"), argv[0], argv[woptind][0], nextchar); } nextchar = (wchar_t *) L""; woptind++; return '?'; } } /* Look at and handle the next short option-character. */ { wchar_t c = *nextchar++; wchar_t *temp = const_cast(my_index(optstring, c)); /* Increment `woptind' when we start to process its last character. */ if (*nextchar == '\0') ++woptind; if (temp == NULL || c == ':') { if (wopterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fwprintf(stderr, _(L"%ls: Illegal option -- %lc\n"), argv[0], c); else fwprintf(stderr, _(L"%ls: Invalid option -- %lc\n"), argv[0], c); } woptopt = c; return '?'; } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { woptarg = nextchar; woptind++; } else woptarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { woptarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ woptind++; } else if (woptind == argc) { if (wopterr) { /* 1003.2 specifies the format of this message. */ fwprintf(stderr, _(L"%ls: Option requires an argument -- %lc\n"), argv[0], c); } woptopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `woptind' once; increment it again when taking next ARGV-elt as argument. */ woptarg = argv[woptind++]; nextchar = NULL; } } return c; } } int wgetopt(int argc, wchar_t *const *argv, const wchar_t *optstring) { return _wgetopt_internal(argc, argv, optstring, (const struct woption *) 0, (int *) 0, 0); } int wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) { return _wgetopt_internal(argc, argv, options, long_options, opt_index, 0); } int wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *options, const struct woption *long_options, int *opt_index) { return _wgetopt_internal(argc, argv, options, long_options, opt_index, 1); } fish/wgetopt.h000066400000000000000000000163471214535744100136720ustar00rootroot00000000000000/** \file wgetopt.h A version of the getopt library for use with wide character strings. This is simply the gnu getopt library, but converted for use with wchar_t instead of char. This is not usually useful since the argv array is always defined to be of type char**, but in fish, all internal commands use wide characters and hence this library is useful. If you want to use this version of getopt in your program, download the fish sourcecode, available at the fish homepage. Extract the sourcode, copy wgetopt.c and wgetopt.h into your program directory, include wgetopt.h in your program, and use all the regular getopt functions, prefixing every function, global variable and structure with a 'w', and use only wide character strings. There are no other functional changes in this version of getopt besides using wide character strings. For examples of how to use wgetopt, see the fish builtin functions, many of which are defined in builtin.c. */ /* Declarations for getopt. Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef FISH_WGETOPT_H #define FISH_WGETOPT_H #include #ifdef __cplusplus extern "C" { #endif /** For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern wchar_t *woptarg; /** Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `woptind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int woptind; /** Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int wopterr; /** Set to an option character which was unrecognized. */ extern int woptopt; /** Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct woption { /** long name for switch */ #if defined (__STDC__) && __STDC__ const wchar_t *name; #else wchar_t *name; #endif /** Must be one of no_argument, required_argument and optional_argument. has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; /** If non-null, the flag whose value should be set if this switch is encountered */ int *flag; /** If \c flag is non-null, this is the value that flag will be set to. Otherwise, this is the return-value of the function call. */ int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ /** Specifies that a switch does not accept an argument */ #define no_argument 0 /** Specifies that a switch requires an argument */ #define required_argument 1 /** Specifies that a switch accepts an optional argument */ #define optional_argument 2 #if defined (__STDC__) && __STDC__ #ifdef __GNU_LIBRARY__ /** Get options from argument list. See the glibc manual for information on how to use this function. */ extern int wgetopt(int argc, wchar_t *const *argv, const wchar_t *shortopts); #else /* not __GNU_LIBRARY__ */ extern int wgetopt(); #endif /* __GNU_LIBRARY__ */ /** Get options from argument list. See the glibc manual for information on how to use this function. */ extern int wgetopt_long(int argc, wchar_t *const *argv, const wchar_t *shortopts, const struct woption *longopts, int *longind); /** Get options from argument list. See the glibc manual for information on how to use this function. */ extern int wgetopt_long_only(int argc, wchar_t *const *argv, const wchar_t *shortopts, const struct woption *longopts, int *longind); /** Internal only. Users should not call this directly. */ extern int _wgetopt_internal(int argc, wchar_t *const *argv, const wchar_t *shortopts, const struct woption *longopts, int *longind, int long_only); #else /* not __STDC__ */ /** Get options from argument list. See the glibc manual for information on how to use this function. */ extern int wgetopt(); /** Get options from argument list. See the glibc manual for information on how to use this function. */ extern int wgetopt_long(); /** Get options from argument list. See the glibc manual for information on how to use this function. */ extern int wgetopt_long_only(); /** Internal only. Users should not call this directly. */ extern int _wgetopt_internal(); #endif /* __STDC__ */ #ifdef __cplusplus } #endif #endif /* FISH_WGETOPT_H */ fish/wildcard.cpp000066400000000000000000000756101214535744100143230ustar00rootroot00000000000000/** \file wildcard.c Fish needs it's own globbing implementation to support tab-expansion of globbed parameters. Also provides recursive wildcards using **. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "fallback.h" #include "util.h" #include "wutil.h" #include "complete.h" #include "common.h" #include "wildcard.h" #include "complete.h" #include "reader.h" #include "expand.h" #include "exec.h" #include /** This flag is set in the flags parameter of wildcard_expand if the call is part of a recursiv wildcard search. It is used to make sure that the contents of subdirectories are only searched once. */ #define WILDCARD_RECURSIVE 64 /** The maximum length of a filename token. This is a fallback value, an attempt to find the true value using patchconf is always made. */ #define MAX_FILE_LENGTH 1024 /** The command to run to get a description from a file suffix */ #define SUFFIX_CMD_STR L"mimedb 2>/dev/null -fd " /** Description for generic executable */ #define COMPLETE_EXEC_DESC _( L"Executable" ) /** Description for link to executable */ #define COMPLETE_EXEC_LINK_DESC _( L"Executable link" ) /** Description for regular file */ #define COMPLETE_FILE_DESC _( L"File" ) /** Description for character device */ #define COMPLETE_CHAR_DESC _( L"Character device" ) /** Description for block device */ #define COMPLETE_BLOCK_DESC _( L"Block device" ) /** Description for fifo buffer */ #define COMPLETE_FIFO_DESC _( L"Fifo" ) /** Description for symlink */ #define COMPLETE_SYMLINK_DESC _( L"Symbolic link" ) /** Description for symlink */ #define COMPLETE_DIRECTORY_SYMLINK_DESC _( L"Symbolic link to directory" ) /** Description for Rotten symlink */ #define COMPLETE_ROTTEN_SYMLINK_DESC _( L"Rotten symbolic link" ) /** Description for symlink loop */ #define COMPLETE_LOOP_SYMLINK_DESC _( L"Symbolic link loop" ) /** Description for socket files */ #define COMPLETE_SOCKET_DESC _( L"Socket" ) /** Description for directories */ #define COMPLETE_DIRECTORY_DESC _( L"Directory" ) /** Hashtable containing all descriptions that describe an executable */ static std::map suffix_map; int wildcard_has(const wchar_t *str, int internal) { if (!str) { debug(2, L"Got null string on line %d of file %s", __LINE__, __FILE__); return 0; } if (internal) { for (; *str; str++) { if ((*str == ANY_CHAR) || (*str == ANY_STRING) || (*str == ANY_STRING_RECURSIVE)) return 1; } } else { wchar_t prev=0; for (; *str; str++) { if (((*str == L'*') || (*str == L'?')) && (prev != L'\\')) return 1; prev = *str; } } return 0; } /** Check whether the string str matches the wildcard string wc. \param str String to be matched. \param wc The wildcard. \param is_first Whether files beginning with dots should not be matched against wildcards. */ static bool wildcard_match_internal(const wchar_t *str, const wchar_t *wc, bool leading_dots_fail_to_match, bool is_first) { if (*str == 0 && *wc==0) return true; /* Hackish fix for https://github.com/fish-shell/fish-shell/issues/270 . Prevent wildcards from matching . or .., but we must still allow literal matches. */ if (leading_dots_fail_to_match && is_first && contains(str, L".", L"..")) { /* The string is '.' or '..'. Return true if the wildcard exactly matches. */ return ! wcscmp(str, wc); } if (*wc == ANY_STRING || *wc == ANY_STRING_RECURSIVE) { /* Ignore hidden file */ if (leading_dots_fail_to_match && is_first && *str == L'.') { return false; } /* Try all submatches */ do { if (wildcard_match_internal(str, wc+1, leading_dots_fail_to_match, false)) return true; } while (*(str++) != 0); return false; } else if (*str == 0) { /* End of string, but not end of wildcard, and the next wildcard element is not a '*', so this is not a match. */ return false; } if (*wc == ANY_CHAR) { if (is_first && *str == L'.') { return false; } return wildcard_match_internal(str+1, wc+1, leading_dots_fail_to_match, false); } if (*wc == *str) return wildcard_match_internal(str+1, wc+1, leading_dots_fail_to_match, false); return false; } /** Matches the string against the wildcard, and if the wildcard is a possible completion of the string, the remainder of the string is inserted into the out vector. */ static bool wildcard_complete_internal(const wcstring &orig, const wchar_t *str, const wchar_t *wc, bool is_first, const wchar_t *desc, wcstring(*desc_func)(const wcstring &), std::vector &out, int flags) { if (!wc || ! str || orig.empty()) { debug(2, L"Got null string on line %d of file %s", __LINE__, __FILE__); return 0; } if (*wc == 0 && ((str[0] != L'.') || (!is_first))) { wcstring out_completion; wcstring out_desc = (desc ? desc : L""); if (flags & COMPLETE_REPLACES_TOKEN) { out_completion = orig; } else { out_completion = str; } size_t complete_sep_loc = out_completion.find(PROG_COMPLETE_SEP); if (complete_sep_loc != wcstring::npos) { /* This completion has an embedded description, do not use the generic description */ out_desc.assign(out_completion, complete_sep_loc + 1, out_completion.size() - complete_sep_loc - 1); out_completion.resize(complete_sep_loc); } else { if (desc_func) { /* A description generating function is specified, call it. If it returns something, use that as the description. */ wcstring func_desc = desc_func(orig); if (! func_desc.empty()) out_desc = func_desc; } } /* Note: out_completion may be empty if the completion really is empty, e.g. tab-completing 'foo' when a file 'foo' exists. */ append_completion(out, out_completion, out_desc, flags); return true; } if (*wc == ANY_STRING) { bool res=false; /* Ignore hidden file */ if (is_first && str[0] == L'.') return false; /* Try all submatches */ do { res = wildcard_complete_internal(orig, str, wc+1, 0, desc, desc_func, out, flags); if (res) break; } while (*str++ != 0); return res; } else if (*wc == ANY_CHAR) { return wildcard_complete_internal(orig, str+1, wc+1, 0, desc, desc_func, out, flags); } else if (*wc == *str) { return wildcard_complete_internal(orig, str+1, wc+1, 0, desc, desc_func, out, flags); } else if (towlower(*wc) == towlower(*str)) { return wildcard_complete_internal(orig, str+1, wc+1, 0, desc, desc_func, out, flags | COMPLETE_CASE_INSENSITIVE | COMPLETE_REPLACES_TOKEN); } return false; } bool wildcard_complete(const wcstring &str, const wchar_t *wc, const wchar_t *desc, wcstring(*desc_func)(const wcstring &), std::vector &out, int flags) { bool res; res = wildcard_complete_internal(str, str.c_str(), wc, true, desc, desc_func, out, flags); return res; } bool wildcard_match(const wcstring &str, const wcstring &wc, bool leading_dots_fail_to_match) { return wildcard_match_internal(str.c_str(), wc.c_str(), leading_dots_fail_to_match, true /* first */); } /** Creates a path from the specified directory and filename. */ static wcstring make_path(const wcstring &base_dir, const wcstring &name) { return base_dir + name; } /** Return a description of a file based on its suffix. This function does not perform any caching, it directly calls the mimedb command to do a lookup. */ static wcstring complete_get_desc_suffix_internal(const wcstring &suff) { wcstring cmd = wcstring(SUFFIX_CMD_STR) + suff; wcstring_list_t lst; wcstring desc; if (exec_subshell(cmd, lst, false /* do not apply exit status */) != -1) { if (! lst.empty()) { const wcstring & ln = lst.at(0); if (ln.size() > 0 && ln != L"unknown") { desc = ln; /* I have decided I prefer to have the description begin in uppercase and the whole universe will just have to accept it. Hah! */ desc[0]=towupper(desc[0]); } } } if (desc.empty()) { desc = COMPLETE_FILE_DESC; } suffix_map[suff] = desc.c_str(); return desc; } /** Use the mimedb command to look up a description for a given suffix */ static wcstring complete_get_desc_suffix(const wchar_t *suff_orig) { size_t len; wchar_t *suff; wchar_t *pos; wchar_t *tmp; len = wcslen(suff_orig); if (len == 0) return COMPLETE_FILE_DESC; suff = wcsdup(suff_orig); /* Drop characters that are commonly used as backup suffixes from the suffix */ for (pos=suff; *pos; pos++) { if (wcschr(L"?;#~@&", *pos)) { *pos=0; break; } } tmp = escape(suff, 1); free(suff); suff = tmp; std::map::iterator iter = suffix_map.find(suff); wcstring desc; if (iter != suffix_map.end()) { desc = iter->second; } else { desc = complete_get_desc_suffix_internal(suff); } free(suff); return desc; } /** Obtain a description string for the file specified by the filename. The returned value is a string constant and should not be free'd. \param filename The file for which to find a description string \param lstat_res The result of calling lstat on the file \param lbuf The struct buf output of calling lstat on the file \param stat_res The result of calling stat on the file \param buf The struct buf output of calling stat on the file \param err The errno value after a failed stat call on the file. */ static wcstring file_get_desc(const wcstring &filename, int lstat_res, struct stat lbuf, int stat_res, struct stat buf, int err) { const wchar_t *suffix; if (!lstat_res) { if (S_ISLNK(lbuf.st_mode)) { if (!stat_res) { if (S_ISDIR(buf.st_mode)) { return COMPLETE_DIRECTORY_SYMLINK_DESC; } else { if ((buf.st_mode & S_IXUSR) || (buf.st_mode & S_IXGRP) || (buf.st_mode & S_IXOTH)) { if (waccess(filename, X_OK) == 0) { /* Weird group permissions and other such issues make it non-trivial to find out if we can actually execute a file using the result from stat. It is much safer to use the access function, since it tells us exactly what we want to know. */ return COMPLETE_EXEC_LINK_DESC; } } } return COMPLETE_SYMLINK_DESC; } else { switch (err) { case ENOENT: { return COMPLETE_ROTTEN_SYMLINK_DESC; } case ELOOP: { return COMPLETE_LOOP_SYMLINK_DESC; } } /* On unknown errors we do nothing. The file will be given the default 'File' description or one based on the suffix. */ } } else if (S_ISCHR(buf.st_mode)) { return COMPLETE_CHAR_DESC; } else if (S_ISBLK(buf.st_mode)) { return COMPLETE_BLOCK_DESC; } else if (S_ISFIFO(buf.st_mode)) { return COMPLETE_FIFO_DESC; } else if (S_ISSOCK(buf.st_mode)) { return COMPLETE_SOCKET_DESC; } else if (S_ISDIR(buf.st_mode)) { return COMPLETE_DIRECTORY_DESC; } else { if ((buf.st_mode & S_IXUSR) || (buf.st_mode & S_IXGRP) || (buf.st_mode & S_IXOTH)) { if (waccess(filename, X_OK) == 0) { /* Weird group permissions and other such issues make it non-trivial to find out if we can actually execute a file using the result from stat. It is much safer to use the access function, since it tells us exactly what we want to know. */ return COMPLETE_EXEC_DESC; } } } } suffix = wcsrchr(filename.c_str(), L'.'); if (suffix != 0 && !wcsrchr(suffix, L'/')) { return complete_get_desc_suffix(suffix); } return COMPLETE_FILE_DESC ; } /** Add the specified filename if it matches the specified wildcard. If the filename matches, first get the description of the specified filename. If this is a regular file, append the filesize to the description. \param list the list to add he completion to \param fullname the full filename of the file \param completion the completion part of the file name \param wc the wildcard to match against \param is_cmd whether we are performing command completion */ static void wildcard_completion_allocate(std::vector &list, const wcstring &fullname, const wcstring &completion, const wchar_t *wc, expand_flags_t expand_flags) { struct stat buf, lbuf; wcstring sb; wcstring munged_completion; int flags = 0; int stat_res, lstat_res; int stat_errno=0; long long sz; /* If the file is a symlink, we need to stat both the file itself _and_ the destination file. But we try to avoid this with non-symlinks by first doing an lstat, and if the file is not a link we copy the results over to the regular stat buffer. */ if ((lstat_res = lwstat(fullname, &lbuf))) { /* lstat failed! */ sz=-1; stat_res = lstat_res; } else { if (S_ISLNK(lbuf.st_mode)) { if ((stat_res = wstat(fullname, &buf))) { sz=-1; } else { sz = (long long)buf.st_size; } /* In order to differentiate between e.g. rotten symlinks and symlink loops, we also need to know the error status of wstat. */ stat_errno = errno; } else { stat_res = lstat_res; memcpy(&buf, &lbuf, sizeof(struct stat)); sz = (long long)buf.st_size; } } bool wants_desc = !(expand_flags & EXPAND_NO_DESCRIPTIONS); wcstring desc; if (wants_desc) desc = file_get_desc(fullname, lstat_res, lbuf, stat_res, buf, stat_errno); if (sz >= 0 && S_ISDIR(buf.st_mode)) { flags = flags | COMPLETE_NO_SPACE; munged_completion = completion; munged_completion.push_back(L'/'); if (wants_desc) sb.append(desc); } else { if (wants_desc) { if (! desc.empty()) { sb.append(desc); sb.append(L", "); } sb.append(format_size(sz)); } } const wcstring &completion_to_use = munged_completion.empty() ? completion : munged_completion; wildcard_complete(completion_to_use, wc, sb.c_str(), NULL, list, flags); } /** Test if the file specified by the given filename matches the expansion flags specified. flags can be a combination of EXECUTABLES_ONLY and DIRECTORIES_ONLY. */ static int test_flags(const wchar_t *filename, int flags) { if (flags & DIRECTORIES_ONLY) { struct stat buf; if (wstat(filename, &buf) == -1) { return 0; } if (!S_ISDIR(buf.st_mode)) { return 0; } } if (flags & EXECUTABLES_ONLY) { if (waccess(filename, X_OK) != 0) return 0; } return 1; } /** Appends a completion to the completion list, if the string is missing from the set. */ static void insert_completion_if_missing(const wcstring &str, std::vector &out, std::set &completion_set) { if (completion_set.insert(str).second) append_completion(out, str); } /** The real implementation of wildcard expansion is in this function. Other functions are just wrappers around this one. This function traverses the relevant directory tree looking for matches, and recurses when needed to handle wildcrards spanning multiple components and recursive wildcards. Because this function calls itself recursively with substrings, it's important that the parameters be raw pointers instead of wcstring, which would be too expensive to construct for all substrings. */ static int wildcard_expand_internal(const wchar_t *wc, const wchar_t * const base_dir, expand_flags_t flags, std::vector &out, std::set &completion_set, std::set &visited_files) { /* Variables for traversing a directory */ DIR *dir; /* The result returned */ int res = 0; /* Variables for testing for presense of recursive wildcards */ const wchar_t *wc_recursive; bool is_recursive; /* Slightly mangled version of base_dir */ const wchar_t *dir_string; // debug( 3, L"WILDCARD_EXPAND %ls in %ls", wc, base_dir ); if (is_main_thread() ? reader_interrupted() : reader_thread_job_is_stale()) { return -1; } if (!wc || !base_dir) { debug(2, L"Got null string on line %d of file %s", __LINE__, __FILE__); return 0; } const size_t base_dir_len = wcslen(base_dir); if (flags & ACCEPT_INCOMPLETE) { /* Avoid excessive number of returned matches for wc ending with a * */ size_t len = wcslen(wc); if (len && (wc[len-1]==ANY_STRING)) { wchar_t * foo = wcsdup(wc); foo[len-1]=0; int res = wildcard_expand_internal(foo, base_dir, flags, out, completion_set, visited_files); free(foo); return res; } } /* Initialize various variables */ dir_string = base_dir[0]==L'\0'?L".":base_dir; if (!(dir = wopendir(dir_string))) { return 0; } /* Points to the end of the current wildcard segment */ const wchar_t * const wc_end = wcschr(wc,L'/'); /* Test for recursive match string in current segment */ wc_recursive = wcschr(wc, ANY_STRING_RECURSIVE); is_recursive = (wc_recursive && (!wc_end || wc_recursive < wc_end)); /* Is this segment of the wildcard the last? */ if (!wc_end) { /* Wildcard segment is the last segment, Insert all matching files/directories */ if (wc[0]=='\0') { /* The last wildcard segment is empty. Insert everything if completing, the directory itself otherwise. */ if (flags & ACCEPT_INCOMPLETE) { wcstring next; while (wreaddir(dir, next)) { if (next[0] != L'.') { wcstring long_name = make_path(base_dir, next); if (test_flags(long_name.c_str(), flags)) { wildcard_completion_allocate(out, long_name, next, L"", flags); } } } } else { res = 1; insert_completion_if_missing(base_dir, out, completion_set); } } else { /* This is the last wildcard segment, and it is not empty. Match files/directories. */ wcstring name_str; while (wreaddir(dir, name_str)) { if (flags & ACCEPT_INCOMPLETE) { const wcstring long_name = make_path(base_dir, name_str); /* Test for matches before stating file, so as to minimize the number of calls to the much slower stat function */ std::vector test; if (wildcard_complete(name_str, wc, L"", 0, test, 0)) { if (test_flags(long_name.c_str(), flags)) { wildcard_completion_allocate(out, long_name, name_str, wc, flags); } } } else { if (wildcard_match(name_str, wc, true /* skip files with leading dots */)) { const wcstring long_name = make_path(base_dir, name_str); int skip = 0; if (is_recursive) { /* In recursive mode, we are only interested in adding files -directories will be added in the next pass. */ struct stat buf; if (!wstat(long_name, &buf)) { skip = S_ISDIR(buf.st_mode); } } if (! skip) { insert_completion_if_missing(long_name, out, completion_set); } res = 1; } } } } } if (wc_end || is_recursive) { /* Wilcard segment is not the last segment. Recursively call wildcard_expand for all matching subdirectories. */ /* In recursive mode, we look through the directory twice. If so, this rewind is needed. */ rewinddir(dir); /* wc_str is the part of the wildcarded string from the beginning to the first slash */ const wcstring wc_str = wcstring(wc, wc_end ? wc_end - wc : wcslen(wc)); /* new_dir is a scratch area containing the full path to a file/directory we are iterating over */ wcstring new_dir = base_dir; wcstring name_str; while (wreaddir(dir, name_str)) { /* Test if the file/directory name matches the whole wildcard element, i.e. regular matching. */ int whole_match = wildcard_match(name_str, wc_str, true /* ignore leading dots */); int partial_match = 0; /* If we are doing recursive matching, also check if this directory matches the part up to the recusrive wildcard, if so, then we can search all subdirectories for matches. */ if (is_recursive) { const wchar_t *end = wcschr(wc, ANY_STRING_RECURSIVE); wchar_t *wc_sub = wcsndup(wc, end-wc+1); partial_match = wildcard_match(name_str, wc_sub, true /* ignore leading dots */); free(wc_sub); } if (whole_match || partial_match) { struct stat buf; int new_res; // new_dir is base_dir + some other path components // Replace everything after base_dir with the new path component new_dir.replace(base_dir_len, wcstring::npos, name_str); int stat_res = wstat(new_dir, &buf); if (!stat_res) { // Insert a "file ID" into visited_files // If the insertion fails, we've already visited this file (i.e. a symlink loop) // If we're not recursive, insert anyways (in case we loop back around in a future recursive segment), but continue on; the idea being that literal path components should still work const file_id_t file_id(buf.st_dev, buf.st_ino); if (S_ISDIR(buf.st_mode) && (visited_files.insert(file_id).second || ! is_recursive)) { new_dir.push_back(L'/'); /* Regular matching */ if (whole_match) { const wchar_t *new_wc = L""; if (wc_end) { new_wc=wc_end+1; /* Accept multiple '/' as a single direcotry separator */ while (*new_wc==L'/') { new_wc++; } } new_res = wildcard_expand_internal(new_wc, new_dir.c_str(), flags, out, completion_set, visited_files); if (new_res == -1) { res = -1; break; } res |= new_res; } /* Recursive matching */ if (partial_match) { new_res = wildcard_expand_internal(wcschr(wc, ANY_STRING_RECURSIVE), new_dir.c_str(), flags | WILDCARD_RECURSIVE, out, completion_set, visited_files); if (new_res == -1) { res = -1; break; } res |= new_res; } } } } } } closedir(dir); return res; } int wildcard_expand(const wchar_t *wc, const wchar_t *base_dir, expand_flags_t flags, std::vector &out) { size_t c = out.size(); /* Make a set of used completion strings so we can do fast membership tests inside wildcard_expand_internal. Otherwise wildcards like '**' are very slow, because we end up with an N^2 membership test. */ std::set completion_set; for (std::vector::const_iterator iter = out.begin(); iter != out.end(); ++iter) { completion_set.insert(iter->completion); } std::set visited_files; int res = wildcard_expand_internal(wc, base_dir, flags, out, completion_set, visited_files); if (flags & ACCEPT_INCOMPLETE) { wcstring wc_base; const wchar_t *wc_base_ptr = wcsrchr(wc, L'/'); if (wc_base_ptr) { wc_base = wcstring(wc, (wc_base_ptr-wc)+1); } for (size_t i=c; i &outputs) { // PCA: not convinced this temporary variable is really necessary std::vector lst; int res = wildcard_expand(wc.c_str(), base_dir.c_str(), flags, lst); outputs.insert(outputs.end(), lst.begin(), lst.end()); return res; } fish/wildcard.h000066400000000000000000000055401214535744100137630ustar00rootroot00000000000000/** \file wildcard.h My own globbing implementation. Needed to implement this instead of using libs globbing to support tab-expansion of globbed paramaters. */ #ifndef FISH_WILDCARD_H /** Header guard */ #define FISH_WILDCARD_H #include #include #include "util.h" #include "common.h" #include "expand.h" /* Use unencoded private-use keycodes for internal characters */ #define WILDCARD_RESERVED 0xf400 class completion_t; /** Enumeration of all wildcard types */ enum { /** Character representing any character except '/' */ ANY_CHAR = WILDCARD_RESERVED, /** Character representing any character string not containing '/' (A slash) */ ANY_STRING, /** Character representing any character string */ ANY_STRING_RECURSIVE, } ; /** Expand the wildcard by matching against the filesystem. New strings are allocated using malloc and should be freed by the caller. wildcard_expand works by dividing the wildcard into segments at each directory boundary. Each segment is processed separatly. All except the last segment are handled by matching the wildcard segment against all subdirectories of matching directories, and recursively calling wildcard_expand for matches. On the last segment, matching is made to any file, and all matches are inserted to the list. If wildcard_expand encounters any errors (such as insufficient priviliges) during matching, no error messages will be printed and wildcard_expand will continue the matching process. \param wc The wildcard string \param base_dir The base directory of the filesystem to perform the match against \param flags flags for the search. Can be any combination of ACCEPT_INCOMPLETE and EXECUTABLES_ONLY \param out The list in which to put the output \return 1 if matches where found, 0 otherwise. Return -1 on abort (I.e. ^C was pressed). */ int wildcard_expand_string(const wcstring &wc, const wcstring &base_dir, expand_flags_t flags, std::vector &out); /** Test whether the given wildcard matches the string. Does not perform any I/O. \param str The string to test \param wc The wildcard to test against \param leading_dots_fail_to_match if set, strings with leading dots are assumed to be hidden files and are not matched \return true if the wildcard matched */ bool wildcard_match(const wcstring &str, const wcstring &wc, bool leading_dots_fail_to_match = false); /** Check if the specified string contains wildcards */ int wildcard_has(const wchar_t *str, int internal); /** Test wildcard completion */ bool wildcard_complete(const wcstring &str, const wchar_t *wc, const wchar_t *desc, wcstring(*desc_func)(const wcstring &), std::vector &out, expand_flags_t flags); #endif fish/wutil.cpp000066400000000000000000000257041214535744100136750ustar00rootroot00000000000000/** \file wutil.c Wide character equivalents of various standard unix functions. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if HAVE_LIBINTL_H #include #endif #include "fallback.h" #include "util.h" #include "common.h" #include "wutil.h" typedef std::string cstring; /** Minimum length of the internal covnersion buffers */ #define TMP_LEN_MIN 256 #ifndef PATH_MAX #ifdef MAXPATHLEN #define PATH_MAX MAXPATHLEN #else /** Fallback length of MAXPATHLEN. Just a hopefully sane value... */ #define PATH_MAX 4096 #endif #endif /* Lock to protect wgettext */ static pthread_mutex_t wgettext_lock; /* Maps string keys to (immortal) pointers to string values */ typedef std::map wgettext_map_t; static std::map wgettext_map; void wutil_init() { } void wutil_destroy() { } bool wreaddir_resolving(DIR *dir, const std::wstring &dir_path, std::wstring &out_name, bool *out_is_dir) { struct dirent *d = readdir(dir); if (!d) return false; out_name = str2wcstring(d->d_name); if (out_is_dir) { /* The caller cares if this is a directory, so check */ bool is_dir; if (d->d_type == DT_DIR) { is_dir = true; } else if (d->d_type == DT_LNK || d->d_type == DT_UNKNOWN) { /* We want to treat symlinks to directories as directories. Use stat to resolve it. */ cstring fullpath = wcs2string(dir_path); fullpath.push_back('/'); fullpath.append(d->d_name); struct stat buf; if (stat(fullpath.c_str(), &buf) != 0) { is_dir = false; } else { is_dir = !!(S_ISDIR(buf.st_mode)); } } else { is_dir = false; } *out_is_dir = is_dir; } return true; } bool wreaddir(DIR *dir, std::wstring &out_name) { struct dirent *d = readdir(dir); if (!d) return false; out_name = str2wcstring(d->d_name); return true; } wchar_t *wgetcwd(wchar_t *buff, size_t sz) { char *buffc = (char *)malloc(sz*MAX_UTF8_BYTES); char *res; wchar_t *ret = 0; if (!buffc) { errno = ENOMEM; return 0; } res = getcwd(buffc, sz*MAX_UTF8_BYTES); if (res) { if ((size_t)-1 != mbstowcs(buff, buffc, sizeof(wchar_t) * sz)) { ret = buff; } } free(buffc); return ret; } int wchdir(const wcstring &dir) { cstring tmp = wcs2string(dir); return chdir(tmp.c_str()); } FILE *wfopen(const wcstring &path, const char *mode) { int permissions = 0, options = 0; size_t idx = 0; switch (mode[idx++]) { case 'r': permissions = O_RDONLY; break; case 'w': permissions = O_WRONLY; options = O_CREAT | O_TRUNC; break; case 'a': permissions = O_WRONLY; options = O_CREAT | O_APPEND; break; default: errno = EINVAL; return NULL; break; } /* Skip binary */ if (mode[idx] == 'b') idx++; /* Consider append option */ if (mode[idx] == '+') permissions = O_RDWR; int fd = wopen_cloexec(path, permissions | options, 0666); if (fd < 0) return NULL; FILE *result = fdopen(fd, mode); if (result == NULL) close(fd); return result; } FILE *wfreopen(const wcstring &path, const char *mode, FILE *stream) { cstring tmp = wcs2string(path); return freopen(tmp.c_str(), mode, stream); } bool set_cloexec(int fd) { int flags = fcntl(fd, F_GETFD, 0); if (flags < 0) { return false; } else if (flags & FD_CLOEXEC) { return true; } else { return fcntl(fd, F_SETFD, flags | FD_CLOEXEC) >= 0; } } static int wopen_internal(const wcstring &pathname, int flags, mode_t mode, bool cloexec) { ASSERT_IS_NOT_FORKED_CHILD(); cstring tmp = wcs2string(pathname); /* Prefer to use O_CLOEXEC. It has to both be defined and nonzero */ #ifdef O_CLOEXEC if (cloexec && O_CLOEXEC) { flags |= O_CLOEXEC; cloexec = false; } #endif int fd = ::open(tmp.c_str(), flags, mode); if (cloexec && fd >= 0 && ! set_cloexec(fd)) { close(fd); fd = -1; } return fd; } int wopen(const wcstring &pathname, int flags, mode_t mode) { // off the main thread, always use wopen_cloexec ASSERT_IS_MAIN_THREAD(); ASSERT_IS_NOT_FORKED_CHILD(); return wopen_internal(pathname, flags, mode, false); } int wopen_cloexec(const wcstring &pathname, int flags, mode_t mode) { return wopen_internal(pathname, flags, mode, true); } int wcreat(const wcstring &pathname, mode_t mode) { cstring tmp = wcs2string(pathname); return creat(tmp.c_str(), mode); } DIR *wopendir(const wcstring &name) { cstring tmp = wcs2string(name); return opendir(tmp.c_str()); } int wstat(const wcstring &file_name, struct stat *buf) { cstring tmp = wcs2string(file_name); return stat(tmp.c_str(), buf); } int lwstat(const wcstring &file_name, struct stat *buf) { cstring tmp = wcs2string(file_name); return lstat(tmp.c_str(), buf); } int waccess(const wcstring &file_name, int mode) { cstring tmp = wcs2string(file_name); return access(tmp.c_str(), mode); } int wunlink(const wcstring &file_name) { cstring tmp = wcs2string(file_name); return unlink(tmp.c_str()); } void wperror(const wcstring &s) { int e = errno; if (!s.empty()) { fwprintf(stderr, L"%ls: ", s.c_str()); } fwprintf(stderr, L"%s\n", strerror(e)); } int make_fd_nonblocking(int fd) { int flags = fcntl(fd, F_GETFL, 0); int err = 0; if (!(flags & O_NONBLOCK)) { err = fcntl(fd, F_SETFL, flags | O_NONBLOCK); } return err == -1 ? errno : 0; } int make_fd_blocking(int fd) { int flags = fcntl(fd, F_GETFL, 0); int err = 0; if (flags & O_NONBLOCK) { err = fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); } return err == -1 ? errno : 0; } static inline void safe_append(char *buffer, const char *s, size_t buffsize) { strncat(buffer, s, buffsize - strlen(buffer) - 1); } const char *safe_strerror(int err) { if (err >= 0 && err < sys_nerr && sys_errlist[err] != NULL) { return sys_errlist[err]; } else { int saved_err = errno; /* Use a shared buffer for this case */ static char buff[384]; char errnum_buff[64]; format_long_safe(errnum_buff, err); buff[0] = '\0'; safe_append(buff, "unknown error (errno was ", sizeof buff); safe_append(buff, errnum_buff, sizeof buff); safe_append(buff, ")", sizeof buff); errno = saved_err; return buff; } } void safe_perror(const char *message) { // Note we cannot use strerror, because on Linux it uses gettext, which is not safe int err = errno; char buff[384]; buff[0] = '\0'; if (message) { safe_append(buff, message, sizeof buff); safe_append(buff, ": ", sizeof buff); } safe_append(buff, safe_strerror(err), sizeof buff); safe_append(buff, "\n", sizeof buff); write(STDERR_FILENO, buff, strlen(buff)); errno = err; } #ifdef HAVE_REALPATH_NULL wchar_t *wrealpath(const wcstring &pathname, wchar_t *resolved_path) { cstring narrow_path = wcs2string(pathname); char *narrow_res = realpath(narrow_path.c_str(), NULL); if (!narrow_res) return NULL; wchar_t *res; wcstring wide_res = str2wcstring(narrow_res); if (resolved_path) { wcslcpy(resolved_path, wide_res.c_str(), PATH_MAX); res = resolved_path; } else { res = wcsdup(wide_res.c_str()); } free(narrow_res); return res; } #else wchar_t *wrealpath(const wcstring &pathname, wchar_t *resolved_path) { cstring tmp = wcs2string(pathname); char narrow_buff[PATH_MAX]; char *narrow_res = realpath(tmp.c_str(), narrow_buff); wchar_t *res; if (!narrow_res) return 0; const wcstring wide_res = str2wcstring(narrow_res); if (resolved_path) { wcslcpy(resolved_path, wide_res.c_str(), PATH_MAX); res = resolved_path; } else { res = wcsdup(wide_res.c_str()); } return res; } #endif wcstring wdirname(const wcstring &path) { char *tmp = wcs2str(path.c_str()); char *narrow_res = dirname(tmp); wcstring result = format_string(L"%s", narrow_res); free(tmp); return result; } wcstring wbasename(const wcstring &path) { char *tmp = wcs2str(path.c_str()); char *narrow_res = basename(tmp); wcstring result = format_string(L"%s", narrow_res); free(tmp); return result; } /* Really init wgettext */ static void wgettext_really_init() { pthread_mutex_init(&wgettext_lock, NULL); fish_bindtextdomain(PACKAGE_NAME, LOCALEDIR); fish_textdomain(PACKAGE_NAME); } /** For wgettext: Internal init function. Automatically called when a translation is first requested. */ static void wgettext_init_if_necessary() { static pthread_once_t once = PTHREAD_ONCE_INIT; pthread_once(&once, wgettext_really_init); } const wchar_t *wgettext(const wchar_t *in) { if (!in) return in; // preserve errno across this since this is often used in printing error messages int err = errno; wgettext_init_if_necessary(); wcstring key = in; scoped_lock lock(wgettext_lock); wcstring *& val = wgettext_map[key]; if (val == NULL) { cstring mbs_in = wcs2string(key); char *out = fish_gettext(mbs_in.c_str()); val = new wcstring(format_string(L"%s", out)); } errno = err; return val->c_str(); } const wchar_t *wgetenv(const wcstring &name) { ASSERT_IS_MAIN_THREAD(); cstring name_narrow = wcs2string(name); char *res_narrow = getenv(name_narrow.c_str()); static wcstring out; if (!res_narrow) return 0; out = format_string(L"%s", res_narrow); return out.c_str(); } int wmkdir(const wcstring &name, int mode) { cstring name_narrow = wcs2string(name); return mkdir(name_narrow.c_str(), mode); } int wrename(const wcstring &old, const wcstring &newv) { cstring old_narrow = wcs2string(old); cstring new_narrow =wcs2string(newv); return rename(old_narrow.c_str(), new_narrow.c_str()); } int fish_wcstoi(const wchar_t *str, wchar_t ** endptr, int base) { long ret = wcstol(str, endptr, base); if (ret > INT_MAX) { ret = INT_MAX; errno = ERANGE; } else if (ret < INT_MIN) { ret = INT_MIN; errno = ERANGE; } return (int)ret; } fish/wutil.h000066400000000000000000000101031214535744100133250ustar00rootroot00000000000000/** \file wutil.h Prototypes for wide character equivalents of various standard unix functions. */ #ifndef FISH_WUTIL_H #define FISH_WUTIL_H #include #include #include #include #include #include #include #include #include #include #include "common.h" /** Call this function on startup to create internal wutil resources. This function doesn't do anything. */ void wutil_init(); /** Call this function on exit to free internal wutil resources */ void wutil_destroy(); /** Wide character version of fopen(). This sets CLO_EXEC. */ FILE *wfopen(const wcstring &path, const char *mode); /** Sets CLO_EXEC on a given fd */ bool set_cloexec(int fd); /** Wide character version of freopen(). */ FILE *wfreopen(const wcstring &path, const char *mode, FILE *stream); /** Wide character version of open(). */ int wopen(const wcstring &pathname, int flags, mode_t mode = 0); /** Wide character version of open() that also sets the close-on-exec flag (atomically when possible). */ int wopen_cloexec(const wcstring &pathname, int flags, mode_t mode = 0); /** Mark an fd as nonblocking; returns errno or 0 on success */ int make_fd_nonblocking(int fd); /** Mark an fd as blocking; returns errno or 0 on success */ int make_fd_blocking(int fd); /** Wide character version of creat(). */ int wcreat(const wcstring &pathname, mode_t mode); /** Wide character version of opendir(). Note that opendir() is guaranteed to set close-on-exec by POSIX (hooray). */ DIR *wopendir(const wcstring &name); /** Wide character version of stat(). */ int wstat(const wcstring &file_name, struct stat *buf); /** Wide character version of lstat(). */ int lwstat(const wcstring &file_name, struct stat *buf); /** Wide character version of access(). */ int waccess(const wcstring &pathname, int mode); /** Wide character version of unlink(). */ int wunlink(const wcstring &pathname); /** Wide character version of perror(). */ void wperror(const wcstring &s); /** Async-safe version of perror(). */ void safe_perror(const char *message); /** Async-safe version of strerror(). */ const char *safe_strerror(int err); /** Wide character version of getcwd(). */ wchar_t *wgetcwd(wchar_t *buff, size_t sz); /** Wide character version of chdir() */ int wchdir(const wcstring &dir); /** Wide character version of realpath function. Just like the GNU version of realpath, wrealpath will accept 0 as the value for the second argument, in which case the result will be allocated using malloc, and must be free'd by the user. */ wchar_t *wrealpath(const wcstring &pathname, wchar_t *resolved_path); /** Wide character version of readdir() */ bool wreaddir(DIR *dir, std::wstring &out_name); bool wreaddir_resolving(DIR *dir, const std::wstring &dir_path, std::wstring &out_name, bool *out_is_dir); /** Wide character version of dirname() */ std::wstring wdirname(const std::wstring &path); /** Wide character version of basename() */ std::wstring wbasename(const std::wstring &path); /** Wide character wrapper around the gettext function. For historic reasons, unlike the real gettext function, wgettext takes care of setting the correct domain, etc. using the textdomain and bindtextdomain functions. This should probably be moved out of wgettext, so that wgettext will be nothing more than a wrapper around gettext, like all other functions in this file. */ const wchar_t *wgettext(const wchar_t *in); /** Wide character version of getenv */ const wchar_t *wgetenv(const wcstring &name); /** Wide character version of mkdir */ int wmkdir(const wcstring &dir, int mode); /** Wide character version of rename */ int wrename(const wcstring &oldName, const wcstring &newName); /** Like wcstol(), but fails on a value outside the range of an int */ int fish_wcstoi(const wchar_t *str, wchar_t ** endptr, int base); /** Class for representing a file's inode. We use this to detect and avoid symlink loops, among other things. */ typedef std::pair file_id_t; #endif fish/xdgmime.cpp000066400000000000000000000413121214535744100141540ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmime.c: XDG Mime Spec mime resolver. Based on version 0.11 of the spec. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003,2004 Red Hat, Inc. * Copyright (C) 2003,2004 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "xdgmime.h" #include "xdgmimeint.h" #include "xdgmimeglob.h" #include "xdgmimemagic.h" #include "xdgmimealias.h" #include "xdgmimeparent.h" #include #include #include #include #include #include #include typedef struct XdgDirTimeList XdgDirTimeList; typedef struct XdgCallbackList XdgCallbackList; static int need_reread = TRUE; static time_t last_stat_time = 0; static XdgGlobHash *global_hash = NULL; static XdgMimeMagic *global_magic = NULL; static XdgAliasList *alias_list = NULL; static XdgParentList *parent_list = NULL; static XdgDirTimeList *dir_time_list = NULL; static XdgCallbackList *callback_list = NULL; const char *xdg_mime_type_unknown = "application/octet-stream"; enum { XDG_CHECKED_UNCHECKED, XDG_CHECKED_VALID, XDG_CHECKED_INVALID }; struct XdgDirTimeList { time_t mtime; char *directory_name; int checked; XdgDirTimeList *next; }; struct XdgCallbackList { XdgCallbackList *next; XdgCallbackList *prev; int callback_id; XdgMimeCallback callback; void *data; XdgMimeDestroy destroy; }; /* Function called by xdg_run_command_on_dirs. If it returns TRUE, further * directories aren't looked at */ typedef int (*XdgDirectoryFunc)(const char *directory, void *user_data); static XdgDirTimeList * xdg_dir_time_list_new(void) { XdgDirTimeList *retval; retval = (XdgDirTimeList *)calloc(1, sizeof(XdgDirTimeList)); retval->checked = XDG_CHECKED_UNCHECKED; return retval; } static void xdg_dir_time_list_free(XdgDirTimeList *list) { XdgDirTimeList *next; while (list) { next = list->next; free(list->directory_name); free(list); list = next; } } static int xdg_mime_init_from_directory(const char *directory) { char *file_name; struct stat st; XdgDirTimeList *list; assert(directory != NULL); file_name = (char *)malloc(strlen(directory) + strlen("/mime/globs") + 1); strcpy(file_name, directory); strcat(file_name, "/mime/globs"); if (stat(file_name, &st) == 0) { _xdg_mime_glob_read_from_file(global_hash, file_name); list = xdg_dir_time_list_new(); list->directory_name = file_name; list->mtime = st.st_mtime; list->next = dir_time_list; dir_time_list = list; } else { free(file_name); } file_name = (char *)malloc(strlen(directory) + strlen("/mime/magic") + 1); strcpy(file_name, directory); strcat(file_name, "/mime/magic"); if (stat(file_name, &st) == 0) { _xdg_mime_magic_read_from_file(global_magic, file_name); list = xdg_dir_time_list_new(); list->directory_name = file_name; list->mtime = st.st_mtime; list->next = dir_time_list; dir_time_list = list; } else { free(file_name); } file_name = (char *)malloc(strlen(directory) + strlen("/mime/aliases") + 1); strcpy(file_name, directory); strcat(file_name, "/mime/aliases"); _xdg_mime_alias_read_from_file(alias_list, file_name); free(file_name); file_name = (char *)malloc(strlen(directory) + strlen("/mime/subclasses") + 1); strcpy(file_name, directory); strcat(file_name, "/mime/subclasses"); _xdg_mime_parent_read_from_file(parent_list, file_name); free(file_name); return FALSE; /* Keep processing */ } /* Runs a command on all the directories in the search path */ static void xdg_run_command_on_dirs(XdgDirectoryFunc func, void *user_data) { const char *xdg_data_home; const char *xdg_data_dirs; const char *ptr; xdg_data_home = getenv("XDG_DATA_HOME"); if (xdg_data_home) { if ((func)(xdg_data_home, user_data)) return; } else { const char *home; home = getenv("HOME"); if (home != NULL) { char *guessed_xdg_home; int stop_processing; guessed_xdg_home = (char *)malloc(strlen(home) + strlen("/.local/share/") + 1); strcpy(guessed_xdg_home, home); strcat(guessed_xdg_home, "/.local/share/"); stop_processing = (func)(guessed_xdg_home, user_data); free(guessed_xdg_home); if (stop_processing) return; } } xdg_data_dirs = getenv("XDG_DATA_DIRS"); if (xdg_data_dirs == NULL) xdg_data_dirs = "/usr/local/share/:/usr/share/"; ptr = xdg_data_dirs; while (*ptr != '\000') { const char *end_ptr; char *dir; int len; int stop_processing; end_ptr = ptr; while (*end_ptr != ':' && *end_ptr != '\000') end_ptr ++; if (end_ptr == ptr) { ptr++; continue; } if (*end_ptr == ':') len = end_ptr - ptr; else len = end_ptr - ptr + 1; dir = (char *)malloc(len + 1); strncpy(dir, ptr, len); dir[len] = '\0'; stop_processing = (func)(dir, user_data); free(dir); if (stop_processing) return; ptr = end_ptr; } } /* Checks file_path to make sure it has the same mtime as last time it was * checked. If it has a different mtime, or if the file doesn't exist, it * returns FALSE. * * FIXME: This doesn't protect against permission changes. */ static int xdg_check_file(const char *file_path) { struct stat st; /* If the file exists */ if (stat(file_path, &st) == 0) { XdgDirTimeList *list; for (list = dir_time_list; list; list = list->next) { if (! strcmp(list->directory_name, file_path) && st.st_mtime == list->mtime) { if (list->checked == XDG_CHECKED_UNCHECKED) list->checked = XDG_CHECKED_VALID; else if (list->checked == XDG_CHECKED_VALID) list->checked = XDG_CHECKED_INVALID; return (list->checked != XDG_CHECKED_VALID); } } return TRUE; } return FALSE; } static int xdg_check_dir(const char *directory, int *invalid_dir_list) { int invalid; char *file_name; assert(directory != NULL); /* Check the globs file */ file_name = (char *)malloc(strlen(directory) + strlen("/mime/globs") + 1); strcpy(file_name, directory); strcat(file_name, "/mime/globs"); invalid = xdg_check_file(file_name); free(file_name); if (invalid) { *invalid_dir_list = TRUE; return TRUE; } /* Check the magic file */ file_name = (char *)malloc(strlen(directory) + strlen("/mime/magic") + 1); strcpy(file_name, directory); strcat(file_name, "/mime/magic"); invalid = xdg_check_file(file_name); free(file_name); if (invalid) { *invalid_dir_list = TRUE; return TRUE; } return FALSE; /* Keep processing */ } /* Walks through all the mime files stat()ing them to see if they've changed. * Returns TRUE if they have. */ static int xdg_check_dirs(void) { XdgDirTimeList *list; int invalid_dir_list = FALSE; for (list = dir_time_list; list; list = list->next) list->checked = XDG_CHECKED_UNCHECKED; xdg_run_command_on_dirs((XdgDirectoryFunc) xdg_check_dir, &invalid_dir_list); if (invalid_dir_list) return TRUE; for (list = dir_time_list; list; list = list->next) { if (list->checked != XDG_CHECKED_VALID) return TRUE; } return FALSE; } /* We want to avoid stat()ing on every single mime call, so we only look for * newer files every 5 seconds. This will return TRUE if we need to reread the * mime data from disk. */ static int xdg_check_time_and_dirs(void) { struct timeval tv; time_t current_time; int retval = FALSE; gettimeofday(&tv, NULL); current_time = tv.tv_sec; if (current_time >= last_stat_time + 5) { retval = xdg_check_dirs(); last_stat_time = current_time; } return retval; } /* Called in every public function. It reloads the hash function if need be. */ static void xdg_mime_init(void) { if (xdg_check_time_and_dirs()) { xdg_mime_shutdown(); } if (need_reread) { global_hash = _xdg_glob_hash_new(); global_magic = _xdg_mime_magic_new(); alias_list = _xdg_mime_alias_list_new(); parent_list = _xdg_mime_parent_list_new(); xdg_run_command_on_dirs((XdgDirectoryFunc) xdg_mime_init_from_directory, NULL); need_reread = FALSE; } } const char * xdg_mime_get_mime_type_for_data(const void *data, size_t len) { const char *mime_type; xdg_mime_init(); mime_type = _xdg_mime_magic_lookup_data(global_magic, data, len); if (mime_type) return mime_type; return XDG_MIME_TYPE_UNKNOWN; } const char * xdg_mime_get_mime_type_for_file(const char *file_name) { const char *mime_type; FILE *file; unsigned char *data; int max_extent; int bytes_read; struct stat statbuf; const char *base_name; if (file_name == NULL) return NULL; if (! _xdg_utf8_validate(file_name)) return NULL; xdg_mime_init(); base_name = _xdg_get_base_name(file_name); mime_type = xdg_mime_get_mime_type_from_file_name(base_name); if (mime_type != XDG_MIME_TYPE_UNKNOWN) return mime_type; if (stat(file_name, &statbuf) != 0) return XDG_MIME_TYPE_UNKNOWN; if (!S_ISREG(statbuf.st_mode)) return XDG_MIME_TYPE_UNKNOWN; /* FIXME: Need to make sure that max_extent isn't totally broken. This could * be large and need getting from a stream instead of just reading it all * in. */ max_extent = _xdg_mime_magic_get_buffer_extents(global_magic); data = (unsigned char *)malloc(max_extent); if (data == NULL) return XDG_MIME_TYPE_UNKNOWN; /* OK to not use CLO_EXEC here because mimedb is single threaded */ file = fopen(file_name, "r"); if (file == NULL) { free(data); return XDG_MIME_TYPE_UNKNOWN; } bytes_read = fread(data, 1, max_extent, file); if (ferror(file)) { free(data); fclose(file); return XDG_MIME_TYPE_UNKNOWN; } mime_type = _xdg_mime_magic_lookup_data(global_magic, data, bytes_read); free(data); fclose(file); if (mime_type) return mime_type; return XDG_MIME_TYPE_UNKNOWN; } const char * xdg_mime_get_mime_type_from_file_name(const char *file_name) { const char *mime_type; xdg_mime_init(); mime_type = _xdg_glob_hash_lookup_file_name(global_hash, file_name); if (mime_type) return mime_type; else return XDG_MIME_TYPE_UNKNOWN; } int xdg_mime_is_valid_mime_type(const char *mime_type) { /* FIXME: We should make this a better test */ return _xdg_utf8_validate(mime_type); } void xdg_mime_shutdown(void) { XdgCallbackList *list; /* FIXME: Need to make this (and the whole library) thread safe */ if (dir_time_list) { xdg_dir_time_list_free(dir_time_list); dir_time_list = NULL; } if (global_hash) { _xdg_glob_hash_free(global_hash); global_hash = NULL; } if (global_magic) { _xdg_mime_magic_free(global_magic); global_magic = NULL; } if (alias_list) { _xdg_mime_alias_list_free(alias_list); alias_list = NULL; } if (parent_list) { _xdg_mime_parent_list_free(parent_list); } for (list = callback_list; list; list = list->next) (list->callback)(list->data); need_reread = TRUE; } int xdg_mime_get_max_buffer_extents(void) { xdg_mime_init(); return _xdg_mime_magic_get_buffer_extents(global_magic); } const char * xdg_mime_unalias_mime_type(const char *mime_type) { const char *lookup; xdg_mime_init(); if ((lookup = _xdg_mime_alias_list_lookup(alias_list, mime_type)) != NULL) return lookup; return mime_type; } int xdg_mime_mime_type_equal(const char *mime_a, const char *mime_b) { const char *unalias_a, *unalias_b; xdg_mime_init(); unalias_a = xdg_mime_unalias_mime_type(mime_a); unalias_b = xdg_mime_unalias_mime_type(mime_b); if (strcmp(unalias_a, unalias_b) == 0) return 1; return 0; } int xdg_mime_media_type_equal(const char *mime_a, const char *mime_b) { char *sep; xdg_mime_init(); sep = const_cast(strchr(mime_a, '/')); if (sep && strncmp(mime_a, mime_b, sep - mime_a + 1) == 0) return 1; return 0; } #if 0 static int xdg_mime_is_super_type(const char *mime) { int length; const char *type; length = strlen(mime); type = &(mime[length - 2]); if (strcmp(type, "/*") == 0) return 1; return 0; } #endif int xdg_mime_mime_type_subclass(const char *mime, const char *base) { const char *umime, *ubase; const char **parents; xdg_mime_init(); umime = xdg_mime_unalias_mime_type(mime); ubase = xdg_mime_unalias_mime_type(base); if (strcmp(umime, ubase) == 0) return 1; #if 0 /* Handle supertypes */ if (xdg_mime_is_super_type(ubase) && xdg_mime_media_type_equal(umime, ubase)) return 1; #endif /* Handle special cases text/plain and application/octet-stream */ if (strcmp(ubase, "text/plain") == 0 && strncmp(umime, "text/", 5) == 0) return 1; if (strcmp(ubase, "application/octet-stream") == 0) return 1; parents = _xdg_mime_parent_list_lookup(parent_list, umime); for (; parents && *parents; parents++) { if (xdg_mime_mime_type_subclass(*parents, ubase)) return 1; } return 0; } const char ** xdg_mime_get_mime_parents(const char *mime) { const char *umime; xdg_mime_init(); umime = xdg_mime_unalias_mime_type(mime); return _xdg_mime_parent_list_lookup(parent_list, umime); } void xdg_mime_dump(void) { printf("*** ALIASES ***\n\n"); _xdg_mime_alias_list_dump(alias_list); printf("\n*** PARENTS ***\n\n"); _xdg_mime_parent_list_dump(parent_list); } /* Registers a function to be called every time the mime database reloads its files */ int xdg_mime_register_reload_callback(XdgMimeCallback callback, void *data, XdgMimeDestroy destroy) { XdgCallbackList *list_el; static int callback_id = 1; /* Make a new list element */ list_el = (XdgCallbackList *)calloc(1, sizeof(XdgCallbackList)); list_el->callback_id = callback_id; list_el->callback = callback; list_el->data = data; list_el->destroy = destroy; list_el->next = callback_list; if (list_el->next) list_el->next->prev = list_el; callback_list = list_el; callback_id ++; return callback_id - 1; } void xdg_mime_remove_callback(int callback_id) { XdgCallbackList *list; for (list = callback_list; list; list = list->next) { if (list->callback_id == callback_id) { if (list->next) list->next = list->prev; if (list->prev) list->prev->next = list->next; else callback_list = list->next; /* invoke the destroy handler */ (list->destroy)(list->data); free(list); return; } } } fish/xdgmime.h000066400000000000000000000076061214535744100136310ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmime.h: XDG Mime Spec mime resolver. Based on version 0.11 of the spec. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003 Red Hat, Inc. * Copyright (C) 2003 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __XDG_MIME_H__ #define __XDG_MIME_H__ #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifdef XDG_PREFIX #define XDG_ENTRY(func) _XDG_ENTRY2(XDG_PREFIX,func) #define _XDG_ENTRY2(prefix,func) _XDG_ENTRY3(prefix,func) #define _XDG_ENTRY3(prefix,func) prefix##_##func #endif typedef void (*XdgMimeCallback)(void *user_data); typedef void (*XdgMimeDestroy)(void *user_data); #ifdef XDG_PREFIX #define xdg_mime_get_mime_type_for_data XDG_ENTRY(get_mime_type_for_data) #define xdg_mime_get_mime_type_for_file XDG_ENTRY(get_mime_type_for_file) #define xdg_mime_get_mime_type_from_file_name XDG_ENTRY(get_mime_type_from_file_name) #define xdg_mime_is_valid_mime_type XDG_ENTRY(is_valid_mime_type) #define xdg_mime_mime_type_equal XDG_ENTRY(mime_type_equal) #define xdg_mime_media_type_equal XDG_ENTRY(media_type_equal) #define xdg_mime_mime_type_subclass XDG_ENTRY(mime_type_subclass) #define xdg_mime_get_mime_parents XDG_ENTRY(get_mime_parents) #define xdg_mime_unalias_mime_type XDG_ENTRY(unalias_mime_type) #define xdg_mime_get_max_buffer_extents XDG_ENTRY(get_max_buffer_extents) #define xdg_mime_shutdown XDG_ENTRY(shutdown) #define xdg_mime_register_reload_callback XDG_ENTRY(register_reload_callback) #define xdg_mime_remove_callback XDG_ENTRY(remove_callback) #define xdg_mime_type_unknown XDG_ENTRY(type_unknown) #endif extern const char *xdg_mime_type_unknown; #define XDG_MIME_TYPE_UNKNOWN xdg_mime_type_unknown const char *xdg_mime_get_mime_type_for_data(const void *data, size_t len); const char *xdg_mime_get_mime_type_for_file(const char *file_name); const char *xdg_mime_get_mime_type_from_file_name(const char *file_name); int xdg_mime_is_valid_mime_type(const char *mime_type); int xdg_mime_mime_type_equal(const char *mime_a, const char *mime_b); int xdg_mime_media_type_equal(const char *mime_a, const char *mime_b); int xdg_mime_mime_type_subclass(const char *mime_a, const char *mime_b); const char **xdg_mime_get_mime_parents(const char *mime); const char *xdg_mime_unalias_mime_type(const char *mime); int xdg_mime_get_max_buffer_extents(void); void xdg_mime_shutdown(void); void xdg_mime_dump(void); int xdg_mime_register_reload_callback(XdgMimeCallback callback, void *data, XdgMimeDestroy destroy); void xdg_mime_remove_callback(int callback_id); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __XDG_MIME_H__ */ fish/xdgmimealias.cpp000066400000000000000000000105311214535744100151650ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimealias.c: Private file. Datastructure for storing the aliases. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2004 Red Hat, Inc. * Copyright (C) 2004 Matthias Clasen * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "xdgmimealias.h" #include "xdgmimeint.h" #include #include #include #include #include #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif typedef struct XdgAlias XdgAlias; struct XdgAlias { char *alias; char *mime_type; }; struct XdgAliasList { struct XdgAlias *aliases; int n_aliases; }; XdgAliasList * _xdg_mime_alias_list_new(void) { XdgAliasList *list; list = (XdgAliasList *)malloc(sizeof(XdgAliasList)); list->aliases = NULL; list->n_aliases = 0; return list; } void _xdg_mime_alias_list_free(XdgAliasList *list) { int i; if (list->aliases) { for (i = 0; i < list->n_aliases; i++) { free(list->aliases[i].alias); free(list->aliases[i].mime_type); } free(list->aliases); } free(list); } static int alias_entry_cmp(const void *v1, const void *v2) { return strcmp(((XdgAlias *)v1)->alias, ((XdgAlias *)v2)->alias); } const char * _xdg_mime_alias_list_lookup(XdgAliasList *list, const char *alias) { XdgAlias *entry; XdgAlias key; if (list->n_aliases > 0) { key.alias = (char *)alias; key.mime_type = 0; entry = (XdgAlias *)bsearch(&key, list->aliases, list->n_aliases, sizeof(XdgAlias), alias_entry_cmp); if (entry) return entry->mime_type; } return NULL; } void _xdg_mime_alias_read_from_file(XdgAliasList *list, const char *file_name) { FILE *file; char line[255]; int alloc; /* OK to not use CLO_EXEC here because mimedb is single threaded */ file = fopen(file_name, "r"); if (file == NULL) return; /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. * Blah */ alloc = list->n_aliases + 16; list->aliases = (XdgAlias *)realloc(list->aliases, alloc * sizeof(XdgAlias)); while (fgets(line, 255, file) != NULL) { char *sep; if (line[0] == '#') continue; sep = strchr(line, ' '); if (sep == NULL) continue; *(sep++) = '\000'; sep[strlen(sep) -1] = '\000'; if (list->n_aliases == alloc) { alloc <<= 1; list->aliases = (XdgAlias *)realloc(list->aliases, alloc * sizeof(XdgAlias)); } list->aliases[list->n_aliases].alias = strdup(line); list->aliases[list->n_aliases].mime_type = strdup(sep); list->n_aliases++; } list->aliases = (XdgAlias *)realloc(list->aliases, list->n_aliases * sizeof(XdgAlias)); fclose(file); if (list->n_aliases > 1) qsort(list->aliases, list->n_aliases, sizeof(XdgAlias), alias_entry_cmp); } void _xdg_mime_alias_list_dump(XdgAliasList *list) { int i; if (list->aliases) { for (i = 0; i < list->n_aliases; i++) { printf("%s %s\n", list->aliases[i].alias, list->aliases[i].mime_type); } } } fish/xdgmimealias.h000066400000000000000000000036551214535744100146430ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimealias.h: Private file. Datastructure for storing the aliases. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2004 Red Hat, Inc. * Copyright (C) 200 Matthias Clasen * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __XDG_MIME_ALIAS_H__ #define __XDG_MIME_ALIAS_H__ #include "xdgmime.h" typedef struct XdgAliasList XdgAliasList; #ifdef XDG_PREFIX #define _xdg_mime_alias_read_from_file XDG_ENTRY(alias_read_from_file) #define _xdg_mime_alias_list_new XDG_ENTRY(alias_list_new) #define _xdg_mime_alias_list_free XDG_ENTRY(alias_list_free) #define _xdg_mime_alias_list_lookup XDG_ENTRY(alias_list_lookup) #endif void _xdg_mime_alias_read_from_file(XdgAliasList *list, const char *file_name); XdgAliasList *_xdg_mime_alias_list_new(void); void _xdg_mime_alias_list_free(XdgAliasList *list); const char *_xdg_mime_alias_list_lookup(XdgAliasList *list, const char *alias); void _xdg_mime_alias_list_dump(XdgAliasList *list); #endif /* __XDG_MIME_ALIAS_H__ */ fish/xdgmimeglob.cpp000066400000000000000000000267211214535744100150270ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimeglob.c: Private file. Datastructure for storing the globs. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003 Red Hat, Inc. * Copyright (C) 2003 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "xdgmimeglob.h" #include "xdgmimeint.h" #include #include #include #include #include #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif typedef struct XdgGlobHashNode XdgGlobHashNode; typedef struct XdgGlobList XdgGlobList; struct XdgGlobHashNode { xdg_unichar_t character; const char *mime_type; XdgGlobHashNode *next; XdgGlobHashNode *child; }; struct XdgGlobList { const char *data; const char *mime_type; XdgGlobList *next; }; struct XdgGlobHash { XdgGlobList *literal_list; XdgGlobHashNode *simple_node; XdgGlobList *full_list; }; /* XdgGlobList */ static XdgGlobList * _xdg_glob_list_new(void) { XdgGlobList *new_element; new_element = (XdgGlobList *)calloc(1, sizeof(XdgGlobList)); return new_element; } /* Frees glob_list and all of it's children */ static void _xdg_glob_list_free(XdgGlobList *glob_list) { XdgGlobList *ptr, *next; ptr = glob_list; while (ptr != NULL) { next = ptr->next; if (ptr->data) free((void *) ptr->data); if (ptr->mime_type) free((void *) ptr->mime_type); free(ptr); ptr = next; } } static XdgGlobList * _xdg_glob_list_append(XdgGlobList *glob_list, void *data, const char *mime_type) { XdgGlobList *new_element; XdgGlobList *tmp_element; new_element = _xdg_glob_list_new(); new_element->data = (const char *)data; new_element->mime_type = mime_type; if (glob_list == NULL) return new_element; tmp_element = glob_list; while (tmp_element->next != NULL) tmp_element = tmp_element->next; tmp_element->next = new_element; return glob_list; } #if 0 static XdgGlobList * _xdg_glob_list_prepend(XdgGlobList *glob_list, void *data, const char *mime_type) { XdgGlobList *new_element; new_element = _xdg_glob_list_new(); new_element->data = data; new_element->next = glob_list; new_element->mime_type = mime_type; return new_element; } #endif /* XdgGlobHashNode */ static XdgGlobHashNode * _xdg_glob_hash_node_new(void) { XdgGlobHashNode *glob_hash_node; glob_hash_node = (XdgGlobHashNode *)calloc(1, sizeof(XdgGlobHashNode)); return glob_hash_node; } static void _xdg_glob_hash_node_dump(XdgGlobHashNode *glob_hash_node, int depth) { int i; for (i = 0; i < depth; i++) printf(" "); printf("%c", (char)glob_hash_node->character); if (glob_hash_node->mime_type) printf(" - %s\n", glob_hash_node->mime_type); else printf("\n"); if (glob_hash_node->child) _xdg_glob_hash_node_dump(glob_hash_node->child, depth + 1); if (glob_hash_node->next) _xdg_glob_hash_node_dump(glob_hash_node->next, depth); } static XdgGlobHashNode * _xdg_glob_hash_insert_text(XdgGlobHashNode *glob_hash_node, const char *text, const char *mime_type) { XdgGlobHashNode *node; xdg_unichar_t character; character = _xdg_utf8_to_ucs4(text); if ((glob_hash_node == NULL) || (character < glob_hash_node->character)) { node = _xdg_glob_hash_node_new(); node->character = character; node->next = glob_hash_node; glob_hash_node = node; } else if (character == glob_hash_node->character) { node = glob_hash_node; } else { XdgGlobHashNode *prev_node; int found_node = FALSE; /* Look for the first character of text in glob_hash_node, and insert it if we * have to.*/ prev_node = glob_hash_node; node = prev_node->next; while (node != NULL) { if (character < node->character) { node = _xdg_glob_hash_node_new(); node->character = character; node->next = prev_node->next; prev_node->next = node; found_node = TRUE; break; } else if (character == node->character) { found_node = TRUE; break; } prev_node = node; node = node->next; } if (! found_node) { node = _xdg_glob_hash_node_new(); node->character = character; node->next = prev_node->next; prev_node->next = node; } } text = _xdg_utf8_next_char(text); if (*text == '\000') { node->mime_type = mime_type; } else { node->child = _xdg_glob_hash_insert_text(node->child, text, mime_type); } return glob_hash_node; } static const char * _xdg_glob_hash_node_lookup_file_name(XdgGlobHashNode *glob_hash_node, const char *file_name, int ignore_case) { XdgGlobHashNode *node; xdg_unichar_t character; if (glob_hash_node == NULL) return NULL; character = _xdg_utf8_to_ucs4(file_name); if (ignore_case) character = _xdg_ucs4_to_lower(character); for (node = glob_hash_node; node && character >= node->character; node = node->next) { if (character == node->character) { file_name = _xdg_utf8_next_char(file_name); if (*file_name == '\000') return node->mime_type; else return _xdg_glob_hash_node_lookup_file_name(node->child, file_name, ignore_case); } } return NULL; } const char * _xdg_glob_hash_lookup_file_name(XdgGlobHash *glob_hash, const char *file_name) { XdgGlobList *list; const char *mime_type; const char *ptr; /* First, check the literals */ assert(file_name != NULL); for (list = glob_hash->literal_list; list; list = list->next) if (strcmp((const char *)list->data, file_name) == 0) return list->mime_type; ptr = strchr(file_name, '.'); while (ptr != NULL) { mime_type = (_xdg_glob_hash_node_lookup_file_name(glob_hash->simple_node, ptr, FALSE)); if (mime_type != NULL) return mime_type; mime_type = (_xdg_glob_hash_node_lookup_file_name(glob_hash->simple_node, ptr, TRUE)); if (mime_type != NULL) return mime_type; ptr = strchr(ptr+1, '.'); } /* FIXME: Not UTF-8 safe */ for (list = glob_hash->full_list; list; list = list->next) if (fnmatch((const char *)list->data, file_name, 0) == 0) return list->mime_type; return NULL; } /* XdgGlobHash */ XdgGlobHash * _xdg_glob_hash_new(void) { XdgGlobHash *glob_hash; glob_hash = (XdgGlobHash *)calloc(1, sizeof(XdgGlobHash)); return glob_hash; } static void _xdg_glob_hash_free_nodes(XdgGlobHashNode *node) { if (node) { if (node->child) _xdg_glob_hash_free_nodes(node->child); if (node->next) _xdg_glob_hash_free_nodes(node->next); if (node->mime_type) free((void *) node->mime_type); free(node); } } void _xdg_glob_hash_free(XdgGlobHash *glob_hash) { _xdg_glob_list_free(glob_hash->literal_list); _xdg_glob_list_free(glob_hash->full_list); _xdg_glob_hash_free_nodes(glob_hash->simple_node); free(glob_hash); } XdgGlobType _xdg_glob_determine_type(const char *glob) { const char *ptr; int maybe_in_simple_glob = FALSE; int first_char = TRUE; ptr = glob; while (*ptr != '\000') { if (*ptr == '*' && first_char) maybe_in_simple_glob = TRUE; else if (*ptr == '\\' || *ptr == '[' || *ptr == '?' || *ptr == '*') return XDG_GLOB_FULL; first_char = FALSE; ptr = _xdg_utf8_next_char(ptr); } if (maybe_in_simple_glob) return XDG_GLOB_SIMPLE; else return XDG_GLOB_LITERAL; } /* glob must be valid UTF-8 */ void _xdg_glob_hash_append_glob(XdgGlobHash *glob_hash, const char *glob, const char *mime_type) { XdgGlobType type; assert(glob_hash != NULL); assert(glob != NULL); type = _xdg_glob_determine_type(glob); switch (type) { case XDG_GLOB_LITERAL: glob_hash->literal_list = _xdg_glob_list_append(glob_hash->literal_list, strdup(glob), strdup(mime_type)); break; case XDG_GLOB_SIMPLE: glob_hash->simple_node = _xdg_glob_hash_insert_text(glob_hash->simple_node, glob + 1, strdup(mime_type)); break; case XDG_GLOB_FULL: glob_hash->full_list = _xdg_glob_list_append(glob_hash->full_list, strdup(glob), strdup(mime_type)); break; } } void _xdg_glob_hash_dump(XdgGlobHash *glob_hash) { XdgGlobList *list; printf("LITERAL STRINGS\n"); if (glob_hash->literal_list == NULL) { printf(" None\n"); } else { for (list = glob_hash->literal_list; list; list = list->next) printf(" %s - %s\n", (char *)list->data, list->mime_type); } printf("\nSIMPLE GLOBS\n"); _xdg_glob_hash_node_dump(glob_hash->simple_node, 4); printf("\nFULL GLOBS\n"); if (glob_hash->full_list == NULL) { printf(" None\n"); } else { for (list = glob_hash->full_list; list; list = list->next) printf(" %s - %s\n", (char *)list->data, list->mime_type); } } void _xdg_mime_glob_read_from_file(XdgGlobHash *glob_hash, const char *file_name) { FILE *glob_file; char line[255]; /* OK to not use CLO_EXEC here because mimedb is single threaded */ glob_file = fopen(file_name, "r"); if (glob_file == NULL) return; /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. * Blah */ while (fgets(line, 255, glob_file) != NULL) { char *colon; if (line[0] == '#') continue; colon = strchr(line, ':'); if (colon == NULL) continue; *(colon++) = '\000'; colon[strlen(colon) -1] = '\000'; _xdg_glob_hash_append_glob(glob_hash, colon, line); } fclose(glob_file); } fish/xdgmimeglob.h000066400000000000000000000047561214535744100145000ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimeglob.h: Private file. Datastructure for storing the globs. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003 Red Hat, Inc. * Copyright (C) 2003 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __XDG_MIME_GLOB_H__ #define __XDG_MIME_GLOB_H__ #include "xdgmime.h" typedef struct XdgGlobHash XdgGlobHash; typedef enum { XDG_GLOB_LITERAL, /* Makefile */ XDG_GLOB_SIMPLE, /* *.gif */ XDG_GLOB_FULL /* x*.[ch] */ } XdgGlobType; #ifdef XDG_PREFIX #define _xdg_mime_glob_read_from_file XDG_ENTRY(glob_read_from_file) #define _xdg_glob_hash_new XDG_ENTRY(hash_new) #define _xdg_glob_hash_free XDG_ENTRY(hash_free) #define _xdg_glob_hash_lookup_file_name XDG_ENTRY(hash_lookup_file_name) #define _xdg_glob_hash_append_glob XDG_ENTRY(hash_append_glob) #define _xdg_glob_determine_type XDG_ENTRY(determine_type) #define _xdg_glob_hash_dump XDG_ENTRY(hash_dump) #endif void _xdg_mime_glob_read_from_file(XdgGlobHash *glob_hash, const char *file_name); XdgGlobHash *_xdg_glob_hash_new(void); void _xdg_glob_hash_free(XdgGlobHash *glob_hash); const char *_xdg_glob_hash_lookup_file_name(XdgGlobHash *glob_hash, const char *text); void _xdg_glob_hash_append_glob(XdgGlobHash *glob_hash, const char *glob, const char *mime_type); XdgGlobType _xdg_glob_determine_type(const char *glob); void _xdg_glob_hash_dump(XdgGlobHash *glob_hash); #endif /* __XDG_MIME_GLOB_H__ */ fish/xdgmimeint.cpp000066400000000000000000000077711214535744100147020ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimeint.c: Internal defines and functions. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003 Red Hat, Inc. * Copyright (C) 2003 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "xdgmimeint.h" #include #include #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif static const char _xdg_utf8_skip_data[256] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 }; const char * const _xdg_utf8_skip = _xdg_utf8_skip_data; /* Returns the number of unprocessed characters. */ xdg_unichar_t _xdg_utf8_to_ucs4(const char *source) { xdg_unichar_t ucs32; if (!(*source & 0x80)) { ucs32 = *source; } else { int bytelength = 0; xdg_unichar_t result; if (!(*source & 0x40)) { ucs32 = *source; } else { if (!(*source & 0x20)) { result = *source++ & 0x1F; bytelength = 2; } else if (!(*source & 0x10)) { result = *source++ & 0x0F; bytelength = 3; } else if (!(*source & 0x08)) { result = *source++ & 0x07; bytelength = 4; } else if (!(*source & 0x04)) { result = *source++ & 0x03; bytelength = 5; } else if (!(*source & 0x02)) { result = *source++ & 0x01; bytelength = 6; } else { result = *source++; bytelength = 1; } for (bytelength --; bytelength > 0; bytelength --) { result <<= 6; result |= *source++ & 0x3F; } ucs32 = result; } } return ucs32; } /* hullo. this is great code. don't rewrite it */ xdg_unichar_t _xdg_ucs4_to_lower(xdg_unichar_t source) { /* FIXME: Do a real to_upper sometime */ /* CaseFolding-3.2.0.txt has a table of rules. */ if ((source & 0xFF) == source) return (xdg_unichar_t) tolower((unsigned char) source); return source; } int _xdg_utf8_validate(const char *source) { /* FIXME: actually write */ return TRUE; } const char * _xdg_get_base_name(const char *file_name) { const char *base_name; if (file_name == NULL) return NULL; base_name = strrchr(file_name, '/'); if (base_name == NULL) return file_name; else return base_name + 1; } fish/xdgmimeint.h000066400000000000000000000050731214535744100143400ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimeint.h: Internal defines and functions. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003 Red Hat, Inc. * Copyright (C) 2003 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __XDG_MIME_INT_H__ #define __XDG_MIME_INT_H__ #include "xdgmime.h" #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif /* FIXME: Needs to be configure check */ typedef unsigned int xdg_unichar_t; typedef unsigned char xdg_uchar8_t; typedef unsigned short xdg_uint16_t; typedef unsigned int xdg_uint32_t; #ifdef XDG_PREFIX #define _xdg_utf8_skip XDG_ENTRY(utf8_skip) #define _xdg_utf8_to_ucs4 XDG_ENTRY(utf8_to_ucs4) #define _xdg_ucs4_to_lower XDG_ENTRY(ucs4_to_lower) #define _xdg_utf8_validate XDG_ENTRY(utf8_validate) #define _xdg_get_base_name XDG_ENTRY(get_ase_name) #endif #define SWAP_BE16_TO_LE16(val) (xdg_uint16_t)(((xdg_uint16_t)(val) << 8)|((xdg_uint16_t)(val) >> 8)) #define SWAP_BE32_TO_LE32(val) (xdg_uint32_t)((((xdg_uint32_t)(val) & 0xFF000000U) >> 24) | \ (((xdg_uint32_t)(val) & 0x00FF0000U) >> 8) | \ (((xdg_uint32_t)(val) & 0x0000FF00U) << 8) | \ (((xdg_uint32_t)(val) & 0x000000FFU) << 24)) /* UTF-8 utils */ extern const char *const _xdg_utf8_skip; #define _xdg_utf8_next_char(p) (char *)((p) + _xdg_utf8_skip[*(unsigned char *)(p)]) #define _xdg_utf8_char_size(p) (int) (_xdg_utf8_skip[*(unsigned char *)(p)]) xdg_unichar_t _xdg_utf8_to_ucs4(const char *source); xdg_unichar_t _xdg_ucs4_to_lower(xdg_unichar_t source); int _xdg_utf8_validate(const char *source); const char *_xdg_get_base_name(const char *file_name); #endif /* __XDG_MIME_INT_H__ */ fish/xdgmimemagic.cpp000066400000000000000000000502351214535744100151610ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimemagic.: Private file. Datastructure for storing magic files. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003 Red Hat, Inc. * Copyright (C) 2003 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "xdgmimemagic.h" #include "xdgmimeint.h" #include #include #include #include #include #include #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif extern int errno; typedef struct XdgMimeMagicMatch XdgMimeMagicMatch; typedef struct XdgMimeMagicMatchlet XdgMimeMagicMatchlet; typedef enum { XDG_MIME_MAGIC_SECTION, XDG_MIME_MAGIC_MAGIC, XDG_MIME_MAGIC_ERROR, XDG_MIME_MAGIC_EOF } XdgMimeMagicState; struct XdgMimeMagicMatch { const char *mime_type; int priority; XdgMimeMagicMatchlet *matchlet; XdgMimeMagicMatch *next; }; struct XdgMimeMagicMatchlet { int indent; int offset; unsigned int value_length; unsigned char *value; unsigned char *mask; unsigned int range_length; unsigned int word_size; XdgMimeMagicMatchlet *next; }; struct XdgMimeMagic { XdgMimeMagicMatch *match_list; int max_extent; }; static XdgMimeMagicMatch * _xdg_mime_magic_match_new(void) { return (XdgMimeMagicMatch *)calloc(1, sizeof(XdgMimeMagicMatch)); } static XdgMimeMagicMatchlet * _xdg_mime_magic_matchlet_new(void) { XdgMimeMagicMatchlet *matchlet; matchlet = (XdgMimeMagicMatchlet *)malloc(sizeof(XdgMimeMagicMatchlet)); matchlet->indent = 0; matchlet->offset = 0; matchlet->value_length = 0; matchlet->value = NULL; matchlet->mask = NULL; matchlet->range_length = 1; matchlet->word_size = 1; matchlet->next = NULL; return matchlet; } static void _xdg_mime_magic_matchlet_free(XdgMimeMagicMatchlet *mime_magic_matchlet) { if (mime_magic_matchlet) { if (mime_magic_matchlet->next) _xdg_mime_magic_matchlet_free(mime_magic_matchlet->next); if (mime_magic_matchlet->value) free(mime_magic_matchlet->value); if (mime_magic_matchlet->mask) free(mime_magic_matchlet->mask); free(mime_magic_matchlet); } } /* Frees mime_magic_match and the remainder of its list */ static void _xdg_mime_magic_match_free(XdgMimeMagicMatch *mime_magic_match) { XdgMimeMagicMatch *ptr, *next; ptr = mime_magic_match; while (ptr) { next = ptr->next; if (ptr->mime_type) free((void *) ptr->mime_type); if (ptr->matchlet) _xdg_mime_magic_matchlet_free(ptr->matchlet); free(ptr); ptr = next; } } /* Reads in a hunk of data until a newline character or a '\000' is hit. The * returned string is null terminated, and doesn't include the newline. */ static char * _xdg_mime_magic_read_to_newline(FILE *magic_file, int *end_of_file) { char *retval; int c; int len, pos; len = 128; pos = 0; retval = (char *)malloc(len); *end_of_file = FALSE; while (TRUE) { c = getc_unlocked(magic_file); if (c == EOF) { *end_of_file = TRUE; break; } if (c == '\n' || c == '\000') break; retval[pos++] = (char) c; if (pos % 128 == 127) { len = len + 128; char *tmp = (char *)realloc(retval, len); if (tmp == NULL) { free(retval); return NULL; } retval = tmp; } } retval[pos] = '\000'; return retval; } /* Returns the number read from the file, or -1 if no number could be read. */ static int _xdg_mime_magic_read_a_number(FILE *magic_file, int *end_of_file) { /* LONG_MAX is about 20 characters on my system */ #define MAX_NUMBER_SIZE 30 char number_string[MAX_NUMBER_SIZE + 1]; int pos = 0; int c; long retval = -1; while (TRUE) { c = getc_unlocked(magic_file); if (c == EOF) { *end_of_file = TRUE; break; } if (! isdigit(c)) { ungetc(c, magic_file); break; } number_string[pos] = (char) c; pos++; if (pos == MAX_NUMBER_SIZE) break; } if (pos > 0) { number_string[pos] = '\000'; errno = 0; retval = strtol(number_string, NULL, 10); if ((retval < INT_MIN) || (retval > INT_MAX) || (errno != 0)) return -1; } return retval; } /* Headers are of the format: * [:] */ static XdgMimeMagicState _xdg_mime_magic_parse_header(FILE *magic_file, XdgMimeMagicMatch *match) { int c; char *buffer; char *end_ptr; int end_of_file = 0; assert(magic_file != NULL); assert(match != NULL); c = getc_unlocked(magic_file); if (c == EOF) return XDG_MIME_MAGIC_EOF; if (c != '[') return XDG_MIME_MAGIC_ERROR; match->priority = _xdg_mime_magic_read_a_number(magic_file, &end_of_file); if (end_of_file) return XDG_MIME_MAGIC_EOF; if (match->priority == -1) return XDG_MIME_MAGIC_ERROR; c = getc_unlocked(magic_file); if (c == EOF) return XDG_MIME_MAGIC_EOF; if (c != ':') return XDG_MIME_MAGIC_ERROR; buffer = _xdg_mime_magic_read_to_newline(magic_file, &end_of_file); if (end_of_file) return XDG_MIME_MAGIC_EOF; end_ptr = buffer; while (*end_ptr != ']' && *end_ptr != '\000' && *end_ptr != '\n') end_ptr++; if (*end_ptr != ']') { free(buffer); return XDG_MIME_MAGIC_ERROR; } *end_ptr = '\000'; match->mime_type = strdup(buffer); free(buffer); return XDG_MIME_MAGIC_MAGIC; } static XdgMimeMagicState _xdg_mime_magic_parse_error(FILE *magic_file) { int c; while (1) { c = getc_unlocked(magic_file); if (c == EOF) return XDG_MIME_MAGIC_EOF; if (c == '\n') return XDG_MIME_MAGIC_SECTION; } } /* Headers are of the format: * [ indent ] ">" start-offset "=" value * [ "&" mask ] [ "~" word-size ] [ "+" range-length ] "\n" */ static XdgMimeMagicState _xdg_mime_magic_parse_magic_line(FILE *magic_file, XdgMimeMagicMatch *match) { XdgMimeMagicMatchlet *matchlet; int c; int end_of_file; int indent = 0; size_t bytes_read; assert(magic_file != NULL); /* Sniff the buffer to make sure it's a valid line */ c = getc_unlocked(magic_file); if (c == EOF) return XDG_MIME_MAGIC_EOF; else if (c == '[') { ungetc(c, magic_file); return XDG_MIME_MAGIC_SECTION; } else if (c == '\n') return XDG_MIME_MAGIC_MAGIC; /* At this point, it must be a digit or a '>' */ end_of_file = FALSE; if (isdigit(c)) { ungetc(c, magic_file); indent = _xdg_mime_magic_read_a_number(magic_file, &end_of_file); if (end_of_file) return XDG_MIME_MAGIC_EOF; if (indent == -1) return XDG_MIME_MAGIC_ERROR; c = getc_unlocked(magic_file); if (c == EOF) return XDG_MIME_MAGIC_EOF; } if (c != '>') return XDG_MIME_MAGIC_ERROR; matchlet = _xdg_mime_magic_matchlet_new(); matchlet->indent = indent; matchlet->offset = _xdg_mime_magic_read_a_number(magic_file, &end_of_file); if (end_of_file) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_EOF; } if (matchlet->offset == -1) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_ERROR; } c = getc_unlocked(magic_file); if (c == EOF) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_EOF; } else if (c != '=') { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_ERROR; } /* Next two bytes determine how long the value is */ matchlet->value_length = 0; c = getc_unlocked(magic_file); if (c == EOF) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_EOF; } matchlet->value_length = c & 0xFF; matchlet->value_length = matchlet->value_length << 8; c = getc_unlocked(magic_file); if (c == EOF) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_EOF; } matchlet->value_length = matchlet->value_length + (c & 0xFF); matchlet->value = (unsigned char *)malloc(matchlet->value_length); /* OOM */ if (matchlet->value == NULL) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_ERROR; } bytes_read = fread(matchlet->value, 1, matchlet->value_length, magic_file); if (bytes_read != matchlet->value_length) { _xdg_mime_magic_matchlet_free(matchlet); if (feof(magic_file)) return XDG_MIME_MAGIC_EOF; else return XDG_MIME_MAGIC_ERROR; } c = getc_unlocked(magic_file); if (c == '&') { matchlet->mask = (unsigned char *)malloc(matchlet->value_length); /* OOM */ if (matchlet->mask == NULL) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_ERROR; } bytes_read = fread(matchlet->mask, 1, matchlet->value_length, magic_file); if (bytes_read != matchlet->value_length) { _xdg_mime_magic_matchlet_free(matchlet); if (feof(magic_file)) return XDG_MIME_MAGIC_EOF; else return XDG_MIME_MAGIC_ERROR; } c = getc_unlocked(magic_file); } if (c == '~') { matchlet->word_size = _xdg_mime_magic_read_a_number(magic_file, &end_of_file); if (end_of_file) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_EOF; } if (matchlet->word_size != 0 && matchlet->word_size != 1 && matchlet->word_size != 2 && matchlet->word_size != 4) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_ERROR; } c = getc_unlocked(magic_file); } if (c == '+') { matchlet->range_length = _xdg_mime_magic_read_a_number(magic_file, &end_of_file); if (end_of_file) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_EOF; } if (matchlet->range_length == (unsigned int)-1) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_ERROR; } c = getc_unlocked(magic_file); } if (c == '\n') { /* We clean up the matchlet, byte swapping if needed */ if (matchlet->word_size > 1) { size_t i; if (matchlet->value_length % matchlet->word_size != 0) { _xdg_mime_magic_matchlet_free(matchlet); return XDG_MIME_MAGIC_ERROR; } /* FIXME: need to get this defined in a style file */ #if LITTLE_ENDIAN for (i = 0; i < matchlet->value_length; i = i + matchlet->word_size) { if (matchlet->word_size == 2) *((xdg_uint16_t *) matchlet->value + i) = SWAP_BE16_TO_LE16(*((xdg_uint16_t *)(matchlet->value + i))); else if (matchlet->word_size == 4) *((xdg_uint32_t *) matchlet->value + i) = SWAP_BE32_TO_LE32(*((xdg_uint32_t *)(matchlet->value + i))); if (matchlet->mask) { if (matchlet->word_size == 2) *((xdg_uint16_t *) matchlet->mask + i) = SWAP_BE16_TO_LE16(*((xdg_uint16_t *)(matchlet->mask + i))); else if (matchlet->word_size == 4) *((xdg_uint32_t *) matchlet->mask + i) = SWAP_BE32_TO_LE32(*((xdg_uint32_t *)(matchlet->mask + i))); } } #endif } matchlet->next = match->matchlet; match->matchlet = matchlet; return XDG_MIME_MAGIC_MAGIC; } _xdg_mime_magic_matchlet_free(matchlet); if (c == EOF) return XDG_MIME_MAGIC_EOF; return XDG_MIME_MAGIC_ERROR; } static int _xdg_mime_magic_matchlet_compare_to_data(XdgMimeMagicMatchlet *matchlet, const void *data, size_t len) { size_t i, j; for (i = matchlet->offset; i <= matchlet->offset + matchlet->range_length; i++) { int valid_matchlet = TRUE; if (i + matchlet->value_length > len) return FALSE; if (matchlet->mask) { for (j = 0; j < matchlet->value_length; j++) { if ((matchlet->value[j] & matchlet->mask[j]) != ((((unsigned char *) data)[j + i]) & matchlet->mask[j])) { valid_matchlet = FALSE; break; } } } else { for (j = 0; j < matchlet->value_length; j++) { if (matchlet->value[j] != ((unsigned char *) data)[j + i]) { valid_matchlet = FALSE; break; } } } if (valid_matchlet) return TRUE; } return FALSE; } static int _xdg_mime_magic_matchlet_compare_level(XdgMimeMagicMatchlet *matchlet, const void *data, size_t len, int indent) { while ((matchlet != NULL) && (matchlet->indent == indent)) { if (_xdg_mime_magic_matchlet_compare_to_data(matchlet, data, len)) { if ((matchlet->next == NULL) || (matchlet->next->indent <= indent)) return TRUE; if (_xdg_mime_magic_matchlet_compare_level(matchlet->next, data, len, indent + 1)) return TRUE; } do { matchlet = matchlet->next; } while (matchlet && matchlet->indent > indent); } return FALSE; } static int _xdg_mime_magic_match_compare_to_data(XdgMimeMagicMatch *match, const void *data, size_t len) { return _xdg_mime_magic_matchlet_compare_level(match->matchlet, data, len, 0); } static void _xdg_mime_magic_insert_match(XdgMimeMagic *mime_magic, XdgMimeMagicMatch *match) { XdgMimeMagicMatch *list; if (mime_magic->match_list == NULL) { mime_magic->match_list = match; return; } if (match->priority > mime_magic->match_list->priority) { match->next = mime_magic->match_list; mime_magic->match_list = match; return; } list = mime_magic->match_list; while (list->next != NULL) { if (list->next->priority < match->priority) { match->next = list->next; list->next = match; return; } list = list->next; } list->next = match; match->next = NULL; } XdgMimeMagic * _xdg_mime_magic_new(void) { return (XdgMimeMagic *)calloc(1, sizeof(XdgMimeMagic)); } void _xdg_mime_magic_free(XdgMimeMagic *mime_magic) { if (mime_magic) { _xdg_mime_magic_match_free(mime_magic->match_list); free(mime_magic); } } int _xdg_mime_magic_get_buffer_extents(XdgMimeMagic *mime_magic) { return mime_magic->max_extent; } const char * _xdg_mime_magic_lookup_data(XdgMimeMagic *mime_magic, const void *data, size_t len) { XdgMimeMagicMatch *match; for (match = mime_magic->match_list; match; match = match->next) { if (_xdg_mime_magic_match_compare_to_data(match, data, len)) { return match->mime_type; } } return NULL; } static void _xdg_mime_update_mime_magic_extents(XdgMimeMagic *mime_magic) { XdgMimeMagicMatch *match; int max_extent = 0; for (match = mime_magic->match_list; match; match = match->next) { XdgMimeMagicMatchlet *matchlet; for (matchlet = match->matchlet; matchlet; matchlet = matchlet->next) { int extent; extent = matchlet->value_length + matchlet->offset + matchlet->range_length; if (max_extent < extent) max_extent = extent; } } mime_magic->max_extent = max_extent; } static XdgMimeMagicMatchlet * _xdg_mime_magic_matchlet_mirror(XdgMimeMagicMatchlet *matchlets) { XdgMimeMagicMatchlet *new_list; XdgMimeMagicMatchlet *tmp; if ((matchlets == NULL) || (matchlets->next == NULL)) return matchlets; new_list = NULL; tmp = matchlets; while (tmp != NULL) { XdgMimeMagicMatchlet *matchlet; matchlet = tmp; tmp = tmp->next; matchlet->next = new_list; new_list = matchlet; } return new_list; } static void _xdg_mime_magic_read_magic_file(XdgMimeMagic *mime_magic, FILE *magic_file) { XdgMimeMagicState state; XdgMimeMagicMatch *match = NULL; /* Quiet compiler */ state = XDG_MIME_MAGIC_SECTION; while (state != XDG_MIME_MAGIC_EOF) { switch (state) { case XDG_MIME_MAGIC_SECTION: match = _xdg_mime_magic_match_new(); state = _xdg_mime_magic_parse_header(magic_file, match); if (state == XDG_MIME_MAGIC_EOF || state == XDG_MIME_MAGIC_ERROR) _xdg_mime_magic_match_free(match); break; case XDG_MIME_MAGIC_MAGIC: state = _xdg_mime_magic_parse_magic_line(magic_file, match); if (state == XDG_MIME_MAGIC_SECTION || (state == XDG_MIME_MAGIC_EOF && match->mime_type)) { match->matchlet = _xdg_mime_magic_matchlet_mirror(match->matchlet); _xdg_mime_magic_insert_match(mime_magic, match); } else if (state == XDG_MIME_MAGIC_EOF || state == XDG_MIME_MAGIC_ERROR) _xdg_mime_magic_match_free(match); break; case XDG_MIME_MAGIC_ERROR: state = _xdg_mime_magic_parse_error(magic_file); break; case XDG_MIME_MAGIC_EOF: default: /* Make the compiler happy */ assert(0); } } _xdg_mime_update_mime_magic_extents(mime_magic); } void _xdg_mime_magic_read_from_file(XdgMimeMagic *mime_magic, const char *file_name) { FILE *magic_file; char header[12]; /* OK to not use CLO_EXEC here because mimedb is single threaded */ magic_file = fopen(file_name, "r"); if (magic_file == NULL) return; if (fread(header, 1, 12, magic_file) == 12) { if (memcmp("MIME-Magic\0\n", header, 12) == 0) _xdg_mime_magic_read_magic_file(mime_magic, magic_file); } fclose(magic_file); } fish/xdgmimemagic.h000066400000000000000000000042461214535744100146270ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimemagic.h: Private file. Datastructure for storing the magic files. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2003 Red Hat, Inc. * Copyright (C) 2003 Jonathan Blandford * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __XDG_MIME_MAGIC_H__ #define __XDG_MIME_MAGIC_H__ #include #include "xdgmime.h" typedef struct XdgMimeMagic XdgMimeMagic; #ifdef XDG_PREFIX #define _xdg_mime_glob_read_from_file XDG_ENTRY(glob_read_from_file) #define _xdg_mime_magic_new XDG_ENTRY(magic_new) #define _xdg_mime_magic_read_from_file XDG_ENTRY(magic_read_from_file) #define _xdg_mime_magic_free XDG_ENTRY(magic_free) #define _xdg_mime_magic_get_buffer_extents XDG_ENTRY(magic_get_buffer_extents) #define _xdg_mime_magic_lookup_data XDG_ENTRY(magic_lookup_data) #endif XdgMimeMagic *_xdg_mime_magic_new(void); void _xdg_mime_magic_read_from_file(XdgMimeMagic *mime_magic, const char *file_name); void _xdg_mime_magic_free(XdgMimeMagic *mime_magic); int _xdg_mime_magic_get_buffer_extents(XdgMimeMagic *mime_magic); const char *_xdg_mime_magic_lookup_data(XdgMimeMagic *mime_magic, const void *data, size_t len); #endif /* __XDG_MIME_MAGIC_H__ */ fish/xdgmimeparent.cpp000066400000000000000000000126271214535744100153750ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimealias.c: Private file. Datastructure for storing the hierarchy. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2004 Red Hat, Inc. * Copyright (C) 2004 Matthias Clasen * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "xdgmimeparent.h" #include "xdgmimeint.h" #include #include #include #include #include #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (!FALSE) #endif typedef struct XdgMimeParents XdgMimeParents; struct XdgMimeParents { char *mime; char **parents; int n_parents; }; struct XdgParentList { struct XdgMimeParents *parents; int n_mimes; }; XdgParentList * _xdg_mime_parent_list_new(void) { XdgParentList *list; list = (XdgParentList *)malloc(sizeof(XdgParentList)); list->parents = NULL; list->n_mimes = 0; return list; } void _xdg_mime_parent_list_free(XdgParentList *list) { int i; char **p; if (list->parents) { for (i = 0; i < list->n_mimes; i++) { for (p = list->parents[i].parents; *p; p++) free(*p); free(list->parents[i].parents); free(list->parents[i].mime); } free(list->parents); } free(list); } static int parent_entry_cmp(const void *v1, const void *v2) { return strcmp(((XdgMimeParents *)v1)->mime, ((XdgMimeParents *)v2)->mime); } const char ** _xdg_mime_parent_list_lookup(XdgParentList *list, const char *mime) { XdgMimeParents *entry; XdgMimeParents key; if (list->n_mimes > 0) { key.mime = (char *)mime; key.parents = NULL; entry = (XdgMimeParents *)bsearch(&key, list->parents, list->n_mimes, sizeof(XdgMimeParents), &parent_entry_cmp); if (entry) return (const char **)entry->parents; } return NULL; } void _xdg_mime_parent_read_from_file(XdgParentList *list, const char *file_name) { FILE *file; char line[255]; int i, alloc; XdgMimeParents *entry; /* OK to not use CLO_EXEC here because mimedb is single threaded */ file = fopen(file_name, "r"); if (file == NULL) return; /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. * Blah */ alloc = list->n_mimes + 16; list->parents = (XdgMimeParents *)realloc(list->parents, alloc * sizeof(XdgMimeParents)); while (fgets(line, 255, file) != NULL) { char *sep; if (line[0] == '#') continue; sep = strchr(line, ' '); if (sep == NULL) continue; *(sep++) = '\000'; sep[strlen(sep) -1] = '\000'; entry = NULL; for (i = 0; i < list->n_mimes; i++) { if (strcmp(list->parents[i].mime, line) == 0) { entry = &(list->parents[i]); break; } } if (!entry) { if (list->n_mimes == alloc) { alloc <<= 1; list->parents = (XdgMimeParents *)realloc(list->parents, alloc * sizeof(XdgMimeParents)); } list->parents[list->n_mimes].mime = strdup(line); list->parents[list->n_mimes].parents = NULL; entry = &(list->parents[list->n_mimes]); list->n_mimes++; } if (!entry->parents) { entry->n_parents = 1; entry->parents = (char **)malloc((entry->n_parents + 1) * sizeof(char *)); } else { entry->n_parents += 1; entry->parents = (char **)realloc(entry->parents, (entry->n_parents + 2) * sizeof(char *)); } entry->parents[entry->n_parents - 1] = strdup(sep); entry->parents[entry->n_parents] = NULL; } list->parents = (XdgMimeParents *)realloc(list->parents, list->n_mimes * sizeof(XdgMimeParents)); fclose(file); if (list->n_mimes > 1) qsort(list->parents, list->n_mimes, sizeof(XdgMimeParents), &parent_entry_cmp); } void _xdg_mime_parent_list_dump(XdgParentList *list) { int i; char **p; if (list->parents) { for (i = 0; i < list->n_mimes; i++) { for (p = list->parents[i].parents; *p; p++) printf("%s %s\n", list->parents[i].mime, *p); } } } fish/xdgmimeparent.h000066400000000000000000000037141214535744100150370ustar00rootroot00000000000000/* -*- mode: C; c-file-style: "gnu" -*- */ /* xdgmimeparent.h: Private file. Datastructure for storing the hierarchy. * * More info can be found at http://www.freedesktop.org/standards/ * * Copyright (C) 2004 Red Hat, Inc. * Copyright (C) 200 Matthias Clasen * * Licensed under the Academic Free License version 2.0 * Or under the following terms: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __XDG_MIME_PARENT_H__ #define __XDG_MIME_PARENT_H__ #include "xdgmime.h" typedef struct XdgParentList XdgParentList; #ifdef XDG_PREFIX #define _xdg_mime_parent_read_from_file XDG_ENTRY(parent_read_from_file) #define _xdg_mime_parent_list_new XDG_ENTRY(parent_list_new) #define _xdg_mime_parent_list_free XDG_ENTRY(parent_list_free) #define _xdg_mime_parent_list_lookup XDG_ENTRY(parent_list_lookup) #endif void _xdg_mime_parent_read_from_file(XdgParentList *list, const char *file_name); XdgParentList *_xdg_mime_parent_list_new(void); void _xdg_mime_parent_list_free(XdgParentList *list); const char **_xdg_mime_parent_list_lookup(XdgParentList *list, const char *mime); void _xdg_mime_parent_list_dump(XdgParentList *list); #endif /* __XDG_MIME_PARENT_H__ */ fish/user_doc/html/0000755000076500000240000000000012145357602015065 5ustar00peterstaff00000000000000fish/user_doc/html/commands.html0000644000076500000240000031026712145357602017565 0ustar00peterstaff00000000000000 fish user documentation

Commands, functions and builtins bundled with fish

Fish ships with a large number of builtin commands, shellscript functions and external commands.

These are all described below.


alias - create a function

Synopsis

alias NAME DEFINITION
alias NAME=DEFINITION

Description

alias is a simple wrapper for the function builtin. It exists for backwards compatibility with Posix shells. For other uses, it is recommended to define a function.

fish does not keep track of which functions have been defined using alias. They must be erased using functions -e.

  • NAME is the name of the alias
  • DEFINITION is the actual command to execute. The string " $argv" will be appended.

You cannot create an alias to a function with the same name.

Example

The following code will create rmi, which runs rm with additional arguments on every invocation.

alias rmi "rm -i"

This is equivalent to entering the following function:

function rmi
    rm -i $argv
end

Back to index.


and - conditionally execute a command

Synopsis

COMMAND1; and COMMAND2

Description

and is used to execute a command if the current exit status (as set by the last previous command) is 0.

and does not change the current exit status.

The exit status of the last foreground command to exit can always be accessed using the $status variable.

Example

The following code runs the make command to build a program. If the build succeeds, make's exit status is 0, and the program is installed. If either step fails, the exit status is 1, and make clean is run, which removes the files created by the. build process.

make; and make install; or make clean

Back to index.


begin - start a new block of code

Synopsis

begin; [COMMANDS...;] end

Description

begin is used to create a new block of code.

The block is unconditionally executed. begin; ...; end is equivalent to if true; ...; end.

begin is used to group a number of commands into a block. This allows the introduction of a new variable scope, redirection of the input or output of a set of commands as a group, or to specify precedence when using the conditional commands like and.

begin does not change the current exit status.

Example

The following code sets a number of variables inside of a block scope. Since the variables are set inside the block and have local scope, they will be automatically deleted when the block ends.

begin
	set -l PIRATE Yarrr
	...
end
# This will not output anything, since the PIRATE variable went out
# of scope at the end of the block
echo $PIRATE

In the following code, all output is redirected to the file out.html.

begin
	echo $xml_header
	echo $html_header
	if test -e $file
		...
	end
	...

end > out.html

Back to index.


bg - send jobs to background

Synopsis

bg [PID...]

Description

bg sends jobs to the background, resuming them if they are stopped. A background job is executed simultaneously with fish, and does not have access to the keyboard. If no job is specified, the last job to be used is put in the background. If PID is specified, the jobs with the specified process group IDs are put in the background.

The PID of the desired process is usually found by using process expansion.

Example

bg %1 will put the job with job ID 1 in the background.

Back to index.


bind - handle fish key bindings

Synopsis

bind [OPTIONS] SEQUENCE COMMAND

Description

bind adds a binding for the specified key sequence to the specified command.

SEQUENCE is the character sequence to bind to. These should be written as fish escape sequences. For example, because pressing the Alt key and another character sends that character prefixed with an escape character, Alt-based key bindings can be written using the \e escape. For example, Alt-w can be written as \ew. The control character can be written in much the same way using the \c escape, for example Control-x (^X) can be written as \cx. Note that Alt-based key bindings are case sensitive and Control-based key bindings are not. This is a constraint of text-based termainls, not fish.

The default key binding can be set by specifying a SEQUENCE of the empty string (that is, ''). It will be used whenever no other binding matches. For most key bindings, it makes sense to use the self-insert function (i.e. bind '' self-insert as the default keybinding. This will insert any keystrokes not specifically bound to into the editor. Non-printable characters are ignored by the editor, so this will not result in control sequences being printable.

If the -k switch is used, the name of the key (such as down, up or backspace) is used instead of a sequence. The names used are the same as the corresponding curses variables, but without the 'key_' prefix. (See terminfo(5) for more information, or use bind --key-names for a list of all available named keys.)

COMMAND can be any fish command, but it can also be one of a set of special input functions. These include functions for moving the cursor, operating on the kill-ring, performing tab completion, etc. Use 'bind --function-names' for a complete list of these input functions.

When COMMAND is a shellscript command, it is a good practice to put the actual code into a function and simply bind to the function name. This way it becomes significantly easier to test the function while editing, and the result is usually more readable as well.

Key bindings are not saved between sessions by default. To save custom keybindings, edit the fish_user_key_bindings function and insert the appropirate bind statements.

The following parameters are available:

  • -k or --key Specify a key name, such as 'left' or 'backspace' instead of a character sequence
  • -K or --key-names Display a list of available key names
  • -f or --function-names Display a list of available input functions

Examples

bind \cd 'exit' causes fish to exit when Control-d is pressed.

bind -k ppage history-search-backward performs a history search when the Page Up key is pressed.

Back to index.


block - temporarily block delivery of events

Synopsis

block [OPTIONS...]

Description

block prevents events triggered by fish or the emit command from being delivered and acted upon while the block is in place.

In functions, block can be useful while performing work that should not be interrupted by the shell.

The block can be removed. Any events which triggered while the block was in place will then be delivered.

Event blocks should not be confused with code blocks, which are created with begin, if, while or for

The following parameters are available:

  • -l or --local Release the block automatically at the end of the current innermost code block scope
  • -g or --global Never automatically release the lock
  • -e or --erase Release global block

Example

# Create a function that listens for events
function --on-event foo foo; echo 'foo fired'; end
# Block the delivery of events
block -g
emit foo
# No output will be produced
block -e
# 'foo fired' will now be printed

Back to index.


break - stop the current inner loop

Synopsis

LOOP_CONSTRUCT; [COMMANDS...] break; [COMMANDS...] end

Description

break halts a currently running loop, such as a for loop or a while loop. It is usually added inside of a conditional block such as an if statement or a switch statement.

There are no parameters for break.

Example

The following code searches all .c files for "smurf", and halts at the first occurrence.

for i in *.c
    if grep smurf $i
        echo Smurfs are present in $i
        break
    end
end

Back to index.


breakpoint - Launch debug mode

Synopsis

breakpoint

Description

breakpoint is used to halt a running script and launch an interactive debugging prompt.

For more details, see Debugging fish scripts in the fish manual.

There are no parameters for breakpoint.

Back to index.


builtin - run a builtin command

Synopsis

builtin BUILTINNAME [OPTIONS...]

Description

builtin forces the shell to use a builtin command, rather than a function or program.

The following parameters are available:

  • -n or --names List the names of all defined builtins

Example

builtin jobs executes the jobs builtin, even if a function named jobs exists.

Back to index.


case - conditionally execute a block of commands

Synopsis

switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end

Description

switch performs one of several blocks of commands, depending on whether a specified value equals one of several wildcarded values. case is used together with the switch statement in order to determine which block should be executed.

Each case command is given one or more parameters. The first case command with a parameter that matches the string specified in the switch command will be evaluated. case parameters may contain wildcards. These need to be escaped or quoted in order to avoid regular wildcard expansion using filenames.

Note that fish does not fall through on case statements. Only the first matching case is executed.

Note that command substitutions in a case statement will be evaluated even if its body is not taken. All substitutions, including command substitutions, must be performed before the value can be compared against the parameter.

Example

If the variable $animal contains the name of an animal, the following code would attempt to classify it:

switch $animal
    case cat
        echo evil
    case wolf dog human moose dolphin whale
        echo mammal
    case duck goose albatross
        echo bird
    case shark trout stingray
        echo fish
    # Note that the next case has a wildcard which is quoted
    case '*'
        echo I have no idea what a $animal is
end

If the above code was run with $animal set to whale, the output would be mammal.

Back to index.


cd - change directory

Synopsis

cd [DIRECTORY]

Description

cd changes the current working directory.

If DIRECTORY is supplied, it will become the new directory. If no parameter is given, the contents of the HOME environment variable will be used.

If DIRECTORY is a relative path, the paths found in the CDPATH environment variable array will be tried as prefixes for the specified path.

Note that the shell will attempt to change directory without requiring cd if the name of a directory is provided (starting with '.', '/' or '~').

Examples

cd changes the working directory to your home directory.

cd /usr/src/fish-shell changes the working directory to /usr/src/fish-shell.

Back to index.


command - run a program

Synopsis

command COMMANDNAME [OPTIONS...]

Description

command forces the shell to execute the program COMMANDNAME and ignore any functions or builtins with the same name.

Example

command ls causes fish to execute the ls program, even if an 'ls' function exists.

Back to index.


commandline - set or get the current command line buffer

Synopsis

commandline [OPTIONS] [CMD]

Description

commandline can be used to set or get the current contents of the command line buffer.

With no parameters, commandline returns the current value of the command line.

With CMD specified, the command line buffer is erased and replaced with the contents of CMD.

The following options are available:

  • -C or --cursor set or get the current cursor position, not the contents of the buffer. If no argument is given, the current cursor position is printed, otherwise the argument is interpreted as the new cursor position.
  • -f or --function inject readline functions into the reader. This option cannot be combined with any other option. It will cause any additional arguments to be interpreted as readline functions, and these functions will be injected into the reader, so that they will be returned to the reader before any additional actual key presses are read.

The following options change the way commandline updates the command line buffer:

  • -a or --append do not remove the current commandline, append the specified string at the end of it
  • -i or --insert do not remove the current commandline, insert the specified string at the current cursor position
  • -r or --replace remove the current commandline and replace it with the specified string (default)

The following options change what part of the commandline is printed or updated:

  • -b or --current-buffer select the entire buffer (default)
  • -j or --current-job select the current job
  • -p or --current-process select the current process
  • -t or --current-token select the current token.

The following options change the way commandline prints the current commandline buffer:

  • -c or --cut-at-cursor only print selection up until the current cursor position
  • -o or --tokenize tokenize the selection and print one string-type token per line

If commandline is called during a call to complete a given string using complete -C STRING, commandline will consider the specified string to be the current contents of the command line.

Example

commandline -j $history[3] replaces the job under the cursor with the third item from the command line history.

Back to index.


complete - edit command specific tab-completions

Synopsis

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]

Description

For an introduction to specifying completions, see Writing your own completions in the fish manual.

  • COMMAND is the name of the command for which to add a completion
  • SHORT_OPTION is a one character option for the command
  • LONG_OPTION is a multi character option for the command
  • OPTION_ARGUMENTS is parameter containing a space-separated list of possible option-arguments, which may contain subshells
  • DESCRIPTION is a description of what the option and/or option arguments do
  • -C STRING or --do-complete=STRING makes complete try to find all possible completions for the specified string
  • -e or --erase implies that the specified completion should be deleted
  • -f or --no-files specifies that the option specified by this completion may not be followed by a filename
  • -n or --condition 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.
  • -o or --old-option implies that the command uses old long style options with only one dash
  • -p or --path implies that the string COMMAND is the full path of the command
  • -r or --require-parameter specifies that the option specified by this completion always must have an option argument, i.e. may not be followed by another option
  • -u or --unauthoritative implies that there may be more options than the ones specified, and that fish should not assume that options not listed are spelling errors
  • -A or --authoritative implies that there may be no more options than the ones specified, and that fish should assume that options not listed are spelling errors
  • -x or --exclusive implies both -r and -f

Command specific tab-completions in fish are based on the notion of options and arguments. An option is a parameter which begins with a hyphen, such as '-h', '-help' or '--help'. Arguments are parameters 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 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').

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 complete -e -c COMMAND, or by specifying a specific completion option to delete by specifying either a long, short or old style option.

Example

The short style option -o for the gcc command requires that a file follows it. This can be done using writing complete -c gcc -s o -r.

The short style option -d for the grep command requires that one of the strings 'read', 'skip' or 'recurse' is used. This can be specified writing complete -c grep -s d -x -a "read skip recurse".

The su command takes any username as an argument. Usernames are given as the first colon-separated field in the file /etc/passwd. This can be specified as: complete -x -c su -d "Username" -a "(cat /etc/passwd|cut -d : -f 1)" .

The rpm command has several different modes. If the -e or --erase flag has been specified, rpm should delete one or more packages, in which case several switches related to deleting packages are valid, like the nodeps switch.

This can be written as:

complete -c rpm -n "__fish_contains_opt -s e erase" -l nodeps -d "Don't check dependencies"

where __fish_contains_opt is a function that checks the commandline buffer for the presence of a specified set of options.

Back to index.


contains - test if a word is present in a list

Synopsis

contains [OPTIONS] KEY [VALUES...]

Description

contains tests whether the set VALUES contains the string KEY. If so, contains exits with status 0; if not, it exits with status 1.

The following options are available:

  • -i or --index print the word index
  • -h or --help display this message

Example

for i in ~/bin /usr/local/bin
	if not contains $i $PATH
		set PATH $PATH $i
	end
end

The above code tests if ~/bin and /usr/local/bin are in the path and adds them if not.

Back to index.


continue - skip the remainder of the current iteration of the current inner loop

Synopsis

LOOP_CONSTRUCT; [COMMANDS...;] continue; [COMMANDS...;] end

Description

continue skips the remainder of the current iteration of the current inner loop, such as a for loop or a while loop. It is usually added inside of a conditional block such as an if statement or a switch statement.

Example

The following code removes all tmp files that do not contain the word smurf.

for i in *.tmp
    if grep smurf $i
        continue
    end
    rm $i
end

Back to index.


count - count the number of elements of an array

Synopsis

count $VARIABLE

Description

count prints the number of arguments that were passed to it. This is usually used to find out how many elements an environment variable array contains.

count does not accept any options, including '-h'.

count exits with a non-zero exit status if no arguments were passed to it, and with zero if at least one argument was passed.

Example

count $PATH

returns the number of directories in the users PATH variable.

count *.txt

returns the number of files in the current working directory ending with the suffix '.txt'.

Back to index.


dirh - print directory history

Synopsis

dirh

Description

dirh prints the current directory history. The current position in the history is highlighted using the color defined in the fish_color_history_current environment variable.

dirh does not accept any parameters.

Back to index.


dirs - print directory stack

Synopsis

dirs

Description

dirs prints the current directory stack, as created by the pushd command.

dirs does not accept any parameters.

Back to index.


echo - display a line of text

Synopsis

echo [STRING]

Description

echo displays a string of text.

The following options are available:

  • -n, Do not output a newline
  • -s, Do not separate arguments with spaces
  • -E, Disable interpretation of backslash escapes (default)
  • -e, Enable interpretation of backslash escapes
  • -h, --help Display this help

Escape Sequences

If -e is used, the following sequences are recognized:

  • \\ backslash
  • \a alert (BEL)
  • \b backspace
  • \c produce no further output
  • \e escape
  • \f form feed
  • \n new line
  • \r carriage return
  • \t horizontal tab
  • \v vertical tab
  • \0NNN byte with octal value NNN (1 to 3 digits)
  • \xHH byte with hexadecimal value HH (1 to 2 digits)

Example

echo 'Hello World' Print hello world to stdout

echo -e 'Top\nBottom' Print Top and Bottom on separate lines, using an escape sequence

Back to index.


else - execute command if a condition is not met

Synopsis

if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end

Description

if will execute the command CONDITION. If the condition's exit status is 0, the commands COMMANDS_TRUE will execute. If it is not 0 and else is given, COMMANDS_FALSE will be executed.

Example

The following code tests whether a file foo.txt exists as a regular file.

if test -f foo.txt
    echo foo.txt exists
else
    echo foo.txt does not exist
end

Back to index.


emit - Emit a generic event

Synopsis

emit EVENT_NAME [ARGUMENTS...]

Description

emit emits, or fires, an event. Events are delivered to, or caught by, special functions called event handlers. The arguments are passed to the event handlers as function arguments.

Example

The following code first defines an event handler for the generic event named 'test_event', and then emits an event of that type.

function event_test --on-event test_event
    echo event test: $argv
end

emit test_event something

Back to index.


end - end a block of commands.

Synopsis

begin; [COMMANDS...] end
if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end
while CONDITION; COMMANDS...; end
for VARNAME in [VALUES...]; COMMANDS...; end
switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end

Description

end ends a block of commands.

For more information, read the documentation for the block constructs, such as if, for and while.

The end command does not change the current exit status.

Back to index.


eval - evaluate the specified commands

Synopsis

eval [COMMANDS...]

Description

eval evaluates the specified parameters as a command. If more than one parameter is specified, all parameters will be joined using a space character as a separator.

Example

The folloing code will call the ls command. Note that fish does not support the use of environment variables as direct commands; eval can be used to work around this.

set cmd ls
eval $cmd

Back to index.


exec - execute command in current process

Synopsis

exec COMMAND [OPTIONS...]

Description

exec replaces the currently running shell with a new command. On successful completion, exec never returns. exec cannot be used inside a pipeline.

Example

exec emacs starts up the emacs text editor, and exits fish. When emacs exits, the session will terminate.

Back to index.


exit - exit the shell

Synopsis

exit [STATUS]

Description

exit causes fish to exit. If STATUS is supplied, it will be converted to an integer and used as the exit code. Otherwise, the exit code will be that of the last command executed.

If exit is called while sourcing a file (using the . builtin) the rest of the file will be skipped, but the shell itself will not exit.

Back to index.


fg - bring job to foreground

Synopsis

fg [PID]

Description

fg brings the specified job to the foreground, resuming it if it is stopped. While a foreground job is executed, fish is suspended. If no job is specified, the last job to be used is put in the foreground. If PID is specified, the job with the specified group ID is put in the foreground.

The PID of the desired process is usually found by using process expansion.

Example

fg %1 will put the job with job ID 1 in the foreground.

Back to index.


fish - the friendly interactive shell

Synopsis

fish [-h] [-v] [-c command] [FILE [ARGUMENTS...]]

Description

fish is a command-line shell written mainly with interactive use in mind. The full manual is available in HTML by using the help command from inside fish.

The following options are available:

  • -c or --command=COMMANDS evaluate the specified commands instead of reading from the commandline
  • -d or --debug-level=DEBUG_LEVEL specify the verbosity level of fish. A higher number means higher verbosity. The default level is 1.
  • -h or --help display help and exit
  • -i or --interactive specify that fish is to run in interactive mode
  • -l or --login specify that fish is to run as a login shell
  • -n or --no-execute do not execute any commands, only perform syntax checking
  • -p or --profile=PROFILE_FILE when fish exits, output timing information on all executed commands to the specified file
  • -v or --version display version and exit

The fish exit status is generally the exit status of the last foreground command. If fish is exiting because of a parse error, the exit status is 127.

Back to index.


fish_config - start the web-based configuration interface

Description

fish_config starts the web-based configuration interface.

The web interface allows you to view your functions, variables and history, and to make changes to your prompt and color configuration.

fish_config starts a local web server and then opens a web browser window; when you have finished, close the browser window and then press the Enter key to terminate the configuration session.

There are no parameters for fish_config.

If the BROWSER environment variable is set, it will be used as the name of the web browser to open instead of the system default.

Example

fish_config opens a new web browser window and allows you to configure certain fish settings.

Back to index.


fish_indent - indenter and prettifier

Synopsis

fish_indent [options]

Description

fish_indent is used to indent a piece of fish code. fish_indent reads commands from standard input and outputs them to standard output.

The following options are available:

  • -h or --help displays this help message and then exits
  • -i or --no-indent do not indent commands
  • -v or --version displays the current fish version and then exits

Back to index.


fish_pager - internal command used by fish

Description

fish_pager is used internally by fish. It should not be used by other commands, as its interface is liable to change in the future.

Back to index.


fish_prompt - define the appearance of the command line prompt

Synopsis

function fish_prompt
    ...
end

Description

By defining the fish_prompt function, the user can choose a custom prompt. The fish_prompt function is executed when the prompt is to be shown, and the output is used as a prompt.

The exit status of commands within fish_prompt will not modify the value of $status outside of the fish_prompt function.

fish ships with a number of example prompts that can be chosen with the fish_config command.

Example

A simple prompt:

function fish_prompt -d "Write out the prompt"
	printf '%s@%s%s%s%s> ' (whoami) (hostname|cut -d . -f 1) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal)
end

Back to index.


fish_right_prompt - define the appearance of the right-side command line prompt

Synopsis

function fish_right_prompt
    ...
end

Description

fish_right_prompt is similar to fish_prompt, except that it appears on the right side of the terminal window.

Multiple lines are not supported in fish_right_prompt.

Example

A simple right prompt:

function fish_right_prompt -d "Write out the right prompt"
    date "+%m/%d/%y"
end

Back to index.


fish_update_completions - Update completions using manual pages

Description

fish_update_completions parses manual pages installed on the system, and attempts to create completion files in the fish configuration directory.

This does not overwrite custom completions.

There are no parameters for fish_update_completions.

Back to index.


fishd - universal variable daemon

Synopsis

fishd [(-h|--help|-v|--version)]

Description

The fishd daemon is used to load, save and distribute universal variable information. fish automatically connects to fishd via a socket on startup.

fishd is started and stopped automatically.

The following options are available if starting fishd manually:

  • -h or --help displays this help message and then exits
  • -v or --version displays the current fish version and then exits

Files

  • ~/.config/fish/fishd.MACHINE_ID - permanent storage location for universal variable data. MACHINE_ID is generally based on the machine's MAC address.

The data is stored as a set of set and set_export commands such as would be parsed by fishd. The file must always be stored in YAML format. If an instance of fishd is running (which is generally the case), manual modifications to ~/.fishd.MACHINE_ID will be lost. Do NOT edit this file manually!

  • /tmp/fishd.socket.USERNAME - the socket which fishd uses to communicate with all clients.

  • /tmp/fishd.log.USERNAME - the fishd log file

Back to index.


for - perform a set of commands multiple times.

Synopsis

for VARNAME in [VALUES...]; COMMANDS...; end

Description

for is a loop construct. It will perform the commands specified by COMMANDS multiple times. On each iteration, the environment variable specified by VARNAME is assigned a new value from VALUES. If VALUES is empty, COMMANDS will not be executed at all.

Example

The command

for i in foo bar baz; echo $i; end

would output:

foo
bar
baz

Back to index.


funced - edit a function interactively

Synopsis

funced [OPTIONS] NAME

Description

funced provides an interface to edit the definition of the function NAME.

If the $EDITOR environment variable is set, it will be used as the program to edit the function. Otherwise, a built-in editor will be used.

If there is no function called NAME a new function will be created with the specified name

  • -e command or --editor command Open the function body inside the text editor given by the command (for example, "vi"). The command 'fish' will use the built-in editor.
  • -i or --interactive Open function body in the built-in editor.

Back to index.


funcsave - save the definition of a function to the user's autoload directory

Synopsis

funcsave FUNCTION_NAME

Description

funcsave saves the current definition of a function to a file in the fish configuration directory. This function will be automatically loaded by current and future fish sessions. This can be useful if you have interactively created a new function and wish to save it for later use.

Back to index.


function - create a function

Synopsis

function [OPTIONS] NAME; BODY; end

Description

function creates a new function NAME with the body BODY.

A function is a list of commands that will be executed when the name of the function is given as a command.

The following options are available:

  • -d DESCRIPTION or --description=DESCRIPTION is a description of what the function does, suitable as a completion description.
  • -e or --on-event EVENT_NAME tells fish to run this function when the specified named event is emitted. Fish internally generates named events e.g. when showing the prompt.
  • -j PID or --on-job-exit PID tells fish to run this function when the job with group ID PID exits. Instead of PID, the string 'caller' can be specified. This is only legal when in a command substitution, and will result in the handler being triggered by the exit of the job which created this command substitution.
  • -p PID or --on-process-exit PID tells fish to run this function when the fish child process with process ID PID exits.
  • -s or --on-signal SIGSPEC 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).
  • -v or --on-variable VARIABLE_NAME tells fish to run this function when the variable VARIABLE_NAME changes value.

If the user enters any additional arguments after the function, they are inserted into the environment variable array $argv.

By using one of the event handler switches, a function can be made to run automatically at specific events. The user may generate new events using the emit builtin. Fish generates the following named events:

  • fish_prompt, which is emitted whenever a new fish prompt is about to be displayed.
  • fish_command_not_found, which is emitted whenever a command lookup failed.

Example

function ll
	ls -l $argv
end

will run the ls command, using the -l option, while passing on any additional files and switches to ls.

function mkdir -d "Create a directory and set CWD"
	command mkdir $argv
	if test $status = 0
		switch $argv[(count $argv)]
			case '-*'

			case '*'
				cd $argv[(count $argv)]
				return
		end
	end
end

will run the mkdir command, and if it is successful, change the current working directory to the one just created.

Back to index.


functions - print or erase functions

Synopsis

functions [-n]
functions -c OLDNAME NEWNAME
functions -d DESCRIPTION FUNCTION
functions [-eq] FUNCTIONS...

Description

functions prints or erases functions.

The following options are available:

  • -a or --all lists all functions, even those whose name start with an underscore.
  • -c OLDNAME NEWNAME or --copy OLDNAME NEWNAME creates a new function named NEWNAME, using the definition of the OLDNAME function.
  • -d DESCRIPTION or --description=DESCRIPTION changes the description of this function.
  • -e or --erase causes the specified functions to be erased.
  • -h or --help displays a help message and exits.
  • -n or --names lists the names of all defined functions.
  • -q or --query tests if the specified functions exist.

The default behavior of functions, when called with no arguments, is to print the names of all defined functions. Unless the -a option is given, no functions starting with underscores are not included in the output.

If any non-option parameters are given, the definition of the specified functions are printed.

Automatically loaded functions cannot be removed using functions -e. Either remove the definition file or change the $fish_function_path variable to remove autoloaded functions.

Copying a function using -c copies only the body of the function, and does not attach any event notifications from the original function.

Only one function's description can be changed in a single invocation of functions -d.

The exit status of functions is the number of functions specified in the argument list that do not exist, which can be used in concert with the -q option.

Examples

functions -n displays a list of currently-defined functions.

functions -c foo bar copies the foo function to a new function called bar.

functions -e bar erases the function bar.

Back to index.


help - display fish documentation

Synopsis

help [SECTION]

Description

help displays the fish help documentation.

If a SECTION is specified, the help for that command is shown.

If the BROWSER environment variable is set, it will be used to display the documentation. Otherwise, fish will search for a suitable browser.

Note that most builtin commands display their help in the terminal when given the --help option.

Example

help fg shows the documentation for the fg builtin.

Back to index.


history - Show and manipulate command history

Synopsis

history (--save | --clear)
history (--search | --delete ) (--prefix "prefix string" | --contains "search string")

Description

history is used to list, search and delete the history of commands used.

The following options are available:

  • --save saves all changes in the history file. The shell automatically saves the history file; this option is provided for internal use.
  • --clear clears the history file. A prompt is displayed before the history is erased.
  • --search returns history items in keeping with the --prefix or --contains options.
  • --delete deletes history items.
  • --prefix searches or deletes items in the history that begin with the specified text string.
  • --contains searches or deletes items in the history that contain the specified text string.

If --search is specified without --contains or --prefix, --contains will be assumed.

If --delete is specified without --contains or --prefix, only a history item which exactly matches the parameter will be erased. No prompt will be given. If --delete is specified with either of these parameters, an interactive prompt will be displayed before any items are deleted.

Example

history --clear deletes all history items

history --search --contains "foo" outputs a list of all previous commands containing the string "foo".

history --delete --prefix "foo" interactively deletes the record of previous commands which start with "foo".

Back to index.


if - conditionally execute a command

Synopsis

if CONDITION; COMMANDS_TRUE...; [else if CONDITION2; COMMANDS_TRUE2...;] [else; COMMANDS_FALSE...;] end

Description

if will execute the command CONDITION. If the condition's exit status is 0, the commands COMMANDS_TRUE will execute. If the exit status is not 0 and else is given, COMMANDS_FALSE will be executed.

In order to use the exit status of multiple commands as the condition of an if block, use begin; ...; end and the short circuit commands and and or.

The exit status of the last foreground command to exit can always be accessed using the $status variable.

Example

if test -f foo.txt
	echo foo.txt exists
else if test -f bar.txt
	echo bar.txt exists
else
	echo foo.txt and bar.txt do not exist
end
will print foo.txt exists if the file foo.txt exists and is a regular file, otherwise it will print bar.txt exists if the file bar.txt exists and is a regular file, otherwise it will print foo.txt and bar.txt do not exist.

Back to index.


isatty - test if the specified file descriptor is a tty

Synopsis

isatty [FILE DESCRIPTOR]

Description

isatty tests if a file descriptor is a tty.

FILE DESCRIPTOR may be either the number of a file descriptor, or one of the strings stdin, stdout and stderr.

If the specified file descriptor is a tty, the exit status of the command is zero. Otherwise, it is non-zero.

Back to index.


jobs - print currently running jobs

Synopsis

jobs [OPTIONS] [PID]

Description

jobs prints a list of the currently running jobs and their status.

jobs accepts the following switches:

  • -c or --command prints the command name for each process in jobs.
  • -g or --group only prints the group ID of each job.
  • -h or --help displays a help message and exits.
  • -l or --last prints only the last job to be started.
  • -p or --pid prints 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 expressed as a percentage of full CPU activity. Note that on multiprocessor systems, the total activity may be more than 100%.

Example

jobs outputs a summary of the current jobs.

Back to index.


math - Perform mathematics calculations

Synopsis

math EXPRESSION

Description

math is used to perform mathematical calculations. It is a very thin wrapper for the bc program, which makes it possible to specify an expression from the command line without using non-standard extensions or a pipeline.

For a description of the syntax supported by math, see the manual for the bc program. Keep in mind that parameter expansion takes place on any expressions before they are evaluated. This can be very useful in order to perform calculations involving environment variables or the output of command substitutions, but it also means that parenthesis have to be escaped.

Examples

math 1+1 outputs 2.

math $status-128 outputs the numerical exit status of the last command minus 128.

Back to index.


mimedb - lookup file information via the mime database

Synopsis

mimedb [OPTIONS] FILES...

Description

mimedb queries the MIME type database and the .desktop files installed on the system in order to find information on the files listed in FILES. The information that mimedb can retrieve includes the MIME type for a file, a description of the type, and the default action that can be performed on the file. mimedb can also be used to launch the default action for this file.

The following options are available:

  • -t, --input-file-data determines the files' type both by their filename and by their contents (default behaviour).
  • -f, --input-filename determines the files' type by their filename.
  • -i, --input-mime specifies that the arguments are not files, but MIME types.
  • -m, --output-mime outputs the MIME type of each file (default behaviour).
  • -f, --output-description outputs the description of each MIME type.
  • -a, --output-action outputs the default action of each MIME type.
  • -l, --launch launches the default action for the specified files.
  • -h, --help displays a help message and exit.
  • -v, --version displays the version number and exits.

Back to index.


nextd - move forward through directory history

Synopsis

nextd [-l | --list] [POS]

Description

nextd moves forwards POS positions in the history of visited directories; if the end of the history has been hit, a warning is printed.

If the -l> or --list flag is specified, the current directory history is also displayed.

Example

cd /usr/src
# Working directory is now /usr/src
cd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
prevd
# Working directory is now /usr/src
nextd
# Working directory is now /usr/src/fish-shell

Back to index.


not - negate the exit status of a job

Synopsis

not COMMAND [OPTIONS...]

Description

not negates the exit status of another command. If the exit status is zero, not returns 1. Otherwise, not returns 0.

Example

The following code reports an error and exits if no file named spoon can be found.

if not test -f spoon
	echo There is no spoon
	exit 1
end

Back to index.


open - open file in its default application

Synopsis

open FILES...

Description

open opens a file in its default application, using the xdg-open command if it exists, or else the mimedb command.

Example

open *.txt opens all the text files in the current directory using your system's default text editor.

Back to index.


or - conditionally execute a command

Synopsis

COMMAND1; or COMMAND2

Description

or is used to execute a command if the current exit status (as set by the last previous command) is not 0.

or does not change the current exit status.

The exit status of the last foreground command to exit can always be accessed using the $status variable.

Example

The following code runs the make command to build a program. If the build succeeds, the program is installed. If either step fails, make clean is run, which removes the files created by the build process.

make; and make install; or make clean

Back to index.


popd - move through directory stack

Synopsis

popd

Description

popd removes the top directory from the directory stack and changes the working directory to the new top directory. Use pushd to add directories to the stack.

Example

pushd /usr/src
# Working directory is now /usr/src
# Directory stack contains /usr/src
pushd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
# Directory stack contains /usr/src /usr/src/fish-shell
popd
# Working directory is now /usr/src
# Directory stack contains /usr/src

Back to index.


prevd - move backward through directory history

Synopsis

prevd [-l | --list] [POS]

Description

prevd moves backwards POS positions in the history of visited directories; if the beginning of the history has been hit, a warning is printed.

If the -l or --list flag is specified, the current history is also displayed.

Example

cd /usr/src
# Working directory is now /usr/src
cd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
prevd
# Working directory is now /usr/src
nextd
# Working directory is now /usr/src/fish-shell

Back to index.


psub - perform process substitution

Synopsis

COMMAND1 (COMMAND2|psub [-f])

Description

Posix shells feature a syntax that is a mix between command substitution and piping, called process substitution. It is used to send the output of a command into the calling command, much like command substitution, but with the difference that the output is not sent through commandline arguments but through a named pipe, with the filename of the named pipe sent as an argument to the calling program. psub combined with a regular command substitution provides the same functionality.

If the -f or --file switch is given to psub, psub will use a regular file instead of a named pipe to communicate with the calling process. This will cause psub to be significantly slower when large amounts of data are involved, but has the advantage that the reading process can seek in the stream.

Example

diff (sort a.txt|psub) (sort b.txt|psub) shows the difference between the sorted versions of files a.txt and b.txt.

Back to index.


pushd - push directory to directory stack

Synopsis

pushd [DIRECTORY]

Description

The pushd function adds DIRECTORY to the top of the directory stack and makes it the current working directory. popd will pop it off and return to the original directory.

Example

pushd /usr/src
# Working directory is now /usr/src
# Directory stack contains /usr/src
pushd /usr/src/fish-shell
# Working directory is now /usr/src/fish-shell
# Directory stack contains /usr/src /usr/src/fish-shell
popd
# Working directory is now /usr/src
# Directory stack contains /usr/src

Back to index.


pwd - output the current working directory

Synopsis

pwd

Description

pwd outputs (prints) the current working directory.

Note that fish always resolves symbolic links in the current directory path.

Back to index.


random - generate random number

Synopsis

random [SEED]

Description

random outputs a random number from 0 to 32766, inclusive.

If a SEED value is provided, it is used to seed the random number generator, and no output will be produced. This can be useful for debugging purposes, where it can be desirable to get the same random number sequence multiple times. If the random number generator is called without first seeding it, the current time will be used as the seed.

Example

The following code will count down from a random number to 1:

for i in (seq (random) -1 1)
	echo $i
	sleep
end

Back to index.


read - read line of input into variables

Synopsis

read [OPTIONS] [VARIABLES...]

Description

read reads one line from standard input and stores the result in one or more environment variables.

The following options are available:

  • -c CMD or --command=CMD sets the initial string in the interactive mode command buffer to CMD.
  • -g or --global makes the variables global (default behaviour).
  • -l or --local makes the variables local.
  • -m NAME or --mode-name=NAME specifies that the name NAME should be used to save/load the history file. If NAME is fish, the regular fish history will be available.
  • -p PROMPT_CMD or --prompt=PROMPT_CMD uses the output of the shell command PROMPT_CMD as the prompt for the interactive mode. The default prompt command is set_color green; echo read; set_color normal; echo "> ".
  • -s or --shell enables syntax highlighting, tab completions and command termination suitable for entering shellscript code in the interactive mode.
  • -u or --unexport prevents the variables from being exported to child processes (default behaviour).
  • -U or --universal causes the specified environment variable to be made universal.
  • -x or --export exports the variables to child processes.

read reads a single line of input from stdin, breaks it into tokens based on the IFS environment variable, and then assigns one token to each variable specified in VARIABLES. If there are more tokens than variables, the complete remainder is assigned to the last variable.

Example

The following code stores the value 'hello' in the environment variable $foo.

echo hello|read foo

Back to index.


return - stop the current inner function

Synopsis

function NAME; [COMMANDS...;] return [STATUS]; [COMMANDS...;] end

Description

return halts a currently running function. The exit status is set to STATUS if it is given.

It is usually added inside of a conditional block such as an if statement or a switch statement to conditionally stop the executing function and return to the caller, but it can also be used to specify the exit status of a function.

Example

The following code is an implementation of the false command as a fish function

function false
	return 1
end

Back to index.


set - display and change environment variables.

Synopsis

set [SCOPE_OPTIONS]
set [OPTIONS] VARIABLE_NAME VALUES...
set [OPTIONS] VARIABLE_NAME[INDICES]... VALUES...
set (-q | --query) [SCOPE_OPTIONS] VARIABLE_NAMES...
set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME
set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME[INDICES]...

Description

set manipulates environment variables.

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.

With both variable names and values provided, set assigns the variable VARIABLE_NAME the values VALUES....

The following options control variable scope:

  • -l or --local forces the specified environment variable to be given a scope that is local to the current block, even if a variable with the given name exists and is non-local
  • -g or --global causes the specified environment variable to be given a global scope. Non-global variables disappear when the block they belong to ends
  • -U or --universal causes the specified environment variable to be given a universal scope. If this option is supplied, the variable will be shared between all the current users fish instances on the current computer, and will be preserved across restarts of the shell.
  • -n or --names List only the names of all defined variables, not their value
  • -u or --unexport causes the specified environment not to be exported to child processes
  • -x or --export causes the specified environment variable to be exported to child processes

The following options are available:

  • -e or --erase causes the specified environment variable to be erased
  • -q or --query 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.
  • -L or --long do not abbreviate long values when printing set variables

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 PATH[1 3 7], only those array elements specified will be changed. When array indices are specified to set, multiple arguments may be used to specify additional indexes, e.g. set PATH[1] PATH[4] /bin /sbin. If you specify a negative index when expanding or assigning to an array variable, the index will be calculated from the end of the array. For example, the index -1 means the last index of an array.

The scoping rules when creating or updating a variable are:

  1. If a variable is explicitly set to either universal, global or local, that setting will be honored. If a variable of the same name exists in a different scope, that variable will not be changed.
  2. If a variable is not explicitly set to be either universal, global or local, but has been previously defined, the previous variable scope is used.
  3. If a variable is not explicitly set to be either universal, global or local and has never before been defined, the variable will be local to the currently executing function. Note that this is different from using the -l or --local flag. If one of those flags is used, the variable will be local to the most inner currently executing block, while without these the variable will be local to the function. If no function is executing, the variable will be global.

The exporting rules when creating or updating a variable are identical to the scoping rules for variables:

  1. If a variable is explicitly set to either be exported or not exported, that setting will be honored.
  2. If a variable is not explicitly set to be exported or not exported, but has been previously defined, the previous exporting rule for the variable is kept.
  3. If a variable is not explicitly set to be either exported or unexported and has never before been defined, the variable will not be exported.

In query mode, the scope to be examined can be specified.

In erase mode, if variable indices are specified, only the specified slices of the array variable will be erased. When erasing an entire variable (i.e. no slicing), the scope of the variable to be erased can be specified. That way, a global variable can be erased even if a local variable with the same name exists. Scope can not be specified when erasing a slice of an array. The innermost scope is always used.

set requires all options to come before any other arguments. For example, set flags -l will have the effect of setting the value of the variable flags to '-l', not making the variable local.

In assignment mode, set exits with a non-zero exit status if variable assignments could not be successfully performed. If the variable assignments were performed, the exit status is unchanged. This allows simultaneous capture of the output and exit status of a subcommand, e.g. if set output (command). In query mode, the exit status is the number of variables that were not found. In erase mode, set exits with a zero exit status in case of success, with a non-zero exit status if the commandline was invalid, if the variable was write-protected or if the variable did not exist.

Example

set -xg will print all global, exported variables.

set foo hi sets the value of the variable foo to be hi.

set -e smurf removes the variable smurf.

set PATH[4] ~/bin changes the fourth element of the PATH array to ~/bin

if set python_path (which python)
    echo "Python is at $python_path"
end

The above outputs the path to Python if which returns true.

Back to index.


set_color - set the terminal color

Synopsis

set_color [-h --help] [-b --background COLOR] [COLOR]

Description

set_color changes the foreground and/or background color of the terminal. COLOR is one of black, red, green, brown, yellow, blue, magenta, purple, cyan, white and normal.

If your terminal supports term256 (modern xterms and OS X Lion), you can specify an RGB value with three or six hex digits, such as A0FF33 or f2f. fish will choose the closest supported color.

The following options are available:

  • -b, --background COLOR sets the background color.
  • -c, --print-colors prints a list of all valid color names.
  • -h, --help displays a help message and exit.
  • -o, --bold sets bold or extra bright mode.
  • -u, --underline sets underlined mode.

Calling set_color normal will set the terminal color to the default color of the terminal.

Some terminals use the --bold escape sequence to switch to a brighter color set. On such terminals, set_color white will result in a grey font color, while set_color --bold white will result in a white font color.

Not all terminal emulators support all these features.

set_color uses the terminfo database to look up how to change terminal colors on whatever terminal is in use. Some systems have old and incomplete terminfo databases, and may lack color information for terminals that support it.

Examples

set_color red; echo "Roses are red"
set_color blue; echo "Violets are blue"
set_color 62A ; echo "Eggplants are dark purple"
set_color normal; echo "Normal is nice too"

Back to index.


. - evaluate contents of file.

Synopsis

. FILENAME [ARGUMENTS...]

Description

. (source) evaluates the commands of the specified file in the current shell. This is different from starting a new process to perform the commands (i.e. fish < FILENAME) since the commands will be evaluated by the current shell, which means that changes in environment variables affect the current shell. If additional arguments are specified after the file name, they will be inserted into the $argv variable.

If no file is specified, or if the file name '-' is used, stdin will be read.

The return status of . is the return status of the last job to execute. If something goes wrong while opening or reading the file, . exits with a non-zero status.

Example

. ~/.config/fish/config.fish causes fish to re-read its initialization file.

Back to index.


status - query fish runtime information

Synopsis

status [OPTION]

Description

With no arguments, status displays a summary of the current login and job control status of the shell.

The following options are available:

  • -c or --is-command-substitution returns 0 if fish is currently executing a command substitution.
  • -b or --is-block returns 0 if fish is currently executing a block of code.
  • -i or --is-interactive returns 0 if fish is interactive - that is, connected to a keyboard.
  • -l or --is-login returns 0 if fish is a login shell - that is, if fish should perform login tasks such as setting up the PATH.
  • --is-full-job-control returns 0 if full job control is enabled.
  • --is-interactive-job-control returns 0 if interactive job control is enabled.
  • --is-no-job-control returns 0 if no job control is enabled.
  • -f or --current-filename prints the filename of the currently running script.
  • -n or --current-line-number prints the line number of the currently running script.
  • -j CONTROLTYPE or --job-control=CONTROLTYPE sets the job control type, which can be none, full, or interactive.
  • -t or --print-stack-trace prints a stack trace of all function calls on the call stack.
  • -h or --help displays a help message and exit.

Back to index.


switch - conditionally execute a block of commands

Synopsis

switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end

Description

switch performs one of several blocks of commands, depending on whether a specified value equals one of several wildcarded values. case is used together with the switch statement in order to determine which block should be executed.

Each case command is given one or more parameters. The first case command with a parameter that matches the string specified in the switch command will be evaluated. case parameters may contain wildcards. These need to be escaped or quoted in order to avoid regular wildcard expansion using filenames.

Note that fish does not fall through on case statements. Only the first matching case is executed.

Note that command substitutions in a case statement will be evaluated even if its body is not taken. All substitutions, including command substitutions, must be performed before the value can be compared against the parameter.

Example

If the variable $animal contains the name of an animal, the following code would attempt to classify it:

switch $animal
    case cat
        echo evil
    case wolf dog human moose dolphin whale
        echo mammal
    case duck goose albatross
        echo bird
    case shark trout stingray
        echo fish
    case '*'
        echo I have no idea what a $animal is
end

If the above code was run with $animal set to whale, the output would be mammal.

Back to index.


test - perform tests on files and text

Synopsis

test [EXPRESSION]

Description

Tests the expression given and sets the exit status to 0 if true, and 1 if false.

The following options are available:

  • -h displays a help message and then exits.
  • -L FILE returns true if FILE is a symbolic link.
  • -S FILE returns true if FILE is a socket.
  • COND1 -a COND2 combines two conditions with a logical and.
  • -b FILE returns true if FILE is a block device.
  • -c FILE returns true if FILE is a character device.
  • -d FILE returns true if FILE is a directory.
  • -e FILE returns true if FILE exists.
  • -f FILE returns true if FILE is a regular file.
  • -f FILE returns true if FILE has set-group-ID bit set.
  • -n STRING returns true if the length of STRING is non-zero.
  • COND1 -o COND2 combines two conditions with a logical or.
  • -p FILE returns true if FILE is a named pipe.
  • -r FILE returns true if FILE is readable.
  • -s FILE returns true if the size of FILE is non-zero.
  • -t FD returns true if FD is a terminal (TTY).
  • -u FILE returns true if FILE has set-user-ID bit set.
  • -w FILE returns true if FILE is writable.
  • -x FILE returns true if FILE is executable.
  • -z STRING returns true if STRING length is zero.

Example

if test -d "/"
    echo "Fish is cool"
end

Because "/" is a directory, the expression will evaluate to true, and "Fish is cool" will be output.

Back to index.


trap - perform an action when the shell receives a signal

Synopsis

trap [OPTIONS] [[ARG] SIGSPEC ... ]

Description

trap is a wrapper around the fish event delivery framework. It exists for backwards compatibility with POSIX shells. For other uses, it is recommended to define an event handler.

The following parameters are available:

  • ARG is the command to be executed on signal delivery.
  • SIGSPEC is the name of the signal to trap.
  • -h or --help displays help and exits.
  • -l or --list-signals prints a list of signal names.
  • -p or --print prints all defined signal handlers.

If ARG and SIGSPEC are both specified, ARG is the command to be executed when the signal specified by SIGSPEC is delivered.

If ARG is absent (and there is a single SIGSPEC) or -, each specified signal is reset to its original disposition (the value it had upon entrance to the shell). If ARG is the null string the signal specified by each SIGSPEC is ignored by the shell and by the commands it invokes.

If ARG is not present and -p has been supplied, then the trap commands associated with each SIGSPEC are displayed. If no arguments are supplied or if only -p is given, trap prints the list of commands associated with each signal.

Signal names are case insensitive and the SIG prefix is optional.

The return status is 1 if any SIGSPEC is invalid; otherwise trap returns 0.

Example

trap "status --print-stack-trace" SIGUSR1 prints a stack trace each time the SIGUSR1 signal is sent to the shell.

Back to index.


type - indicate how a command would be interpreted

Synopsis

type [OPTIONS] NAME [NAME ...]

Description

With no options, type indicates how each NAME would be interpreted if used as a command name.

The following options are available:

  • -h or --help prints help and then exits.
  • -a or --all prints all of possible definitions of the specified names.
  • -f or --no-functions suppresses function and builtin lookup.
  • -t or --type prints keyword, function, builtin, or file if NAME is a shell reserved word, function, builtin, or disk file, respectively.
  • -p or --path returns the name of the disk file that would be executed, or nothing if 'type -t name' would not return 'file'.
  • -P or --force-path returns the name of the disk file that would be executed, or nothing no file with the specified name could be found in the $PATH.

type sets the exit status to 0 if the specified command was found, and 1 if it could not be found.

Example

type fg outputs the string 'fg is a shell builtin'.

Back to index.


ulimit - set or get resource usage limits

Synopsis

ulimit [OPTIONS] [LIMIT]

Description

ulimit builtin sets or outputs the resource usage limits of the shell and any processes spawned by it. If a new limit value is omitted, the current value of the limit of the resource is printed; otherwise, the specified limit is set to the new value.

Use one of the following switches to specify which resource limit to set or report:

  • -c or --core-size: the maximum size of core files created. By setting this limit to zero, core dumps can be disabled.
  • -d or --data-size: the maximum size of a process' data segment.
  • -f or --file-size: the maximum size of files created by the shell.
  • -l or --lock-size: the maximum size that may be locked into memory.
  • -m or --resident-set-size: the maximum resident set size.
  • -n or --file-descriptor-count: the maximum number of open file descriptors (most systems do not allow this value to be set).
  • -s or --stack-size: the maximum stack size.
  • -t or --cpu-time: the maximum amount of CPU time in seconds.
  • -u or --process-count: the maximum number of processes available to a single user.
  • -v or --virtual-memory-size The maximum amount of virtual memory available to the shell.

Note that not all these limits are available in all operating systems.

The value of limit can be a number in the unit specified for the resource or one of the special values hard, soft, or unlimited, which stand for the current hard limit, the current soft limit, and no limit, respectively.

If limit is given, it is the new value of the specified resource. If no option is given, then -f is assumed. Values are in kilobytes, except for -t, which is in seconds and -n and -u, which are unscaled values. The return status is 0 unless an invalid option or argument is supplied, or an error occurs while setting a new limit.

ulimit also accepts the following switches that determine what type of limit to set:

  • -H or --hard sets hard resource limit
  • -S or --soft sets soft resource limit

A hard limit can only be decreased. Once it is set it cannot be increased; a soft limit may be increased up to the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are updated when assigning a new limit value, and the soft limit is used when reporting the current value.

The following additional options are also understood by ulimit:

  • -a or --all prints all current limits
  • -h or --help displays help and exits.

The fish implementation of ulimit should behave identically to the implementation in bash, except for these differences:

  • Fish ulimit supports GNU-style long options for all switches
  • Fish ulimit does not support the -p option for getting the pipe size. The bash implementation consists of a compile-time check that empirically guesses this number by writing to a pipe and waiting for SIGPIPE. Fish does not do this because it this method of determining pipe size is unreliable. Depending on bash version, there may also be further additional limits to set in bash that do not exist in fish.
  • Fish ulimit does not support getting or setting multiple limits in one command, except reporting all values using the -a switch

Example

ulimit -Hs 64 sets the hard stack size limit to 64 kB.

Back to index.


umask - set or get the file creation mode mask

Synopsis

umask [OPTIONS] [MASK]

Description

umask displays and manipulates the "umask", or file creation mode mask, which is used to restrict the default access to files.

The umask may be expressed either as an octal number, which represents the rights that will be removed by default, or symbolically, which represents the only rights that will be granted by default.

Access rights are explained in the manual page for the chmod(1) program.

With no parameters, the current file creation mode mask is printed as an octal number.

  • -h or --help prints this message.
  • -S or --symbolic prints the umask in symbolic form instead of octal form.
  • -p or --as-command outputs the umask in a form that may be reused as input

If a numeric mask is specified as a parameter, the current shell's umask will be set to that value, and the rights specified by that mask will be removed from new files and directories by default.

If a symbolic mask is specified, the desired permission bits, and not the inverse, should be specified. A symbolic mask is a comma 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 u, g, o or a, where u specifies the user who owns the file, g specifies the group owner of the file, o specific other users rights and a specifies all three should be changed.
  • The second part of a right specifies the mode, and can be one of =, + or -, where = specifies that the rights should be set to the new value, + specifies that the specified right should be added to those previously specified and - 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 combination of r, w and x, representing read, write and execute rights.

If the first and second parts are skipped, they are assumed to be a and =, respectively. As an example, r,u+w means all users should have read access and the file owner should also have write access.

Note that symbolic masks currently do not work as intended.

Example

umask 177 or umask u=rw sets the file creation mask to read and write for the owner and no permissions at all for any other users.

Back to index.


vared - interactively edit the value of an environment variable

Synopsis

vared VARIABLE_NAME

Description

vared is used to interactively edit the value of an environment variable. Array variables as a whole can not be edited using vared, but individual array elements can.

Example

vared PATH[3] edits the third element of the PATH array

Back to index.


while - perform a command multiple times

Synopsis

while CONDITION; COMMANDS...; end

Description

while repeatedly executes CONDITION, and if the exit status is 0, then executes COMMANDS.

If the exit status of CONDITION is non-zero on the first iteration, COMMANDS will not be executed at all.

Use begin; ...; end for complex conditions; more complex control can be achieved with while true containing a break.

Example

while test -f foo.txt; echo file exists; sleep 10; end outputs 'file exists' at 10 second intervals as long as the file foo.txt exists.

Back to index.


Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/design.html0000644000076500000240000002115712145357602017232 0ustar00peterstaff00000000000000 fish user documentation

Design document

Overview

This is a description of the design principles that have been used to design fish. The fish design has three high level goals. These are:

  1. Everything that can be done in other shell languages should be possible to do in fish, though fish may rely on external commands in doing so.
  2. Fish should be user friendly, but not at the expense of expressiveness. Most tradeoffs between power and ease of use can be avoided with careful design.
  3. Whenever possible without breaking the above goals, fish should follow the Posix syntax.

To achieve these high-level goals, the fish design relies on a number of more specific design principles. These are presented below, together with a rationale and a few examples for each.

The law of orthogonality

The shell language should have a small set of orthogonal features. Any situation where two features are related but not identical, one of them should be removed, and the other should be made powerful and general enough to handle all common use cases of either feature.

Rationale:

Related features make the language larger, which makes it harder to learn. It also increases the size of the sourcecode, making the program harder to maintain and update.

Examples:

  • Here documents are too similar to using echo inside of a pipeline.
  • Subshells, command substitution and process substitution are strongly related. fish only supports command substitution, the others can be achieved either using a block or the psub shellscript function.
  • Having both aliases and functions is confusing, especially since both of them have limitations and problems. fish functions have none of the drawbacks of either syntax.
  • The many Posix quoting styles are silly, especially $''.

The law of responsiveness

The shell should attempt to remain responsive to the user at all times, even in the face of contended or unresponsive filesystems. It is only acceptable to block in response to a user initiated action, such as running a command.

Rationale:

Bad performance increases user-facing complexity, because it trains users to recognize and route around slow use cases. It is also incredibly frustrating.

Examples:

  • Features like syntax highlighting and autosuggestions must perform all of their disk I/O asynchronously.
  • Startup should minimize forks and disk I/O, so that fish can be started even if the system is under load.

Configurability is the root of all evil

Every configuration option in a program is a place where the program is too stupid to figure out for itself what the user really wants, and should be considered a failiure of both the program and the programmer who implemented it.

Rationale:

Different configuration options are a nightmare to maintain, since the number of potential bugs caused by specific configuration combinations quickly becomes an issue. Configuration options often imply assumptions about the code which change when reimplementing the code, causing issues with backwards compatibility. But mostly, configuration options should be avoided since they simply should not exist, as the program should be smart enough to do what is best, or at least a good enough approximation of it.

Examples:

  • Fish allows the user to set various syntax highlighting colors. This is needed because fish does not know what colors the terminal uses by default, which might make some things unreadable. The proper solution would be for text color preferences to be defined centrally by the user for all programs, and for the terminal emulator to send these color properties to fish.
  • Fish does not allow you to set the history filename, the number of history entries, different language substyles or any number of other common shell configuration options.

A special note on the evils of configurability is the long list of very useful features found in some shells, that are not turned on by default. Both zsh and bash support command specific completions, but no such completions are shipped with bash by default, and they are turned off by default in zsh. Other features that zsh support that are disabled by default include tab-completion of strings containing wildcards, a sane completion pager and a history file.

The law of user focus

When designing a program, one should first think about how to make a intuitive and powerful program. Implementation issues should only be considered once a user interface has been designed.

Rationale:

This design rule is different than the others, since it describes how one should go about designing new features, not what the features should be. The problem with focusing on what can be done, and what is easy to do, is that to much of the implementation is exposed. This means that the user must know a great deal about the underlying system to be able to guess how the shell works, it also means that the language will often be rather low-level.

Examples:

  • There should only be one type of input to the shell, lists of commands. Loops, conditionals and variable assignments are all performed through regular commands.
  • The differences between builtin commands, shellscript functions and builtin commands should be made as small as possible. Builtins and shellscript functions should have exactly the same types of argument expansion as other commands, should be possible to use in any position in a pipeline, and should support any io redirection.
  • Instead of forking when performing command substitution to provide a fake variable scope, all fish commands are performed from the same process, and fish instead supports true scoping.
  • All blocks end with the end builtin.

The law of discoverability

A program should be designed to make its features as easy as possible to discover for the user.

Rationale:

A program whose features are discoverable turns a new user into an expert in a shorter span of time, since the user will become an expert on the program simply by using it.

The main benefit of a graphical program over a command line-based program is discoverability. In a graphical program, one can discover all the common features by simply looking at the user interface and guessing what the different buttons, menus and other widgets do. The traditional way to discover features in commandline programs is through manual pages. This requires both that the user starts to use a different program, and the she/he then remembers the new information until the next time she/he uses the same program.

Examples:

  • Everything should be tab-completable, and every tab completion should have a description.
  • Every syntax error and error in a builtin command should contain an error message describing what went wrong and a relevant help page. Whenever possible, errors should be flagged red by the syntax highlighter.
  • The help manual should be easy to read, easily available from the shell, complete and contain many examples
  • The language should be uniform, so that once the user understands the command/argument syntax, he will know the whole language, and be able to use tab-completion to discover new featues.

Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/doc_8h_source.html0000644000076500000240000000232512145357602020501 0ustar00peterstaff00000000000000 fish user documentation

doc.h

00001 

Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/doxygen.css0000644000076500000240000001310512145357602017254 0ustar00peterstaff00000000000000body, table, div, p, dl { font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; font-size: 12px; } /* @group Heading Levels */ h1 { text-align: center; font-size: 150%; } h2 { font-size: 120%; } h3 { font-size: 100%; } /* @end */ caption { font-weight: bold; } div.qindex, div.navtab{ background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; padding: 2px; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #153788; font-weight: normal; text-decoration: none; } .contents a:visited { color: #1b77c5; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code { } a.codeRef { } /* @end */ dl.el { margin-left: -1cm; } .fragment { font-family: monospace, fixed; font-size: 105%; } pre.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; padding: 4px 6px; margin: 4px 8px 4px 2px; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } div.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background: white; color: black; margin-right: 20px; margin-left: 20px; } td.indexkey { background-color: #e8eef2; font-weight: bold; border: 1px solid #CCCCCC; margin: 2px 0px 2px 0; padding: 2px 10px; } td.indexvalue { background-color: #e8eef2; border: 1px solid #CCCCCC; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #f0f0f0; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } /* @end */ .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #84b0c7; } th.dirtab { background: #e8eef2; font-weight: bold; } hr { height: 0; border: none; border-top: 1px solid #666; } /* @group Member Descriptions */ .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #FAFAFA; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memItemLeft, .memItemRight, .memTemplParams { border-top: 1px solid #ccc; } .memTemplParams { color: #606060; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #606060; font-weight: normal; margin-left: 3px; } .memnav { background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .memitem { padding: 0; } .memname { white-space: nowrap; font-weight: bold; } .memproto, .memdoc { border: 1px solid #84b0c7; } .memproto { padding: 0; background-color: #d5e1e8; font-weight: bold; -webkit-border-top-left-radius: 8px; -webkit-border-top-right-radius: 8px; -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; } .memdoc { padding: 2px 5px; background-color: #eef3f5; border-top-width: 0; -webkit-border-bottom-left-radius: 8px; -webkit-border-bottom-right-radius: 8px; -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } /* @end */ /* @group Directory (tree) */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin: 0.5em; } /* these are for tree view when used as main index */ .directory { font-size: 9pt; font-weight: bold; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } /* The following two styles can be used to replace the root node title with an image of your choice. Simply uncomment the next two styles, specify the name of your image and be sure to set 'height' to the proper pixel height of your image. */ /* .directory h3.swap { height: 61px; background-repeat: no-repeat; background-image: url("yourimage.gif"); } .directory h3.swap span { display: none; } */ .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { font-size: 100%; font-weight: bold; } .directory-alt h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory-alt > h3 { margin-top: 0; } .directory-alt p { margin: 0px; white-space: nowrap; } .directory-alt div { display: none; margin: 0px; } .directory-alt img { vertical-align: -30%; } /* @end */ address { font-style: normal; color: #333; } fish/user_doc/html/doxygen.png0000644000076500000240000000240112145357602017245 0ustar00peterstaff00000000000000‰PNG  IHDRd-ok>ÂgAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<]PLTEǾÏ"&©ÈÎï¶»ÖÓÚú“¢Þ ¬à¶Âõ‡§ÕÙêÉÊÎáâæ{ŽÔ¡ëˆ™× ²ø§¬¹ÀÀ±ÝÝÎùùéõõçëëåED9×ÖËhg]_X<@:#mhUÿÿÿÝÀ1tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍvÿIDATxÚbC£: d#„„………h` @¡X",***LKˆ.–], ºX@t± €èb @ÑÅ€BµD„6–š%""´° € ˜% ˆ™B:H¢ˆ²Áf@• ˆRPy"K`\PbC(!II!h©…ëƒ(ñ„Ä!ꈬC„Ä…àl!0[X\J\$TMˆ(’>a$S„ Ù@ Ш@R.$‚¬LJBR¢‰AÌG1 ¬ Â(FȃÔPhhÁTÀ¢„%!`€&q°%u P ¹¢ ¬ € ¹CT$B¢à|‚ºW„¤Àl £!B`R$( …Ĉ‘’ž@AÅ%ĤÄ%@,(—ʂڱ%$ÁââRPmB U`1IˆYB  99€\1 yCCCÿf"[N 'Ü=TGÈ’øl8˜^Kû5<êSæRɤ”%î@@ à›Ê b1 qÅAXHˆ¸&ØB’R y n˜P„Ìã–4A €€j¹€€>Ü ˜ t!˜+(.ÈÅWQ±A2ÜÜMUÜ‚’’‚‚â `1 %`19€F< 3cZÄ`óe!\ˆ DÈ+. 83‹³Àä¸!lYYA -6‚EJŠ¢V €@©žXXX 4„å Ê@86Ð`RdB´€4I "Ý "–@xrÊŒ‚H€AÊ`—f ÉȰCŒ"XV0ɲ³C b@2…¬H ¬È“ p)!(ì‚ 0Ž4ˆ)(%RÁÎ ¶$€TÊ€¥Àþb‡b,säÐ@7À üѰ‚Òî?f¥Ö—\PIx!I´¦"”Ȉ’3¨ QY˜ÿt^^ÛØgv- }>WJOAV`$&#”¦8ùøø8€\FF ›SFJ$ÂÆ€ÐƊС䈉ÀÀ 4ª…Èäå -Á§‡ €H²…—ŸŸŸf ?ðâ5„ €k1Âd‰,ŒÃ ³ƒ“€.€"­F™ËË€àñ‚½ÁIÈ€"±Ù4ÉH gx|‚f©m)))9´. aMDƒ& ºX@t± €èb @ÑÅ€¢‹%DKˆ.–], ºX@t± €èb @€d`‚ɽSµOIEND®B`‚fish/user_doc/html/faq.html0000644000076500000240000002113612145357602016525 0ustar00peterstaff00000000000000 fish user documentation

Frequently asked questions


Why does cd, $PWD and and various fish commands always resolve symlinked directories to their canonical path?

For example if ~/images is a symlink to ~/Documents/Images, if I write 'cd images', my prompt will say ~/D/Images, not ~/images.

Because it is impossible to consistently keep symlinked directories unresolved. It is indeed possible to do this partially, and many other shells do so. But it was felt there are enough serious corner cases that this is a bad idea. Most such issues have to do with how '..' is handled, and are varitations of the following example:

Writing cd images; ls .. given the above directory structure would list the contents of ~/Documents, not of ~, even though using cd .. changes the current directory to ~, and the prompt, the pwd builtin and many other directory information sources suggest that the current directory is ~/images and its parent is ~. This issue is not possible to fix without either making every single command into a builtin, breaking Unix semantics or implementing kludges in every single command.

This issue can also be seen when doing IO redirection.

Another related issue is that many programs that operate on recursive directory trees, like the find command, silently ignore symlinked directories. For example, find $PWD -name '*.txt' silently fails in shells that don't resolve symlinked paths.


I accidentally entered a directory path and fish changed directory. What happened?

If fish is unable to locate a command with a given name, and it starts with '.', '/' or '~', fish will test if a directory of that name exists. If it does, it is implicitly assumed that you want to change working directory. For example, the fastest way to switch to your home directory is to simply press ~ and enter.


The open command doesn't work.

The open command uses the MIME type database and the .desktop files used by Gnome and KDE to identify filetypes and default actions. If at least one of these environments is installed, but the open command is not working, this probably means that the relevant files are installed in a non-standard location. Consider asking for more help.


How do I make fish my default shell?

If you installed fish manually (e.g. by compiling it, not by using a package manager), you first need to add fish to the list of shells by executing the following command (assuming you installed fish in /usr/local) as root:

echo /usr/local/bin/fish >>/etc/shells

If you installed a prepackaged version of fish, the package manager should have already done this for you.

In order to change your default shell, type:

chsh -s /usr/local/bin/fish

You may need to adjust the above path to e.g. /usr/bin/fish. Use the command which fish if you are unsure of where fish is installed.

Unfortunately, there is no way to make the changes take effect at once. You will need to log out and back in again.


I'm seeing weird output before each prompt when using screen. What's wrong?

Quick answer:

Run the following command in fish:

echo 'function fish_title;end' > ~/.config/fish/config.fish

Problem solved!

The long answer:

Fish is trying to set the titlebar message of your terminal. While screen itself supports this feature, your terminal does not. Unfortunately, when the underlying terminal doesn't support setting the titlebar, screen simply passes through the escape codes and text to the underlying terminal instead of ignoring them. It is impossible detect and resolve this problem from inside fish since fish has no way of knowing what the underlying terminal type is. For now, the only way to fix this is to unset the titlebar message, as suggested above.

Note that fish has a default titlebar message, which will be used if the fish_title function is undefined. So simply unsetting the fish_title function will not work.


How do I change the greeting message?

Change the value of the variable fish_greeting. For example, to remove the greeting use:

set fish_greeting


Why doesn't history substitution ("!$" etc.) work?

Because history substitution is an awkward interface that was invented before interactive line editing was even possible. Fish drops it in favor of perfecting the interactive history recall interface. Switching requires a small change of habits: if you want to modify an old line/word, first recall it, then edit. E.g. don't type "sudo !!" - first press Up, then Home, then type "sudo ".

Fish history recall is very simple yet effective:

  • As in any modern shell, the Up arrow recalls whole lines, starting from the last line executed. A single press replaces "!!", later presses replace "!-3" and the like.
    • If the line you want is far back in the history, type any part of the line and then press Up one or more times. This will constrain the recall to lines that include this text, and you will get to the line you want much faster. This replaces "!vi", "!?bar.c" and the like.
  • Alt+Up recalls individual arguments, starting from the last argument in the last line executed. A single press replaces "!$", later presses replace "!!:4" and the like.
    • If the argument you want is far back in history (e.g. 2 lines back - that's a lot of words!), type any part of it and then press Alt+Up. This will show only arguments containing that part and you will get what you want much faster. Try it out, this is very convenient!
    • If you want to reuse several arguments from the same line ("!!:3*" and the like), consider recalling the whole line and removing what you don't need (Alt+D and Alt+Backspace are your friends).

See documentation for more details about line editing in fish.


Uninstalling fish

Should you wish to uninstall fish, first ensure fish is not set as your shell. Run chsh -s /bin/bash if you are not sure.

Next, do the following (assuming fish was installed to /usr/local):

rm -Rf /usr/local/etc/fish /usr/local/share/fish ~/.config/fish
rm /usr/local/share/man/man1/fish*.1
cd /usr/local/bin
rm -f fish mimedb fish_pager fishd fish_indent

Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/files.html0000644000076500000240000000254212145357602017060 0ustar00peterstaff00000000000000 fish user documentation

File List

Here is a list of all documented files with brief descriptions:
doc.h [code]

Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/index.html0000644000076500000240000024004312145357602017065 0ustar00peterstaff00000000000000 fish user documentation

Fish user documentation

2.0.0

Table of contents

Introduction

This is the documentation for fish, the friendly interactive shell. 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 fish, please visit the fish homepage.

Syntax overview

Shells like fish are used by giving them commands. Every fish command follows the same simple syntax.

A command is executed by writing the name of the command followed by any arguments.

Example:

echo hello world

calls the echo command. echo is a command which will write its arguments to the screen. In the example above, the output will be 'hello world'. Everything in fish is done with commands. There are commands for performing a set of commands multiple times, commands for assigning variables, commands for treating a group of commands as a single command, etc.. And every single command follows the same simple syntax.

If you want to find out more about the echo command used above, read the manual page for the echo command by writing:

man echo

man is a command for displaying a manual page on a given topic. The man command takes the name of the manual page to display as an argument. There are manual pages for almost every command on most computers. There are also manual pages for many other things, such as system libraries and important files.

Every program on your computer can be used as a command in fish. If the program file is located in one of the directories in the PATH, it is sufficient to type the name of the program to use it. Otherwise the whole filename, including the directory (like /home/me/code/checkers/checkers or ../checkers) has to be used.

Here is a list of some useful commands:

  • cd, change the current directory
  • ls, list files and directories
  • man, display a manual page on the screen
  • mv, move (rename) files
  • cp, copy files
  • open, open files with the default application associated with each filetype
  • less, list the contents of files

Commands and parameters are separated by the space character ( ). Every command ends with either a newline (i.e. by pressing the return key) or a semicolon (;). More than one command can be written on the same line by separating them with semicolons.

A switch is a very common special type of argument. Switches almost always start with one or more hyphens (-) and alter the way a command operates. For example, the ls command usually lists all the files and directories in the current working directory, but by using the -l switch, the behavior of ls is changed to not only display the filename, but also the size, permissions, owner and modification time of each file. Switches differ between commands and are documented in the manual page for each command. Some switches are common to most command though, for example '--help' will usually display a help text, '-i' will often turn on interactive prompting before taking action, while '-f' will turn it off.

Quotes

Sometimes features such as parameter expansion and character escapes get in the way. When that happens, the user can write a parameter within quotes, either ' (single quote) or " (double quote). There is one important difference between single quoted and double quoted strings: When using double quoted string, variable expansion still takes place. Other than that, a quoted parameter will not be parameter expanded, may contain spaces, and escape sequences are ignored. The only backslash escape accepted within single quotes is \', which escapes a single quote and \\, which escapes the backslash symbol. The only backslash escapes accepted within double quotes are \", which escapes a double quote, \$, which escapes a dollar character, \ followed by a newline, which deletes the backslash and the newline, and lastly \\, which escapes the backslash symbol. Single quotes have no special meaning within double quotes and vice versa.

Example:

rm "cumbersome filename.txt"

Will remove the file 'cumbersome filename.txt', while

rm cumbersome filename.txt

would remove the two files 'cumbersome' and 'filename.txt'.

Escaping characters

Some characters can not be written directly on the command line. For these characters, so called escape sequences are provided. These are:

  • '\a' escapes the alert character
  • '\b' escapes the backspace character
  • '\e' escapes the escape character
  • '\f' escapes the form feed character
  • '\n' escapes a newline character
  • '\r' escapes the carriage return character
  • '\t' escapes the tab character
  • '\v' escapes the vertical tab character
  • '\ ' escapes the space character
  • '\$' escapes the dollar character
  • '\\' escapes the backslash character
  • '\*' escapes the star character
  • '\?' escapes the question mark character
  • '\~' escapes the tilde character
  • '\%' escapes the percent character
  • '\#' escapes the hash character
  • '\(' escapes the left parenthesis character
  • '\)' escapes the right parenthesis character
  • '\{' escapes the left curly bracket character
  • '\}' escapes the right curly bracket character
  • '\[' escapes the left bracket character
  • '\]' escapes the right bracket character
  • '\<' escapes the less than character
  • '\>' escapes the more than character
  • '\^' escapes the circumflex character
  • '\&' escapes the ampersand character
  • '\;' escapes the semicolon character
  • '\"' escapes the quote character
  • '\'' escapes the apostrophe character
  • '\xxx', where xx is a hexadecimal number, escapes the ascii character with the specified value. For example, \x9 is the tab character.
  • '\Xxx', where xx 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.
  • '\ooo', where ooo is an octal number, escapes the ascii character with the specified value. For example, \011 is the tab character.
  • '\uxxxx', where xxxx is a hexadecimal number, escapes the 16-bit Unicode character with the specified value. For example, \u9 is the tab character.
  • '\Uxxxxxxxx', where xxxxxxxx is a hexadecimal number, escapes the 32-bit Unicode character with the specified value. For example, \U9 is the tab character.
  • '\cx', where x is a letter of the alphabet, escapes the control sequence generated by pressing the control key and the specified letter. For example, \ci is the tab character

Input/Output (IO) redirection

Most programs use three input/output (IO) streams, each represented by a number called a file descriptor (FD). These are:

  • Standard input, FD 0, for reading, defaults to reading from the keyboard.
  • 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 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 its default through a simple mechanism called a redirection.

An example of a file redirection is echo hello >output.txt, which directs the output of the echo command to the file output.txt.

  • To redirect standard input, write <SOURCE_FILE
  • To redirect standard output, write >DESTINATION
  • To redirect standard error, write ^DESTINATION
  • To redirect standard output to a file which will be appended, write >>DESTINATION_FILE
  • To redirect standard error to a file which will be appended, write ^^DESTINATION_FILE

DESTINATION 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.
  • 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 echo Hello >all_output.txt ^&1.

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 N<DESTINATION
  • To redirect output of FD number N, write N>DESTINATION
  • To redirect output of FD number N to a file which will be appended, write N>>DESTINATION_FILE

Example: echo Hello 2>- and echo Hello ^- are equivalent.

Piping

The user can string together multiple commands into a so called 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

cat foo.txt | head

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 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 man cat.

Pipes usually connect file descriptor 1 (standard output) of the first process to file descriptor 0 (standard input) of the second 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:

make fish 2>|less

will attempt to build the fish program, and any errors will be shown using the less pager.

Background jobs

When you start a job in fish, fish itself will pause, and give control of the terminal to the program just started. Sometimes, you want to continue using the commandline, and have the job run in the background. To create a background job, append an & (ampersand) to your command. This will tell fish to run the job in the background. Background jobs are very useful when running programs that have a graphical user interface.

Example:

emacs &

will start the emacs text editor in the background.

Job control

Most programs allow you to suspend the program's execution and return control to fish by pressing ^Z (press and hold the Control key and press 'z'). Once back at the fish commandline, you can start other programs and do anything you want. If you then want you can go back to the suspended command by using the fg (foreground) command.

If you instead want to put a suspended job into the background, use the bg command.

To get a listing of all currently started jobs, use the jobs command.

Functions

Functions are programs written in the fish syntax. They group together one or more commands and their arguments using a single name. It can also be used to start a specific command with additional arguments.

For example, the following is a function definition that calls the command ls with the argument '-l' to print a detailed listing of the contents of the current directory:

function ll
	ls -l $argv
end

The first line tells fish that a function by the name of ll is to be defined. To use it, simply write ll on the commandline. The second line tells fish that the command ls -l $argv should be called when ll is invoked. $argv is an array variable, which always contains all arguments sent to the function. In the example above, these are simply passed on to the ls command. For more information on functions, see the documentation for the function builtin.

Defining aliases

One of the most common uses for functions is to slightly alter the behavior of an already existing command. For example, one might want to redefine the ls command to display colors. The switch for turning on colors on GNU systems is '--color=auto'. An alias, or wrapper, around ls might look like this:

function ls
	command ls --color=auto $argv
end

There are a few important things that need to be noted about aliases:

  • Always take care to add the $argv variable to the list of parameters to the wrapped command. This makes sure that if the user specifies any additional parameters to the function, they are passed on to the underlying command.
  • If the alias has the same name as the aliased command, it is necessary to prefix the call to the program with command in order to tell fish that the function should not call itself, but rather a command with the same name. Failing to do so will cause infinite recursion bugs.

To easily create a function of this form, you can use the alias command.

Autoloading functions

Functions can be defined on the commandline or in a configuration file, but they can also be automatically loaded. This method of defining functions has several advantages. An autoloaded function becomes available automatically to all running shells. If the function definition is changed, all running shells will automatically reload the altered version. Startup time and memory usage is improved, etc.

Fish automatically searches through any directories in the array variable $fish_function_path, and any functions defined are automatically loaded when needed. A function definition file must have a filename consisting of the name of the function plus the suffix '.fish'.

The default value for $fish_function_path is ~/.config/fish/functions /etc/fish/functions /usr/share/fish/functions. The exact path to the last two of these may be slightly different depending on what install path prefix was chosen at configuration time. The rationale behind having three different directories is that the first one is for user specific functions, the second one is for system-wide additional functions and the last one is for default fish functions. The path list is searched in order, meaning that by default, the system administrator can override default fish functions, and the user can override functions defined by the system administrator.

It is very important that function definition files only contain the definition for the specified function and nothing else. Otherwise, it is possible that autoloading a function files requires that the function already be loaded, which creates a circular dependency.

Conditional execution of code and flow control

There are four fish builtins that let you execute commands only if a specific criterion is met. These builtins are if, switch, and and or.

The switch command is used to execute one of possibly many blocks of commands depending on the value of a string. See the documentation for switch for more information.

The other conditionals use the exit status of a command to decide if a command or a block of commands should be executed. See the documentation for if, and and or for more information.

Some common words

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 in the shell. Builtins are commands that are so closely tied to the shell that it is impossible to implement them as external commands.
  • command, a program that the shell can run.
  • function, a block of commands that can be called as if they where 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
  • pipeline, a set of commands stringed together so that the output of one command is the input of the next command
  • redirection, a operation that changes one of the input/output streams associated with a job
  • switch, a special flag sent as an argument to a command that will alter the behavior of the command. A switch almost always begins with one or two hyphens.

help - display fish documentation

fish has an extensive help system. Use the help command to obtain help on a specific subject or command. For instance, writing help syntax displays the syntax section of this documentation.

fish also has man pages for its commands. For example, man set will show the documentation for set as a man page.

Help on a specific builtin can also be obtained with the -h parameter. For instance, to obtain help on the fg builtin, either type fg -h or help fg.

Tab completion

Tab completion is one of the most time saving features of any modern shell. By tapping the tab key, the user asks fish to guess the rest of the command or parameter that the user is currently typing. If fish can only find one possible completion, fish will write it out. If there is more than one completion, fish will write out the longest prefix that all completions have in common. If the completions differ on the first character, a list of all possible completions is printed. The list features descriptions of the completions and if the list doesn't fit the screen, it is scrollable by using the arrow keys, the page up/page down keys, the tab key or the space bar. Pressing any other key will exit the list and insert the pressed key into the command line.

These are the general purpose tab completions that fish provides:

  • Completion of commands (builtins, functions and regular programs).
  • Completion of environment variable names.
  • Completion of usernames for tilde expansion.
  • Completion of filenames, even on strings with wildcards such as '*', '**' and '?'.
  • Completion of job ID, job name and process names for process expansion.

fish provides a large number of program specific completions. Most of these completions are simple options like the -l option for ls, but some are more advanced. The latter include:

  • The programs man and whatis show all installed manual pages as completions.
  • The make program uses all targets in the Makefile in the current directory as completions.
  • The mount command uses all mount points specified in fstab as completions.
  • The ssh command uses all hosts that are stored in the known_hosts file as completions. (See the ssh documentation for more information)
  • The su command uses all users on the system as completions.
  • The apt-get, rpm and yum commands use all installed packages as completions.

Writing your own completions

Specifying your own completions is not difficult. To specify a completion, use the complete command. complete takes as a parameter the name of the command to specify a completion for. For example, to add a completion for the program myprog, one would start the completion command with complete -c myprog .... To provide a list of possible completions for myprog, use the -a switch. If myprog accepts the arguments start and stop, this can be specified as complete -c myprog -a 'start stop'. The argument to the -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.

Fish has a special syntax to support specifying switches accepted by a command. The switches -s, -l and -o are used to specify a short switch (single character, such as -l), a gnu style long switch (such as --color) and an old-style long switch (like -shuffle), 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:

complete -c myprog -s o -l output -a "yes no"

There are also special switches for specifying that a switch requires an argument, to disable filename completion, to create completions that are only available in some combinations, etc.. For a complete description of the various switches accepted by the complete command, see the documentation for the complete builtin, or write 'complete --help' inside the fish shell.

For examples of how to write your own complex completions, study the completions in /usr/share/fish/completions. (The exact path depends on your chosen installation prefix and may be slightly different)

Useful functions for writing completions

Fish ships with several functions that are very useful when writing command specific completions. Most of these functions name begins with the string '__fish_'. Such functions are internal to fish and their name and interface may change in future fish versions. Still, some of them may be very useful when writing completions. A few of these functions are described here. Be aware that they may be removed or changed in future versions of fish.

Functions beginning with the string '__fish_print_' print a newline-separated list of strings. For example, __fish_print_filesystems prints a list of all known file systems. Functions beginning with '__fish_complete_' print out a newline separated list of completions with descriptions. The description is separated from the completion by a tab character.

__fish_complete_directories STRING DESCRIPTION

performs path completion on STRING, allowing only directories, and giving them the description DESCRIPTION.

__fish_complete_groups

prints a list of all user groups with the groups members as description.

__fish_complete_pids

prints a list of all processes IDs with the command name as description.

__fish_complete_suffix SUFFIX

performs file completion allowing only files ending in SUFFIX. The mimetype database is used to find a suitable description.

__fish_complete_users

prints a list of all users with their full name as description.

__fish_print_filesystems

prints a list of all known file systems. Currently, this is a static list, and not dependent on what file systems the host operating system actually understands.

__fish_print_hostnames

prints a list of all known hostnames. This functions searches the fstab for nfs servers, ssh for known hosts and checks the /etc/hosts file.

__fish_print_interfaces

prints a list of all known network interfaces.

__fish_print_packages

prints a list of all installed packages. This function currently handles Debian, rpm and Gentoo packages.

Where to put completions

Completions can be defined on the commandline or in a configuration file, but they can also be automatically loaded. Fish automatically searches through any directories in the array variable $fish_complete_path, and any completions defined are automatically loaded when needed. A completion file must have a filename consisting of the name of the command to complete and the suffix '.fish'.

The default value for $fish_complete_path is ~/.config/fish/completions /etc/fish/completions /usr/share/fish/completions. The exact path to the last two of these may be slightly different depending on what install path prefix was chosen at configuration time. If a suitable file is found in one of these directories, it will be automatically loaded and the search will be stopped. The rationale behind having three different directories is that the first one is for user specific completions, the second one is for system-wide completions and the last one is for default fish completions.

If you have written new completions for a common Unix command, please consider sharing your work by submitting it via the instructions in Further help and development.

Parameter expansion (Globbing)

When an argument for a program is given on the commandline, it undergoes the process of parameter expansion before it is sent on to the command. Parameter expansion is a powerful mechanism that allows you to expand the parameter in various ways, including performing wildcard matching on files, inserting the value of environment variables into the parameter or even using the output of another command as a parameter list.

Wildcards

If a star (*) or a question mark (?) is present in the parameter, fish attempts to match the given parameter to any files in such a way that:

  • '?' can match any single character except '/'.
  • '*' can match any string of characters not containing '/'. This includes matching an empty string.
  • '**' matches any string of characters. This includes matching an empty string. The string may include the '/' character but does not need to.

Wildcard matches are sorted case insensitively. When sorting matches containing numbers, consecutive digits are considered to be one element, so that the strings '1' '5' and '12' would be sorted in the order given.

File names beginning with a dot are not considered when wildcarding unless a dot is specifically given as the first character of the file name.

Examples:

a* matches any files beginning with an 'a' in the current directory.

??? matches any file in the current directory whose name is exactly three characters long.

** matches any files and directories in the current directory and all of its subdirectories.

Note that if no matches are found for a specific wildcard, it will expand into zero arguments, i.e. to nothing. If none of the wildcarded arguments sent to a command result in any matches, the command will not be executed. If this happens when using the shell interactively, a warning will also be printed.

Command substitution

The output of a series of commands can be used as the parameters to another command. If a parameter contains a set of parenthesis, the text enclosed by the parenthesis will be interpreted as a list of commands. On expansion, this list is executed, and substituted by the output. If the output is more than one line long, each line will be expanded to a new parameter.

The exit status of the last run command substitution is available in the status variable.

Only part of the output can be used, see index range expansion for details.

Examples:

The command echo (basename image.jpg .jpg).png will output 'image.png'.

The command for i in *.jpg; convert $i (basename $i .jpg).png; end will convert all JPEG files in the current directory to the PNG format using the convert program.

Brace expansion

A comma separated list of characters enclosed in curly braces will be expanded so each element of the list becomes a new parameter.

Example:

echo input.{c,h,txt} outputs 'input.c input.h input.txt'

The command mv *.{c,h} src/ moves all files with the suffix '.c' or '.h' to the subdirectory src.

Variable expansion

A dollar sign followed by a string of characters is expanded into the value of the environment variable with the same name. For an introduction to the concept of environment variables, read the Environment variables section.

Undefined and empty variables expand to nothing.

To separate a variable name from text it should immediately be followed by, encase the variable within braces.

Examples:

echo $HOME prints the home directory of the current user.

echo $nonexistentvariable prints no output.

echo The plural of $WORD is {$WORD}s prints "The plural of cat is cats" when $WORD is set to cat. Note that without the braces, fish will try to expand a variable called $WORDs, which may not exist.

The latter syntax works by exploiting brace expansion; care should be taken with array variables and undefined variables, as these behave very differently to POSIX shells.

Variable expansion is the only type of expansion performed on double quoted strings. There is, however, an important difference in how variables are expanded when quoted and when unquoted. An unquoted variable expansion will result in a variable number of arguments. For example, if the variable $foo has zero elements or is undefined, the argument $foo will expand to zero elements. If the variable $foo is an array of five elements, the argument $foo will expand to five elements. When quoted, like "$foo", a variable expansion will always result in exactly one argument. Undefined variables will expand to the empty string, and array variables will be concatenated using the space character. The dangers noted in the third example above can therefore be avoided by wrapping the variable in double quotes (echo {"$WORD"}s).

There is one further notable feature of fish variable expansion. Consider the following code snippet:

set foo a b c
set a 10; set b 20; set c 30
for i in (seq (count $$foo))
	echo $$foo[$i]
end
# Output is:
# 10
# 20
# 30

The above code demonstrates how to use multiple '$' symbols to expand the value of a variable as a variable name. One can think of the $ symbol as a variable dereference operator. When using this feature together with array brackets, the brackets will always match the innermost $ dereference. Thus, $$foo[5] will always mean the fifth element of the foo variable should be dereferenced, not the fifth element of the doubly dereferenced variable foo. The latter can instead be expressed as $$foo[1][5].

Index range expansion

Both command substitution and environment variables support accessing only specific items by providing a set of indices in square brackets. It's often needed to access a sequence of elements. To do this, use the range operator '..' for this. A range 'a..b', where range limits 'a' and 'b' are integer numbers, is expanded into a sequence of indices 'a a+1 a+2 ... b' or 'a a-1 a-2 ... b' depending on which of 'a' or 'b' is higher. The negative range limits are calculated from the end of the array or command substitution.

Some examples:

# Limit the command substitution output
echo (seq 10)[2..5] # will use elements from 2 to 5
# Output is:
# 2 3 4 5

# Use overlapping ranges:
echo (seq 10)[2..5 1..3] # will take elements from 2 to 5 and then elements from 1 to 3 
# Output is:
# 2 3 4 5 1 2 3

# Reverse output
echo (seq 10)[-1..1] # will use elements from the last output line to the first one in reverse direction
# Output is:
# 10 9 8 7 6 5 4 3 2 1

The same works when setting or expanding variables:

# Reverse path variable
set PATH $PATH[-1..1]
# or 
set PATH[-1..1] $PATH

# Use only n last items of the PATH
set n -3
echo $PATH[$n..-1]

Note that variables can be used as indices for expansion of variables, but not command substitution.

Home directory expansion

The ~ (tilde) character at the beginning of a parameter, followed by a username, is expanded into the home directory of the specified user. A lone ~, or a ~ followed by a slash, is expanded into the home directory of the process owner.

Process expansion

The % (percent) character at the beginning of a parameter followed by a string is expanded into a process ID (PID). The following expansions are performed:

  • If the string is the entire word self, the shell's PID is the result.
  • Otherwise, if the string is the ID of a job, the result is the process group ID of the job.
  • Otherwise, if any child processes match the specified string, their PIDs are the result of the expansion.
  • Otherwise, if any processes owned by the user match the specified string, their PIDs are the result of the expansion.
  • If none of these matches apply, an error is produced.

This form of expansion is useful for commands like kill and fg, which take process IDs as arguments.

Example:

fg %ema will search for a process whose command line begins with the letters 'ema', such as emacs, and if found, put it in the foreground.

kill -s SIGINT %3 will send the SIGINT signal to the job with job ID 3.

Combining different expansions

All of the above expansions can be combined. If several expansions result in more than one parameter, all possible combinations are created.

When combining multiple parameter expansions, expansions are performed in the following order:

  • Command substitutions
  • Variable expansions
  • Bracket expansion
  • Pid expansion
  • Wildcard expansion

Expansions are performed from right to left, nested bracket expansions are performed from the inside and out.

Example:

If the current directory contains the files 'foo' and 'bar', the command echo a(ls){1,2,3} will output 'abar1 abar2 abar3 afoo1 afoo2 afoo3'.

Environment variables

Environment variables are named pieces of data, which can be created, deleted and their values changed and used by the user.

To set a variable value, use the set command.

Example:

To set the variable smurf_color to the value blue, use the command set smurf_color blue.

After a variable has been set, you can use the value of a variable in the shell through variable expansion.

Example:

To use the value of the variable smurf, write $ (dollar symbol) followed by the name of the variable, like echo Smurfs are usually $smurf_color, which would print the result 'Smurfs are usually blue'.

Variable scope

There are three kinds of variables in fish: universal, global and 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 set -e. 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 begins with one of the commands for, while , if, function, begin or switch, and ends with the command end. The user can specify that a variable should have either global or local scope using the -g/--global or -l/--local switches.

Variables can be explicitly set to be universal with the -U or --universal switch, global with the -g or --global switch, or local with the -l or --local switch. The scoping rules when creating or updating a variable are:

  1. If a variable is explicitly set to either universal, global or local, that setting will be honored. If a variable of the same name exists in a different scope, that variable will not be changed.
  2. If a variable is not explicitly set to be either universal, global or local, but has been previously defined, the variable scope is not changed.
  3. If a variable is not explicitly set to be either universal, global or local and has never before been defined, the variable will be local to the currently executing function. Note that this is different from using the -l or --local flag. If one of those flags is used, the variable will be local to the most inner currently executing block, while without these the variable will be local to the function. If no function is executing, the variable will be global.

There may be many variables with the same name, but different scopes. When using a variable, the variable scope will be searched from the inside out, i.e. a local variable will be used rather than a global variable with the same name, a global variable will be used rather than a universal variable with the same name.

Example:

The following code will not output anything:

begin
	# This is a nice local scope where all variables will die
	set -l pirate 'There be treasure in them thar hills'
end

# This will not output anything, since the pirate was local
echo $pirate

More on universal variables

Universal variables are variables that are shared between all the users fish sessions on the computer. Fish stores many of its configuration options as universal variables. This means that in order to change fish settings, all you have to do is change the variable 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 set fish_color_cwd blue. Since 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.

Variable scope for functions

When calling a function, all current local variables temporarily disappear. This shadowing of the local scope is needed since the variable namespace would become cluttered, making it very easy to accidentally overwrite variables from another function.

For example, the following code will output 'Avast, mateys':

function shiver
	set phrase 'Shiver me timbers'
end

function avast
	set phrase 'Avast, mateys'

	# Calling the shiver function here can not change any variables
	# in the local scope
	shiver

	echo $phrase
end

avast

Exporting variables

Variables in fish can be exported. This means the variable will be inherited by any commands started by fish. It is convention that exported variables are in uppercase and unexported variables are in lowercase.

Variables can be explicitly set to be exported with the -x or --export switch, or not exported with the -u or --unexport switch. The exporting rules when creating or updating a variable are identical to the scoping rules for variables:

  1. If a variable is explicitly set to either be exported or not exported, that setting will be honored.
  2. If a variable is not explicitly set to be exported or not exported, but has been previously defined, the previous exporting rule for the variable is kept.
  3. If a variable is not explicitly set to be either exported or not exported and has never before been defined, the variable will not be exported.

Arrays

fish can store a list of multiple strings inside of a variable. To access one element of an array, use the index of the element inside of square brackets, like this:

echo $PATH[3]

Note that array indices start at 1 in fish, not 0, as is more common in other languages. This is because many common Unix tools like seq are more suited to such use.

If you do not use any brackets, all the elements of the array will be written as separate items. This means you can easily iterate over an array using this syntax:

for i in $PATH; echo $i is in the path; end

To create a variable smurf, containing the items blue and small, simply write:

set smurf blue small

It is also possible to set or erase individual elements of an array:

#Set smurf to be an array with the elements 'blue' and 'small'
set smurf blue small

#Change the second element of smurf to 'evil'
set smurf[2] evil

#Erase the first element
set -e smurf[1]

#Output 'evil'
echo $smurf

If you specify a negative index when expanding or assigning to an array variable, the index will be calculated from the end of the array. For example, the index -1 means the last index of an array.

A range of indices can be specified, see index range expansion for details.

All arrays are one-dimensional and cannot contain other arrays, although it is possible to fake nested arrays using the dereferencing rules of variable expansion.

Special variables

The user can change the settings of fish by changing the values of certain environment variables.

  • BROWSER, the user's preferred web browser. If this variable is set, fish will use the specified browser instead of the system default browser to display the fish documentation.
  • CDPATH, an array of directories in which to search for the new directory for the cd builtin. By default, the fish configuration defines CDPATH to be a universal variable with the values . and ~.
  • A large number of variable starting with the prefixes fish_color and fish_pager_color. See Variables for changing highlighting colors for more information.
  • fish_greeting, the greeting message printed on startup.
  • LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC and LC_TIME set the language option for the shell and subprograms. See the section Locale variables for more information.
  • fish_user_paths, an array of directories that are appended to PATH. This can be a universal variable.
  • PATH, an array of directories in which to search for commands
  • umask, the current file creation mask. The preferred way to change the umask variable is through the umask function. An attempt to set umask to an invalid value will always fail.

fish also sends additional information to the user through the values of certain environment variables. The user cannot change the values of most of these variables.

  • _, the name of the currently running command.
  • argv, an array of arguments to the shell or function. argv is only defined when inside a function call, or if fish was invoked with a list of arguments, like 'fish myscript.fish foo bar'. This variable can be changed by the user.
  • history, an array containing the last commands that were entered.
  • HOME, the user's home directory. This variable can only be changed by the root user.
  • PWD, the current working directory.
  • status, the exit status of the last foreground job to exit. If the job was terminated through a signal, the exit status will be 128 plus the signal number.
  • USER, the current username. This variable can only be changed by the root user.

The names of these variables are mostly derived from the csh family of shells and differ from the ones used by Bourne style shells such as bash.

Variables whose name are in uppercase are exported to the commands started by fish, while those in lowercase are not exported. This rule is not enforced by fish, but it is good coding practice to use casing to distinguish between exported and unexported variables. fish also uses several variables internally. Such variables are prefixed with the string __FISH or __fish. These should never be used by the user. Changing their value may break fish.

The status variable

Whenever a process exits, an exit status is returned to the program that started it (usually the shell). This exit status is an integer number, which tells the calling application how the execution of the command went. In general, a zero exit status means that the command executed without problem, but a non-zero exit status means there was some form of problem.

Fish stores the exit status of the last process in the last job to exit in the status variable.

If fish encounters a problem while executing a command, the status variable may also be set to a specific value:

  • 1 is the generally the exit status from fish builtin commands if they were supplied with invalid arguments
  • 124 means that the command was not executed because none of the wildcards in the command produced any matches
  • 125 means that while an executable with the specified name was located, the operating system could not actually execute the command
  • 126 means that while a file with the specified name was located, it was not executable
  • 127 means that no function, builtin or command with the given name could be located

If a process exits through a signal, the exit status will be 128 plus the number of the signal.

Variables for changing highlighting colors

The colors used by fish for syntax highlighting can be configured by changing the values of a various variables. The value of these variables can be one of the colors accepted by the set_color command. The --bold or -b switches accepted by set_color are also accepted.

The following variables are available to change the highlighting colors in fish:

  • fish_color_normal, the default color
  • fish_color_command, the color for commands
  • fish_color_quote, the color for quoted blocks of text
  • fish_color_redirection, the color for IO redirections
  • fish_color_end, the color for process separators like ';' and '&'
  • fish_color_error, the color used to highlight potential errors
  • fish_color_param, the color for regular command parameters
  • fish_color_comment, the color used for code comments
  • fish_color_match, the color used to highlight matching parenthesis
  • fish_color_search_match, the color used to highlight history search matches
  • fish_color_operator, the color for parameter expansion operators like '*' and '~'
  • fish_color_escape, the color used to highlight character escapes like '\n' and '\x70'
  • fish_color_cwd, the color used for the current working directory in the default prompt

Additionally, the following variables are available to change the highlighting in the completion pager:

  • fish_pager_color_prefix, the color of the prefix string, i.e. the string that is to be completed
  • fish_pager_color_completion, the color of the completion itself
  • fish_pager_color_description, the color of the completion description
  • fish_pager_color_progress, the color of the progress bar at the bottom left corner
  • fish_pager_color_secondary, the background color of the every second completion

Example:

To make errors highlighted and red, use:

set fish_color_error red --bold

Locale variables

The most common way to set the locale to use a command like 'set -x LANG en_GB.utf8', which sets the current locale to be the English language, as used in Great Britain, using the UTF-8 character set. For a list of available locales, use 'locale -a'.

LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC and LC_TIME set the language option for the shell and subprograms. These variables work as follows: LC_ALL forces all the aspects of the locale to the specified value. If LC_ALL is set, all other locale variables will be ignored. The other LC_ variables set the specified aspect of the locale information. LANG is a fallback value, it will be used if none of the LC_ variables are specified.

Builtin commands

Many other shells have a large library of builtin commands. Most of these commands are also available as standalone commands, but have been implemented in the shell anyway. To avoid code duplication, and to avoid the confusion of subtly differing versions of the same command, fish generally only implements builtins for actions which cannot be performed by a regular command.

For a list of all builtins, functions and commands shipped with fish, see the table of contents. The documentation is also available by using the --help switch of the command.

Command line editor

The fish editor features copy and paste, a searchable history and many editor functions that can be bound to special keyboard shortcuts.

Here are some of the commands available in the editor:

  • Tab completes the current token
  • Home or Ctrl-A moves to the beginning of the line
  • End or Ctrl-E moves to the end of line
  • Left and Right moves one character left or right
  • Alt-Left and Alt-Right moves one word left or right, or moves forward/backward in the directory history if the commandline is empty
  • Up and Down search the command history for the previous/next command containing the string that was specified on the commandline before the search was started. If the commandline was empty when the search started, all commands match. See the history section for more information on history searching.
  • Alt-Up and Alt-Down search the command history for the previous/next token containing the token under the cursor before the search was started. If the commandline was not on a token when the search started, all tokens match. See the history section for more information on history searching.
  • Delete and Backspace removes one character forwards or backwards respectively
  • Ctrl-C deletes entire line
  • Ctrl-D delete one character to the right of the cursor, unless the buffer is empty, in which case the shell will exit
  • Ctrl-K moves contents from the cursor to the end of line to the killring
  • Ctrl-U moves contents from the beginning of line to the cursor to the killring
  • Ctrl-L clears and repaints the screen
  • Ctrl-W moves the previous word to the killring
  • Alt-D moves the next word to the killring
  • Alt-W prints a short description of the command under the cursor
  • Alt-L lists the contents of the current directory, unless the cursor is over a directory argument, in which case the contents of that directory will be listed
  • Alt-P adds the string '| less;' to the end of the job under the cursor. The result is that the output of the command will be paged.

You can change these key bindings using the bind builtin command.

  • backward-char, moves one character to the left
  • backward-delete-char, deletes one character of input to the left of the cursor
  • backward-kill-line, move everything from the beginning of the line to the cursor to the killring
  • backward-kill-word, move the word to the left of the cursor to the killring
  • backward-word, move one word to the left
  • beginning-of-history, move to the beginning of the history
  • beginning-of-line, move to the beginning of the line
  • complete, guess the remainder of the current token
  • delete-char, delete one character to the right of the cursor
  • delete-line, delete the entire line
  • dump-functions, print a list of all key-bindings
  • end-of-history, move to the end of the history
  • end-of-line, move to the end of the line
  • explain, print a description of possible problems with the current command
  • forward-char, move one character to the right
  • forward-word, move one word to the right
  • history-search-backward, search the history for the previous match
  • history-search-forward, search the history for the next match
  • kill-line, move everything from the cursor to the end of the line to the killring
  • kill-whole-line, move the line to the killring
  • kill-word, move the next word to the killring
  • yank, insert the latest entry of the killring into the buffer
  • yank-pop, rotate to the previous entry of the killring

If such a script produces output, the script needs to finish by calling 'commandline -f repaint' in order to tell fish that a repaint is in order.

Copy and paste (Kill Ring)

fish uses an Emacs style kill ring for copy and paste functionality. Use Ctrl-K to cut from the current cursor position to the end of the line. The string that is cut (a.k.a. killed) is inserted into a linked list of kills, called the kill ring. To paste the latest value from the kill ring use Ctrl-Y. After pasting, use Meta-Y to rotate to the previous kill.

If the environment variable DISPLAY is set and the xsel program is installed, fish will try to connect to the X Windows server specified by this variable, and use the clipboard on the X server for copying and pasting.

history - Show and manipulate command history

After a command has been entered, it is inserted at the end of a history list. Any duplicate history items are automatically removed. By pressing the up and down keys, the user can search forwards and backwards in the history. If the current command line is not empty when starting a history search, only the commands containing the string entered into the command line are shown.

By pressing Alt-Up and Alt-Down, a history search is also performed, but instead of searching for a complete commandline, each commandline is broken into separate elements just like it would be before execution, and the history is searched for an element matching that under the cursor.

History searches can be aborted by pressing the escape key.

Prefixing the commandline with a space will prevent the entire line from being stored in the history.

The history is stored in the file ~/.config/fish/fish_history.

Examples:

To search for previous entries containing the word 'make', type 'make' in the console and press the up key.

If the commandline reads 'cd m', place the cursor over the m character and press Alt-Up to search for previously typed words containing 'm'.

Multiline editing

The fish commandline editor can be used to work on commands that are several lines long. There are three ways to make a command span more than a single line:

  • Pressing the Enter key while a block of commands is unclosed, such as when one or more block commands such as 'for', 'begin' or 'if' do not have a corresponding 'end' command.
  • Pressing Alt-Enter instead of pressing the Enter key.
  • By inserting a backslash (\) character before pressing the Enter key, escaping the newline.

The fish commandline editor works exactly the same in single line mode and in multiline mode. To move between lines use the left and right arrow keys and other such keyboard shortcuts.

Running multiple programs

Normally when fish starts a program, this program will be put in the foreground, meaning it will take control of the terminal and 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 fish's behavior.

  1. By ending a command with the & (ampersand) symbol, the user tells fish to put the specified command into the background. A background process will be run simultaneous with fish. fish will retain control of the terminal, so the program will not be able to read from the keyboard.
  2. By pressing ^Z, the user stops a currently running foreground program and returns control to fish. Some programs do not support this feature, or remap it to another key. GNU Emacs uses ^X z to stop running.
  3. By using the fg and bg builtin commands, the user can send any currently running job into the foreground or background.

Note that functions cannot be started in the background. Functions that are stopped and then restarted in the background using the bg command will not execute correctly.

Initialization files

On startup, fish evaluates the files /usr/share/fish/config.fish (Or /usr/local/fish... if you installed fish in /usr/local), /etc/fish/config.fish (Or ~/etc/fish/... if you installed fish in your home directory) and ~/.config/fish/config.fish (Or any other directory specified by the $XDG_CONFIG_HOME variable), in that order. The first file should not be directly edited, the second one is meant for systemwide configuration and the last one is meant for user configuration. 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 when using a login shell, use 'status --is-login' instead.

Examples:

If you want to add the directory ~/linux/bin to your PATH variable when using a login shell, add the following to your ~/.config/fish/config.fish file:

if status --is-login
	set PATH $PATH ~/linux/bin
end

If you want to run a set of commands when fish exits, use an event handler that is triggered by the exit of the shell:

function on_exit --on-process %self
	echo fish is now exiting
end

Universal variables are stored in the file .config/fish/fishd.MACHINE_ID, where MACHINE_ID is typically your MAC address. Do not edit this file directly, as your edits may be overwritten. Edit them through fish scripts or by using fish interactively instead.

Other features

Syntax highlighting

fish interprets the command line as it is typed and uses syntax highlighting to provide feedback to the user. The most important feedback is the detection of potential errors. By default, errors are marked red.

Detected errors include:

  • Non existing commands.
  • Reading from or appending to a non existing file.
  • Incorrect use of output redirects
  • Mismatched parenthesis

When the cursor is over a parenthesis or a quote, fish also highlights its matching quote or parenthesis.

To customize the syntax highlighting, you can set the environment variables fish_color_normal, fish_color_command, fish_color_substitution, fish_color_redirection, fish_color_end, fish_color_error, fish_color_param, fish_color_comment, fish_color_match, fish_color_search_match, fish_color_cwd, fish_pager_color_prefix, fish_pager_color_completion, fish_pager_color_description, fish_pager_color_progress and fish_pager_color_secondary. Usually, the value of these variables will be one of black, red, green, brown, yellow, blue, magenta, purple, cyan, white or normal, but they can be an array containing any color options for the set_color command.

Issuing set fish_color_error black --background=red --bold will make all commandline errors be written in a black, bold font, with a red background.

Programmable title

When using most virtual terminals, it is possible to set the message displayed in the titlebar of the terminal window. This can be done automatically in fish by defining the fish_title function. The fish_title function is executed before and after a new command is executed or put into the foreground and the output is used as a titlebar message. The $_ environment variable will always contain the name of the job to be put into the foreground (Or 'fish' if control is returning to the shell) when the fish_prompt function is called.

Example:

The default fish title is

function fish_title
	echo $_ ' '
	pwd
end

Configurable greeting

If a function named fish_greeting exists after initialization, it will be run when entering interactive mode. Otherwise,if an environment variable named fish_greeting exists, it will be printed.

Event handlers

When defining a new function in fish, it is possible to make it into an event handler, i.e. a function that is automatically run when a specific event takes place. Events that can trigger a handler currently are:

  • When a signal is delivered
  • When a process or job exits
  • When the value of a variable is updated
  • When the prompt is about to be shown
  • When a command lookup fails

Example:

To specify a signal handler for the WINCH signal, write:

function --on-signal WINCH my_signal_handler
	echo Got WINCH signal!
end

For more information on how to define new event handlers, see the documentation for the function command.

Debugging fish scripts

Fish includes a built in debugger. The debugger allows you to stop execution of a script at an arbitrary point and launch a prompt. This prompt can then be used to check or change the value of any variables or perform any shellscript command. To resume normal execution of the script, simply exit the prompt.

To start the debugger, simply call the builtin command 'breakpoint'. The default action of the TRAP signal is to call this builtin, so a running script can be debugged by sending it the TRAP signal. Once in the debugger, it is easy to insert new breakpoints by using the funced function to edit the definition of a function.

Common issues with fish

If you install fish in your home directory, fish will not work correctly for any other user than yourself. This is because fish needs its initialization files to function properly. To solve this problem, either copy the initialization files to each fish users home directory, or install them in /etc.

Translating fish to other languages

Fish uses the GNU gettext library to implement translation to multiple languages. If fish is not available in your language, please consider making a translation. Currently, only the shell itself can be translated, a future version of fish should also include translated manuals.

To make a translation of fish, you will first need the source code, available from the fish homepage. Download the latest version, and then extract it using a command like tar -zxf fish-VERSION.tar.gz.

Next, cd into the newly created fish directory using cd fish-VERSION.

You will now need to configure the source code using the command ./configure. This step might take a while.

Before you continue, you will need to know the ISO 639 language code of the language you are translating to. These codes can be found here. For example, the language code for Uighur is ug.

Now you have the source code and it is properly configured. Lets start translating. To do this, first create an empty translation table for the language you wish to translate to by writing make po/[LANGUAGE CODE].po in the fish terminal. For example, if you are translating to Uighur, you should write make po/ug.po. This should create the file po/ug.po, a template translation table containing all the strings that need to be translated.

Now you are all set up to translate fish to a new language. Open the newly created .po file in your editor of choice, and start translating. The .po file format is rather simple. It contains pairs of string in a format like:

msgid "%ls: No suitable job\n"
msgstr ""

The first line is the English string to translate, the second line should contain your translation. For example, in Swedish the above might become:

msgid "%ls: No suitable job\n"
msgstr "%ls: Inget passande jobb\n"

%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 are ways to avoid this, but they are too complicated for this short introduction. See the full manual for the printf C function for more information.)

Once you have provided a translation for fish, please submit it via the instructions in Further help and development.

Further help and development

If you have a question not answered by this documentation, there are several avenues for help:

  1. The official mailing list at fish-users@lists.sf.net
  2. The Internet Relay Chat channel, fish on irc.oftc.net
  3. The project GitHub page

If you have an improvement for fish, you can submit it via the mailing list or the GitHub page.


Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/license.html0000644000076500000240000016367512145357602017417 0ustar00peterstaff00000000000000 fish user documentation

Licenses

License for fish

Fish Copyright (C) 2005-2009 Axel Liljencrantz. Fish is released under the GNU General Public License, version 2. The license agreement is included below.

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6.

Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.


License for wcslcat and wcslcpy

fish also contains small amounts of code under the BSD license, namely versions of the two functions strlcat and strlcpy, modified for use with wide character strings. This code is copyrighted by Todd C. Miller.

Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.


License for XSel

The XSel command, written and copyrighted by Conrad Parker, is distributed together with fish.

It is Copyright (C) 2001 Conrad Parker <conrad@vergenet.net>

Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.


License for xdgmime and glibc

The xdgmime library, written and copyrighted by Red Hat, Inc, is used by the mimedb command, which is a part of fish. It is released under the LGPL, version 2 or later, or under the Academic Free License, version 2. Version 2 of the LGPL license agreement is included below.

Fish contains code from the glibc library, namely the wcstok function. This code is licensed under the LGPL, version 2 or later. Version 2 of the LPGL license agreement is included below.

GNU LESSER GENERAL PUBLIC LICENSE

Version 2.1, February 1999

Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.

This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.

When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.

To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.

We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.

To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.

Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.

Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.

When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.

We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.

For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.

In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.

Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.

The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".

A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.

The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)

"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.

1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2.

You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

  • a) The modified work must itself be a software library.
  • b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.

  • c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.

  • d)

    If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.

    (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.

    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3.

You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.

Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.

This option is useful when you wish to copy part of the code of the Library into a program that is not a library.

4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.

If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.

5.

A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.

However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.

When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.

If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)

Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.

6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.

You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:

  • a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)

  • b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.

  • c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.

  • d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.

  • e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.

For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.

7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:

  • a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.

  • b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.

8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.

10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.

11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.

14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

License for printf

Copyright (C) 1990-2007 Free Software Foundation, Inc. Printf (from GNU Coreutils 6.9) is released under the GNU General Public License, version 2. The license agreement is included below.

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6.

Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.


Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/pages.html0000644000076500000240000000275412145357602017062 0ustar00peterstaff00000000000000 fish user documentation

Related Pages

Here is a list of all related documentation pages:

Generated on Fri May 17 00:42:58 2013 for fish by  doxygen 1.5.9
fish/user_doc/html/tab_b.gif0000644000076500000240000000004312145357602016620 0ustar00peterstaff00000000000000GIF89a€„°Ç,D;fish/user_doc/html/tab_l.gif0000644000076500000240000000130212145357602016631 0ustar00peterstaff00000000000000GIF89a ,Õö÷ùñô÷öøúüýþúûüùúûøùúêïóïóöÆÕßÒÞæØâéÞçíÝæìåìñèîòô÷ùóöø³ÈÕÁÒÝËÙâÏÜäÖá薴ŹɯÂÍ»ÎÙÃÔÞÂÓÝÈ×àÌÚâÕáèÙäê×âèåìðëðó„°ÇÑÞåÜæëãëïëñôîóõ÷úûûüüÿÿÿþþþ, ,ÿ@–P±É`H$!%CqVe2X­ŠÌJ(“Ä +€˜3 2$ÀÆ ¼kvŠä-Ëçõu*…"}ã|}|~q(" $f„ 'Žl(Œ&&$r‘™ › & ! )¢¤›{¨£¥r­ª°©¯„±¯¬´¦·»º³®«§¾¶ÃÂÀ¿²¹ÇÄËÆ²ÌÉεҽͼ„ÔÈÓ×иÙÝÕÏÙÊâÜßãçæê¾äÛÅëÇíáîÖìéïøñ÷õüÑðåùü¤Pß?‚ƒœÇÛBm åAœÎáÀ†%V܈î!Çk÷Ø/áÄ;^¤¨²$Æ–#Mf)f͇(WÎL‰“æKçÒ„° ’I)L:eD ¡Cµ´x*4 U¨h  %A«£^ÁNKb¬Ùe§X±‚´k»x!ÁÖí—2tÝÖ !¯š5tÛæé—À]$¬´%ƒXíâ.i[¬]Y­•ÊfžEëõkg`µ††:zëçÒž;£}ºµj×aa‹–Mš¶é׸cçž½»vïÛºƒóî›8ðáÈ‹'?®¼9óç©G_>Ýyuè¬_ßž]zwêß­‡Ç¾º¼mîæµG~½ûôÞთ/ž>ùööÙ«Ïÿ¿ÿýÿÅà|ÖWà}v;fish/user_doc/html/tab_r.gif0000644000076500000240000000503112145357602016642 0ustar00peterstaff00000000000000GIF89a,Õö÷ùñô÷öøúüýþúûüùúûøùúêïóïóöÆÕßÒÞæØâéÞçíÝæìåìñèîòô÷ùóöø³ÈÕÁÒÝËÙâÏÜäÖá薴ŹɯÂÍ»ÎÙÃÔÞÂÓÝÈ×àÌÚâÕáèÙäê×âèåìðëðó„°ÇÑÞåÜæëãëïëñôîóõ÷úûûüüÿÿÿþþþ,,ÿ@’pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬v •h<¬pkL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~ÏwVa+‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ “*)^,*ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂö)'ÆÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæÚ¥(" ðñòóôõö÷øùúûüýþÿ H° ÁƒòK"ƒRHœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\éÅu&@€ Á²¦Í›8sêÜɳ§Oÿ–(±€DУH“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯S84± ‰hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€Ó} âDÌf(^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹m¹ðCÄHœXͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N÷ÃJ” Á®¹óçУKŸN½ºõëØ³kßν»÷ïàËO¾úñ€ dÇ@€‚‚L¤"ÉÈF:ò‘Œ¤$9† (8…&ÉÉNzò“  ¥(G©FB^²!˨)WÉÊVºò•°l¤)1™ wÄò–¸Ì¥.wÊYºäƒà¥0‡IÌbó¾|ÉHpÌf:ó™Ðìe pJ±ˆ€}Ȧ6·ÉÍnzó›à §8û0Â%"¸æ8×ÉÎvºóðŒ§<ÉPÎQ`ò%×$€>÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'ZPKF Ö¼&16ÊÑŽzô£ ©HGJRb ÷Lç5ÏÁÒ–ºô¥ÿ0©LgJÓšš#(e>¯‰Óžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕª&5;%U·ÊÕ®zõ«` «XÇJV«ÂC§‹ÑjY×ÊÖ¶ºõ­p«\ŠU´À¦xÍ«^÷Ê×¾úõ¯ÐÀi)$‚”ô°ˆM¬bËØÆ:vˆ, ಘͬf7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ°­*$ÛSPô¶¸Í­nwËÛÞúö·ÀÅm +„â¸ÈM®r—ËÜæ:÷¹ÐE®?±9ÏêZ÷ºØÍ®v¿9€î"‚ºÛ ¯xÇKÞòb—™ÑLÿ¯z×Ë^A¢·½ð¯|ç†÷Ò÷¾øÍ¯0í«ßþú÷¿¡ä/€Là»×ÀN°‚ï(à;øÁ n0„'LaýJ¸ÂÎ0{/¬á{ؘþ°ˆG|Ë“øÄ(¥‰SÌâCrÅ.ޱŒ ãÛøÆv¬1ŽwÌc6ê¸Ç@ÞñƒLd¹ÈHNñ‘“Ìd/¹ÉPÎð“£LeO¹ÊXŽp–·|â+sùËýõ2˜ÇL_1“ùÌí53š×M5³ùÍÇt3œç¼_:ÛÙÂwÎs™õÌgøÊ¹Ï€p ýÌ?úÐ/F´¢ë¼èFãÒÐŽŽt!-éJã‘Ò–Îô1­éN»‘ÓžuÿA-êP“ºÔ>5ª3­êUWºÕ®Ž4¬cÝèYÓZѶ¾õ¡s­ëAóº×€þ5°ù,ìaç¹ØÆ¶3²“=çe3ûÍÎ~öš£-í3S»Úc¾6¶¿¬ímo¹ÛÞÆ2¸ÃMåq“Êæ>7“Ó­n$³»ÝD~7¼,ïyó¸ÞöÆ1¾ómã}óÛÈÿvµ¿Þâ\É/µÁNâ…3ÜÉ÷´Ã#Þá‰S\ÊguÆ-mñO¸ã0ÈC¾à‘“\Ë'_´ÉS^à•³|À.ùc.ó0לÐ4¿9~s®ó=÷¼Ï<ÿy|ƒ.ô4]ÏD?ºz“®ô67]ÙO§3Ó£ÞÌ©SÄW‡vÖÙl>õ­3Úëdî:Øu)ö±?ÚìÙF;˜Ë®öW²½í­|;ÜW)÷¹²îvtÞ˽w¾÷Ý|à×=xÂÞÝA;fish/user_doc/html/tabs.css0000644000076500000240000000345612145357602016540 0ustar00peterstaff00000000000000/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ DIV.tabs { float : left; width : 100%; background : url("tab_b.gif") repeat-x bottom; margin-bottom : 4px; } DIV.tabs UL { margin : 0px; padding-left : 10px; list-style : none; } DIV.tabs LI, DIV.tabs FORM { display : inline; margin : 0px; padding : 0px; } DIV.tabs FORM { float : right; } DIV.tabs A { float : left; background : url("tab_r.gif") no-repeat right top; border-bottom : 1px solid #84B0C7; font-size : 80%; font-weight : bold; text-decoration : none; } DIV.tabs A:hover { background-position: 100% -150px; } DIV.tabs A:link, DIV.tabs A:visited, DIV.tabs A:active, DIV.tabs A:hover { color: #1A419D; } DIV.tabs SPAN { float : left; display : block; background : url("tab_l.gif") no-repeat left top; padding : 5px 9px; white-space : nowrap; } DIV.tabs INPUT { float : right; display : inline; font-size : 1em; } DIV.tabs TD { font-size : 80%; font-weight : bold; text-decoration : none; } /* Commented Backslash Hack hides rule from IE5-Mac \*/ DIV.tabs SPAN {float : none;} /* End IE5-Mac hack */ DIV.tabs A:hover SPAN { background-position: 0% -150px; } DIV.tabs LI.current A { background-position: 100% -150px; border-width : 0px; } DIV.tabs LI.current SPAN { background-position: 0% -150px; padding-bottom : 6px; } DIV.navpath { background : none; border : none; border-bottom : 1px solid #84B0C7; text-align : center; margin : 2px; padding : 2px; } fish/share/man/0000755000076500000240000000000012145357603014174 5ustar00peterstaff00000000000000fish/share/man/man1/0000755000076500000240000000000012145357604015031 5ustar00peterstaff00000000000000fish/share/man/man1/alias.10000644000076500000240000000175712145357603016215 0ustar00peterstaff00000000000000.TH "alias" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME alias - create a function .PP .SS "Synopsis" .PP .nf alias NAME DEFINITION alias NAME=DEFINITION .fi .PP .SS "Description" \fCalias\fP is a simple wrapper for the \fCfunction\fP builtin. It exists for backwards compatibility with Posix shells. For other uses, it is recommended to define a \fCfunction\fP. .PP \fCfish\fP does not keep track of which functions have been defined using \fCalias\fP. They must be erased using \fCfunctions -e\fP. .PP .IP "\(bu" 2 NAME is the name of the alias .IP "\(bu" 2 DEFINITION is the actual command to execute. The string ' $argv' will be appended. .PP .PP You cannot create an alias to a function with the same name. .SS "Example" The following code will create \fCrmi\fP, which runs \fCrm\fP with additional arguments on every invocation. .PP \fCalias rmi 'rm -i'\fP .PP This is equivalent to entering the following function: .PP .PP .nf function rmi rm -i $argv end .fi .PP fish/share/man/man1/and.10000644000076500000240000000147012145357603015656 0ustar00peterstaff00000000000000.TH "and" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME and - conditionally execute a command .PP .SS "Synopsis" \fCCOMMAND1; and COMMAND2\fP .SS "Description" \fCand\fP is used to execute a command if the current exit status (as set by the last previous command) is 0. .PP \fCand\fP does not change the current exit status. .PP The exit status of the last foreground command to exit can always be accessed using the \fC$status\fP variable. .SS "Example" The following code runs the \fCmake\fP command to build a program. If the build succeeds, \fCmake\fP's exit status is 0, and the program is installed. If either step fails, the exit status is 1, and \fCmake clean\fP is run, which removes the files created by the. build process. .PP .PP .nf make; and make install; or make clean .fi .PP fish/share/man/man1/begin.10000644000076500000240000000235612145357603016204 0ustar00peterstaff00000000000000.TH "begin" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME begin - start a new block of code .PP .SS "Synopsis" \fCbegin; [COMMANDS...;] end\fP .SS "Description" \fCbegin\fP is used to create a new block of code. .PP The block is unconditionally executed. \fCbegin; ...; end\fP is equivalent to \fCif true; ...; end\fP. .PP \fCbegin\fP is used to group a number of commands into a block. This allows the introduction of a new variable scope, redirection of the input or output of a set of commands as a group, or to specify precedence when using the conditional commands like \fCand\fP. .PP \fCbegin\fP does not change the current exit status. .SS "Example" The following code sets a number of variables inside of a block scope. Since the variables are set inside the block and have local scope, they will be automatically deleted when the block ends. .PP .PP .nf begin set -l PIRATE Yarrr ... end # This will not output anything, since the PIRATE variable went out # of scope at the end of the block echo $PIRATE .fi .PP .PP In the following code, all output is redirected to the file out.html. .PP .PP .nf begin echo $xml_header echo $html_header if test -e $file ... end ... .fi .PP .PP .PP .nf end > out.html .fi .PP fish/share/man/man1/bg.10000644000076500000240000000124412145357603015503 0ustar00peterstaff00000000000000.TH "bg" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME bg - send jobs to background .PP .SS "Synopsis" \fCbg [PID...]\fP .SS "Description" \fCbg\fP sends \fCjobs\fP to the background, resuming them if they are stopped. A background job is executed simultaneously with fish, and does not have access to the keyboard. If no job is specified, the last job to be used is put in the background. If PID is specified, the jobs with the specified process group IDs are put in the background. .PP The PID of the desired process is usually found by using \fCprocess expansion\fP. .SS "Example" \fCbg %1\fP will put the job with job ID 1 in the background. fish/share/man/man1/bind.10000644000076500000240000000567212145357603016040 0ustar00peterstaff00000000000000.TH "bind" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME bind - handle fish key bindings .PP .SS "Synopsis" \fCbind [OPTIONS] SEQUENCE COMMAND\fP .SS "Description" \fCbind\fP adds a binding for the specified key sequence to the specified command. .PP SEQUENCE is the character sequence to bind to. These should be written as \fCfish escape sequences\fP. For example, because pressing the Alt key and another character sends that character prefixed with an escape character, Alt-based key bindings can be written using the \fC\\e\fP escape. For example, Alt-w can be written as \fC\\ew\fP. The control character can be written in much the same way using the \fC\\c\fP escape, for example Control-x (^X) can be written as \fC\\cx\fP. Note that Alt-based key bindings are case sensitive and Control-based key bindings are not. This is a constraint of text-based termainls, not \fCfish\fP. .PP The default key binding can be set by specifying a SEQUENCE of the empty string (that is, \fC''\fP). It will be used whenever no other binding matches. For most key bindings, it makes sense to use the \fCself-insert\fP function (i.e. \fCbind '' self-insert\fP as the default keybinding. This will insert any keystrokes not specifically bound to into the editor. Non-printable characters are ignored by the editor, so this will not result in control sequences being printable. .PP If the -k switch is used, the name of the key (such as down, up or backspace) is used instead of a sequence. The names used are the same as the corresponding curses variables, but without the 'key_' prefix. (See \fCterminfo(5)\fP for more information, or use \fCbind --key-names\fP for a list of all available named keys.) .PP COMMAND can be any fish command, but it can also be one of a set of special input functions. These include functions for moving the cursor, operating on the kill-ring, performing tab completion, etc. Use 'bind --function-names' for a complete list of these input functions. .PP When COMMAND is a shellscript command, it is a good practice to put the actual code into a \fCfunction\fP and simply bind to the function name. This way it becomes significantly easier to test the function while editing, and the result is usually more readable as well. .PP Key bindings are not saved between sessions by default. To save custom keybindings, edit the \fCfish_user_key_bindings\fP function and insert the appropirate \fCbind\fP statements. .PP The following parameters are available: .PP .IP "\(bu" 2 \fC-k\fP or \fC--key\fP Specify a key name, such as 'left' or 'backspace' instead of a character sequence .IP "\(bu" 2 \fC-K\fP or \fC--key-names\fP Display a list of available key names .IP "\(bu" 2 \fC-f\fP or \fC--function-names\fP Display a list of available input functions .PP .SS "Examples" \fCbind \\cd 'exit'\fP causes \fCfish\fP to exit when Control-d is pressed. .PP \fCbind -k ppage history-search-backward\fP performs a history search when the Page Up key is pressed. fish/share/man/man1/block.10000644000076500000240000000234712145357603016212 0ustar00peterstaff00000000000000.TH "block" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME block - temporarily block delivery of events .PP .SS "Synopsis" \fCblock [OPTIONS...]\fP .SS "Description" \fCblock\fP prevents events triggered by \fCfish\fP or the \fC\fCemit\fP\fP command from being delivered and acted upon while the block is in place. .PP In functions, \fCblock\fP can be useful while performing work that should not be interrupted by the shell. .PP The block can be removed. Any events which triggered while the block was in place will then be delivered. .PP Event blocks should not be confused with code blocks, which are created with \fCbegin\fP, \fCif\fP, \fCwhile\fP or \fCfor\fP .PP The following parameters are available: .PP .IP "\(bu" 2 \fC-l\fP or \fC--local\fP Release the block automatically at the end of the current innermost code block scope .IP "\(bu" 2 \fC-g\fP or \fC--global\fP Never automatically release the lock .IP "\(bu" 2 \fC-e\fP or \fC--erase\fP Release global block .PP .SS "Example" .PP .nf # Create a function that listens for events function --on-event foo foo; echo 'foo fired'; end # Block the delivery of events block -g emit foo # No output will be produced block -e # 'foo fired' will now be printed .fi .PP fish/share/man/man1/break.10000644000076500000240000000126312145357603016200 0ustar00peterstaff00000000000000.TH "break" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME break - stop the current inner loop .PP .SS "Synopsis" \fCLOOP_CONSTRUCT; [COMMANDS...] break; [COMMANDS...] end\fP .SS "Description" \fCbreak\fP halts a currently running loop, such as a \fCfor\fP loop or a \fCwhile\fP loop. It is usually added inside of a conditional block such as an \fCif\fP statement or a \fCswitch\fP statement. .PP There are no parameters for \fCbreak\fP. .SS "Example" The following code searches all .c files for 'smurf', and halts at the first occurrence. .PP .PP .nf for i in *.c if grep smurf $i echo Smurfs are present in $i break end end .fi .PP fish/share/man/man1/breakpoint.10000644000076500000240000000062312145357603017251 0ustar00peterstaff00000000000000.TH "breakpoint" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME breakpoint - Launch debug mode .PP .SS "Synopsis" \fCbreakpoint\fP .SS "Description" \fCbreakpoint\fP is used to halt a running script and launch an interactive debugging prompt. .PP For more details, see \fCDebugging fish scripts\fP in the \fCfish\fP manual. .PP There are no parameters for \fCbreakpoint\fP. fish/share/man/man1/builtin.10000644000076500000240000000100612145357603016555 0ustar00peterstaff00000000000000.TH "builtin" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME builtin - run a builtin command .PP .SS "Synopsis" \fCbuiltin BUILTINNAME [OPTIONS...]\fP .SS "Description" \fCbuiltin\fP forces the shell to use a builtin command, rather than a function or program. .PP The following parameters are available: .PP .IP "\(bu" 2 \fC-n\fP or \fC--names\fP List the names of all defined builtins .PP .SS "Example" \fCbuiltin jobs\fP executes the jobs builtin, even if a function named jobs exists. fish/share/man/man1/case.10000644000076500000240000000327012145357603016027 0ustar00peterstaff00000000000000.TH "case" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME case - conditionally execute a block of commands .PP .SS "Synopsis" \fCswitch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end\fP .SS "Description" \fCswitch\fP performs one of several blocks of commands, depending on whether a specified value equals one of several wildcarded values. \fCcase\fP is used together with the \fCswitch\fP statement in order to determine which block should be executed. .PP Each \fCcase\fP command is given one or more parameters. The first \fCcase\fP command with a parameter that matches the string specified in the switch command will be evaluated. \fCcase\fP parameters may contain wildcards. These need to be escaped or quoted in order to avoid regular wildcard expansion using filenames. .PP Note that fish does not fall through on case statements. Only the first matching case is executed. .PP Note that command substitutions in a case statement will be evaluated even if its body is not taken. All substitutions, including command substitutions, must be performed before the value can be compared against the parameter. .SS "Example" If the variable $animal contains the name of an animal, the following code would attempt to classify it: .PP .PP .nf switch $animal case cat echo evil case wolf dog human moose dolphin whale echo mammal case duck goose albatross echo bird case shark trout stingray echo fish # Note that the next case has a wildcard which is quoted case '*' echo I have no idea what a $animal is end .fi .PP .PP If the above code was run with \fC$animal\fP set to \fCwhale\fP, the output would be \fCmammal\fP. fish/share/man/man1/cd.10000644000076500000240000000153212145357604015502 0ustar00peterstaff00000000000000.TH "cd" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME cd - change directory .PP .SS "Synopsis" \fCcd [DIRECTORY]\fP .SS "Description" \fCcd\fP changes the current working directory. .PP If \fCDIRECTORY\fP is supplied, it will become the new directory. If no parameter is given, the contents of the \fCHOME\fP environment variable will be used. .PP If \fCDIRECTORY\fP is a relative path, the paths found in the \fCCDPATH\fP environment variable array will be tried as prefixes for the specified path. .PP Note that the shell will attempt to change directory without requiring \fCcd\fP if the name of a directory is provided (starting with '.', '/' or '~'). .SS "Examples" \fCcd\fP changes the working directory to your home directory. .PP \fCcd /usr/src/fish-shell\fP changes the working directory to \fC/usr/src/fish-shell\fP. fish/share/man/man1/command.10000644000076500000240000000065412145357604016536 0ustar00peterstaff00000000000000.TH "command" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME command - run a program .PP .SS "Synopsis" \fCcommand COMMANDNAME [OPTIONS...]\fP .SS "Description" \fCcommand\fP forces the shell to execute the program \fCCOMMANDNAME\fP and ignore any functions or builtins with the same name. .SS "Example" \fCcommand ls\fP causes fish to execute the \fCls\fP program, even if an 'ls' function exists. fish/share/man/man1/commandline.10000644000076500000240000000522512145357604017405 0ustar00peterstaff00000000000000.TH "commandline" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME commandline - set or get the current command line buffer .PP .SS "Synopsis" \fCcommandline [OPTIONS] [CMD]\fP .SS "Description" \fCcommandline\fP can be used to set or get the current contents of the command line buffer. .PP With no parameters, \fCcommandline\fP returns the current value of the command line. .PP With \fCCMD\fP specified, the command line buffer is erased and replaced with the contents of \fCCMD\fP. .PP The following options are available: .PP .IP "\(bu" 2 \fC-C\fP or \fC--cursor\fP set or get the current cursor position, not the contents of the buffer. If no argument is given, the current cursor position is printed, otherwise the argument is interpreted as the new cursor position. .IP "\(bu" 2 \fC-f\fP or \fC--function\fP inject readline functions into the reader. This option cannot be combined with any other option. It will cause any additional arguments to be interpreted as readline functions, and these functions will be injected into the reader, so that they will be returned to the reader before any additional actual key presses are read. .PP .PP The following options change the way \fCcommandline\fP updates the command line buffer: .PP .IP "\(bu" 2 \fC-a\fP or \fC--append\fP do not remove the current commandline, append the specified string at the end of it .IP "\(bu" 2 \fC-i\fP or \fC--insert\fP do not remove the current commandline, insert the specified string at the current cursor position .IP "\(bu" 2 \fC-r\fP or \fC--replace\fP remove the current commandline and replace it with the specified string (default) .PP .PP The following options change what part of the commandline is printed or updated: .PP .IP "\(bu" 2 \fC-b\fP or \fC--current-buffer\fP select the entire buffer (default) .IP "\(bu" 2 \fC-j\fP or \fC--current-job\fP select the current job .IP "\(bu" 2 \fC-p\fP or \fC--current-process\fP select the current process .IP "\(bu" 2 \fC-t\fP or \fC--current-token\fP select the current token. .PP .PP The following options change the way \fCcommandline\fP prints the current commandline buffer: .PP .IP "\(bu" 2 \fC-c\fP or \fC--cut-at-cursor\fP only print selection up until the current cursor position .IP "\(bu" 2 \fC-o\fP or \fC--tokenize\fP tokenize the selection and print one string-type token per line .PP .PP If \fCcommandline\fP is called during a call to complete a given string using \fCcomplete -C STRING\fP, \fCcommandline\fP will consider the specified string to be the current contents of the command line. .SS "Example" \fCcommandline -j $history[3]\fP replaces the job under the cursor with the third item from the command line history. fish/share/man/man1/complete.10000644000076500000240000001251212145357604016724 0ustar00peterstaff00000000000000.TH "complete" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME complete - edit command specific tab-completions .PP .SS "Synopsis" \fCcomplete (-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] \fP .SS "Description" For an introduction to specifying completions, see \fCWriting your own completions\fP in the fish manual. .PP .IP "\(bu" 2 \fCCOMMAND\fP is the name of the command for which to add a completion .IP "\(bu" 2 \fCSHORT_OPTION\fP is a one character option for the command .IP "\(bu" 2 \fCLONG_OPTION\fP is a multi character option for the command .IP "\(bu" 2 \fCOPTION_ARGUMENTS\fP is parameter containing a space-separated list of possible option-arguments, which may contain subshells .IP "\(bu" 2 \fCDESCRIPTION\fP is a description of what the option and/or option arguments do .IP "\(bu" 2 \fC-C STRING\fP or \fC--do-complete=STRING\fP makes complete try to find all possible completions for the specified string .IP "\(bu" 2 \fC-e\fP or \fC--erase\fP implies that the specified completion should be deleted .IP "\(bu" 2 \fC-f\fP or \fC--no-files\fP specifies that the option specified by this completion may not be followed by a filename .IP "\(bu" 2 \fC-n\fP or \fC--condition\fP 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. .IP "\(bu" 2 \fC-o\fP or \fC--old-option\fP implies that the command uses old long style options with only one dash .IP "\(bu" 2 \fC-p\fP or \fC--path\fP implies that the string COMMAND is the full path of the command .IP "\(bu" 2 \fC-r\fP or \fC--require-parameter\fP specifies that the option specified by this completion always must have an option argument, i.e. may not be followed by another option .IP "\(bu" 2 \fC-u\fP or \fC--unauthoritative\fP implies that there may be more options than the ones specified, and that fish should not assume that options not listed are spelling errors .IP "\(bu" 2 \fC-A\fP or \fC--authoritative\fP implies that there may be no more options than the ones specified, and that fish should assume that options not listed are spelling errors .IP "\(bu" 2 \fC-x\fP or \fC--exclusive\fP implies both \fC-r\fP and \fC-f\fP .PP .PP Command specific tab-completions in \fCfish\fP are based on the notion of options and arguments. An option is a parameter which begins with a hyphen, such as '-h', '-help' or '--help'. Arguments are parameters 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: .PP .IP "\(bu" 2 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'). .IP "\(bu" 2 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'). .IP "\(bu" 2 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'). .PP .PP 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. .PP When erasing completions, it is possible to either erase all completions for a specific command by specifying \fCcomplete -e -c COMMAND\fP, or by specifying a specific completion option to delete by specifying either a long, short or old style option. .SS "Example" The short style option \fC-o\fP for the \fCgcc\fP command requires that a file follows it. This can be done using writing \fCcomplete -c gcc -s o -r\fP. .PP The short style option \fC-d\fP for the \fCgrep\fP command requires that one of the strings 'read', 'skip' or 'recurse' is used. This can be specified writing \fCcomplete -c grep -s d -x -a 'read skip recurse'\fP. .PP The \fCsu\fP command takes any username as an argument. Usernames are given as the first colon-separated field in the file /etc/passwd. This can be specified as: \fCcomplete -x -c su -d 'Username' -a '(cat /etc/passwd|cut -d : -f 1)' \fP. .PP The \fCrpm\fP command has several different modes. If the \fC-e\fP or \fC--erase\fP flag has been specified, \fCrpm\fP should delete one or more packages, in which case several switches related to deleting packages are valid, like the \fCnodeps\fP switch. .PP This can be written as: .PP \fCcomplete -c rpm -n '__fish_contains_opt -s e erase' -l nodeps -d 'Don't check dependencies'\fP .PP where \fC__fish_contains_opt\fP is a function that checks the commandline buffer for the presence of a specified set of options. fish/share/man/man1/contains.10000644000076500000240000000136712145357604016740 0ustar00peterstaff00000000000000.TH "contains" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME contains - test if a word is present in a list .PP .SS "Synopsis" \fCcontains [OPTIONS] KEY [VALUES...]\fP .SS "Description" \fCcontains\fP tests whether the set \fCVALUES\fP contains the string \fCKEY\fP. If so, \fCcontains\fP exits with status 0; if not, it exits with status 1. .PP The following options are available: .PP .IP "\(bu" 2 \fC-i\fP or \fC--index\fP print the word index .IP "\(bu" 2 \fC-h\fP or \fC--help\fP display this message .PP .SS "Example" .PP .nf for i in ~/bin /usr/local/bin if not contains $i $PATH set PATH $PATH $i end end .fi .PP .PP The above code tests if \fC~/bin\fP and \fC/usr/local/bin\fP are in the path and adds them if not. fish/share/man/man1/continue.10000644000076500000240000000130312145357604016734 0ustar00peterstaff00000000000000.TH "continue" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME continue - skip the remainder of the current iteration of the current inner loop .PP .SS "Synopsis" \fCLOOP_CONSTRUCT; [COMMANDS...;] continue; [COMMANDS...;] end\fP .SS "Description" \fCcontinue\fP skips the remainder of the current iteration of the current inner loop, such as a \fCfor\fP loop or a \fCwhile\fP loop. It is usually added inside of a conditional block such as an \fCif\fP statement or a \fCswitch\fP statement. .SS "Example" The following code removes all tmp files that do not contain the word smurf. .PP .PP .nf for i in *.tmp if grep smurf $i continue end rm $i end .fi .PP fish/share/man/man1/count.10000644000076500000240000000142512145357604016245 0ustar00peterstaff00000000000000.TH "count" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME count - count the number of elements of an array .PP .SS "Synopsis" \fCcount $VARIABLE\fP .SS "Description" \fCcount\fP prints the number of arguments that were passed to it. This is usually used to find out how many elements an environment variable array contains. .PP \fCcount\fP does not accept any options, including '-h'. .PP \fCcount\fP exits with a non-zero exit status if no arguments were passed to it, and with zero if at least one argument was passed. .SS "Example" .PP .nf count $PATH .fi .PP .PP returns the number of directories in the users PATH variable. .PP .PP .nf count *.txt .fi .PP .PP returns the number of files in the current working directory ending with the suffix '.txt'. fish/share/man/man1/dirh.10000644000076500000240000000061712145357604016045 0ustar00peterstaff00000000000000.TH "dirh" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME dirh - print directory history .PP .SS "Synopsis" \fCdirh\fP .SS "Description" \fCdirh\fP prints the current directory history. The current position in the history is highlighted using the color defined in the \fCfish_color_history_current\fP environment variable. .PP \fCdirh\fP does not accept any parameters. fish/share/man/man1/dirs.10000644000076500000240000000045712145357604016062 0ustar00peterstaff00000000000000.TH "dirs" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME dirs - print directory stack .PP .SS "Synopsis" \fCdirs\fP .SS "Description" \fCdirs\fP prints the current directory stack, as created by the \fC\fCpushd\fP\fP command. .PP \fCdirs\fP does not accept any parameters. fish/share/man/man1/echo.10000644000076500000240000000240712145357604016034 0ustar00peterstaff00000000000000.TH "echo" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME echo - display a line of text .PP .SS "Synopsis" \fCecho [STRING]\fP .SS "Description" \fCecho\fP displays a string of text. .PP The following options are available: .PP .IP "\(bu" 2 \fC-n\fP, \fCDo\fP not output a newline .IP "\(bu" 2 \fC-s\fP, \fCDo\fP not separate arguments with spaces .IP "\(bu" 2 \fC-E\fP, \fCDisable\fP interpretation of backslash escapes (default) .IP "\(bu" 2 \fC-e\fP, \fCEnable\fP interpretation of backslash escapes .IP "\(bu" 2 \fC-h\fP, \fC--help\fP Display this help .PP .SS "Escape Sequences" If \fC-e\fP is used, the following sequences are recognized: .PP .IP "\(bu" 2 \fC\\\\\fP \fCbackslash\fP .IP "\(bu" 2 \\a alert (BEL) .IP "\(bu" 2 \\b backspace .IP "\(bu" 2 \\c produce no further output .IP "\(bu" 2 \\e escape .IP "\(bu" 2 \\f form feed .IP "\(bu" 2 \\n new line .IP "\(bu" 2 \\r carriage return .IP "\(bu" 2 \\t horizontal tab .IP "\(bu" 2 \\v vertical tab .IP "\(bu" 2 \\0NNN byte with octal value NNN (1 to 3 digits) .IP "\(bu" 2 \\xHH byte with hexadecimal value HH (1 to 2 digits) .PP .SS "Example" \fCecho 'Hello World'\fP Print hello world to stdout .PP \fCecho -e 'Top\\nBottom'\fP Print Top and Bottom on separate lines, using an escape sequence fish/share/man/man1/else.10000644000076500000240000000122012145357604016036 0ustar00peterstaff00000000000000.TH "else" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME else - execute command if a condition is not met .PP .SS "Synopsis" \fCif CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end\fP .SS "Description" \fCif\fP will execute the command \fCCONDITION\fP. If the condition's exit status is 0, the commands \fCCOMMANDS_TRUE\fP will execute. If it is not 0 and \fCelse\fP is given, \fCCOMMANDS_FALSE\fP will be executed. .SS "Example" The following code tests whether a file \fCfoo.txt\fP exists as a regular file. .PP .PP .nf if test -f foo.txt echo foo.txt exists else echo foo.txt does not exist end .fi .PP fish/share/man/man1/emit.10000644000076500000240000000122512145357604016051 0ustar00peterstaff00000000000000.TH "emit" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME emit - Emit a generic event .PP .SS "Synopsis" \fCemit EVENT_NAME [ARGUMENTS...]\fP .SS "Description" \fCemit\fP emits, or fires, an event. Events are delivered to, or caught by, special functions called event handlers. The arguments are passed to the event handlers as function arguments. .SS "Example" The following code first defines an event handler for the generic event named 'test_event', and then emits an event of that type. .PP .PP .nf function event_test --on-event test_event echo event test: $argv end .fi .PP .PP .PP .nf emit test_event something .fi .PP fish/share/man/man1/end.10000644000076500000240000000115412145357604015662 0ustar00peterstaff00000000000000.TH "end" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME end - end a block of commands. .PP .SS "Synopsis" .PP .nf begin; [COMMANDS...] end if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end while CONDITION; COMMANDS...; end for VARNAME in [VALUES...]; COMMANDS...; end switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end .fi .PP .SS "Description" \fCend\fP ends a block of commands. .PP For more information, read the documentation for the block constructs, such as \fCif\fP, \fCfor\fP and \fCwhile\fP. .PP The \fCend\fP command does not change the current exit status. fish/share/man/man1/eval.10000644000076500000240000000112312145357604016037 0ustar00peterstaff00000000000000.TH "eval" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME eval - evaluate the specified commands .PP .SS "Synopsis" \fCeval [COMMANDS...]\fP .SS "Description" \fCeval\fP evaluates the specified parameters as a command. If more than one parameter is specified, all parameters will be joined using a space character as a separator. .SS "Example" The folloing code will call the ls command. Note that \fCfish\fP does not support the use of environment variables as direct commands; \fCeval\fP can be used to work around this. .PP .PP .nf set cmd ls eval $cmd .fi .PP fish/share/man/man1/exec.10000644000076500000240000000075712145357604016050 0ustar00peterstaff00000000000000.TH "exec" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME exec - execute command in current process .PP .SS "Synopsis" \fCexec COMMAND [OPTIONS...]\fP .SS "Description" \fCexec\fP replaces the currently running shell with a new command. On successful completion, \fCexec\fP never returns. \fCexec\fP cannot be used inside a pipeline. .SS "Example" \fCexec emacs\fP starts up the emacs text editor, and exits \fCfish\fP. When emacs exits, the session will terminate. fish/share/man/man1/exit.10000644000076500000240000000076712145357604016076 0ustar00peterstaff00000000000000.TH "exit" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME exit - exit the shell .PP .SS "Synopsis" \fCexit [STATUS]\fP .SS "Description" \fCexit\fP causes fish to exit. If \fCSTATUS\fP is supplied, it will be converted to an integer and used as the exit code. Otherwise, the exit code will be that of the last command executed. .PP If exit is called while sourcing a file (using the \fC.\fP builtin) the rest of the file will be skipped, but the shell itself will not exit. fish/share/man/man1/fg.10000644000076500000240000000116512145357604015512 0ustar00peterstaff00000000000000.TH "fg" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fg - bring job to foreground .PP .SS "Synopsis" \fCfg [PID]\fP .SS "Description" \fCfg\fP brings the specified \fCjob\fP to the foreground, resuming it if it is stopped. While a foreground job is executed, fish is suspended. If no job is specified, the last job to be used is put in the foreground. If PID is specified, the job with the specified group ID is put in the foreground. .PP The PID of the desired process is usually found by using \fCprocess expansion\fP. .SS "Example" \fCfg %1\fP will put the job with job ID 1 in the foreground. fish/share/man/man1/fish.10000644000076500000240000000261212145357604016045 0ustar00peterstaff00000000000000.TH "fish" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fish - the friendly interactive shell .PP .SS "Synopsis" fish [-h] [-v] [-c command] [FILE [ARGUMENTS...]] .SS "Description" \fCfish\fP is a command-line shell written mainly with interactive use in mind. The full manual is available \fCin HTML\fP by using the \fChelp\fP command from inside fish. .PP The following options are available: .PP .IP "\(bu" 2 \fC-c\fP or \fC--command=COMMANDS\fP evaluate the specified commands instead of reading from the commandline .IP "\(bu" 2 \fC-d\fP or \fC--debug-level=DEBUG_LEVEL\fP specify the verbosity level of fish. A higher number means higher verbosity. The default level is 1. .IP "\(bu" 2 \fC-h\fP or \fC--help\fP display help and exit .IP "\(bu" 2 \fC-i\fP or \fC--interactive\fP specify that fish is to run in interactive mode .IP "\(bu" 2 \fC-l\fP or \fC--login\fP specify that fish is to run as a login shell .IP "\(bu" 2 \fC-n\fP or \fC--no-execute\fP do not execute any commands, only perform syntax checking .IP "\(bu" 2 \fC-p\fP or \fC--profile=PROFILE_FILE\fP when fish exits, output timing information on all executed commands to the specified file .IP "\(bu" 2 \fC-v\fP or \fC--version\fP display version and exit .PP .PP The fish exit status is generally the exit status of the last foreground command. If fish is exiting because of a parse error, the exit status is 127. fish/share/man/man1/fish_config.10000644000076500000240000000156612145357604017401 0ustar00peterstaff00000000000000.TH "fish_config" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fish_config - start the web-based configuration interface .PP .SS "Description" \fCfish_config\fP starts the web-based configuration interface. .PP The web interface allows you to view your functions, variables and history, and to make changes to your prompt and color configuration. .PP \fCfish_config\fP starts a local web server and then opens a web browser window; when you have finished, close the browser window and then press the Enter key to terminate the configuration session. .PP There are no parameters for \fCfish_config\fP. .PP If the \fCBROWSER\fP environment variable is set, it will be used as the name of the web browser to open instead of the system default. .SS "Example" \fCfish_config\fP opens a new web browser window and allows you to configure certain fish settings. fish/share/man/man1/fish_indent.10000644000076500000240000000116712145357604017412 0ustar00peterstaff00000000000000.TH "fish_indent" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fish_indent - indenter and prettifier .PP .SS "Synopsis" \fCfish_indent [options]\fP .SS "Description" \fCfish_indent\fP is used to indent a piece of fish code. \fCfish_indent\fP reads commands from standard input and outputs them to standard output. .PP The following options are available: .PP .IP "\(bu" 2 \fC-h\fP or \fC--help\fP displays this help message and then exits .IP "\(bu" 2 \fC-i\fP or \fC--no-indent\fP do not indent commands .IP "\(bu" 2 \fC-v\fP or \fC--version\fP displays the current fish version and then exits .PP fish/share/man/man1/fish_pager.10000644000076500000240000000045012145357604017221 0ustar00peterstaff00000000000000.TH "fish_pager" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fish_pager - internal command used by fish .PP .SS "Description" \fCfish_pager\fP is used internally by fish. It should not be used by other commands, as its interface is liable to change in the future. fish/share/man/man1/fish_prompt.10000644000076500000240000000161512145357604017450 0ustar00peterstaff00000000000000.TH "fish_prompt" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fish_prompt - define the appearance of the command line prompt .PP .SS "Synopsis" .PP .nf function fish_prompt ... end .fi .PP .SS "Description" By defining the \fCfish_prompt\fP function, the user can choose a custom prompt. The \fCfish_prompt\fP function is executed when the prompt is to be shown, and the output is used as a prompt. .PP The exit status of commands within \fCfish_prompt\fP will not modify the value of \fC$status\fP outside of the \fCfish_prompt\fP function. .PP \fCfish\fP ships with a number of example prompts that can be chosen with the \fCfish_config\fP command. .SS "Example" A simple prompt: .PP .PP .nf function fish_prompt -d 'Write out the prompt' printf '%s@%s%s%s%s> ' (whoami) (hostname|cut -d . -f 1) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) end .fi .PP fish/share/man/man1/fish_right_prompt.10000644000076500000240000000113212145357604020637 0ustar00peterstaff00000000000000.TH "fish_right_prompt" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fish_right_prompt - define the appearance of the right-side command line prompt .PP .SS "Synopsis" .PP .nf function fish_right_prompt ... end .fi .PP .SS "Description" \fCfish_right_prompt\fP is similar to \fCfish_prompt\fP, except that it appears on the right side of the terminal window. .PP Multiple lines are not supported in \fCfish_right_prompt\fP. .SS "Example" A simple right prompt: .PP .PP .nf function fish_right_prompt -d 'Write out the right prompt' date '+%m/%d/%y' end .fi .PP fish/share/man/man1/fish_update_completions.10000644000076500000240000000071512145357604022025 0ustar00peterstaff00000000000000.TH "fish_update_completions" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fish_update_completions - Update completions using manual pages .PP .SS "Description" \fCfish_update_completions\fP parses manual pages installed on the system, and attempts to create completion files in the \fCfish\fP configuration directory. .PP This does not overwrite custom completions. .PP There are no parameters for \fCfish_update_completions\fP. fish/share/man/man1/fishd.10000644000076500000240000000252312145357604016212 0ustar00peterstaff00000000000000.TH "fishd" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME fishd - universal variable daemon .PP .SS "Synopsis" \fCfishd [(-h|--help|-v|--version)]\fP .SS "Description" The \fCfishd\fP daemon is used to load, save and distribute universal variable information. \fCfish\fP automatically connects to \fCfishd\fP via a socket on startup. .PP \fCfishd\fP is started and stopped automatically. .PP The following options are available if starting \fCfishd\fP manually: .PP .IP "\(bu" 2 \fC-h\fP or \fC--help\fP displays this help message and then exits .IP "\(bu" 2 \fC-v\fP or \fC--version\fP displays the current fish version and then exits .PP .SS "Files" .IP "\(bu" 2 \fC~/\fP.config/fish/fishd.MACHINE_ID - permanent storage location for universal variable data. \fCMACHINE_ID\fP is generally based on the machine's MAC address. .PP .PP The data is stored as a set of \fCset\fP and \fCset_export\fP commands such as would be parsed by fishd. The file must always be stored in YAML format. If an instance of fishd is running (which is generally the case), manual modifications to \fC~/\fP.fishd.MACHINE_ID will be lost. Do NOT edit this file manually! .PP .IP "\(bu" 2 \fC/tmp/fishd\fP.socket.USERNAME - the socket which fishd uses to communicate with all clients. .PP .PP .IP "\(bu" 2 /tmp/fishd.log.USERNAME - the fishd log file .PP fish/share/man/man1/for.10000644000076500000240000000117112145357604015701 0ustar00peterstaff00000000000000.TH "for" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME for - perform a set of commands multiple times. .PP .SS "Synopsis" \fCfor VARNAME in [VALUES...]; COMMANDS...; end\fP .SS "Description" \fCfor\fP is a loop construct. It will perform the commands specified by \fCCOMMANDS\fP multiple times. On each iteration, the environment variable specified by \fCVARNAME\fP is assigned a new value from \fCVALUES\fP. If \fCVALUES\fP is empty, \fCCOMMANDS\fP will not be executed at all. .SS "Example" The command .PP \fCfor i in foo bar baz; echo $i; end\fP .PP would output: .PP .PP .nf foo bar baz .fi .PP fish/share/man/man1/funced.10000644000076500000240000000146412145357604016364 0ustar00peterstaff00000000000000.TH "funced" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME funced - edit a function interactively .PP .SS "Synopsis" \fCfunced [OPTIONS] NAME\fP .SS "Description" \fCfunced\fP provides an interface to edit the definition of the function \fCNAME\fP. .PP If the \fC$EDITOR\fP environment variable is set, it will be used as the program to edit the function. Otherwise, a built-in editor will be used. .PP If there is no function called \fCNAME\fP a new function will be created with the specified name .PP .IP "\(bu" 2 \fC-e command\fP or \fC--editor command\fP Open the function body inside the text editor given by the command (for example, 'vi'). The command 'fish' will use the built-in editor. .IP "\(bu" 2 \fC-i\fP or \fC--interactive\fP Open function body in the built-in editor. .PP fish/share/man/man1/funcsave.10000644000076500000240000000101312145357604016720 0ustar00peterstaff00000000000000.TH "funcsave" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME funcsave - save the definition of a function to the user's autoload directory .PP .SS "Synopsis" \fCfuncsave FUNCTION_NAME\fP .SS "Description" \fCfuncsave\fP saves the current definition of a function to a file in the fish configuration directory. This function will be automatically loaded by current and future fish sessions. This can be useful if you have interactively created a new function and wish to save it for later use. fish/share/man/man1/function.10000644000076500000240000000524012145357604016741 0ustar00peterstaff00000000000000.TH "function" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME function - create a function .PP .SS "Synopsis" \fCfunction [OPTIONS] NAME; BODY; end \fP .SS "Description" \fCfunction\fP creates a new function \fCNAME\fP with the body \fCBODY\fP. .PP A function is a list of commands that will be executed when the name of the function is given as a command. .PP The following options are available: .PP .IP "\(bu" 2 \fC-d DESCRIPTION\fP or \fC--description=DESCRIPTION\fP is a description of what the function does, suitable as a completion description. .IP "\(bu" 2 \fC-e\fP or \fC--on-event EVENT_NAME\fP tells fish to run this function when the specified named event is emitted. Fish internally generates named events e.g. when showing the prompt. .IP "\(bu" 2 \fC-j PID\fP or \fC --on-job-exit PID\fP tells fish to run this function when the job with group ID PID exits. Instead of PID, the string 'caller' can be specified. This is only legal when in a command substitution, and will result in the handler being triggered by the exit of the job which created this command substitution. .IP "\(bu" 2 \fC-p PID\fP or \fC --on-process-exit PID\fP tells fish to run this function when the fish child process with process ID PID exits. .IP "\(bu" 2 \fC-s\fP or \fC--on-signal SIGSPEC\fP 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). .IP "\(bu" 2 \fC-v\fP or \fC--on-variable VARIABLE_NAME\fP tells fish to run this function when the variable VARIABLE_NAME changes value. .PP .PP If the user enters any additional arguments after the function, they are inserted into the environment \fCvariable array\fP \fC$argv\fP. .PP By using one of the event handler switches, a function can be made to run automatically at specific events. The user may generate new events using the \fCemit\fP builtin. Fish generates the following named events: .PP .IP "\(bu" 2 \fCfish_prompt\fP, which is emitted whenever a new fish prompt is about to be displayed. .IP "\(bu" 2 \fCfish_command_not_found\fP, which is emitted whenever a command lookup failed. .PP .SS "Example" .PP .nf function ll ls -l $argv end .fi .PP .PP will run the \fCls\fP command, using the \fC-l\fP option, while passing on any additional files and switches to \fCls\fP. .PP .PP .nf function mkdir -d 'Create a directory and set CWD' command mkdir $argv if test $status = 0 switch $argv[(count $argv)] case '-*' .fi .PP .PP .PP .nf case '*' cd $argv[(count $argv)] return end end end .fi .PP .PP will run the mkdir command, and if it is successful, change the current working directory to the one just created. fish/share/man/man1/functions.10000644000076500000240000000430212145357604017122 0ustar00peterstaff00000000000000.TH "functions" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME functions - print or erase functions .PP .SS "Synopsis" .PP .nf functions [-n] functions -c OLDNAME NEWNAME functions -d DESCRIPTION FUNCTION functions [-eq] FUNCTIONS... .fi .PP .SS "Description" \fCfunctions\fP prints or erases functions. .PP The following options are available: .PP .IP "\(bu" 2 \fC-a\fP or \fC--all\fP lists all functions, even those whose name start with an underscore. .IP "\(bu" 2 \fC-c OLDNAME NEWNAME\fP or \fC--copy OLDNAME NEWNAME\fP creates a new function named NEWNAME, using the definition of the OLDNAME function. .IP "\(bu" 2 \fC-d DESCRIPTION\fP or \fC--description=DESCRIPTION\fP changes the description of this function. .IP "\(bu" 2 \fC-e\fP or \fC--erase\fP causes the specified functions to be erased. .IP "\(bu" 2 \fC-h\fP or \fC--help\fP displays a help message and exits. .IP "\(bu" 2 \fC-n\fP or \fC--names\fP lists the names of all defined functions. .IP "\(bu" 2 \fC-q\fP or \fC--query\fP tests if the specified functions exist. .PP .PP The default behavior of \fCfunctions\fP, when called with no arguments, is to print the names of all defined functions. Unless the \fC-a\fP option is given, no functions starting with underscores are not included in the output. .PP If any non-option parameters are given, the definition of the specified functions are printed. .PP Automatically loaded functions cannot be removed using \fCfunctions -e\fP. Either remove the definition file or change the $fish_function_path variable to remove autoloaded functions. .PP Copying a function using \fC-c\fP copies only the body of the function, and does not attach any event notifications from the original function. .PP Only one function's description can be changed in a single invocation of \fCfunctions -d\fP. .PP The exit status of \fCfunctions\fP is the number of functions specified in the argument list that do not exist, which can be used in concert with the \fC-q\fP option. .SS "Examples" \fCfunctions -n\fP displays a list of currently-defined functions. .PP \fCfunctions -c foo bar\fP copies the \fCfoo\fP function to a new function called \fCbar\fP. .PP \fCfunctions -e bar\fP erases the function \fCbar\fP. fish/share/man/man1/help.10000644000076500000240000000117012145357604016042 0ustar00peterstaff00000000000000.TH "help" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME help - display fish documentation .PP .SS "Synopsis" \fChelp [SECTION]\fP .SS "Description" \fChelp\fP displays the fish help documentation. .PP If a \fCSECTION\fP is specified, the help for that command is shown. .PP If the BROWSER environment variable is set, it will be used to display the documentation. Otherwise, fish will search for a suitable browser. .PP Note that most builtin commands display their help in the terminal when given the \fC--help\fP option. .SS "Example" \fChelp fg\fP shows the documentation for the \fCfg\fP builtin. fish/share/man/man1/history.10000644000076500000240000000340512145357604016616 0ustar00peterstaff00000000000000.TH "history" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME history - Show and manipulate command history .PP .SS "Synopsis" .PP .nf history (--save | --clear) history (--search | --delete ) (--prefix 'prefix string' | --contains 'search string') .fi .PP .SS "Description" \fChistory\fP is used to list, search and delete the history of commands used. .PP The following options are available: .PP .IP "\(bu" 2 \fC--save\fP saves all changes in the history file. The shell automatically saves the history file; this option is provided for internal use. .IP "\(bu" 2 \fC--clear\fP clears the history file. A prompt is displayed before the history is erased. .IP "\(bu" 2 \fC--search\fP returns history items in keeping with the \fC--prefix\fP or \fC--contains\fP options. .IP "\(bu" 2 \fC--delete\fP deletes history items. .IP "\(bu" 2 \fC--prefix\fP searches or deletes items in the history that begin with the specified text string. .IP "\(bu" 2 \fC--contains\fP searches or deletes items in the history that contain the specified text string. .PP .PP If \fC--search\fP is specified without \fC--contains\fP or \fC--prefix\fP, \fC--contains\fP will be assumed. .PP If \fC--delete\fP is specified without \fC--contains\fP or \fC--prefix\fP, only a history item which exactly matches the parameter will be erased. No prompt will be given. If \fC--delete\fP is specified with either of these parameters, an interactive prompt will be displayed before any items are deleted. .SS "Example" \fChistory --clear\fP deletes all history items .PP \fChistory --search --contains 'foo'\fP outputs a list of all previous commands containing the string 'foo'. .PP \fChistory --delete --prefix 'foo'\fP interactively deletes the record of previous commands which start with 'foo'. fish/share/man/man1/if.10000644000076500000240000000226612145357604015517 0ustar00peterstaff00000000000000.TH "if" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME if - conditionally execute a command .PP .SS "Synopsis" \fCif CONDITION; COMMANDS_TRUE...; [else if CONDITION2; COMMANDS_TRUE2...;] [else; COMMANDS_FALSE...;] end\fP .SS "Description" \fCif\fP will execute the command \fCCONDITION\fP. If the condition's exit status is 0, the commands \fCCOMMANDS_TRUE\fP will execute. If the exit status is not 0 and \fCelse\fP is given, \fCCOMMANDS_FALSE\fP will be executed. .PP In order to use the exit status of multiple commands as the condition of an if block, use \fC\fCbegin; ...; end\fP\fP and the short circuit commands \fC\fCand\fP\fP and \fC\fCor\fP\fP. .PP The exit status of the last foreground command to exit can always be accessed using the \fC$status\fP variable. .SS "Example" .PP .nf if test -f foo.txt echo foo.txt exists else if test -f bar.txt echo bar.txt exists else echo foo.txt and bar.txt do not exist end .fi .PP will print \fCfoo.txt exists\fP if the file foo.txt exists and is a regular file, otherwise it will print \fCbar.txt exists\fP if the file bar.txt exists and is a regular file, otherwise it will print \fCfoo.txt and bar.txt do not exist\fP. fish/share/man/man1/isatty.10000644000076500000240000000100412145357604016423 0ustar00peterstaff00000000000000.TH "isatty" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME isatty - test if the specified file descriptor is a tty .PP .SS "Synopsis" \fCisatty [FILE DESCRIPTOR]\fP .SS "Description" \fCisatty\fP tests if a file descriptor is a tty. .PP \fCFILE DESCRIPTOR\fP may be either the number of a file descriptor, or one of the strings \fCstdin\fP, \fCstdout\fP and \fCstderr\fP. .PP If the specified file descriptor is a tty, the exit status of the command is zero. Otherwise, it is non-zero. fish/share/man/man1/jobs.10000644000076500000240000000203512145357604016050 0ustar00peterstaff00000000000000.TH "jobs" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME jobs - print currently running jobs .PP .SS "Synopsis" \fCjobs [OPTIONS] [PID]\fP .SS "Description" \fCjobs\fP prints a list of the currently running \fCjobs\fP and their status. .PP jobs accepts the following switches: .PP .IP "\(bu" 2 \fC-c\fP or \fC--command\fP prints the command name for each process in jobs. .IP "\(bu" 2 \fC-g\fP or \fC--group\fP only prints the group ID of each job. .IP "\(bu" 2 \fC-h\fP or \fC--help\fP displays a help message and exits. .IP "\(bu" 2 \fC-l\fP or \fC--last\fP prints only the last job to be started. .IP "\(bu" 2 \fC-p\fP or \fC--pid\fP prints the process ID for each process in all jobs. .PP .PP 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 expressed as a percentage of full CPU activity. Note that on multiprocessor systems, the total activity may be more than 100%. .SS "Example" \fCjobs\fP outputs a summary of the current jobs. fish/share/man/man1/math.10000644000076500000240000000162412145357604016047 0ustar00peterstaff00000000000000.TH "math" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME math - Perform mathematics calculations .PP .SS "Synopsis" \fCmath EXPRESSION\fP .SS "Description" \fCmath\fP is used to perform mathematical calculations. It is a very thin wrapper for the bc program, which makes it possible to specify an expression from the command line without using non-standard extensions or a pipeline. .PP For a description of the syntax supported by math, see the manual for the bc program. Keep in mind that parameter expansion takes place on any expressions before they are evaluated. This can be very useful in order to perform calculations involving environment variables or the output of command substitutions, but it also means that parenthesis have to be escaped. .SS "Examples" \fCmath 1+1\fP outputs 2. .PP \fCmath $status-128\fP outputs the numerical exit status of the last command minus 128. fish/share/man/man1/mimedb.10000644000076500000240000000276212145357604016357 0ustar00peterstaff00000000000000.TH "mimedb" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME mimedb - lookup file information via the mime database .PP .SS "Synopsis" \fCmimedb [OPTIONS] FILES...\fP .SS "Description" \fCmimedb\fP queries the MIME type database and the \fC\fP.desktop files installed on the system in order to find information on the files listed in \fCFILES\fP. The information that \fCmimedb\fP can retrieve includes the MIME type for a file, a description of the type, and the default action that can be performed on the file. \fCmimedb\fP can also be used to launch the default action for this file. .PP The following options are available: .PP .IP "\(bu" 2 \fC-t\fP, \fC--input-file-data\fP determines the files' type both by their filename and by their contents (default behaviour). .IP "\(bu" 2 \fC-f\fP, \fC--input-filename\fP determines the files' type by their filename. .IP "\(bu" 2 \fC-i\fP, \fC--input-mime\fP specifies that the arguments are not files, but MIME types. .IP "\(bu" 2 \fC-m\fP, \fC--output-mime\fP outputs the MIME type of each file (default behaviour). .IP "\(bu" 2 \fC-f\fP, \fC--output-description\fP outputs the description of each MIME type. .IP "\(bu" 2 \fC-a\fP, \fC--output-action\fP outputs the default action of each MIME type. .IP "\(bu" 2 \fC-l\fP, \fC--launch\fP launches the default action for the specified files. .IP "\(bu" 2 \fC-h\fP, \fC--help\fP displays a help message and exit. .IP "\(bu" 2 \fC-v\fP, \fC--version\fP displays the version number and exits. .PP fish/share/man/man1/nextd.10000644000076500000240000000127512145357604016242 0ustar00peterstaff00000000000000.TH "nextd" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME nextd - move forward through directory history .PP .SS "Synopsis" \fCnextd [-l | --list] [POS]\fP .SS "Description" \fCnextd\fP moves forwards \fCPOS\fP positions in the history of visited directories; if the end of the history has been hit, a warning is printed. .PP If the \fC-l>\fP or \fC--list\fP flag is specified, the current directory history is also displayed. .SS "Example" .PP .nf cd /usr/src # Working directory is now /usr/src cd /usr/src/fish-shell # Working directory is now /usr/src/fish-shell prevd # Working directory is now /usr/src nextd # Working directory is now /usr/src/fish-shell .fi .PP fish/share/man/man1/not.10000644000076500000240000000076712145357604015725 0ustar00peterstaff00000000000000.TH "not" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME not - negate the exit status of a job .PP .SS "Synopsis" \fCnot COMMAND [OPTIONS...]\fP .SS "Description" \fCnot\fP negates the exit status of another command. If the exit status is zero, \fCnot\fP returns 1. Otherwise, \fCnot\fP returns 0. .SS "Example" The following code reports an error and exits if no file named spoon can be found. .PP .PP .nf if not test -f spoon echo There is no spoon exit 1 end .fi .PP fish/share/man/man1/or.10000644000076500000240000000137112145357604015535 0ustar00peterstaff00000000000000.TH "or" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME or - conditionally execute a command .PP .SS "Synopsis" \fCCOMMAND1; or COMMAND2\fP .SS "Description" \fCor\fP is used to execute a command if the current exit status (as set by the last previous command) is not 0. .PP \fCor\fP does not change the current exit status. .PP The exit status of the last foreground command to exit can always be accessed using the \fC$status\fP variable. .SS "Example" The following code runs the \fCmake\fP command to build a program. If the build succeeds, the program is installed. If either step fails, \fCmake clean\fP is run, which removes the files created by the build process. .PP .PP .nf make; and make install; or make clean .fi .PP fish/share/man/man1/popd.10000644000076500000240000000124112145357604016053 0ustar00peterstaff00000000000000.TH "popd" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME popd - move through directory stack .PP .SS "Synopsis" \fCpopd\fP .SS "Description" \fCpopd\fP removes the top directory from the directory stack and changes the working directory to the new top directory. Use \fC\fCpushd\fP\fP to add directories to the stack. .SS "Example" .PP .nf pushd /usr/src # Working directory is now /usr/src # Directory stack contains /usr/src pushd /usr/src/fish-shell # Working directory is now /usr/src/fish-shell # Directory stack contains /usr/src /usr/src/fish-shell popd # Working directory is now /usr/src # Directory stack contains /usr/src .fi .PP fish/share/man/man1/prevd.10000644000076500000240000000127212145357604016235 0ustar00peterstaff00000000000000.TH "prevd" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME prevd - move backward through directory history .PP .SS "Synopsis" \fCprevd [-l | --list] [POS]\fP .SS "Description" \fCprevd\fP moves backwards \fCPOS\fP positions in the history of visited directories; if the beginning of the history has been hit, a warning is printed. .PP If the \fC-l\fP or \fC--list\fP flag is specified, the current history is also displayed. .SS "Example" .PP .nf cd /usr/src # Working directory is now /usr/src cd /usr/src/fish-shell # Working directory is now /usr/src/fish-shell prevd # Working directory is now /usr/src nextd # Working directory is now /usr/src/fish-shell .fi .PP fish/share/man/man1/psub.10000644000076500000240000000220612145357604016064 0ustar00peterstaff00000000000000.TH "psub" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME psub - perform process substitution .PP .SS "Synopsis" \fCCOMMAND1 (COMMAND2|psub [-f]) \fP .SS "Description" Posix shells feature a syntax that is a mix between command substitution and piping, called process substitution. It is used to send the output of a command into the calling command, much like command substitution, but with the difference that the output is not sent through commandline arguments but through a named pipe, with the filename of the named pipe sent as an argument to the calling program. \fCpsub\fP combined with a regular command substitution provides the same functionality. .PP If the \fC-f\fP or \fC--file\fP switch is given to \fCpsub\fP, \fCpsub\fP will use a regular file instead of a named pipe to communicate with the calling process. This will cause \fCpsub\fP to be significantly slower when large amounts of data are involved, but has the advantage that the reading process can seek in the stream. .SS "Example" \fCdiff (sort a.txt|psub) (sort b.txt|psub)\fP shows the difference between the sorted versions of files a.txt and b.txt. fish/share/man/man1/pushd.10000644000076500000240000000130712145357604016237 0ustar00peterstaff00000000000000.TH "pushd" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME pushd - push directory to directory stack .PP .SS "Synopsis" \fCpushd [DIRECTORY]\fP .SS "Description" The \fCpushd\fP function adds \fCDIRECTORY\fP to the top of the directory stack and makes it the current working directory. \fC\fCpopd\fP\fP will pop it off and return to the original directory. .SS "Example" .PP .nf pushd /usr/src # Working directory is now /usr/src # Directory stack contains /usr/src pushd /usr/src/fish-shell # Working directory is now /usr/src/fish-shell # Directory stack contains /usr/src /usr/src/fish-shell popd # Working directory is now /usr/src # Directory stack contains /usr/src .fi .PP fish/share/man/man1/pwd.10000644000076500000240000000050112145357604015701 0ustar00peterstaff00000000000000.TH "pwd" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME pwd - output the current working directory .PP .SS "Synopsis" \fCpwd\fP .SS "Description" \fCpwd\fP outputs (prints) the current working directory. .PP Note that \fCfish\fP always resolves symbolic links in the current directory path. fish/share/man/man1/random.10000644000076500000240000000134712145357604016400 0ustar00peterstaff00000000000000.TH "random" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME random - generate random number .PP .SS "Synopsis" \fCrandom [SEED]\fP .SS "Description" \fCrandom\fP outputs a random number from 0 to 32766, inclusive. .PP If a \fCSEED\fP value is provided, it is used to seed the random number generator, and no output will be produced. This can be useful for debugging purposes, where it can be desirable to get the same random number sequence multiple times. If the random number generator is called without first seeding it, the current time will be used as the seed. .SS "Example" The following code will count down from a random number to 1: .PP .PP .nf for i in (seq (random) -1 1) echo $i sleep end .fi .PP fish/share/man/man1/read.10000644000076500000240000000367712145357604016043 0ustar00peterstaff00000000000000.TH "read" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME read - read line of input into variables .PP .SS "Synopsis" \fCread [OPTIONS] [VARIABLES...]\fP .SS "Description" \fCread\fP reads one line from standard input and stores the result in one or more environment variables. .PP The following options are available: .PP .IP "\(bu" 2 \fC-c CMD\fP or \fC--command=CMD\fP sets the initial string in the interactive mode command buffer to \fCCMD\fP. .IP "\(bu" 2 \fC-g\fP or \fC--global\fP makes the variables global (default behaviour). .IP "\(bu" 2 \fC-l\fP or \fC--local\fP makes the variables local. .IP "\(bu" 2 \fC-m NAME\fP or \fC--mode-name=NAME\fP specifies that the name NAME should be used to save/load the history file. If NAME is fish, the regular fish history will be available. .IP "\(bu" 2 \fC-p PROMPT_CMD\fP or \fC--prompt=PROMPT_CMD\fP uses the output of the shell command \fCPROMPT_CMD\fP as the prompt for the interactive mode. The default prompt command is \fCset_color green; echo read; set_color normal; echo '> '\fP. .IP "\(bu" 2 \fC-s\fP or \fC--shell\fP enables syntax highlighting, tab completions and command termination suitable for entering shellscript code in the interactive mode. .IP "\(bu" 2 \fC-u\fP or \fC--unexport\fP prevents the variables from being exported to child processes (default behaviour). .IP "\(bu" 2 \fC-U\fP or \fC--universal\fP causes the specified environment variable to be made universal. .IP "\(bu" 2 \fC-x\fP or \fC--export\fP exports the variables to child processes. .PP .PP \fCread\fP reads a single line of input from stdin, breaks it into tokens based on the \fCIFS\fP environment variable, and then assigns one token to each variable specified in \fCVARIABLES\fP. If there are more tokens than variables, the complete remainder is assigned to the last variable. .SS "Example" The following code stores the value 'hello' in the environment variable \fC$foo\fP. .PP \fCecho hello|read foo\fP fish/share/man/man1/return.10000644000076500000240000000134112145357604016431 0ustar00peterstaff00000000000000.TH "return" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME return - stop the current inner function .PP .SS "Synopsis" \fCfunction NAME; [COMMANDS...;] return [STATUS]; [COMMANDS...;] end\fP .SS "Description" \fCreturn\fP halts a currently running function. The exit status is set to \fCSTATUS\fP if it is given. .PP It is usually added inside of a conditional block such as an \fCif\fP statement or a \fCswitch\fP statement to conditionally stop the executing function and return to the caller, but it can also be used to specify the exit status of a function. .SS "Example" The following code is an implementation of the false command as a fish function .PP .PP .nf function false return 1 end .fi .PP fish/share/man/man1/set.10000644000076500000240000001415012145357604015707 0ustar00peterstaff00000000000000.TH "set" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME set - display and change environment variables. .PP .SS "Synopsis" .PP .nf set [SCOPE_OPTIONS] set [OPTIONS] VARIABLE_NAME VALUES... set [OPTIONS] VARIABLE_NAME[INDICES]... VALUES... set (-q | --query) [SCOPE_OPTIONS] VARIABLE_NAMES... set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME[INDICES]... .fi .PP .SS "Description" \fCset\fP manipulates \fCenvironment variables\fP. .PP 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. .PP With both variable names and values provided, \fCset\fP assigns the variable \fCVARIABLE_NAME\fP the values \fCVALUES...\fP. .PP The following options control variable scope: .IP "\(bu" 2 \fC-l\fP or \fC--local\fP forces the specified environment variable to be given a scope that is local to the current block, even if a variable with the given name exists and is non-local .IP "\(bu" 2 \fC-g\fP or \fC--global\fP causes the specified environment variable to be given a global scope. Non-global variables disappear when the block they belong to ends .IP "\(bu" 2 \fC-U\fP or \fC--universal\fP causes the specified environment variable to be given a universal scope. If this option is supplied, the variable will be shared between all the current users fish instances on the current computer, and will be preserved across restarts of the shell. .IP "\(bu" 2 \fC-n\fP or \fC--names\fP List only the names of all defined variables, not their value .IP "\(bu" 2 \fC-u\fP or \fC--unexport\fP causes the specified environment not to be exported to child processes .IP "\(bu" 2 \fC-x\fP or \fC--export\fP causes the specified environment variable to be exported to child processes .PP .PP The following options are available: .IP "\(bu" 2 \fC-e\fP or \fC--erase\fP causes the specified environment variable to be erased .IP "\(bu" 2 \fC-q\fP or \fC--query\fP 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. .IP "\(bu" 2 \fC-L\fP or \fC--long\fP do not abbreviate long values when printing set variables .PP .PP 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. .PP If the variable name is one or more array elements, such as \fCPATH[1 3 7]\fP, only those array elements specified will be changed. When array indices are specified to \fCset\fP, multiple arguments may be used to specify additional indexes, e.g. \fCset PATH[1] PATH[4] /bin /sbin\fP. If you specify a negative index when expanding or assigning to an array variable, the index will be calculated from the end of the array. For example, the index -1 means the last index of an array. .PP The scoping rules when creating or updating a variable are: .PP .IP "1." 4 If a variable is explicitly set to either universal, global or local, that setting will be honored. If a variable of the same name exists in a different scope, that variable will not be changed. .IP "2." 4 If a variable is not explicitly set to be either universal, global or local, but has been previously defined, the previous variable scope is used. .IP "3." 4 If a variable is not explicitly set to be either universal, global or local and has never before been defined, the variable will be local to the currently executing function. Note that this is different from using the \fC-l\fP or \fC--local\fP flag. If one of those flags is used, the variable will be local to the most inner currently executing block, while without these the variable will be local to the function. If no function is executing, the variable will be global. .PP .PP The exporting rules when creating or updating a variable are identical to the scoping rules for variables: .PP .IP "1." 4 If a variable is explicitly set to either be exported or not exported, that setting will be honored. .IP "2." 4 If a variable is not explicitly set to be exported or not exported, but has been previously defined, the previous exporting rule for the variable is kept. .IP "3." 4 If a variable is not explicitly set to be either exported or unexported and has never before been defined, the variable will not be exported. .PP .PP In query mode, the scope to be examined can be specified. .PP In erase mode, if variable indices are specified, only the specified slices of the array variable will be erased. When erasing an entire variable (i.e. no slicing), the scope of the variable to be erased can be specified. That way, a global variable can be erased even if a local variable with the same name exists. Scope can not be specified when erasing a slice of an array. The innermost scope is always used. .PP \fCset\fP requires all options to come before any other arguments. For example, \fCset flags -l\fP will have the effect of setting the value of the variable \fCflags\fP to '-l', not making the variable local. .PP In assignment mode, \fCset\fP exits with a non-zero exit status if variable assignments could not be successfully performed. If the variable assignments were performed, the exit status is unchanged. This allows simultaneous capture of the output and exit status of a subcommand, e.g. \fCif set output (command)\fP. In query mode, the exit status is the number of variables that were not found. In erase mode, \fCset\fP exits with a zero exit status in case of success, with a non-zero exit status if the commandline was invalid, if the variable was write-protected or if the variable did not exist. .SS "Example" \fCset -xg\fP will print all global, exported variables. .PP \fCset foo hi\fP sets the value of the variable foo to be hi. .PP \fCset -e smurf\fP removes the variable \fCsmurf\fP. .PP \fCset PATH[4] ~/bin\fP changes the fourth element of the \fCPATH\fP array to \fC~/bin\fP .PP .PP .nf if set python_path (which python) echo 'Python is at $python_path' end .fi .PP .PP The above outputs the path to Python if \fCwhich\fP returns true. fish/share/man/man1/set_color.10000644000076500000240000000347712145357604017117 0ustar00peterstaff00000000000000.TH "set_color" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME set_color - set the terminal color .PP .SS "Synopsis" \fCset_color [-h --help] [-b --background COLOR] [COLOR]\fP .SS "Description" \fCset_color\fP changes the foreground and/or background color of the terminal. \fCCOLOR\fP is one of black, red, green, brown, yellow, blue, magenta, purple, cyan, white and normal. .PP If your terminal supports term256 (modern xterms and OS X Lion), you can specify an RGB value with three or six hex digits, such as A0FF33 or f2f. \fCfish\fP will choose the closest supported color. .PP The following options are available: .PP .IP "\(bu" 2 \fC-b\fP, \fC--background\fP \fCCOLOR\fP sets the background color. .IP "\(bu" 2 \fC-c\fP, \fC--print-colors\fP prints a list of all valid color names. .IP "\(bu" 2 \fC-h\fP, \fC--help\fP displays a help message and exit. .IP "\(bu" 2 \fC-o\fP, \fC--bold\fP sets bold or extra bright mode. .IP "\(bu" 2 \fC-u\fP, \fC--underline\fP sets underlined mode. .PP .PP Calling \fCset_color normal\fP will set the terminal color to the default color of the terminal. .PP Some terminals use the --bold escape sequence to switch to a brighter color set. On such terminals, \fCset_color white\fP will result in a grey font color, while \fCset_color --bold white\fP will result in a white font color. .PP Not all terminal emulators support all these features. .PP \fCset_color\fP uses the terminfo database to look up how to change terminal colors on whatever terminal is in use. Some systems have old and incomplete terminfo databases, and may lack color information for terminals that support it. .SS "Examples" .PP .nf set_color red; echo 'Roses are red' set_color blue; echo 'Violets are blue' set_color 62A ; echo 'Eggplants are dark purple' set_color normal; echo 'Normal is nice too' .fi .PP fish/share/man/man1/source.10000644000076500000240000000171312145357604016415 0ustar00peterstaff00000000000000.TH "source" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME . - evaluate contents of file. .PP .SS "Synopsis" \fC. FILENAME [ARGUMENTS...]\fP .SS "Description" \fC\fP. (source) evaluates the commands of the specified file in the current shell. This is different from starting a new process to perform the commands (i.e. \fCfish < FILENAME\fP) since the commands will be evaluated by the current shell, which means that changes in environment variables affect the current shell. If additional arguments are specified after the file name, they will be inserted into the $argv variable. .PP If no file is specified, or if the file name '-' is used, stdin will be read. .PP The return status of \fC\fP. is the return status of the last job to execute. If something goes wrong while opening or reading the file, \fC\fP. exits with a non-zero status. .SS "Example" \fC. ~/.config/fish/config.fish\fP causes fish to re-read its initialization file. fish/share/man/man1/status.10000644000076500000240000000315512145357604016442 0ustar00peterstaff00000000000000.TH "status" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME status - query fish runtime information .PP .SS "Synopsis" \fCstatus [OPTION]\fP .SS "Description" With no arguments, \fCstatus\fP displays a summary of the current login and job control status of the shell. .PP The following options are available: .IP "\(bu" 2 \fC-c\fP or \fC--is-command-substitution\fP returns 0 if fish is currently executing a command substitution. .IP "\(bu" 2 \fC-b\fP or \fC--is-block\fP returns 0 if fish is currently executing a block of code. .IP "\(bu" 2 \fC-i\fP or \fC--is-interactive\fP returns 0 if fish is interactive - that is, connected to a keyboard. .IP "\(bu" 2 \fC-l\fP or \fC--is-login\fP returns 0 if fish is a login shell - that is, if fish should perform login tasks such as setting up the PATH. .IP "\(bu" 2 \fC--is-full-job-control\fP returns 0 if full job control is enabled. .IP "\(bu" 2 \fC--is-interactive-job-control\fP returns 0 if interactive job control is enabled. .IP "\(bu" 2 \fC--is-no-job-control\fP returns 0 if no job control is enabled. .IP "\(bu" 2 \fC-f\fP or \fC--current-filename\fP prints the filename of the currently running script. .IP "\(bu" 2 \fC-n\fP or \fC--current-line-number\fP prints the line number of the currently running script. .IP "\(bu" 2 \fC-j CONTROLTYPE\fP or \fC--job-control=CONTROLTYPE\fP sets the job control type, which can be \fCnone\fP, \fCfull\fP, or \fCinteractive\fP. .IP "\(bu" 2 \fC-t\fP or \fC--print-stack-trace\fP prints a stack trace of all function calls on the call stack. .IP "\(bu" 2 \fC-h\fP or \fC--help\fP displays a help message and exit. .PP fish/share/man/man1/switch.10000644000076500000240000000317712145357604016424 0ustar00peterstaff00000000000000.TH "switch" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME switch - conditionally execute a block of commands .PP .SS "Synopsis" \fCswitch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end\fP .SS "Description" \fCswitch\fP performs one of several blocks of commands, depending on whether a specified value equals one of several wildcarded values. \fCcase\fP is used together with the \fCswitch\fP statement in order to determine which block should be executed. .PP Each \fCcase\fP command is given one or more parameters. The first \fCcase\fP command with a parameter that matches the string specified in the switch command will be evaluated. \fCcase\fP parameters may contain wildcards. These need to be escaped or quoted in order to avoid regular wildcard expansion using filenames. .PP Note that fish does not fall through on case statements. Only the first matching case is executed. .PP Note that command substitutions in a case statement will be evaluated even if its body is not taken. All substitutions, including command substitutions, must be performed before the value can be compared against the parameter. .SS "Example" If the variable $animal contains the name of an animal, the following code would attempt to classify it: .PP .PP .nf switch $animal case cat echo evil case wolf dog human moose dolphin whale echo mammal case duck goose albatross echo bird case shark trout stingray echo fish case '*' echo I have no idea what a $animal is end .fi .PP .PP If the above code was run with \fC$animal\fP set to \fCwhale\fP, the output would be \fCmammal\fP. fish/share/man/man1/trap.10000644000076500000240000000345512145357604016070 0ustar00peterstaff00000000000000.TH "trap" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME trap - perform an action when the shell receives a signal .PP .SS "Synopsis" \fCtrap [OPTIONS] [[ARG] SIGSPEC ... ]\fP .SS "Description" \fCtrap\fP is a wrapper around the fish event delivery framework. It exists for backwards compatibility with POSIX shells. For other uses, it is recommended to define an \fCevent handler\fP. .PP The following parameters are available: .PP .IP "\(bu" 2 \fCARG\fP is the command to be executed on signal delivery. .IP "\(bu" 2 \fCSIGSPEC\fP is the name of the signal to trap. .IP "\(bu" 2 \fC-h\fP or \fC--help\fP displays help and exits. .IP "\(bu" 2 \fC-l\fP or \fC--list-signals\fP prints a list of signal names. .IP "\(bu" 2 \fC-p\fP or \fC--print\fP prints all defined signal handlers. .PP .PP If \fCARG\fP and \fCSIGSPEC\fP are both specified, \fCARG\fP is the command to be executed when the signal specified by \fCSIGSPEC\fP is delivered. .PP If \fCARG\fP is absent (and there is a single SIGSPEC) or -, each specified signal is reset to its original disposition (the value it had upon entrance to the shell). If \fCARG\fP is the null string the signal specified by each \fCSIGSPEC\fP is ignored by the shell and by the commands it invokes. .PP If \fCARG\fP is not present and \fC-p\fP has been supplied, then the trap commands associated with each \fCSIGSPEC\fP are displayed. If no arguments are supplied or if only \fC-p\fP is given, \fCtrap\fP prints the list of commands associated with each signal. .PP Signal names are case insensitive and the \fCSIG\fP prefix is optional. .PP The return status is 1 if any \fCSIGSPEC\fP is invalid; otherwise trap returns 0. .SS "Example" \fCtrap 'status --print-stack-trace' SIGUSR1\fP prints a stack trace each time the \fCSIGUSR1\fP signal is sent to the shell. fish/share/man/man1/type.10000644000076500000240000000244612145357604016102 0ustar00peterstaff00000000000000.TH "type" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME type - indicate how a command would be interpreted .PP .SS "Synopsis" \fCtype [OPTIONS] NAME [NAME ...]\fP .SS "Description" With no options, \fCtype\fP indicates how each \fCNAME\fP would be interpreted if used as a command name. .PP The following options are available: .PP .IP "\(bu" 2 \fC-h\fP or \fC--help\fP prints help and then exits. .IP "\(bu" 2 \fC-a\fP or \fC--all\fP prints all of possible definitions of the specified names. .IP "\(bu" 2 \fC-f\fP or \fC--no-functions\fP suppresses function and builtin lookup. .IP "\(bu" 2 \fC-t\fP or \fC--type\fP prints \fCkeyword\fP, \fCfunction\fP, \fCbuiltin\fP, or \fCfile\fP if \fCNAME\fP is a shell reserved word, function, builtin, or disk file, respectively. .IP "\(bu" 2 \fC-p\fP or \fC--path\fP returns the name of the disk file that would be executed, or nothing if 'type -t name' would not return 'file'. .IP "\(bu" 2 \fC-P\fP or \fC--force-path\fP returns the name of the disk file that would be executed, or nothing no file with the specified name could be found in the \fC$PATH\fP. .PP .PP \fCtype\fP sets the exit status to 0 if the specified command was found, and 1 if it could not be found. .SS "Example" \fCtype fg\fP outputs the string 'fg is a shell builtin'. fish/share/man/man1/ulimit.10000644000076500000240000000746012145357604016425 0ustar00peterstaff00000000000000.TH "ulimit" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME ulimit - set or get resource usage limits .PP .SS "Synopsis" \fCulimit [OPTIONS] [LIMIT]\fP .SS "Description" \fCulimit\fP builtin sets or outputs the resource usage limits of the shell and any processes spawned by it. If a new limit value is omitted, the current value of the limit of the resource is printed; otherwise, the specified limit is set to the new value. .PP Use one of the following switches to specify which resource limit to set or report: .PP .IP "\(bu" 2 \fC-c\fP or \fC--core-size\fP: the maximum size of core files created. By setting this limit to zero, core dumps can be disabled. .IP "\(bu" 2 \fC-d\fP or \fC--data-size\fP: the maximum size of a process' data segment. .IP "\(bu" 2 \fC-f\fP or \fC--file-size\fP: the maximum size of files created by the shell. .IP "\(bu" 2 \fC-l\fP or \fC--lock-size\fP: the maximum size that may be locked into memory. .IP "\(bu" 2 \fC-m\fP or \fC--resident-set-size\fP: the maximum resident set size. .IP "\(bu" 2 \fC-n\fP or \fC--file-descriptor-count\fP: the maximum number of open file descriptors (most systems do not allow this value to be set). .IP "\(bu" 2 \fC-s\fP or \fC--stack-size\fP: the maximum stack size. .IP "\(bu" 2 \fC-t\fP or \fC--cpu-time\fP: the maximum amount of CPU time in seconds. .IP "\(bu" 2 \fC-u\fP or \fC--process-count\fP: the maximum number of processes available to a single user. .IP "\(bu" 2 \fC-v\fP or \fC--virtual-memory-size\fP The maximum amount of virtual memory available to the shell. .PP .PP Note that not all these limits are available in all operating systems. .PP The value of limit can be a number in the unit specified for the resource or one of the special values \fChard\fP, \fCsoft\fP, or \fCunlimited\fP, which stand for the current hard limit, the current soft limit, and no limit, respectively. .PP If limit is given, it is the new value of the specified resource. If no option is given, then \fC-f\fP is assumed. Values are in kilobytes, except for \fC-t\fP, which is in seconds and \fC-n\fP and \fC-u\fP, 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. .PP \fCulimit\fP also accepts the following switches that determine what type of limit to set: .PP .IP "\(bu" 2 \fC-H\fP or \fC--hard\fP sets hard resource limit .IP "\(bu" 2 \fC-S\fP or \fC--soft\fP sets soft resource limit .PP .PP A hard limit can only be decreased. Once it is set it cannot be increased; a soft limit may be increased up to the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are updated when assigning a new limit value, and the soft limit is used when reporting the current value. .PP The following additional options are also understood by \fCulimit\fP: .PP .IP "\(bu" 2 \fC-a\fP or \fC--all\fP prints all current limits .IP "\(bu" 2 \fC-h\fP or \fC--help\fP displays help and exits. .PP .PP The \fCfish\fP implementation of \fCulimit\fP should behave identically to the implementation in bash, except for these differences: .PP .IP "\(bu" 2 Fish \fCulimit\fP supports GNU-style long options for all switches .IP "\(bu" 2 Fish \fCulimit\fP does not support the \fC-p\fP option for getting the pipe size. The bash implementation consists of a compile-time check that empirically guesses this number by writing to a pipe and waiting for SIGPIPE. Fish does not do this because it this method of determining pipe size is unreliable. Depending on bash version, there may also be further additional limits to set in bash that do not exist in fish. .IP "\(bu" 2 Fish \fCulimit\fP does not support getting or setting multiple limits in one command, except reporting all values using the -a switch .PP .SS "Example" \fCulimit -Hs 64\fP sets the hard stack size limit to 64 kB. fish/share/man/man1/umask.10000644000076500000240000000520312145357604016233 0ustar00peterstaff00000000000000.TH "umask" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME umask - set or get the file creation mode mask .PP .SS "Synopsis" \fCumask [OPTIONS] [MASK]\fP .SS "Description" \fCumask\fP displays and manipulates the 'umask', or file creation mode mask, which is used to restrict the default access to files. .PP The umask may be expressed either as an octal number, which represents the rights that will be removed by default, or symbolically, which represents the only rights that will be granted by default. .PP Access rights are explained in the manual page for the \fCchmod(1)\fP program. .PP With no parameters, the current file creation mode mask is printed as an octal number. .PP .IP "\(bu" 2 \fC-h\fP or \fC--help\fP prints this message. .IP "\(bu" 2 \fC-S\fP or \fC--symbolic\fP prints the umask in symbolic form instead of octal form. .IP "\(bu" 2 \fC-p\fP or \fC--as-command\fP outputs the umask in a form that may be reused as input .PP .PP If a numeric mask is specified as a parameter, the current shell's umask will be set to that value, and the rights specified by that mask will be removed from new files and directories by default. .PP If a symbolic mask is specified, the desired permission bits, and not the inverse, should be specified. A symbolic mask is a comma separated list of rights. Each right consists of three parts: .PP .IP "\(bu" 2 The first part specifies to whom this set of right applies, and can be one of \fCu\fP, \fCg\fP, \fCo\fP or \fCa\fP, where \fCu\fP specifies the user who owns the file, \fCg\fP specifies the group owner of the file, \fCo\fP specific other users rights and \fCa\fP specifies all three should be changed. .IP "\(bu" 2 The second part of a right specifies the mode, and can be one of \fC=\fP, \fC+\fP or \fC-\fP, where \fC=\fP specifies that the rights should be set to the new value, \fC+\fP specifies that the specified right should be added to those previously specified and \fC-\fP specifies that the specified rights should be removed from those previously specified. .IP "\(bu" 2 The third part of a right specifies what rights should be changed and can be any combination of \fCr\fP, \fCw\fP and \fCx\fP, representing read, write and execute rights. .PP .PP If the first and second parts are skipped, they are assumed to be \fCa\fP and \fC=\fP, respectively. As an example, \fCr,u+w\fP means all users should have read access and the file owner should also have write access. .PP Note that symbolic masks currently do not work as intended. .SS "Example" \fCumask 177\fP or \fCumask u=rw\fP sets the file creation mask to read and write for the owner and no permissions at all for any other users. fish/share/man/man1/vared.10000644000076500000240000000072612145357604016221 0ustar00peterstaff00000000000000.TH "vared" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME vared - interactively edit the value of an environment variable .PP .SS "Synopsis" \fCvared VARIABLE_NAME\fP .SS "Description" \fCvared\fP is used to interactively edit the value of an environment variable. Array variables as a whole can not be edited using \fCvared\fP, but individual array elements can. .SS "Example" \fCvared PATH[3]\fP edits the third element of the PATH array fish/share/man/man1/while.10000644000076500000240000000134112145357604016222 0ustar00peterstaff00000000000000.TH "while" 1 "17 May 2013" "Version 2.0.0" "fish" \" -*- nroff -*- .ad l .nh .SH NAME while - perform a command multiple times .PP .SS "Synopsis" \fCwhile CONDITION; COMMANDS...; end\fP .SS "Description" \fCwhile\fP repeatedly executes \fCCONDITION\fP, and if the exit status is 0, then executes \fCCOMMANDS\fP. .PP If the exit status of \fCCONDITION\fP is non-zero on the first iteration, \fCCOMMANDS\fP will not be executed at all. .PP Use \fC\fCbegin; ...; end\fP\fP for complex conditions; more complex control can be achieved with \fCwhile true\fP containing a \fCbreak\fP. .SS "Example" \fCwhile test -f foo.txt; echo file exists; sleep 10; end\fP outputs 'file exists' at 10 second intervals as long as the file foo.txt exists.