From e0a386effa7d91d58a4a2e0c0c6f69fb2aa1405c Mon Sep 17 00:00:00 2001 From: marcusDenslow Date: Mon, 28 Apr 2025 17:36:06 +0200 Subject: [PATCH] making suggestion system work in linux the suggestions were not working after porting to linux. remade the system but with a better ui (feels so freeing not working on windows anymore) now its similar to the zsh autocomplete plugin. start typing and a suggestion will pop up, hit enter to start cycling suggestions in the new ui and hit enter on the wanted suggestion --- line_reader.c | 1142 +++++++++++++++++++++++++------------------------ line_reader.h | 4 +- line_reader.o | Bin 42264 -> 41080 bytes shell | Bin 266912 -> 266848 bytes shell.c | 92 ++-- shell.o | Bin 28696 -> 29168 bytes 6 files changed, 638 insertions(+), 600 deletions(-) diff --git a/line_reader.c b/line_reader.c index d4ff2ba..7f33066 100644 --- a/line_reader.c +++ b/line_reader.c @@ -8,6 +8,7 @@ #include "bookmarks.h" // Added for bookmark support #include "builtins.h" // Added for history access #include "common.h" +#include "git_integration.h" #include "persistent_history.h" #include "tab_complete.h" #include "themes.h" @@ -23,6 +24,22 @@ #define PATH_MAX 4096 #endif +// Suggestion state - make these global +static int has_suggestion = 0; +static int suggestion_index = 0; +static char **suggestions = NULL; +static int suggestion_count = 0; +static char full_suggestion[LSH_RL_BUFSIZE] = {0}; +static int prefix_start = 0; +static int menu_mode = 0; +static int menu_start_line = 0; + +// Define colors for suggestions +#define SUGGESTION_COLOR "\033[2;37m" // Dim white color for suggestions +#define HIGHLIGHT_COLOR "\033[7;36m" // Highlighted background for selected item +#define NORMAL_COLOR "\033[0;36m" // Normal color for menu items +#define RESET_COLOR "\033[0m" + /** * Check if a command is valid * @@ -56,6 +73,52 @@ int is_valid_command(const char *cmd) { return 1; } + void generate_enhanced_prompt(char *prompt_buffer, size_t buffer_size) { + // Get current directory information + char cwd[PATH_MAX]; + char parent_dir[PATH_MAX / 2]; + char current_dir[PATH_MAX / 2]; + + if (getcwd(cwd, sizeof(cwd)) != NULL) { + get_path_display(cwd, parent_dir, current_dir, PATH_MAX / 2); + } else { + strcpy(parent_dir, "unknown"); + strcpy(current_dir, "dir"); + } + + // Get Git information - modified to extract just the branch name + char git_display[LSH_RL_BUFSIZE] = {0}; + char *git_status_info = get_git_status(); + if (git_status_info != NULL) { + // Extract just the branch name from git status info + char branch_name[LSH_RL_BUFSIZE] = {0}; + char *paren_open = strchr(git_status_info, '('); + char *paren_close = strchr(git_status_info, ')'); + + if (paren_open && paren_close && paren_close > paren_open) { + // Extract content between parentheses - should be the branch name + size_t branch_len = paren_close - paren_open - 1; + if (branch_len < sizeof(branch_name)) { + strncpy(branch_name, paren_open + 1, branch_len); + branch_name[branch_len] = '\0'; + snprintf(git_display, sizeof(git_display), " \033[1;35mgit:(%s)\033[0m", branch_name); + } else { + // Fallback if branch name is too long + snprintf(git_display, sizeof(git_display), " \033[1;35mgit:(?)\033[0m"); + } + } else { + // If we can't parse the branch name, just use the whole status + snprintf(git_display, sizeof(git_display), " \033[1;35mgit:(%s)\033[0m", git_status_info); + } + + free(git_status_info); + } + + // Format the prompt + snprintf(prompt_buffer, buffer_size, "\033[1;36m%s/%s\033[0m%s \033[1;31m✗\033[0m ", + parent_dir, current_dir, git_display); +} + // Check if it's an executable in PATH // We'll use a simplified approach - check if the file exists and is executable struct stat st; @@ -111,7 +174,6 @@ int read_key(void) { char seq[6]; // Define local constants for special keys - // We avoid modifying common.h by using local constants #define LOCAL_KEY_SHIFT_ENTER 1010 // Read a character @@ -156,7 +218,6 @@ int read_key(void) { } // Check for Shift+Enter sequence (varies by terminal, try common forms) - // Note: These may vary widely between terminals if (i >= 3) { // xterm/vte: ESC [ 13 ; 2 ~ if (seq[0] == '[' && seq[1] == '1' && seq[2] == '3' && i >= 5 && seq[3] == ';' && seq[4] == '2') { @@ -177,123 +238,165 @@ int read_key(void) { } /** - * Read a line of input from the user - * - * @return The line read from stdin + * Update suggestions based on current input */ -char *lsh_read_line(void) { - int bufsize = LSH_RL_BUFSIZE; - int position = 0; - char *buffer = malloc(sizeof(char) * bufsize); - int c; - int history_position = -1; - int show_suggestions = 0; - - // Suggestion state - static int has_suggestion = 0; - static int suggestion_index = 0; - static char **suggestions = NULL; - static int suggestion_count = 0; - static char full_suggestion[LSH_RL_BUFSIZE] = {0}; - static int prefix_start = 0; - - // Define colors for suggestions - #define SUGGESTION_COLOR "\033[2;37m" // Dim white color for suggestions - #define COUNTER_COLOR "\033[0;36m" // Cyan color for the counter - #define RESET_COLOR "\033[0m" - - if (!buffer) { - fprintf(stderr, "lsh: allocation error\n"); - exit(EXIT_FAILURE); - } - - // Clear the buffer - buffer[0] = '\0'; - - // Display prompt - printf("\033[1;32m➜\033[0m "); - fflush(stdout); - - // Function to check if current input exactly matches current suggestion - int is_complete_match() { - if (!has_suggestion || suggestion_count == 0) { - return 0; // No suggestion to compare with +void update_suggestions(const char *buffer, int position) { + // Free previous suggestions if any + if (suggestions) { + for (int i = 0; i < suggestion_count; i++) { + if (suggestions[i]) free(suggestions[i]); } - - // If we're typing a command (not an argument) - if (prefix_start == 0) { - // Check if buffer exactly matches the current suggestion - return (strcasecmp(buffer, suggestions[suggestion_index]) == 0); - } else { - // We're completing an argument - // Check if the part after the last space exactly matches the suggestion - char *arg_part = buffer + prefix_start; - return (strcasecmp(arg_part, suggestions[suggestion_index]) == 0); - } - } - - // Function to update and display suggestions - void update_suggestions() { - // Free previous suggestions if any - if (suggestions) { - for (int i = 0; i < suggestion_count; i++) { - if (suggestions[i]) free(suggestions[i]); - } - free(suggestions); - suggestions = NULL; - suggestion_count = 0; - } - - has_suggestion = 0; - - // Parse command line - prefix_start = 0; - - // Find the last space to determine where the prefix starts - char *last_space = strrchr(buffer, ' '); - if (last_space) { - // We have a command and partial argument - prefix_start = (last_space - buffer) + 1; - - // Skip additional spaces - while (buffer[prefix_start] == ' ' && buffer[prefix_start] != '\0') { - prefix_start++; - } - } else { - // Just a command, no arguments - prefix_start = 0; - } - - // Build list of suggestions + free(suggestions); suggestions = NULL; suggestion_count = 0; + } + + has_suggestion = 0; + + // Parse command line + prefix_start = 0; + + // Find the last space to determine where the prefix starts + char *last_space = strrchr(buffer, ' '); + if (last_space) { + // We have a command and partial argument + prefix_start = (last_space - buffer) + 1; - // Get command or file suggestions based on context - if (!last_space) { - // Command suggestions - // First count how many we'll need - for (int i = 0; i < lsh_num_builtins(); i++) { - if (strncasecmp(builtin_str[i], buffer, strlen(buffer)) == 0) { + // Skip additional spaces + while (buffer[prefix_start] == ' ' && buffer[prefix_start] != '\0') { + prefix_start++; + } + } else { + // Just a command, no arguments + prefix_start = 0; + } + + // Build list of suggestions + suggestions = NULL; + suggestion_count = 0; + + // Get command or file suggestions based on context + if (!last_space) { + // Command suggestions + // First count how many we'll need + for (int i = 0; i < lsh_num_builtins(); i++) { + if (strncasecmp(builtin_str[i], buffer, strlen(buffer)) == 0) { + suggestion_count++; + } + } + + // Add alias count - rough estimate + int alias_count; + char **aliases = get_alias_names(&alias_count); + if (aliases) { + for (int i = 0; i < alias_count; i++) { + if (strncasecmp(aliases[i], buffer, strlen(buffer)) == 0) { suggestion_count++; } } - // Add alias count - rough estimate - int alias_count; - char **aliases = get_alias_names(&alias_count); - if (aliases) { - for (int i = 0; i < alias_count; i++) { - if (strncasecmp(aliases[i], buffer, strlen(buffer)) == 0) { - suggestion_count++; - } + // Free alias names, we'll get them again + for (int i = 0; i < alias_count; i++) { + free(aliases[i]); + } + free(aliases); + } + + // Allocate suggestions array + if (suggestion_count > 0) { + suggestions = (char**)malloc(suggestion_count * sizeof(char*)); + if (!suggestions) { + fprintf(stderr, "Memory allocation error\n"); + suggestion_count = 0; + } else { + // Initialize all entries to NULL + for (int i = 0; i < suggestion_count; i++) { + suggestions[i] = NULL; + } + } + } + + // Now fill the suggestions array + int idx = 0; + + // Add builtin commands + for (int i = 0; i < lsh_num_builtins() && idx < suggestion_count; i++) { + if (strncasecmp(builtin_str[i], buffer, strlen(buffer)) == 0) { + suggestions[idx++] = strdup(builtin_str[i]); + } + } + + // Add aliases + aliases = get_alias_names(&alias_count); + if (aliases) { + for (int i = 0; i < alias_count && idx < suggestion_count; i++) { + if (strncasecmp(aliases[i], buffer, strlen(buffer)) == 0) { + suggestions[idx++] = strdup(aliases[i]); + } + } + + // Free alias names + for (int i = 0; i < alias_count; i++) { + free(aliases[i]); + } + free(aliases); + } + + // Update actual suggestion count in case we got fewer than expected + suggestion_count = idx; + } else { + // File/directory suggestions + char prefix[PATH_MAX] = ""; + char dir_path[PATH_MAX] = "."; + char name_prefix[PATH_MAX] = ""; + + if (buffer[prefix_start] != '\0') { + strncpy(prefix, &buffer[prefix_start], sizeof(prefix) - 1); + prefix[sizeof(prefix) - 1] = '\0'; + + // Split path into directory part and name prefix part + char *last_slash = strrchr(prefix, '/'); + if (last_slash) { + // Path contains a directory part + int dir_len = last_slash - prefix; + strncpy(dir_path, prefix, dir_len); + dir_path[dir_len] = '\0'; + + // Handle absolute path vs. relative path with subdirectories + if (dir_len == 0) { + // Handle case where path starts with '/' + strcpy(dir_path, "/"); } - // Free alias names, we'll get them again - for (int i = 0; i < alias_count; i++) { - free(aliases[i]); - } - free(aliases); + // Extract the name prefix part (after the last slash) + strncpy(name_prefix, last_slash + 1, sizeof(name_prefix) - 1); + name_prefix[sizeof(name_prefix) - 1] = '\0'; + } else { + // No directory part, just a name prefix + strncpy(name_prefix, prefix, sizeof(name_prefix) - 1); + name_prefix[sizeof(name_prefix) - 1] = '\0'; } + } + + // Count matching files and directories + DIR *dir = opendir(dir_path); + if (dir) { + struct dirent *entry; + + // First count the number of matching entries + while ((entry = readdir(dir)) != NULL) { + // Skip "." and ".." if there's a name prefix + if (name_prefix[0] != '\0' && + (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)) { + continue; + } + + if (strncasecmp(entry->d_name, name_prefix, strlen(name_prefix)) == 0) { + suggestion_count++; + } + } + + rewinddir(dir); // Allocate suggestions array if (suggestion_count > 0) { @@ -309,443 +412,422 @@ char *lsh_read_line(void) { } } - // Now fill the suggestions array + // Fill the suggestions array int idx = 0; - - // Add builtin commands - for (int i = 0; i < lsh_num_builtins() && idx < suggestion_count; i++) { - if (strncasecmp(builtin_str[i], buffer, strlen(buffer)) == 0) { - suggestions[idx++] = strdup(builtin_str[i]); - } - } - - // Add aliases - aliases = get_alias_names(&alias_count); - if (aliases) { - for (int i = 0; i < alias_count && idx < suggestion_count; i++) { - if (strncasecmp(aliases[i], buffer, strlen(buffer)) == 0) { - suggestions[idx++] = strdup(aliases[i]); - } + while ((entry = readdir(dir)) != NULL && idx < suggestion_count) { + // Skip "." and ".." if there's a name prefix + if (name_prefix[0] != '\0' && + (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)) { + continue; } - // Free alias names - for (int i = 0; i < alias_count; i++) { - free(aliases[i]); - } - free(aliases); - } - - // Update actual suggestion count in case we got fewer than expected - suggestion_count = idx; - } else { - // File/directory suggestions - char prefix[PATH_MAX] = ""; - char dir_path[PATH_MAX] = "."; - char name_prefix[PATH_MAX] = ""; - - if (buffer[prefix_start] != '\0') { - strncpy(prefix, &buffer[prefix_start], sizeof(prefix) - 1); - prefix[sizeof(prefix) - 1] = '\0'; - - // Split path into directory part and name prefix part - char *last_slash = strrchr(prefix, '/'); - if (last_slash) { - // Path contains a directory part - int dir_len = last_slash - prefix; - strncpy(dir_path, prefix, dir_len); - dir_path[dir_len] = '\0'; + if (strncasecmp(entry->d_name, name_prefix, strlen(name_prefix)) == 0) { + // Create the full path suggestion + char full_path[PATH_MAX * 2]; - // Handle absolute path vs. relative path with subdirectories - if (dir_len == 0) { - // Handle case where path starts with '/' - strcpy(dir_path, "/"); - } - - // Extract the name prefix part (after the last slash) - strncpy(name_prefix, last_slash + 1, sizeof(name_prefix) - 1); - name_prefix[sizeof(name_prefix) - 1] = '\0'; - } else { - // No directory part, just a name prefix - strncpy(name_prefix, prefix, sizeof(name_prefix) - 1); - name_prefix[sizeof(name_prefix) - 1] = '\0'; - } - } - - // Count matching files and directories - DIR *dir = opendir(dir_path); - if (dir) { - struct dirent *entry; - - // First count the number of matching entries - while ((entry = readdir(dir)) != NULL) { - // Skip "." and ".." if there's a name prefix - if (name_prefix[0] != '\0' && - (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)) { - continue; - } - - if (strncasecmp(entry->d_name, name_prefix, strlen(name_prefix)) == 0) { - suggestion_count++; - } - } - - rewinddir(dir); - - // Allocate suggestions array - if (suggestion_count > 0) { - suggestions = (char**)malloc(suggestion_count * sizeof(char*)); - if (!suggestions) { - fprintf(stderr, "Memory allocation error\n"); - suggestion_count = 0; + if (strcmp(dir_path, ".") == 0) { + strncpy(full_path, entry->d_name, sizeof(full_path) - 1); + } else if (dir_path[0] == '/' && dir_path[1] == '\0') { + snprintf(full_path, sizeof(full_path) - 1, "/%s", entry->d_name); } else { - // Initialize all entries to NULL - for (int i = 0; i < suggestion_count; i++) { - suggestions[i] = NULL; - } - } - } - - // Fill the suggestions array - int idx = 0; - while ((entry = readdir(dir)) != NULL && idx < suggestion_count) { - // Skip "." and ".." if there's a name prefix - if (name_prefix[0] != '\0' && - (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)) { - continue; + snprintf(full_path, sizeof(full_path) - 1, "%s/%s", dir_path, entry->d_name); } - if (strncasecmp(entry->d_name, name_prefix, strlen(name_prefix)) == 0) { - // Create the full path suggestion - char full_path[PATH_MAX * 2]; - - if (strcmp(dir_path, ".") == 0) { - strncpy(full_path, entry->d_name, sizeof(full_path) - 1); - } else if (dir_path[0] == '/' && dir_path[1] == '\0') { - snprintf(full_path, sizeof(full_path) - 1, "/%s", entry->d_name); - } else { - snprintf(full_path, sizeof(full_path) - 1, "%s/%s", dir_path, entry->d_name); - } - - // Check if it's a directory and add trailing slash if needed - struct stat st; - char check_path[PATH_MAX * 2]; - - if (dir_path[0] == '/') { - // Absolute path - snprintf(check_path, sizeof(check_path) - 1, "%s/%s", dir_path, entry->d_name); - } else { - // Relative path - snprintf(check_path, sizeof(check_path) - 1, "%s/%s", dir_path, entry->d_name); - } - - if (stat(check_path, &st) == 0 && S_ISDIR(st.st_mode)) { - strncat(full_path, "/", sizeof(full_path) - strlen(full_path) - 1); - } - - suggestions[idx++] = strdup(full_path); - } - } - - // Update actual suggestion count - suggestion_count = idx; - - closedir(dir); - } - } - - // If we have suggestions, use the first one - if (suggestion_count > 0) { - has_suggestion = 1; - suggestion_index = 0; - - // Create the full suggestion string that Enter would accept - if (prefix_start > 0) { - // We're completing an argument - strncpy(full_suggestion, buffer, prefix_start); - full_suggestion[prefix_start] = '\0'; - strncat(full_suggestion, suggestions[suggestion_index], - sizeof(full_suggestion) - strlen(full_suggestion) - 1); - } else { - // We're completing a command - strncpy(full_suggestion, suggestions[suggestion_index], sizeof(full_suggestion) - 1); - } - full_suggestion[sizeof(full_suggestion) - 1] = '\0'; - - // Determine what part should be in normal text and what part in suggestion color - char current_text[LSH_RL_BUFSIZE] = ""; - char suggestion_text[LSH_RL_BUFSIZE] = ""; - - strncpy(current_text, buffer, position); - current_text[position] = '\0'; - - // Extract just the suggestion part (after what user typed) - int current_len = 0; - - if (prefix_start > 0) { - char current_arg[LSH_RL_BUFSIZE] = ""; - strncpy(current_arg, &buffer[prefix_start], position - prefix_start); - current_arg[position - prefix_start] = '\0'; - current_len = strlen(current_arg); - - if (current_len > 0) { - // Find where the current argument ends in the suggestion - char *suggestion_part = suggestions[suggestion_index]; - if (strncasecmp(suggestion_part, current_arg, current_len) == 0) { - strncpy(suggestion_text, suggestion_part + current_len, - sizeof(suggestion_text) - 1); - } - } else { - // Use the entire suggestion - strncpy(suggestion_text, suggestions[suggestion_index], - sizeof(suggestion_text) - 1); - } - } else { - // Completing a command - if (strlen(buffer) <= strlen(suggestions[suggestion_index]) && - strncasecmp(suggestions[suggestion_index], buffer, strlen(buffer)) == 0) { - strncpy(suggestion_text, - suggestions[suggestion_index] + strlen(buffer), - sizeof(suggestion_text) - 1); - } - } - - // If there's no suggestion text (exact match), then don't show suggestion - if (strlen(suggestion_text) == 0) { - // Clear the current line - printf("\r\033[K"); - - // Display prompt and current text without suggestion - printf("\033[1;32m➜\033[0m %s", buffer); - fflush(stdout); - } else { - // Clear the current line - printf("\r\033[K"); - - // Display prompt and current text - printf("\033[1;32m➜\033[0m %s", current_text); - - // Display the suggestion part in dim color - printf("%s%s%s", SUGGESTION_COLOR, suggestion_text, RESET_COLOR); - - // Show counter for which suggestion we're on - if (suggestion_count > 1) { - printf(" %s(%d/%d)%s", COUNTER_COLOR, suggestion_index + 1, suggestion_count, RESET_COLOR); + // Check if it's a directory and add trailing slash if needed + struct stat st; + char check_path[PATH_MAX * 2]; - // Move cursor back to end of actual input (including the counter) - char counter_str[20]; - snprintf(counter_str, sizeof(counter_str), " (%d/%d)", suggestion_index + 1, suggestion_count); - int counter_len = strlen(counter_str); - int suggestion_len = strlen(suggestion_text); + if (dir_path[0] == '/') { + // Absolute path + snprintf(check_path, sizeof(check_path) - 1, "%s/%s", dir_path, entry->d_name); + } else { + // Relative path + snprintf(check_path, sizeof(check_path) - 1, "%s/%s", dir_path, entry->d_name); + } - for (int i = 0; i < suggestion_len + counter_len; i++) { - printf("\b"); - } - } else { - // Just move cursor back to end of actual input - int suggestion_len = strlen(suggestion_text); - for (int i = 0; i < suggestion_len; i++) { - printf("\b"); + if (stat(check_path, &st) == 0 && S_ISDIR(st.st_mode)) { + strncat(full_path, "/", sizeof(full_path) - strlen(full_path) - 1); } + + suggestions[idx++] = strdup(full_path); } - - fflush(stdout); } - } else { - // No suggestions, just redraw the current line - printf("\r\033[K\033[1;32m➜\033[0m %s", buffer); - fflush(stdout); + + // Update actual suggestion count + suggestion_count = idx; + + closedir(dir); } } - // Function to display the current suggestion (used after tab cycling) - void display_current_suggestion() { - if (has_suggestion && suggestion_count > 0) { - // Create the full suggestion string - if (prefix_start > 0) { - // We're completing an argument - strncpy(full_suggestion, buffer, prefix_start); - full_suggestion[prefix_start] = '\0'; - strncat(full_suggestion, suggestions[suggestion_index], - sizeof(full_suggestion) - strlen(full_suggestion) - 1); - } else { - // We're completing a command - strncpy(full_suggestion, suggestions[suggestion_index], sizeof(full_suggestion) - 1); - } - full_suggestion[sizeof(full_suggestion) - 1] = '\0'; + // If we have suggestions, use the first one + if (suggestion_count > 0) { + has_suggestion = 1; + suggestion_index = 0; + + // Create the full suggestion string that would be accepted + if (prefix_start > 0) { + // We're completing an argument + strncpy(full_suggestion, buffer, prefix_start); + full_suggestion[prefix_start] = '\0'; + strncat(full_suggestion, suggestions[suggestion_index], + sizeof(full_suggestion) - strlen(full_suggestion) - 1); + } else { + // We're completing a command + strncpy(full_suggestion, suggestions[suggestion_index], sizeof(full_suggestion) - 1); + } + full_suggestion[sizeof(full_suggestion) - 1] = '\0'; + } +} + +/** + * Display a single inline suggestion (when not in menu mode) + */ +void display_inline_suggestion(const char *prompt_buffer, const char *buffer, int position) { + if (has_suggestion && suggestion_count > 0) { + // Determine what part should be in normal text and what part in suggestion color + char current_text[LSH_RL_BUFSIZE] = ""; + char suggestion_text[LSH_RL_BUFSIZE] = ""; + + strncpy(current_text, buffer, position); + current_text[position] = '\0'; + + // Extract just the suggestion part (after what user typed) + int current_len = 0; + + if (prefix_start > 0) { + char current_arg[LSH_RL_BUFSIZE] = ""; + strncpy(current_arg, &buffer[prefix_start], position - prefix_start); + current_arg[position - prefix_start] = '\0'; + current_len = strlen(current_arg); - // Determine what part should be in normal text and what part in suggestion color - char current_text[LSH_RL_BUFSIZE] = ""; - char suggestion_text[LSH_RL_BUFSIZE] = ""; - - strncpy(current_text, buffer, position); - current_text[position] = '\0'; - - // Extract just the suggestion part (after what user typed) - int current_len = 0; - - if (prefix_start > 0) { - char current_arg[LSH_RL_BUFSIZE] = ""; - strncpy(current_arg, &buffer[prefix_start], position - prefix_start); - current_arg[position - prefix_start] = '\0'; - current_len = strlen(current_arg); - - if (current_len > 0) { - // Find where the current argument ends in the suggestion - char *suggestion_part = suggestions[suggestion_index]; - if (strncasecmp(suggestion_part, current_arg, current_len) == 0) { - strncpy(suggestion_text, suggestion_part + current_len, - sizeof(suggestion_text) - 1); - } - } else { - // Use the entire suggestion - strncpy(suggestion_text, suggestions[suggestion_index], - sizeof(suggestion_text) - 1); + if (current_len > 0) { + // Find where the current argument ends in the suggestion + char *suggestion_part = suggestions[suggestion_index]; + if (strncasecmp(suggestion_part, current_arg, current_len) == 0) { + strncpy(suggestion_text, suggestion_part + current_len, + sizeof(suggestion_text) - 1); } } else { - // Completing a command - if (strlen(buffer) <= strlen(suggestions[suggestion_index]) && - strncasecmp(suggestions[suggestion_index], buffer, strlen(buffer)) == 0) { - strncpy(suggestion_text, - suggestions[suggestion_index] + strlen(buffer), - sizeof(suggestion_text) - 1); - } + // Use the entire suggestion + strncpy(suggestion_text, suggestions[suggestion_index], + sizeof(suggestion_text) - 1); } + } else { + // Completing a command + if (strlen(buffer) <= strlen(suggestions[suggestion_index]) && + strncasecmp(suggestions[suggestion_index], buffer, strlen(buffer)) == 0) { + strncpy(suggestion_text, + suggestions[suggestion_index] + strlen(buffer), + sizeof(suggestion_text) - 1); + } + } + + // If there's no suggestion text (exact match), then don't show suggestion + if (strlen(suggestion_text) == 0) { + // Clear the current line + printf("\r\033[K"); + // Display prompt and current text without suggestion + printf("%s%s", prompt_buffer, buffer); + fflush(stdout); + } else { // Clear the current line printf("\r\033[K"); // Display prompt and current text - printf("\033[1;32m➜\033[0m %s", current_text); + printf("%s%s", prompt_buffer, current_text); // Display the suggestion part in dim color printf("%s%s%s", SUGGESTION_COLOR, suggestion_text, RESET_COLOR); - // Show counter for which suggestion we're on - if (suggestion_count > 1) { - printf(" %s(%d/%d)%s", COUNTER_COLOR, suggestion_index + 1, suggestion_count, RESET_COLOR); - - // Move cursor back to end of actual input (including the counter) - char counter_str[20]; - snprintf(counter_str, sizeof(counter_str), " (%d/%d)", suggestion_index + 1, suggestion_count); - int counter_len = strlen(counter_str); - int suggestion_len = strlen(suggestion_text); - - for (int i = 0; i < suggestion_len + counter_len; i++) { - printf("\b"); - } - } else { - // Just move cursor back to end of actual input - int suggestion_len = strlen(suggestion_text); - for (int i = 0; i < suggestion_len; i++) { - printf("\b"); - } + // Move cursor back to end of actual input + int suggestion_len = strlen(suggestion_text); + for (int i = 0; i < suggestion_len; i++) { + printf("\b"); } fflush(stdout); } + } else { + // No suggestions, just redraw the current line + printf("\r\033[K%s%s", prompt_buffer, buffer); + fflush(stdout); } +} - // Flag to track if we're in suggestion mode or execution mode - int suggestion_active = 1; // Start in suggestion mode +/** + * Function to clear the menu + */ +void clear_menu() { + if (menu_start_line > 0) { + // Save current cursor position + printf("\033[s"); + + // Move cursor to where the menu starts (one line below input) + printf("\033[1B\r"); + + // Clear each line of the menu + for (int i = 0; i < menu_start_line; i++) { + printf("\033[K"); // Clear entire line + if (i < menu_start_line - 1) { + printf("\033[1B\r"); // Move down to next line if not the last + } + } + + // Restore cursor position (back to input line) + printf("\033[u"); + fflush(stdout); + + menu_start_line = 0; + } +} + + +/** + * Function to display menu of suggestions + */ + +void display_menu(const char *prompt_buffer, const char *buffer, int position) { + if (!has_suggestion || suggestion_count == 0) { + // No suggestions to show + return; + } + + // First, clear any existing menu + clear_menu(); + + // Save current cursor position (should be at end of input) + printf("\033[s"); + + // Calculate how many items to show + int show_count = suggestion_count; + if (show_count > 10) show_count = 10; // Max 10 items in menu + + // Move to the beginning of the next line (below input) + printf("\n\r"); + + // Display each suggestion on a line + for (int i = 0; i < show_count; i++) { + if (i > 0) { + printf("\n\r"); // New line for each suggestion after the first + } + + if (i == suggestion_index) { + // Highlight the selected item + printf("%s%s%s", HIGHLIGHT_COLOR, suggestions[i], RESET_COLOR); + } else { + // Normal color for non-selected items + printf("%s%s%s", NORMAL_COLOR, suggestions[i], RESET_COLOR); + } + } + + // Store number of menu lines displayed + menu_start_line = show_count; + + // Restore cursor to original position (back to input line) + printf("\033[u"); + fflush(stdout); +} + + +/** + * Function to refresh the display - based on menu mode + */ + +void refresh_display(const char *prompt_buffer, const char *buffer, int position) { + // Always clear any existing menu first + clear_menu(); + + // Always redraw the command line to ensure prompt is visible + printf("\r\033[K%s%s", prompt_buffer, buffer); + fflush(stdout); + + if (menu_mode) { + // Show menu of options below the input line + display_menu(prompt_buffer, buffer, position); + } else { + // Show inline suggestion + display_inline_suggestion(prompt_buffer, buffer, position); + } +} + +/** + * Read a line of input from the user + * + * @return The line read from stdin + */ +char *lsh_read_line(void) { + int bufsize = LSH_RL_BUFSIZE; + int position = 0; + char *buffer = malloc(sizeof(char) * bufsize); + int c; + int history_position = -1; + + // Prompt buffer for enhanced prompt + char prompt_buffer[LSH_RL_BUFSIZE]; + + // Reset menu mode + menu_mode = 0; + menu_start_line = 0; + + if (!buffer) { + fprintf(stderr, "lsh: allocation error\n"); + exit(EXIT_FAILURE); + } + + // Clear the buffer + buffer[0] = '\0'; + + // Generate enhanced prompt - INLINED CODE + { + // Get current directory information + char cwd[PATH_MAX]; + char parent_dir[PATH_MAX / 2]; + char current_dir[PATH_MAX / 2]; + + if (getcwd(cwd, sizeof(cwd)) != NULL) { + get_path_display(cwd, parent_dir, current_dir, PATH_MAX / 2); + } else { + strcpy(parent_dir, "unknown"); + strcpy(current_dir, "dir"); + } + + // Get Git information + char git_display[LSH_RL_BUFSIZE] = {0}; + char *git_status_info = get_git_status(); + if (git_status_info != NULL) { + // Extract just the branch name from git status info + char branch_name[LSH_RL_BUFSIZE] = {0}; + char *paren_open = strchr(git_status_info, '('); + char *paren_close = strchr(git_status_info, ')'); + + if (paren_open && paren_close && paren_close > paren_open) { + // Extract content between parentheses - should be the branch name + size_t branch_len = paren_close - paren_open - 1; + if (branch_len < sizeof(branch_name)) { + strncpy(branch_name, paren_open + 1, branch_len); + branch_name[branch_len] = '\0'; + snprintf(git_display, sizeof(git_display), " \033[1;35mgit:(%s)\033[0m", branch_name); + } else { + // Fallback if branch name is too long + snprintf(git_display, sizeof(git_display), " \033[1;35mgit:(?)\033[0m"); + } + } else { + // If we can't parse the branch name, just use the whole status + snprintf(git_display, sizeof(git_display), " \033[1;35mgit:(%s)\033[0m", git_status_info); + } + + free(git_status_info); + } + + // Format the prompt + snprintf(prompt_buffer, sizeof(prompt_buffer), "\033[1;36m%s/%s\033[0m%s \033[1;31m✗\033[0m ", + parent_dir, current_dir, git_display); + } + + // Display prompt + printf("%s", prompt_buffer); + fflush(stdout); + + // Initialize suggestions + update_suggestions(buffer, position); while (1) { c = read_key(); if (c == KEY_ENTER || c == '\n' || c == '\r') { - // Check if we have a visible suggestion (not an exact match) - if (has_suggestion && suggestion_count > 0) { - // Extract just the suggestion part to see if there's anything to complete - char suggestion_text[LSH_RL_BUFSIZE] = ""; - - if (prefix_start > 0) { - char current_arg[LSH_RL_BUFSIZE] = ""; - strncpy(current_arg, &buffer[prefix_start], position - prefix_start); - current_arg[position - prefix_start] = '\0'; - - if (strncasecmp(suggestions[suggestion_index], current_arg, strlen(current_arg)) == 0) { - strncpy(suggestion_text, - suggestions[suggestion_index] + strlen(current_arg), - sizeof(suggestion_text) - 1); + if (menu_mode) { + // In menu mode: accept the highlighted suggestion without executing + if (has_suggestion && suggestion_count > 0) { + // Update buffer with selected suggestion + if (prefix_start > 0) { + // We're completing an argument + char temp[LSH_RL_BUFSIZE]; + strncpy(temp, buffer, prefix_start); + temp[prefix_start] = '\0'; + strncat(temp, suggestions[suggestion_index], + LSH_RL_BUFSIZE - strlen(temp) - 1); + + strncpy(buffer, temp, bufsize - 1); + } else { + // We're completing a command + strncpy(buffer, suggestions[suggestion_index], bufsize - 1); } - } else { - if (strncasecmp(suggestions[suggestion_index], buffer, strlen(buffer)) == 0) { - strncpy(suggestion_text, - suggestions[suggestion_index] + strlen(buffer), - sizeof(suggestion_text) - 1); - } - } - - // If there's a non-empty suggestion part and in suggestion mode, accept it - if (strlen(suggestion_text) > 0 && suggestion_active) { - // First Enter press with an active suggestion: Accept it without executing - strncpy(buffer, full_suggestion, bufsize - 1); buffer[bufsize - 1] = '\0'; position = strlen(buffer); - // Redraw line with full accepted suggestion - printf("\r\033[K\033[1;32m➜\033[0m %s", buffer); + // Clear the menu + clear_menu(); + menu_mode = 0; + + // Redraw the line with accepted suggestion + printf("\r\033[K%s%s", prompt_buffer, buffer); fflush(stdout); - // Switch to execution mode for next Enter press - suggestion_active = 0; - - // Reset suggestion state since we've accepted it - has_suggestion = 0; - if (suggestions) { - for (int i = 0; i < suggestion_count; i++) { - if (suggestions[i]) free(suggestions[i]); - } - free(suggestions); - suggestions = NULL; - suggestion_count = 0; - } - } else { - // No visible suggestion or already accepted: Execute - buffer[position] = '\0'; - printf("\n"); - fflush(stdout); - break; + // Update suggestions for new state + update_suggestions(buffer, position); + display_inline_suggestion(prompt_buffer, buffer, position); } } else { - // No suggestion: Execute the command + // Not in menu mode: execute the command as is buffer[position] = '\0'; printf("\n"); fflush(stdout); break; } + } else if (c == KEY_ESCAPE) { + if (menu_mode) { + // Exit menu mode + menu_mode = 0; + clear_menu(); + display_inline_suggestion(prompt_buffer, buffer, position); + } } else if (c == KEY_BACKSPACE || c == 127) { // Handle backspace if (position > 0) { position--; buffer[position] = '\0'; + // Exit menu mode when backspacing + if (menu_mode) { + menu_mode = 0; + clear_menu(); + } + // Update suggestions after backspace - suggestion_active = 1; // Re-enter suggestion mode - update_suggestions(); + update_suggestions(buffer, position); + display_inline_suggestion(prompt_buffer, buffer, position); } } else if (c == KEY_TAB) { - // If we have suggestions, cycle to the next one - suggestion_active = 1; // Ensure we're in suggestion mode - - if (suggestion_count == 1) { - // Only one suggestion - accept it but don't execute - strncpy(buffer, full_suggestion, bufsize - 1); - buffer[bufsize - 1] = '\0'; - position = strlen(buffer); - - // Redraw line with full accepted suggestion - printf("\r\033[K\033[1;32m➜\033[0m %s", buffer); - fflush(stdout); - - // Reset suggestion state to find new suggestions - update_suggestions(); - } else if (suggestion_count > 1) { - // Multiple suggestions - cycle to the next one - suggestion_index = (suggestion_index + 1) % suggestion_count; - display_current_suggestion(); + if (menu_mode) { + // Already in menu mode: cycle to next suggestion + if (suggestion_count > 0) { + suggestion_index = (suggestion_index + 1) % suggestion_count; + refresh_display(prompt_buffer, buffer, position); + } + } else { + // Enter menu mode if we have suggestions + if (has_suggestion && suggestion_count > 0) { + menu_mode = 1; + suggestion_index = 0; // Start with first suggestion + refresh_display(prompt_buffer, buffer, position); + } } - } else if (c == KEY_UP) { - // Navigate history upward + } else if (c == KEY_UP && menu_mode) { + // In menu mode, up arrow goes to previous suggestion + if (suggestion_count > 0) { + suggestion_index = (suggestion_index + suggestion_count - 1) % suggestion_count; + refresh_display(prompt_buffer, buffer, position); + } + } else if (c == KEY_DOWN && menu_mode) { + // In menu mode, down arrow goes to next suggestion + if (suggestion_count > 0) { + suggestion_index = (suggestion_index + 1) % suggestion_count; + refresh_display(prompt_buffer, buffer, position); + } + } else if (c == KEY_UP && !menu_mode) { + // Navigate history upward when not in menu mode char *history_entry = get_previous_history_entry(&history_position); if (history_entry) { // Clear current line @@ -757,15 +839,15 @@ char *lsh_read_line(void) { position = strlen(buffer); // Display the history entry and update suggestions - printf("\033[1;32m➜\033[0m %s", buffer); + printf("%s%s", prompt_buffer, buffer); fflush(stdout); // Update suggestions after loading history - suggestion_active = 1; // Re-enter suggestion mode - update_suggestions(); + update_suggestions(buffer, position); + display_inline_suggestion(prompt_buffer, buffer, position); } - } else if (c == KEY_DOWN) { - // Navigate history downward + } else if (c == KEY_DOWN && !menu_mode) { + // Navigate history downward when not in menu mode char *history_entry = get_next_history_entry(&history_position); if (history_entry) { // Clear current line @@ -777,15 +859,15 @@ char *lsh_read_line(void) { position = strlen(buffer); // Display the history entry and update suggestions - printf("\033[1;32m➜\033[0m %s", buffer); + printf("%s%s", prompt_buffer, buffer); fflush(stdout); // Update suggestions after loading history - suggestion_active = 1; // Re-enter suggestion mode - update_suggestions(); + update_suggestions(buffer, position); + display_inline_suggestion(prompt_buffer, buffer, position); } else { // At the end of history, clear the line - printf("\r\033[K\033[1;32m➜\033[0m "); + printf("\r\033[K%s", prompt_buffer); buffer[0] = '\0'; position = 0; @@ -799,75 +881,7 @@ char *lsh_read_line(void) { suggestion_count = 0; } has_suggestion = 0; - suggestion_active = 1; // Re-enter suggestion mode } - } else if (c == '?') { - // Toggle showing command suggestions - show_suggestions = !show_suggestions; - - // Print the ? character - if (position >= bufsize - 1) { - bufsize += LSH_RL_BUFSIZE; - char *new_buffer = realloc(buffer, bufsize); - if (!new_buffer) { - fprintf(stderr, "lsh: allocation error\n"); - free(buffer); - exit(EXIT_FAILURE); - } - buffer = new_buffer; - } - - buffer[position] = c; - position++; - buffer[position] = '\0'; - printf("%c", c); - - if (show_suggestions) { - // Show command suggestions - printf("\nCommand suggestions:\n"); - - // Check history for similar commands - int suggestions_shown = 0; - char **matching_commands = get_matching_history_entries(buffer); - if (matching_commands) { - for (int i = 0; matching_commands[i] != NULL && suggestions_shown < 5; i++) { - printf(" %s\n", matching_commands[i]); - suggestions_shown++; - } - free_matching_entries(matching_commands); - } - - // Check built-in commands - for (int i = 0; i < lsh_num_builtins() && suggestions_shown < 5; i++) { - if (strncmp(buffer, builtin_str[i], position) == 0) { - printf(" %s\n", builtin_str[i]); - suggestions_shown++; - } - } - - // If we showed suggestions, redisplay the prompt and buffer - if (suggestions_shown > 0) { - printf("\033[1;32m➜\033[0m %s", buffer); - fflush(stdout); - } - - // Update suggestions after ? mode - suggestion_active = 1; // Re-enter suggestion mode - update_suggestions(); - } - } else if (c == KEY_RIGHT && has_suggestion) { - // Right arrow also accepts the current suggestion (without executing) - strncpy(buffer, full_suggestion, bufsize - 1); - buffer[bufsize - 1] = '\0'; - position = strlen(buffer); - - // Redraw line with full accepted suggestion - printf("\r\033[K\033[1;32m➜\033[0m %s", buffer); - fflush(stdout); - - // Reset suggestion state to find new suggestions - suggestion_active = 1; // Re-enter suggestion mode - update_suggestions(); } else if (isprint(c)) { // Regular character - add it to the buffer if (position >= bufsize - 1) { @@ -885,9 +899,15 @@ char *lsh_read_line(void) { position++; buffer[position] = '\0'; + // Exit menu mode when typing + if (menu_mode) { + menu_mode = 0; + clear_menu(); + } + // Update with the new character and show suggestions - suggestion_active = 1; // Re-enter suggestion mode when typing - update_suggestions(); + update_suggestions(buffer, position); + display_inline_suggestion(prompt_buffer, buffer, position); } } diff --git a/line_reader.h b/line_reader.h index cefe6ba..6fcf768 100644 --- a/line_reader.h +++ b/line_reader.h @@ -30,6 +30,8 @@ int read_key(void); */ char *lsh_read_line(void); +void generate_enhanced_prompt(char *prompt_buffer, size_t buffer_size); + /** * Split a line into tokens * @@ -54,4 +56,4 @@ char *parse_token(char **str_ptr); */ char ***lsh_split_piped_line(char *line); -#endif // LINE_READER_H \ No newline at end of file +#endif // LINE_READER_H diff --git a/line_reader.o b/line_reader.o index d941ee2dbf5ba2e26f16106cb067121e7edfe22b..f304a2d9771b9f084302d4e06e6764605df93b29 100644 GIT binary patch literal 41080 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

