diff --git a/lib/io/cli_viewer.cpp b/lib/io/cli_viewer.cpp index 337c04f..09f5afe 100644 --- a/lib/io/cli_viewer.cpp +++ b/lib/io/cli_viewer.cpp @@ -63,17 +63,33 @@ void gctl::cli_viewer::display() { int maxLines = LINES - 1; // 终端的行数(减去提示行) int startLine = 0; // 当前显示的起始行 + int startX = 0; // 当前水平滚动的起始位置 + int maxLineLength = 0; // 最长行的长度 + + // 计算最长行的长度 + for (const auto& line : lines) + { + maxLineLength = std::max(maxLineLength, static_cast(line.length())); + } + // 主循环 while (true) { - // 清屏并显示文件内容 werase(stdscr); // 清屏但不闪烁 + + // 显示文件内容 for (int i = startLine; i < startLine + maxLines && i < lines.size(); ++i) { - mvprintw(i - startLine, 0, "%s", lines[i].c_str()); + const std::string& line = lines[i]; + if (startX < line.length()) + { + mvprintw(i - startLine, 0, "%s", line.substr(startX).c_str()); + } } + // 在最后一行显示提示信息 mvprintw(LINES - 1, 0, "Use arrow keys or mouse wheel to scroll. Press Q or ESC to exit."); + int ch = getch(); // 获取按键 if (ch == KEY_UP) { @@ -83,6 +99,14 @@ void gctl::cli_viewer::display() { startLine = std::min(startLine + 1, static_cast(lines.size()) - maxLines); // 向下滚动 } + else if (ch == KEY_LEFT) + { + startX = std::max(0, startX - 1); // 向左滚动 + } + else if (ch == KEY_RIGHT) + { + startX = std::min(startX + 1, maxLineLength - COLS); // 向右滚动 + } else if (ch == 'q' || ch == 'Q' || ch == 27) { // 按Q或ESC退出 break; diff --git a/lib/io/cli_viewer.h b/lib/io/cli_viewer.h index ff230b9..6c694db 100644 --- a/lib/io/cli_viewer.h +++ b/lib/io/cli_viewer.h @@ -35,6 +35,7 @@ namespace gctl { + // 命令行查看器,用于在终端内查看文本文件内容,支持上下左右鼠标滚动或按键导航和退出查看 class cli_viewer { public: