2005-09-20 21:26:39 +08:00
/** \file complete.h
Prototypes for functions related to tab - completion .
2006-06-17 21:07:08 +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
2006-06-17 21:07:08 +08:00
2005-10-24 23:26:25 +08:00
/**
Header guard
*/
2005-10-04 23:11:39 +08:00
# define FISH_COMPLETE_H
2012-01-17 00:56:47 +08:00
2005-10-04 23:11:39 +08:00
# include <wchar.h>
# include "util.h"
2012-01-17 00:56:47 +08:00
# include "common.h"
2011-12-27 11:18:46 +08:00
/**
Use all completions
2006-06-17 21:07:08 +08:00
*/
2005-09-20 21:26:39 +08:00
# define SHARED 0
2011-12-27 11:18:46 +08:00
/**
Do not use file completion
2006-06-17 21:07:08 +08:00
*/
2005-09-20 21:26:39 +08:00
# define NO_FILES 1
2011-12-27 11:18:46 +08:00
/**
Require a parameter after completion
2006-06-17 21:07:08 +08:00
*/
2005-09-20 21:26:39 +08:00
# define NO_COMMON 2
2011-12-27 11:18:46 +08:00
/**
2006-06-17 21:07:08 +08:00
Only use the argument list specifies with completion after
option . This is the same as ( NO_FILES & NO_COMMON )
*/
2005-09-20 21:26:39 +08:00
# define EXCLUSIVE 3
2011-12-27 11:18:46 +08:00
/**
Command is a path
2006-06-17 21:07:08 +08:00
*/
2005-09-20 21:26:39 +08:00
# define PATH 1
2011-12-27 11:18:46 +08:00
/**
Command is not a path
2006-06-17 21:07:08 +08:00
*/
2005-09-20 21:26:39 +08:00
# define COMMAND 0
2011-12-27 11:18:46 +08:00
/**
2006-06-17 21:07:08 +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
2011-12-27 11:18:46 +08:00
/**
2006-06-17 21:07:08 +08:00
Separator between completion and description
*/
2005-09-20 21:26:39 +08:00
# define COMPLETE_SEP_STR L"\004"
2006-06-17 21:07:08 +08:00
/**
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 .
*/
2006-02-14 19:46:31 +08:00
# define COMPLETE_ITEM_SEP L'\uf500'
2005-09-20 21:26:39 +08:00
/**
2006-06-17 21:07:08 +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-02-26 10:54:49 +08:00
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 compeltion is case insensitive .
Warning : The contents of the completion_t structure is actually
different if this flag is set ! Specifically , the completion string
contains the _entire_ completion token , not only the current
*/
COMPLETE_NO_CASE = 1 < < 1 ,
/**
This compeltion is the whole argument , not just the remainder . This
flag must never be set on completions returned from the complete ( )
function . It is strictly for internal use in the completion code .
*/
COMPLETE_WHOLE_ARGUMENT = 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
} ;
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 */
completion_t ( ) { }
public :
2007-02-09 17:33:50 +08:00
/**
The completion string
*/
2012-01-17 00:56:47 +08:00
wcstring completion ;
2007-02-19 07:25:20 +08:00
2007-02-09 17:33:50 +08:00
/**
The description for this completion
*/
2012-01-17 00:56:47 +08:00
wcstring description ;
2007-02-19 07:25:20 +08:00
2007-02-09 17:33:50 +08:00
/**
2011-12-27 11:18:46 +08:00
Flags determining the completion behaviour .
2007-02-19 07:25:20 +08:00
Determines whether a space should be inserted after this
compeltion 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 .
2007-02-09 17:33:50 +08:00
*/
int flags ;
2012-02-02 08:27:14 +08:00
completion_t ( const wcstring & comp , const wcstring & desc = L " " , int flags_val = 0 ) : 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 ;
}
}
2012-01-17 02:24:57 +08:00
2012-01-17 00:56:47 +08:00
bool operator < ( const completion_t & rhs ) const { return this - > completion < rhs . completion ; }
bool operator = = ( const completion_t & rhs ) const { return this - > completion = = rhs . completion ; }
2012-02-02 08:27:14 +08:00
bool operator ! = ( const completion_t & rhs ) const { return ! ( * this = = rhs ) ; }
2012-02-03 04:04:04 +08:00
} ;
2007-02-09 17:33:50 +08:00
2012-02-25 04:13:35 +08:00
enum complete_type_t {
COMPLETE_DEFAULT ,
COMPLETE_AUTOSUGGEST
} ;
2007-02-09 17:33:50 +08:00
2005-09-20 21:26:39 +08:00
/**
2011-12-27 11:18:46 +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
2011-12-27 11:18:46 +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 :
2011-12-27 11:18:46 +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
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 )
2011-12-27 11:18:46 +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
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 .
2008-01-14 00:47:47 +08:00
\ param flags A set of completion flags
2005-09-20 21:26:39 +08:00
*/
2011-12-27 11:18:46 +08:00
void complete_add ( const wchar_t * cmd ,
2012-02-27 05:27:31 +08:00
bool cmd_is_path ,
2008-01-14 00:47:47 +08:00
wchar_t short_opt ,
const wchar_t * long_opt ,
2011-12-27 11:18:46 +08:00
int long_mode ,
int result_mode ,
2008-01-14 00:47:47 +08:00
const wchar_t * condition ,
const wchar_t * comp ,
const wchar_t * desc ,
2011-12-27 11:18:46 +08:00
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-02-27 05:27:31 +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
*/
2011-12-27 11:18:46 +08:00
void complete_remove ( const wchar_t * cmd ,
2012-02-27 05:27:31 +08:00
bool cmd_is_path ,
2008-01-14 00:47:47 +08:00
wchar_t short_opt ,
const wchar_t * long_opt ) ;
2005-09-20 21:26:39 +08:00
2012-02-25 04:13:35 +08:00
2012-02-27 12:11:34 +08:00
/** 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 < completion_t > & comp , complete_type_t type , wcstring_list_t * to_load = NULL ) ;
2005-09-20 21:26:39 +08:00
/**
2012-03-04 14:08:34 +08:00
Print a list of all current completions into the string .
2005-09-20 21:26:39 +08:00
2012-03-04 14:08:34 +08:00
\ param out The string to write completions to
2005-09-20 21:26:39 +08:00
*/
2012-02-23 02:51:06 +08:00
void complete_print ( wcstring & out ) ;
2005-09-20 21:26:39 +08:00
/**
Tests if the specified option is defined for the specified command
*/
2011-12-27 11:18:46 +08:00
int complete_is_valid_option ( const wchar_t * str ,
const wchar_t * opt ,
2012-02-11 09:54:21 +08:00
wcstring_list_t * inErrorsOrNull ,
2012-01-16 06:24:58 +08:00
bool allow_autoload ) ;
2005-09-20 21:26:39 +08:00
/**
Tests if the specified argument is valid for the specified option
and command
*/
2011-12-27 11:18:46 +08:00
int complete_is_valid_argument ( const wchar_t * str ,
const wchar_t * opt ,
2005-09-20 21:26:39 +08:00
const wchar_t * 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 )
*/
2012-02-08 14:44:10 +08:00
void complete_load ( const wcstring & cmd , bool reload ) ;
2005-10-04 23:11: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
*/
2012-02-02 08:27:14 +08:00
void completion_allocate ( std : : vector < completion_t > & completions , const wcstring & comp , const wcstring & desc , int flags ) ;
2007-02-19 07:25:20 +08:00
2005-10-04 23:11:39 +08:00
# endif