From b4f53143b0e05fd3061cdf2e65e17a6a2904090b Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Fri, 24 Jul 2015 00:50:58 -0700 Subject: Migrate source files into src/ directory This change moves source files into a src/ directory, and puts object files into an obj/ directory. The Makefile and xcode project are updated accordingly. Fixes #1866 --- src/reader.h | 321 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 321 insertions(+) create mode 100644 src/reader.h (limited to 'src/reader.h') diff --git a/src/reader.h b/src/reader.h new file mode 100644 index 00000000..744a360e --- /dev/null +++ b/src/reader.h @@ -0,0 +1,321 @@ +/** \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" +#include "highlight.h" +#include "parse_constants.h" + +class parser_t; +class completion_t; +class history_t; + +/* Helper class for storing a command line */ +class editable_line_t +{ +public: + + /** The command line */ + wcstring text; + + /** The current position of the cursor in the command line */ + size_t position; + + const wcstring &get_text() const + { + return text; + } + + /* Gets the length of the text */ + size_t size() const + { + return text.size(); + } + + bool empty() const + { + return text.empty(); + } + + void clear() + { + text.clear(); + position = 0; + } + + wchar_t at(size_t idx) + { + return text.at(idx); + } + + editable_line_t() : text(), position(0) + { + } + + /* 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); +}; + +/** + 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(); + +/** Restore the term mode at startup */ +void restore_term_mode(); + +/** + 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. + + \param cmd Command line string passed to \c fish_title if is defined. +*/ +void reader_write_title(const wcstring &cmd); + +/** + 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(); + + +/** + Get the current selection range in the command line. + Returns false if there is no active selection, true otherwise. +*/ +bool reader_get_selection(size_t *start, size_t *len); + +/** + 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. 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. +*/ +const wchar_t *reader_readline(int nchars); + +/** + 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); +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(parser_test_error_bits_t (*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 abbreviation expansion is performed. */ +void reader_set_expand_abbreviations(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. +*/ +bool shell_is_exiting(); + +/** + 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(). +*/ +parser_test_error_bits_t reader_shell_test(const wchar_t *b); + +/** + Test whether the interactive reader is in search mode. + + \return 0 if not in search mode, 1 if in search mode and -1 if not in interactive mode + */ +int reader_search_mode(); + +/** + 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(); + + +/* 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); + +/* 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); + +/* 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 -- cgit v1.2.3