S~gbn;L?J;ou^&G*c!tJ~B}&;9wq@6Fn| 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 F{V#suXd?gs diff --git a/shell b/shell index cb5cca43d8f4ec2f0aedbd17e317c71e5408e5ca..42dd4462c64bf36315268a48f4630330d11a038b 100755 GIT binary patch delta 57559 zcmaG}2YeL8_utveCL!$-l8{14fk5aT=@2A%^iYDJNRg@(DT#Cr2#3VufOx&xdeaz`#|2jGVi^4^QP?V?%jruLJKy9 zE>C9hIkm3`gbim3eZq#@E3yUw<3|Wg89&0_jkRF&?DN?d6?+&|K`n*$zUq(!(=W1W zd3aNkI&Rv}s^3MdU2y-!)m3YnCT$y;JY?dhP2c{=|N7p~3>h(Mou&3VRlBH78{4N; z9iqAx?mbtv7h}ctgt(}#56(;7mupGW{!*n9bV1Uc<>*G8UR;h|%RWCYDyFW^^-nIV zEycbE+|D{Tz8p8regoVAI=5vx?kIa$d{oRhotsvUJKLTDu36`fEyrDDpA7CAojb1_ zcenimaQErl)#bRS>}SFKPUr3}$NkyP5~3=&xhL&?5~A!a6GCHd>+%KV5ANuh+30H{G6)7!@;E=MF5# zonY?+uDkA}a@@)G`CfGwm*Y;e?@5fZ7bNsVVCsp?kbC%@ArIj-*| z8S{?i=z%)jRE{2FZ(JiPCQj!LE5~hQ9}aFaojbi8*JRHDx2MisUXJ^c{V2G@bncdN z+-dgv;F@)AemU+EdqPrF%u1bmxg2+!y$`sb>fGXT+!OZsNm1;Zy=#&>g{tem+IzM6 zd!y7xNA}Kscaf^Hy>_4XC#x;@*{8ifRK2jze);`=>gK(B>#wiI)Khu(o*SN1bMp2s z+Q2KQzizh2Z9Al%+hV`EZGqZjt9|(P-fF_fdq3SCVo;yoxcAu3WTqbf(0+T@V0FYM zd$-+P)Rc{T-`U-ksm<5h&+M6}zVd;+@27)QWuyI*PdlnN*YCae>9we6dm}|LWm^Wi zTrQJUf^3KL&)Iu_Idw9?TpU5%!_h@9*GQAqCn*^dm?=B;QR94*Ej1MNT7qNB5&}v_ z2sDtWalf)KKQkbYX1hYwpePPYGRTA$)w7DSX~Y>_*u>5l_lN4#)r(hX#SqOBLagDx z3PX9u3(iqP$z#R3l2n^UoHAKgM%&Xa)-V%Z0;9&IQ_(25;u8ynVz^Sz?Mf%BD4SNB zY!Uw<=S(&&z86zW)(F*PvydOA?29IZ0DS510+jSWzKnvU9MK5JbRC< zfx81Rn!&nY(y^GR!R{3 zCTg0pza_0r?O$B39^0FQMMJIWk4Bp6Mu`5*(43p?PcPSH-R#Lf)MmTweSbK^hT5zD z*pzMG`{IxOtbeBgF4tGb(@ojG^fS%B9X*-U9(FEuxw7} !~sa3V9TTGvI0q9xzB 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%0D&u;%be! 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 diff --git a/shell.c b/shell.c index 1c42d46..f768e64 100644 --- a/shell.c +++ b/shell.c @@ -265,50 +265,66 @@ void update_status_bar(int fd, const char *git_info) { /** * Get the name of the parent and current directories from a path */ + void get_path_display(const char *cwd, char *parent_dir_name, char *current_dir_name, size_t buf_size) { - char *last_slash = strrchr(cwd, '/'); + char path_copy[PATH_MAX]; + strncpy(path_copy, cwd, PATH_MAX - 1); + path_copy[PATH_MAX - 1] = '\0'; - if (last_slash != NULL) { - strncpy(current_dir_name, last_slash + 1, buf_size - 1); - current_dir_name[buf_size - 1] = '\0'; + // Default values if we can't parse the path + strncpy(parent_dir_name, ".", buf_size - 1); + strncpy(current_dir_name, "unknown", buf_size - 1); + parent_dir_name[buf_size - 1] = '\0'; + current_dir_name[buf_size - 1] = '\0'; + + // Handle root directory special case + if (strcmp(path_copy, "/") == 0) { + strncpy(parent_dir_name, "/", buf_size - 1); + strncpy(current_dir_name, "", buf_size - 1); + return; + } + + // Remove trailing slash if present + size_t len = strlen(path_copy); + if (len > 1 && path_copy[len - 1] == '/') { + path_copy[len - 1] = '\0'; + } + + // Find the last component (current directory) + char *last_slash = strrchr(path_copy, '/'); + if (!last_slash) { + // No slash found, must be a relative path with no slashes + strncpy(current_dir_name, path_copy, buf_size - 1); + return; + } + + // Extract current directory name + strncpy(current_dir_name, last_slash + 1, buf_size - 1); + + // Handle paths directly under root + if (last_slash == path_copy) { + strncpy(parent_dir_name, "/", buf_size - 1); + return; + } + + // Temporarily terminate the string at the last slash + *last_slash = '\0'; + + // Find the previous slash to identify parent directory + char *prev_slash = strrchr(path_copy, '/'); + + if (prev_slash) { + // Extract just the parent directory name + strncpy(parent_dir_name, prev_slash + 1, buf_size - 1); - // If we're in root directory - if (last_slash == cwd) { - strncpy(parent_dir_name, "/", buf_size - 1); - parent_dir_name[buf_size - 1] = '\0'; - return; - } - - // Find the second-to-last slash for parent directory - char *parent_slash = last_slash; - while (parent_slash > cwd && *(parent_slash - 1) != '/') { - parent_slash--; - } - - if (parent_slash > cwd) { - size_t parent_len = parent_slash - cwd - 1; - if (parent_len >= buf_size) { - parent_len = buf_size - 1; - } - - // If parent is root - if (parent_len == 0) { - strncpy(parent_dir_name, "/", buf_size - 1); - } else { - strncpy(parent_dir_name, parent_slash - parent_len, parent_len); - parent_dir_name[parent_len] = '\0'; - } - } else { + // Special case: parent is root + if (prev_slash == path_copy) { strncpy(parent_dir_name, "/", buf_size - 1); } - parent_dir_name[buf_size - 1] = '\0'; } else { - // Fall back if path doesn't contain slashes - strncpy(current_dir_name, cwd, buf_size - 1); - strncpy(parent_dir_name, ".", buf_size - 1); - current_dir_name[buf_size - 1] = '\0'; - parent_dir_name[buf_size - 1] = '\0'; + // No previous slash, parent is the remaining part + strncpy(parent_dir_name, path_copy, buf_size - 1); } } @@ -497,7 +513,7 @@ void lsh_loop(void) { terminal_fd = init_terminal(&g_orig_termios); // Initialize the status bar - init_status_bar(STDOUT_FILENO); + //init_status_bar(STDOUT_FILENO); // Initialize subsystems init_aliases(); diff --git a/shell.o b/shell.o index 3f5d6853ec5a15771a2b373d738d4822b62abd90..34f2c7f8a8148e073a444889d39dd42b54805175 100644 GIT binary patch delta 10939 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 A@&Et; delta 10603 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 o0!fV&&ycgq=>fw31K5U8JOBUy