editor without ncurses

This commit is contained in:
2024-10-30 01:12:56 +01:00
parent e94cf31916
commit 3ce65e6a33

136
editor.c
View File

@@ -1,110 +1,98 @@
#ifdef _WIN32
#include <pdcurses.h> // PDCurses verwenden, wenn auf Windows kompiliert
#else
#include <ncurses.h> // Ncurses verwenden, wenn auf Unix/Linux kompiliert
#endif
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
#include <string.h> #include <string.h>
#define CTRL_KEY(k) ((k) & 0x1f) #define CTRL_KEY(k) ((k) & 0x1f)
void init_ncurses() { struct termios orig_termios;
initscr(); // Startet den ncurses-Modus
raw(); // Direktes Erfassen der Eingaben (kein Zeilenpuffer) void disable_raw_mode() {
keypad(stdscr, TRUE); // Ermöglicht die Nutzung von Funktionstasten wie den Pfeiltasten tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
noecho(); // Verhindert, dass Eingaben direkt ausgegeben werden
curs_set(1); // Cursor sichtbar machen
} }
void shutdown_ncurses() { void enable_raw_mode() {
endwin(); // Beendet den ncurses-Modus tcgetattr(STDIN_FILENO, &orig_termios);
atexit(disable_raw_mode);
struct termios raw = orig_termios;
raw.c_lflag &= ~(ECHO | ICANON | ISIG);
raw.c_iflag &= ~(IXON);
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
} }
void load_file(const char *filename) { void load_file(const char *filename) {
FILE *file = fopen(filename, "r"); FILE *file = fopen(filename, "r");
if (file == NULL) { if (file == NULL) {
mvprintw(1, 0, "Fehler beim Öffnen der Datei %s.", filename); printf("Fehler beim Öffnen der Datei %s.\n", filename);
return; return;
} }
int y = 1;
char line[256]; char line[256];
while (fgets(line, sizeof(line), file)) { while (fgets(line, sizeof(line), file)) {
mvprintw(y++, 0, "%s", line); printf("%s", line);
} }
fclose(file); fclose(file);
} }
void insert_char(int y, int x, char ch) {
int max_x = getmaxx(stdscr);
char line[max_x - x];
// Speichere den Rest der Zeile ab der aktuellen Position
for (int i = 0; i < max_x - x - 1; ++i) {
line[i] = mvinch(y, x + i) & A_CHARTEXT;
}
line[max_x - x - 1] = '\0';
// Setze das neue Zeichen an der aktuellen Position
mvaddch(y, x, ch);
// Schreibe den Rest der Zeile wieder zurück, um den Text nach rechts zu verschieben
mvprintw(y, x + 1, "%s", line);
move(y, x + 1);
}
void editor_loop() { void editor_loop() {
int ch; int ch;
while ((ch = getch()) != 27) { // Beenden mit ESC (ASCII 27) while (1) {
int y = getcury(stdscr); ch = getchar();
int x = getcurx(stdscr); if (ch == '\x1b') {
switch (ch) { char seq[3];
case KEY_UP: if (read(STDIN_FILENO, &seq[0], 1) != 1) continue;
// Cursor nach oben bewegen if (read(STDIN_FILENO, &seq[1], 1) != 1) continue;
move(y - 1, x);
break; if (seq[0] == '[') {
case KEY_DOWN: switch (seq[1]) {
// Cursor nach unten bewegen case 'A':
move(y + 1, x); // Cursor nach oben bewegen (nicht implementiert)
break; printf("\033[A");
case KEY_LEFT: break;
// Cursor nach links bewegen case 'B':
move(y, x - 1); // Cursor nach unten bewegen (nicht implementiert)
break; printf("\033[B");
case KEY_RIGHT: break;
// Cursor nach rechts bewegen case 'C':
move(y, x + 1); // Cursor nach rechts bewegen
break; printf("\033[C");
case KEY_BACKSPACE: break;
case 127: case 'D':
// Zeichen löschen (Rückschritt) // Cursor nach links bewegen
move(y, x - 1); printf("\033[D");
delch(); break;
break; }
case KEY_DC: }
// Zeichen löschen (Entfernen) } else if (ch == 27) {
delch(); // ESC-Taste zum Beenden
break; break;
default: } else {
// Zeichen einfügen und Rest der Zeile nach rechts verschieben switch (ch) {
insert_char(y, x, ch); case 127:
break; // Zeichen löschen (Rückschritt)
printf("\b \b");
break;
default:
// Zeichen anzeigen
putchar(ch);
break;
}
} }
refresh(); fflush(stdout);
} }
} }
int main() { int main() {
init_ncurses(); enable_raw_mode();
mvprintw(0, 0, "Willkommen zu deinem Texteditor! Drücke ESC zum Beenden."); printf("Willkommen zu deinem Texteditor! Drücke ESC zum Beenden.\n");
load_file("test.txt"); load_file("test.txt");
refresh();
editor_loop(); editor_loop();
shutdown_ncurses();
return 0; return 0;
} }