Autocomplete.
This commit is contained in:
parent
64a2407f4d
commit
44b288497a
31
line.h
31
line.h
@ -5,6 +5,7 @@
|
|||||||
// External includes:
|
// External includes:
|
||||||
// - <readline/readline.h>
|
// - <readline/readline.h>
|
||||||
// - <readline/history.h>
|
// - <readline/history.h>
|
||||||
|
// - <glob.h>
|
||||||
|
|
||||||
// MIT License: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction.
|
// MIT License: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction.
|
||||||
|
|
||||||
@ -12,13 +13,14 @@
|
|||||||
#include <readline/history.h>
|
#include <readline/history.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <glob.h>
|
||||||
|
|
||||||
#define HISTORY_FILE ".r_history"
|
#define HISTORY_FILE ".r_history"
|
||||||
|
|
||||||
bool line_initialized = false;
|
bool line_initialized = false;
|
||||||
|
|
||||||
char* line_command_generator(const char* text, int state) {
|
char* line_command_generator(const char* text, int state) {
|
||||||
static int list_index, len;
|
static int list_index, len = 0;
|
||||||
const char* commands[] = {"help", "exit", "list", "review", "refactor", "obfuscate", NULL};
|
const char* commands[] = {"help", "exit", "list", "review", "refactor", "obfuscate", NULL};
|
||||||
|
|
||||||
if (!state) {
|
if (!state) {
|
||||||
@ -36,8 +38,33 @@ char* line_command_generator(const char* text, int state) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* line_file_generator(const char* text, int state) {
|
||||||
|
static int list_index;
|
||||||
|
glob_t glob_result;
|
||||||
|
char pattern[1024];
|
||||||
|
|
||||||
|
if (!state) {
|
||||||
|
list_index = 0;
|
||||||
|
snprintf(pattern, sizeof(pattern), "%s*", text); // Create a pattern for glob
|
||||||
|
glob(pattern, GLOB_NOSORT, NULL, &glob_result);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list_index < glob_result.gl_pathc) {
|
||||||
|
return strdup(glob_result.gl_pathv[list_index++]);
|
||||||
|
}
|
||||||
|
|
||||||
|
globfree(&glob_result);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
char** line_command_completion(const char* text, int start, int end) {
|
char** line_command_completion(const char* text, int start, int end) {
|
||||||
rl_attempted_completion_over = 1;
|
rl_attempted_completion_over = 1;
|
||||||
|
|
||||||
|
// Check if the input is a file path
|
||||||
|
if (start > 0 && text[0] != ' ') {
|
||||||
|
return rl_completion_matches(text, line_file_generator);
|
||||||
|
}
|
||||||
|
|
||||||
return rl_completion_matches(text, line_command_generator);
|
return rl_completion_matches(text, line_command_generator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,4 +88,4 @@ char* line_read(char* prefix) {
|
|||||||
void line_add_history(char* data) {
|
void line_add_history(char* data) {
|
||||||
add_history(data);
|
add_history(data);
|
||||||
write_history(HISTORY_FILE);
|
write_history(HISTORY_FILE);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user