line highlighter jumps over empty lines

This commit is contained in:
2025-06-11 06:50:35 +02:00
parent 24f6547354
commit 4b48526c25
5 changed files with 91 additions and 81 deletions

View File

@@ -1430,7 +1430,7 @@ char ***lsh_split_piped_line(char *line) {
}
cmd_str = strtok_r(NULL, "|", &save_ptr);
} // this is a change
}
commands[cmd_position] = NULL;
return commands;

View File

@@ -2912,30 +2912,14 @@ int handle_ncurses_diff_input(NCursesDiffViewer *viewer, int key) {
case KEY_UP:
case 'k':
// Move cursor up (vim-style)
if (viewer->file_cursor_line > 0) {
viewer->file_cursor_line--;
// Scroll up if cursor gets within 3 lines of top
if (viewer->file_cursor_line < viewer->file_scroll_offset + 3 &&
viewer->file_scroll_offset > 0) {
viewer->file_scroll_offset--;
}
}
// Move cursor up while skipping empty lines
move_cursor_smart(viewer, -1);
break;
case KEY_DOWN:
case 'j':
// Move cursor down (vim-style)
if (viewer->file_cursor_line < viewer->file_line_count - 1) {
viewer->file_cursor_line++;
// Scroll down if cursor gets within 3 lines of bottom
if (viewer->file_cursor_line >=
viewer->file_scroll_offset + max_lines_visible - 3 &&
viewer->file_scroll_offset <
viewer->file_line_count - max_lines_visible) {
viewer->file_scroll_offset++;
}
}
// Move cursor down while skipping empty lines
move_cursor_smart(viewer, 1);
break;
case KEY_PPAGE: // Page Up
@@ -3538,30 +3522,14 @@ int handle_ncurses_diff_input(NCursesDiffViewer *viewer, int key) {
case KEY_UP:
case 'k':
// Move cursor up (vim-style)
if (viewer->file_cursor_line > 0) {
viewer->file_cursor_line--;
// Scroll up if cursor gets within 3 lines of top
if (viewer->file_cursor_line < viewer->file_scroll_offset + 3 &&
viewer->file_scroll_offset > 0) {
viewer->file_scroll_offset--;
}
}
// Move cursor up while skipping empty lines
move_cursor_smart(viewer, -1);
break;
case KEY_DOWN:
case 'j':
// Move cursor down (vim-style)
if (viewer->file_cursor_line < viewer->file_line_count - 1) {
viewer->file_cursor_line++;
// Scroll down if cursor gets within 3 lines of bottom
if (viewer->file_cursor_line >=
viewer->file_scroll_offset + max_lines_visible - 3 &&
viewer->file_scroll_offset <
viewer->file_line_count - max_lines_visible) {
viewer->file_scroll_offset++;
}
}
// Move cursor down while skipping empty lines
move_cursor_smart(viewer, 1);
break;
case 21: // Ctrl+U
@@ -3632,30 +3600,14 @@ int handle_ncurses_diff_input(NCursesDiffViewer *viewer, int key) {
case KEY_UP:
case 'k':
// Move cursor up (vim-style)
if (viewer->file_cursor_line > 0) {
viewer->file_cursor_line--;
// Scroll up if cursor gets within 3 lines of top
if (viewer->file_cursor_line < viewer->file_scroll_offset + 3 &&
viewer->file_scroll_offset > 0) {
viewer->file_scroll_offset--;
}
}
// Move cursor up while skipping empty lines
move_cursor_smart(viewer, -1);
break;
case KEY_DOWN:
case 'j':
// Move cursor down (vim-style)
if (viewer->file_cursor_line < viewer->file_line_count - 1) {
viewer->file_cursor_line++;
// Scroll down if cursor gets within 3 lines of bottom
if (viewer->file_cursor_line >=
viewer->file_scroll_offset + max_lines_visible - 3 &&
viewer->file_scroll_offset <
viewer->file_line_count - max_lines_visible) {
viewer->file_scroll_offset++;
}
}
// Move cursor down while skipping empty lines
move_cursor_smart(viewer, 1);
break;
case 21: // Ctrl+U
@@ -3725,30 +3677,14 @@ int handle_ncurses_diff_input(NCursesDiffViewer *viewer, int key) {
case KEY_UP:
case 'k':
// Move cursor up (vim-style)
if (viewer->file_cursor_line > 0) {
viewer->file_cursor_line--;
// Scroll up if cursor gets within 3 lines of top
if (viewer->file_cursor_line < viewer->file_scroll_offset + 3 &&
viewer->file_scroll_offset > 0) {
viewer->file_scroll_offset--;
}
}
// Move cursor up while skipping empty lines
move_cursor_smart(viewer, -1);
break;
case KEY_DOWN:
case 'j':
// Move cursor down (vim-style)
if (viewer->file_cursor_line < viewer->file_line_count - 1) {
viewer->file_cursor_line++;
// Scroll down if cursor gets within 3 lines of bottom
if (viewer->file_cursor_line >=
viewer->file_scroll_offset + max_lines_visible - 3 &&
viewer->file_scroll_offset <
viewer->file_line_count - max_lines_visible) {
viewer->file_scroll_offset++;
}
}
// Move cursor down while skipping empty lines
move_cursor_smart(viewer, 1);
break;
case 21: // Ctrl+U
@@ -5473,6 +5409,75 @@ void check_background_fetch(NCursesDiffViewer *viewer) {
}
}
/**
* Move cursor up/down while skipping empty lines
* direction: -1 for up, 1 for down
*/
void move_cursor_smart(NCursesDiffViewer *viewer, int direction) {
if (!viewer || viewer->file_line_count == 0) {
return;
}
int original_cursor = viewer->file_cursor_line;
int new_cursor = viewer->file_cursor_line;
int attempts = 0;
const int max_attempts = viewer->file_line_count; // Prevent infinite loops
do {
new_cursor += direction;
attempts++;
// Bounds checking
if (new_cursor < 0) {
new_cursor = 0;
break;
}
if (new_cursor >= viewer->file_line_count) {
new_cursor = viewer->file_line_count - 1;
break;
}
// Check if current line is empty or just whitespace
NCursesFileLine *line = &viewer->file_lines[new_cursor];
char *trimmed = line->line;
// Skip leading whitespace
while (*trimmed == ' ' || *trimmed == '\t') {
trimmed++;
}
// If line has content after trimming, or we've tried too many times, stop here
if (*trimmed != '\0' || attempts >= max_attempts) {
break;
}
} while (attempts < max_attempts);
// Update cursor position
viewer->file_cursor_line = new_cursor;
// Auto-scroll logic (same as before)
int height, width;
getmaxyx(viewer->file_content_win, height, width);
int max_lines_visible = height - 2;
if (direction == -1) { // Moving up
// Scroll up if cursor gets within 3 lines of top
if (viewer->file_cursor_line < viewer->file_scroll_offset + 3 &&
viewer->file_scroll_offset > 0) {
viewer->file_scroll_offset--;
}
} else { // Moving down
// Scroll down if cursor gets within 3 lines of bottom
if (viewer->file_cursor_line >=
viewer->file_scroll_offset + max_lines_visible - 3 &&
viewer->file_scroll_offset <
viewer->file_line_count - max_lines_visible) {
viewer->file_scroll_offset++;
}
}
}
/**
* Clean up ncurses diff viewer resources
*/

View File

@@ -320,4 +320,9 @@ void start_background_fetch(NCursesDiffViewer *viewer);
*/
void check_background_fetch(NCursesDiffViewer *viewer);
/**
* Move cursor up/down while skipping empty lines
*/
void move_cursor_smart(NCursesDiffViewer *viewer, int direction);
#endif // NCURSES_DIFF_VIEWER_H

Binary file not shown.

BIN
shell

Binary file not shown.