28#ifndef LLDB_HOST_EDITLINE_H
29#define LLDB_HOST_EDITLINE_H
30#if defined(__cplusplus)
32#include "lldb/Host/Config.h"
34#if LLDB_EDITLINE_USE_WCHAR
43#if !defined(_WIN32) && !defined(__ANDROID__)
59#include "llvm/ADT/FunctionExtras.h"
62namespace line_editor {
65#if LLDB_EDITLINE_USE_WCHAR
66using EditLineStringType = std::wstring;
67using EditLineStringStreamType = std::wstringstream;
68using EditLineCharType = wchar_t;
70using EditLineStringType = std::string;
71using EditLineStringStreamType = std::stringstream;
72using EditLineCharType = char;
79#if LLDB_EDITLINE_USE_WCHAR || defined(EL_CLIENTDATA) || LLDB_HAVE_EL_RFUNC_T
80using EditLineGetCharType = wchar_t;
82using EditLineGetCharType = char;
85using EditlineGetCharCallbackType = int (*)(::EditLine *editline,
86 EditLineGetCharType *c);
87using EditlineCommandCallbackType =
unsigned char (*)(::EditLine *editline,
89using EditlinePromptCallbackType =
const char *(*)(::EditLine *editline);
93using EditlineHistorySP = std::shared_ptr<EditlineHistory>;
95using IsInputCompleteCallbackType =
96 llvm::unique_function<bool(Editline *, StringList &)>;
98using FixIndentationCallbackType =
99 llvm::unique_function<int(Editline *, StringList &,
int)>;
101using SuggestionCallbackType =
102 llvm::unique_function<std::optional<std::string>(llvm::StringRef)>;
104using CompleteCallbackType = llvm::unique_function<void(CompletionRequest &)>;
108enum class EditorStatus {
124enum class CursorLocation {
141enum class HistoryOperation {
150using namespace line_editor;
157 Editline(
const char *editor_name, FILE *input_file, FILE *output_file,
158 FILE *error_file, std::recursive_mutex &output_mutex,
165 static Editline *InstanceFor(::EditLine *editline);
169 void SetPrompt(
const char *prompt);
174 void SetContinuationPrompt(
const char *continuation_prompt);
177 void TerminalSizeChanged();
180 const char *GetPrompt();
192 void SetSuggestionCallback(SuggestionCallbackType callback) {
193 m_suggestion_callback = std::move(callback);
197 void SetAutoCompleteCallback(CompleteCallbackType callback) {
198 m_completion_callback = std::move(callback);
202 void SetIsInputCompleteCallback(IsInputCompleteCallbackType callback) {
203 m_is_input_complete_callback = std::move(callback);
209 void SetFixIndentationCallback(FixIndentationCallbackType callback,
210 const char *indent_chars) {
211 m_fix_indentation_callback = std::move(callback);
212 m_fix_indentation_callback_chars = indent_chars;
215 void SetSuggestionAnsiPrefix(std::string prefix) {
216 m_suggestion_ansi_prefix = std::move(prefix);
219 void SetSuggestionAnsiSuffix(std::string suffix) {
220 m_suggestion_ansi_suffix = std::move(suffix);
224 bool GetLine(std::string &line,
bool &interrupted);
227 bool GetLines(
int first_line_number, StringList &lines,
bool &interrupted);
229 void PrintAsync(Stream *stream,
const char *s,
size_t len);
235 void SetBaseLineNumber(
int line_number);
241 std::string PromptForIndex(
int line_index);
246 void SetCurrentLine(
int line_index);
251 int GetPromptWidth();
263 int GetLineIndexForLocation(CursorLocation location,
int cursor_row);
268 void MoveCursor(CursorLocation from, CursorLocation to);
275 void DisplayInput(
int firstIndex = 0);
281 int CountRowsForLine(
const EditLineStringType &content);
284 void SaveEditedLine();
287 StringList GetInputAsStringList(
int line_count =
UINT32_MAX);
290 unsigned char RecallHistory(HistoryOperation op);
294 int GetCharacter(EditLineGetCharType *c);
297 const char *Prompt();
300 unsigned char BreakLineCommand(
int ch);
303 unsigned char EndOrAddLineCommand(
int ch);
306 unsigned char DeleteNextCharCommand(
int ch);
309 unsigned char DeletePreviousCharCommand(
int ch);
313 unsigned char PreviousLineCommand(
int ch);
317 unsigned char NextLineCommand(
int ch);
321 unsigned char PreviousHistoryCommand(
int ch);
325 unsigned char NextHistoryCommand(
int ch);
328 unsigned char BufferStartCommand(
int ch);
331 unsigned char BufferEndCommand(
int ch);
335 unsigned char TabCommand(
int ch);
338 unsigned char ApplyAutosuggestCommand(
int ch);
341 unsigned char TypedCharacter(
int ch);
344 unsigned char FixIndentationCommand(
int ch);
347 unsigned char RevertLineCommand(
int ch);
351 void ConfigureEditor(
bool multiline);
353 bool CompleteCharacter(
char ch, EditLineGetCharType &out);
355 void ApplyTerminalSizeChange();
361 void AddFunctionToEditLine(
const EditLineCharType *command,
362 const EditLineCharType *helptext,
363 EditlineCommandCallbackType callbackFn);
364 void SetEditLinePromptCallback(EditlinePromptCallbackType callbackFn);
365 void SetGetCharacterFunction(EditlineGetCharCallbackType callbackFn);
367#if LLDB_EDITLINE_USE_WCHAR
368 std::wstring_convert<std::codecvt_utf8<wchar_t>> m_utf8conv;
370 ::EditLine *m_editline =
nullptr;
371 EditlineHistorySP m_history_sp;
372 bool m_in_history =
false;
373 std::vector<EditLineStringType> m_live_history_lines;
374 bool m_multiline_enabled =
false;
375 std::vector<EditLineStringType> m_input_lines;
376 EditorStatus m_editor_status;
377 bool m_color_prompts =
true;
378 int m_terminal_width = 0;
379 int m_base_line_number = 0;
380 unsigned m_current_line_index = 0;
381 int m_current_line_rows = -1;
382 int m_revert_cursor_index = 0;
383 int m_line_number_digits = 3;
384 std::string m_set_prompt;
385 std::string m_set_continuation_prompt;
386 std::string m_current_prompt;
387 bool m_needs_prompt_repaint =
false;
388 volatile std::sig_atomic_t m_terminal_size_has_changed = 0;
389 std::string m_editor_name;
393 ConnectionFileDescriptor m_input_connection;
395 IsInputCompleteCallbackType m_is_input_complete_callback;
397 FixIndentationCallbackType m_fix_indentation_callback;
398 const char *m_fix_indentation_callback_chars =
nullptr;
400 CompleteCallbackType m_completion_callback;
401 SuggestionCallbackType m_suggestion_callback;
403 std::string m_suggestion_ansi_prefix;
404 std::string m_suggestion_ansi_suffix;
406 std::size_t m_previous_autosuggestion_size = 0;
407 std::recursive_mutex &m_output_mutex;
bool IsOnlySpaces(const EditLineStringType &content)
A class that represents a running process on the host machine.