2005-09-20 21:26:39 +08:00
/** \file complete.h
2012-11-18 18:23:22 +08:00
Prototypes for functions related to tab - completion .
2005-09-20 21:26:39 +08:00
2012-11-18 18:23:22 +08:00
These functions are used for storing and retrieving tab - completion
data , as well as for performing tab - completion .
2005-09-20 21:26:39 +08:00
*/
2005-10-04 23:11:39 +08:00
# ifndef FISH_COMPLETE_H
# define FISH_COMPLETE_H
2015-07-25 23:14:25 +08:00
# include <vector>
2014-01-25 10:53:12 +08:00
# include <stdint.h>
2016-04-21 14:00:54 +08:00
# include <stdbool.h>
2005-10-04 23:11:39 +08:00
2012-01-17 00:56:47 +08:00
# include "common.h"
2016-04-21 14:00:54 +08:00
2012-11-18 18:23:22 +08:00
/**
2012-11-18 20:52:21 +08:00
* Use all completions
*/
2005-09-20 21:26:39 +08:00
# define SHARED 0
2012-11-18 18:23:22 +08:00
/**
2012-11-18 20:52:21 +08:00
* Do not use file completion
*/
2005-09-20 21:26:39 +08:00
# define NO_FILES 1
2012-11-18 18:23:22 +08:00
/**
2012-11-18 20:52:21 +08:00
* Require a parameter after completion
*/
2005-09-20 21:26:39 +08:00
# define NO_COMMON 2
2012-11-18 18:23:22 +08:00
/**
2012-11-18 20:52:21 +08:00
* Only use the argument list specifies with completion after
2014-11-01 01:44:32 +08:00
* option . This is the same as ( NO_FILES | NO_COMMON )
2012-11-18 20:52:21 +08:00
*/
2005-09-20 21:26:39 +08:00
# define EXCLUSIVE 3
2012-11-18 18:23:22 +08:00
/**
2012-11-18 20:52:21 +08:00
* Command is a path
*/
2005-09-20 21:26:39 +08:00
# define PATH 1
2012-11-18 18:23:22 +08:00
/**
2012-11-18 20:52:21 +08:00
* Command is not a path
*/
2005-09-20 21:26:39 +08:00
# define COMMAND 0
2012-11-18 18:23:22 +08:00
/**
2012-11-18 20:52:21 +08:00
* Separator between completion and description
*/
2005-09-20 21:26:39 +08:00
# define COMPLETE_SEP L'\004'
2006-06-17 21:07:08 +08:00
2005-09-20 21:26:39 +08:00
/**
2012-11-18 20:52:21 +08:00
* Character that separates the completion and description on
* programmable completions
*/
2005-09-20 21:26:39 +08:00
# define PROG_COMPLETE_SEP L'\t'
2012-11-19 08:30:30 +08:00
enum
{
2012-02-26 10:54:49 +08:00
/**
Do not insert space afterwards if this is the only completion . ( The
default is to try insert a space )
*/
COMPLETE_NO_SPACE = 1 < < 0 ,
2013-03-06 12:54:16 +08:00
/** This is not the suffix of a token, but replaces it entirely */
COMPLETE_REPLACES_TOKEN = 1 < < 2 ,
2012-02-26 10:54:49 +08:00
2013-05-26 06:41:18 +08:00
/** This completion may or may not want a space at the end - guess by
checking the last character of the completion . */
2013-03-06 12:54:16 +08:00
COMPLETE_AUTO_SPACE = 1 < < 3 ,
2012-02-26 10:54:49 +08:00
2013-03-06 12:54:16 +08:00
/** This completion should be inserted as-is, without escaping. */
2013-04-08 14:54:43 +08:00
COMPLETE_DONT_ESCAPE = 1 < < 4 ,
2013-05-05 17:33:17 +08:00
2013-04-08 14:54:43 +08:00
/** If you do escape, don't escape tildes */
COMPLETE_DONT_ESCAPE_TILDES = 1 < < 5
2012-02-26 10:54:49 +08:00
} ;
typedef int complete_flags_t ;
2008-01-14 03:32:21 +08:00
2012-02-02 08:27:14 +08:00
class completion_t
2007-02-09 17:33:50 +08:00
{
2007-02-19 07:25:20 +08:00
2012-02-02 08:27:14 +08:00
private :
/* No public default constructor */
2012-11-19 08:30:30 +08:00
completion_t ( ) ;
2012-02-02 08:27:14 +08:00
public :
2013-04-17 06:01:24 +08:00
/* Destructor. Not inlining it saves code size. */
~ completion_t ( ) ;
2013-05-26 06:41:18 +08:00
/** The completion string */
2012-11-19 08:30:30 +08:00
wcstring completion ;
2012-11-18 18:23:22 +08:00
2013-05-26 06:41:18 +08:00
/** The description for this completion */
2012-11-19 08:30:30 +08:00
wcstring description ;
2007-02-19 07:25:20 +08:00
2013-05-26 06:41:18 +08:00
/** The type of fuzzy match */
string_fuzzy_match_t match ;
2012-11-19 08:30:30 +08:00
/**
Flags determining the completion behaviour .
2007-02-19 07:25:20 +08:00
2012-11-19 08:30:30 +08:00
Determines whether a space should be inserted after this
2013-01-24 19:17:13 +08:00
completion if it is the only possible completion using the
2012-11-19 08:30:30 +08:00
COMPLETE_NO_SPACE flag .
2007-02-19 07:25:20 +08:00
2012-11-19 08:30:30 +08:00
The COMPLETE_NO_CASE can be used to signal that this completion
is case insensitive .
*/
2014-01-15 06:28:06 +08:00
complete_flags_t flags ;
2013-06-02 16:14:26 +08:00
2012-07-18 03:47:01 +08:00
/* Construction. Note: defining these so that they are not inlined reduces the executable size. */
2016-02-28 11:38:15 +08:00
explicit completion_t ( const wcstring & comp , const wcstring & desc = wcstring ( ) , string_fuzzy_match_t match = string_fuzzy_match_t ( fuzzy_match_exact ) , complete_flags_t flags_val = 0 ) ;
2012-07-18 03:47:01 +08:00
completion_t ( const completion_t & ) ;
completion_t & operator = ( const completion_t & ) ;
2013-10-27 06:27:39 +08:00
2013-09-12 16:03:41 +08:00
/* Compare two completions. No operating overlaoding to make this always explicit (there's potentially multiple ways to compare completions). */
2015-03-24 02:13:26 +08:00
/* "Naturally less than" means in a natural ordering, where digits are treated as numbers. For example, foo10 is naturally greater than foo2 (but alphabetically less than it) */
static bool is_naturally_less_than ( const completion_t & a , const completion_t & b ) ;
2013-09-01 06:01:02 +08:00
static bool is_alphabetically_equal_to ( const completion_t & a , const completion_t & b ) ;
2015-08-03 08:58:37 +08:00
/* If this completion replaces the entire token, prepend a prefix. Otherwise do nothing. */
void prepend_token_prefix ( const wcstring & prefix ) ;
2012-02-03 04:04:04 +08:00
} ;
2007-02-09 17:33:50 +08:00
2016-02-07 07:06:33 +08:00
/** Sorts and remove any duplicate completions in the completion list, then puts them in priority order. */
void completions_sort_and_prioritize ( std : : vector < completion_t > * comps ) ;
2013-03-22 08:44:51 +08:00
enum
{
2013-03-06 12:54:16 +08:00
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
2012-02-25 04:13:35 +08:00
} ;
2013-03-06 12:54:16 +08:00
typedef uint32_t completion_request_flags_t ;
2007-02-09 17:33:50 +08:00
2005-09-20 21:26:39 +08:00
/**
2012-11-18 18:23:22 +08:00
Add a completion .
2005-09-20 21:26:39 +08:00
2006-11-29 22:21:02 +08:00
All supplied values are copied , they should be freed by or otherwise
disposed by the caller .
2005-09-20 21:26:39 +08:00
2012-11-18 18:23:22 +08:00
Examples :
2005-09-20 21:26:39 +08:00
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 :
2012-11-18 18:23:22 +08:00
2005-09-20 21:26:39 +08:00
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
2012-11-18 20:52:21 +08:00
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 )
2012-11-18 18:23:22 +08:00
\ param long_mode Whether to use old style , single dash long options .
2005-09-20 21:26:39 +08:00
\ param result_mode Whether to search further completions when this
2012-11-18 20:52:21 +08:00
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 .
2005-09-20 21:26:39 +08:00
\ param comp A space separated list of completions which may contain subshells .
\ param desc A description of the completion .
2012-11-18 20:52:21 +08:00
\ 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 .
2008-01-14 00:47:47 +08:00
\ param flags A set of completion flags
2005-09-20 21:26:39 +08:00
*/
2016-01-17 07:46:43 +08:00
enum complete_option_type_t
{
option_type_args_only , // no option
option_type_short , // -x
option_type_single_long , // -foo
option_type_double_long // --foo
} ;
2012-11-19 08:30:30 +08:00
void complete_add ( const wchar_t * cmd ,
bool cmd_is_path ,
2016-01-17 07:46:43 +08:00
const wcstring & option ,
complete_option_type_t option_type ,
2012-11-19 08:30:30 +08:00
int result_mode ,
const wchar_t * condition ,
const wchar_t * comp ,
const wchar_t * desc ,
int flags ) ;
2007-01-28 21:40:59 +08:00
/**
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 .
*/
2012-11-19 08:30:30 +08:00
void complete_set_authoritative ( const wchar_t * cmd , bool cmd_type , bool authoritative ) ;
2005-09-20 21:26:39 +08:00
/**
Remove a previously defined completion
*/
2016-01-17 14:42:14 +08:00
void complete_remove ( const wcstring & cmd ,
2012-11-19 08:30:30 +08:00
bool cmd_is_path ,
2016-01-17 14:42:14 +08:00
const wcstring & option ,
complete_option_type_t type ) ;
2005-09-20 21:26:39 +08:00
2016-01-17 14:42:14 +08:00
/** Removes all completions for a given command */
void complete_remove_all ( const wcstring & cmd , bool cmd_is_path ) ;
2012-02-25 04:13:35 +08:00
2013-11-30 15:44:26 +08:00
/** Find all completions of the command cmd, insert them into out.
2012-11-18 20:52:21 +08:00
*/
2016-02-08 17:29:23 +08:00
class env_vars_snapshot_t ;
2012-11-18 20:52:21 +08:00
void complete ( const wcstring & cmd ,
2016-02-07 11:17:43 +08:00
std : : vector < completion_t > * out_comps ,
2016-02-08 17:29:23 +08:00
completion_request_flags_t flags ,
const env_vars_snapshot_t & vars ) ;
2005-09-20 21:26:39 +08:00
/**
2015-09-22 02:24:49 +08:00
Return a list of all current completions .
2005-09-20 21:26:39 +08:00
*/
2015-09-22 02:24:49 +08:00
wcstring complete_print ( ) ;
2005-09-20 21:26:39 +08:00
/**
Tests if the specified option is defined for the specified command
*/
2012-11-19 08:30:30 +08:00
int complete_is_valid_option ( const wcstring & str ,
const wcstring & opt ,
wcstring_list_t * inErrorsOrNull ,
bool allow_autoload ) ;
2005-09-20 21:26:39 +08:00
/**
Tests if the specified argument is valid for the specified option
and command
*/
2012-11-19 08:30:30 +08:00
bool complete_is_valid_argument ( const wcstring & str ,
const wcstring & opt ,
const wcstring & arg ) ;
2005-09-20 21:26:39 +08:00
2007-02-19 07:25:20 +08:00
/**
Create a new completion entry
2012-02-02 08:27:14 +08:00
\ param completions The array of completions to append to
2008-01-14 00:47:47 +08:00
\ param comp The completion string
2007-02-19 07:25:20 +08:00
\ param desc The description of the completion
\ param flags completion flags
2012-02-02 08:27:14 +08:00
2007-02-19 07:25:20 +08:00
*/
2015-07-28 09:45:47 +08:00
void append_completion ( std : : vector < completion_t > * completions , const wcstring & comp , const wcstring & desc = wcstring ( ) , int flags = 0 , string_fuzzy_match_t match = string_fuzzy_match_t ( fuzzy_match_exact ) ) ;
2007-02-19 07:25:20 +08:00
2013-03-06 12:54:16 +08:00
/* Function used for testing */
void complete_set_variable_names ( const wcstring_list_t * names ) ;
2007-02-19 07:25:20 +08:00
2014-08-16 09:14:36 +08:00
/* Support for "wrap targets." A wrap target is a command that completes liek another command. The target chain is the sequence of wraps (A wraps B wraps C...). Any loops in the chain are silently ignored. */
bool complete_add_wrapper ( const wcstring & command , const wcstring & wrap_target ) ;
bool complete_remove_wrapper ( const wcstring & command , const wcstring & wrap_target ) ;
wcstring_list_t complete_get_wrap_chain ( const wcstring & command ) ;
/* Wonky interface: returns all wraps. Even-values are the commands, odd values are the targets. */
wcstring_list_t complete_get_wrap_pairs ( ) ;
2005-10-04 23:11:39 +08:00
# endif