2012-11-19 08:30:30 +08:00
|
|
|
/** \file reader.h
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
2005-10-04 23:11:39 +08:00
|
|
|
#ifndef FISH_READER_H
|
|
|
|
#define FISH_READER_H
|
|
|
|
|
2012-01-17 00:56:47 +08:00
|
|
|
#include <vector>
|
2005-10-04 23:11:39 +08:00
|
|
|
#include <wchar.h>
|
|
|
|
|
|
|
|
#include "util.h"
|
2007-04-26 02:30:02 +08:00
|
|
|
#include "io.h"
|
2012-02-11 09:54:21 +08:00
|
|
|
#include "common.h"
|
2012-02-25 04:13:35 +08:00
|
|
|
#include "complete.h"
|
2014-01-15 17:01:25 +08:00
|
|
|
#include "highlight.h"
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2012-01-23 13:40:08 +08:00
|
|
|
class parser_t;
|
2012-02-02 08:27:14 +08:00
|
|
|
class completion_t;
|
2012-02-06 08:42:24 +08:00
|
|
|
class history_t;
|
2012-01-23 13:40:08 +08:00
|
|
|
|
2014-01-26 16:41:30 +08:00
|
|
|
/* Helper class for storing a command line */
|
|
|
|
class editable_line_t
|
|
|
|
{
|
2014-04-01 01:01:39 +08:00
|
|
|
public:
|
|
|
|
|
2014-01-26 16:41:30 +08:00
|
|
|
/** The command line */
|
|
|
|
wcstring text;
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-01-26 16:41:30 +08:00
|
|
|
/** The current position of the cursor in the command line */
|
|
|
|
size_t position;
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-01-26 16:41:30 +08:00
|
|
|
const wcstring &get_text() const
|
|
|
|
{
|
|
|
|
return text;
|
|
|
|
}
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-01-26 16:41:30 +08:00
|
|
|
/* Gets the length of the text */
|
|
|
|
size_t size() const
|
|
|
|
{
|
|
|
|
return text.size();
|
|
|
|
}
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-01-26 16:41:30 +08:00
|
|
|
bool empty() const
|
|
|
|
{
|
|
|
|
return text.empty();
|
|
|
|
}
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-01-27 16:56:13 +08:00
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
text.clear();
|
|
|
|
position = 0;
|
|
|
|
}
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-03-30 05:19:45 +08:00
|
|
|
wchar_t at(size_t idx)
|
|
|
|
{
|
|
|
|
return text.at(idx);
|
|
|
|
}
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-01-26 16:41:30 +08:00
|
|
|
editable_line_t() : text(), position(0)
|
|
|
|
{
|
|
|
|
}
|
2014-04-01 01:01:39 +08:00
|
|
|
|
2014-07-26 03:23:42 +08:00
|
|
|
/* Inserts a substring of str given by start, len at the cursor position */
|
|
|
|
void insert_string(const wcstring &str, size_t start = 0, size_t len = wcstring::npos);
|
2014-01-26 16:41:30 +08:00
|
|
|
};
|
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
2005-10-19 20:07:44 +08:00
|
|
|
Read commands from \c fd until encountering EOF
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
int reader_read(int fd, const io_chain_t &io);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Tell the shell that it should exit after the currently running command finishes.
|
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_exit(int do_exit, int force);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
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();
|
|
|
|
|
2013-10-27 06:22:20 +08:00
|
|
|
/** Restore the term mode at startup */
|
|
|
|
void restore_term_mode();
|
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Returns the filename of the file currently read
|
|
|
|
*/
|
2012-02-03 07:05:08 +08:00
|
|
|
const wchar_t *reader_current_filename();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Push a new filename on the stack of read files
|
2012-11-19 08:30:30 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
\param fn The fileanme to push
|
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_push_current_filename(const wchar_t *fn);
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Pop the current filename from the stack of read files
|
|
|
|
*/
|
2012-02-03 07:05:08 +08:00
|
|
|
void reader_pop_current_filename();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Write the title to the titlebar. This function is called just
|
|
|
|
before a new application starts executing and just after it
|
|
|
|
finishes.
|
2014-07-14 23:34:15 +08:00
|
|
|
|
|
|
|
\param cmd Command line string passed to \c fish_title if is defined.
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2014-08-03 12:01:40 +08:00
|
|
|
void reader_write_title(const wcstring &cmd);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
2007-10-05 22:59:19 +08:00
|
|
|
Call this function to tell the reader that a repaint is needed, and
|
|
|
|
should be performed when possible.
|
|
|
|
*/
|
|
|
|
void reader_repaint_needed();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2012-03-25 18:00:38 +08:00
|
|
|
/** 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();
|
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Run the specified command with the correct terminal modes, and
|
|
|
|
while taking care to perform job notification, set the title, etc.
|
|
|
|
*/
|
2013-04-08 03:40:08 +08:00
|
|
|
void reader_run_command(const wcstring &buff);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Get the string of character currently entered into the command
|
|
|
|
buffer, or 0 if interactive mode is uninitialized.
|
|
|
|
*/
|
2012-02-06 17:45:16 +08:00
|
|
|
const wchar_t *reader_get_buffer();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2012-02-06 08:42:24 +08:00
|
|
|
/** Returns the current reader's history */
|
|
|
|
history_t *reader_get_history(void);
|
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
|
|
|
Set the string of characters in the command buffer, as well as the cursor position.
|
|
|
|
|
|
|
|
\param b the new buffer value
|
2012-08-02 07:32:52 +08:00
|
|
|
\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.
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_set_buffer(const wcstring &b, size_t p);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Get the current cursor position in the command line. If interactive
|
2012-08-05 04:47:56 +08:00
|
|
|
mode is uninitialized, return (size_t)(-1).
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2012-08-05 04:47:56 +08:00
|
|
|
size_t reader_get_cursor_pos();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2014-01-15 22:07:22 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Get the current selection range in the command line.
|
|
|
|
Returns false if there is no active selection, true otherwise.
|
|
|
|
*/
|
2014-03-30 05:19:45 +08:00
|
|
|
bool reader_get_selection(size_t *start, size_t *len);
|
2014-01-15 22:07:22 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
2006-10-05 05:42:04 +08:00
|
|
|
Return the value of the interrupted flag, which is set by the sigint
|
2005-09-20 21:26:39 +08:00
|
|
|
handler, and clear it if it was set.
|
|
|
|
*/
|
2006-10-05 05:42:04 +08:00
|
|
|
int reader_interrupted();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2013-01-21 05:23:27 +08:00
|
|
|
/**
|
2013-02-12 15:16:50 +08:00
|
|
|
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.
|
2013-01-21 05:23:27 +08:00
|
|
|
*/
|
|
|
|
void reader_reset_interrupted();
|
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
2006-10-05 05:42:04 +08:00
|
|
|
Return the value of the interrupted flag, which is set by the sigint
|
2013-01-21 05:23:27 +08:00
|
|
|
handler, and clear it if it was set. If the current reader is interruptible,
|
2013-02-12 15:16:50 +08:00
|
|
|
call \c reader_exit().
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2013-01-22 18:00:02 +08:00
|
|
|
int reader_reading_interrupted();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2013-01-23 07:19:29 +08:00
|
|
|
/**
|
2013-02-12 15:16:50 +08:00
|
|
|
Returns true if the current reader generation count does not equal the
|
|
|
|
generation count the current thread was started with.
|
2013-01-23 08:29:24 +08:00
|
|
|
Note 1: currently only valid for autocompletion threads! Other threads don't
|
2013-02-12 15:16:50 +08:00
|
|
|
set the threadlocal generation count when they start up.
|
2013-01-23 07:19:29 +08:00
|
|
|
*/
|
2013-02-06 04:18:22 +08:00
|
|
|
bool reader_thread_job_is_stale();
|
2013-01-23 07:19:29 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
2014-08-19 20:28:08 +08:00
|
|
|
Read one line of input. Before calling this function, reader_push() must have
|
|
|
|
been called in order to set up a valid reader environment. If nchars > 0,
|
|
|
|
return after reading that many characters even if a full line has not yet
|
|
|
|
been read. Note: the returned value may be longer than nchars if a single
|
|
|
|
keypress resulted in multiple characters being inserted into the commandline.
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2014-08-19 20:28:08 +08:00
|
|
|
const wchar_t *reader_readline(int nchars);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
2012-11-19 08:30:30 +08:00
|
|
|
Push a new reader environment.
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_push(const wchar_t *name);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Return to previous reader environment
|
|
|
|
*/
|
|
|
|
void reader_pop();
|
|
|
|
|
|
|
|
/**
|
2012-11-19 08:30:30 +08:00
|
|
|
Specify function to use for finding possible tab completions. The function must take these arguments:
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
- The command to be completed as a null terminated array of wchar_t
|
|
|
|
- An array_list_t in which completions will be inserted.
|
|
|
|
*/
|
2013-11-30 15:44:26 +08:00
|
|
|
typedef void (*complete_function_t)(const wcstring &, std::vector<completion_t> &, completion_request_flags_t);
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_set_complete_function(complete_function_t);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
2011-12-27 11:18:46 +08:00
|
|
|
The type of a highlight function.
|
|
|
|
*/
|
2012-07-21 11:39:31 +08:00
|
|
|
class env_vars_snapshot_t;
|
2014-01-15 17:01:25 +08:00
|
|
|
typedef void (*highlight_function_t)(const wcstring &, std::vector<highlight_spec_t> &, size_t, wcstring_list_t *, const env_vars_snapshot_t &vars);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2011-12-27 11:18:46 +08:00
|
|
|
/**
|
|
|
|
Specify function for syntax highlighting. The function must take these arguments:
|
2012-11-19 08:30:30 +08:00
|
|
|
|
2011-12-27 11:18:46 +08:00
|
|
|
- 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
|
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_set_highlight_function(highlight_function_t);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Specify function for testing if the command buffer contains syntax
|
|
|
|
errors that must be corrected before returning.
|
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_set_test_function(int (*f)(const wchar_t *));
|
2005-09-20 21:26:39 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Specify string of shell commands to be run in order to generate the
|
|
|
|
prompt.
|
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_set_left_prompt(const wcstring &prompt);
|
2012-11-08 11:59:20 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
Specify string of shell commands to be run in order to generate the
|
|
|
|
right prompt.
|
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_set_right_prompt(const wcstring &prompt);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2012-11-18 18:43:35 +08:00
|
|
|
|
|
|
|
/** Sets whether autosuggesting is allowed. */
|
|
|
|
void reader_set_allow_autosuggesting(bool flag);
|
|
|
|
|
2013-07-17 15:38:04 +08:00
|
|
|
/** Sets whether abbreviation expansion is performed. */
|
|
|
|
void reader_set_expand_abbreviations(bool flag);
|
|
|
|
|
|
|
|
|
2013-01-21 05:23:27 +08:00
|
|
|
/** Sets whether the reader should exit on ^C. */
|
2013-01-22 18:25:17 +08:00
|
|
|
void reader_set_exit_on_interrupt(bool flag);
|
2013-01-21 05:23:27 +08:00
|
|
|
|
2005-09-20 21:26:39 +08:00
|
|
|
/**
|
2012-11-19 08:30:30 +08:00
|
|
|
Returns true if the shell is exiting, 0 otherwise.
|
2005-09-20 21:26:39 +08:00
|
|
|
*/
|
2013-12-30 08:23:26 +08:00
|
|
|
bool shell_is_exiting();
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2005-10-14 19:40:33 +08:00
|
|
|
/**
|
2006-10-05 05:42:04 +08:00
|
|
|
The readers interrupt signal handler. Cancels all currently running blocks.
|
2005-10-14 19:40:33 +08:00
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
void reader_handle_int(int signal);
|
2005-10-06 06:37:08 +08:00
|
|
|
|
2006-05-14 18:16:23 +08:00
|
|
|
/**
|
|
|
|
This function returns true if fish is exiting by force, i.e. because stdin died
|
|
|
|
*/
|
|
|
|
int reader_exit_forced();
|
|
|
|
|
2007-01-30 00:26:24 +08:00
|
|
|
/**
|
|
|
|
Test if the given shell command contains errors. Uses parser_test
|
|
|
|
for testing. Suitable for reader_set_test_function().
|
|
|
|
*/
|
2012-11-19 08:30:30 +08:00
|
|
|
int reader_shell_test(const wchar_t *b);
|
2007-01-30 00:26:24 +08:00
|
|
|
|
2007-09-21 22:05:49 +08:00
|
|
|
/**
|
|
|
|
Test whether the interactive reader is in search mode.
|
|
|
|
|
2014-01-18 04:53:01 +08:00
|
|
|
\return 0 if not in search mode, 1 if in search mode and -1 if not in interactive mode
|
2007-09-21 22:05:49 +08:00
|
|
|
*/
|
|
|
|
int reader_search_mode();
|
|
|
|
|
2014-01-18 04:53:01 +08:00
|
|
|
/**
|
|
|
|
Test whether the interactive reader has visible pager contents.
|
|
|
|
|
|
|
|
\return 0 if it has pager contents, 1 if it does not have pager contents, and -1 if not in interactive mode
|
|
|
|
*/
|
|
|
|
int reader_has_pager_contents();
|
|
|
|
|
|
|
|
|
2013-01-06 07:21:42 +08:00
|
|
|
/* 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);
|
|
|
|
|
2013-07-17 15:38:04 +08:00
|
|
|
/* Expand abbreviations at the given cursor position. Exposed for testing purposes only. */
|
|
|
|
bool reader_expand_abbreviation_in_command(const wcstring &cmdline, size_t cursor_pos, wcstring *output);
|
|
|
|
|
2013-02-03 06:50:22 +08:00
|
|
|
/* 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);
|
|
|
|
|
2005-10-04 23:11:39 +08:00
|
|
|
#endif
|