diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 49b6526..14247dd 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -11,9 +11,9 @@
-
+ {
+ "useNewFormat": true
+}
@@ -21,11 +21,7 @@
-
-
-
-
-
+
@@ -34,8 +30,13 @@
+
+
+
+
+
@@ -75,9 +76,9 @@
-
+ {
+ "associatedIndex": 3
+}
@@ -104,6 +105,7 @@
"RunOnceActivity.RadMigrateCodeStyle": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.cidr.known.project.marker": "true",
+ "RunOnceActivity.git.unshallow": "true",
"RunOnceActivity.readMode.enableVisualFormatting": "true",
"RunOnceActivity.west.config.association.type.startup.service": "true",
"cf.first.check.clang-format": "false",
@@ -119,7 +121,7 @@
"nodejs_package_manager_path": "npm",
"onboarding.tips.debug.path": "/Users/kyle/src/kte/main.cpp",
"rearrange.code.on.save": "true",
- "settings.editor.selected.configurable": "junie.application.models",
+ "settings.editor.selected.configurable": "editor.preferences.fonts.default",
"to.speed.mode.migration.done": "true",
"vue.rearranger.settings.migration": "true"
}
@@ -129,32 +131,12 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -164,6 +146,13 @@
1764457173148
+
+
+
+
+
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 63aa3cf..6d353bc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,7 +4,7 @@ project(kte)
include(GNUInstallDirs)
set(CMAKE_CXX_STANDARD 17)
-set(KTE_VERSION "0.9.0")
+set(KTE_VERSION "0.9.1")
# Default to terminal-only build to avoid SDL/OpenGL dependency by default.
# Enable with -DBUILD_GUI=ON when SDL2/OpenGL/Freetype are available.
@@ -44,6 +44,8 @@ if (${BUILD_GUI})
endif ()
# NCurses for terminal mode
+set(CURSES_NEED_NCURSES)
+set(CURSES_NEED_WIDE)
find_package(Curses REQUIRED)
include_directories(${CURSES_INCLUDE_DIR})
diff --git a/KKeymap.cc b/KKeymap.cc
index 08ea384..7e2b36f 100644
--- a/KKeymap.cc
+++ b/KKeymap.cc
@@ -137,9 +137,6 @@ KLookupCtrlCommand(const int ascii_key, CommandId &out) -> bool
case 'g':
out = CommandId::Refresh;
return true;
- case 'x':
- out = CommandId::SaveAndQuit; // direct C-x mapping (GUI had this)
- return true;
default:
break;
}
diff --git a/default-gui.nix b/default-gui.nix
index 9011df3..e91ee77 100644
--- a/default-gui.nix
+++ b/default-gui.nix
@@ -2,36 +2,37 @@
lib,
stdenv,
cmake,
- libGL,
+ ncurses,
SDL2,
- xorg.libX11
+ libGL,
+ xorg,
installShellFiles,
...
}:
let
cmakeContent = builtins.readFile ./CMakeLists.txt;
cmakeLines = lib.splitString "\n" cmakeContent;
- versionLine = lib.findFirst (l: builtins.match ".*set\\(KE_VERSION \".+\"\\).*" l
- version = builtins.head (builtins.match ".*set\\(KE_VERSION \"(.+)\"\\).*" versio
+ versionLine = lib.findFirst (l: builtins.match ".*set\\(KTE_VERSION \".+\"\\).*" l != null) (throw "KTE_VERSION not found in CMakeLists.txt") cmakeLines;
+ version = builtins.head (builtins.match ".*set\\(KTE_VERSION \"(.+)\"\\).*" versionLine);
in
-pkgs.stdenv.mkDerivation {
+stdenv.mkDerivation {
pname = "kte";
inherit version;
- src = ./.;
+ src = lib.cleanSource ./.;
- nativeBuildInputs = [ pkgs.cmake pkgs.pkg-config ];
- buildInputs = with pkgs; [
+ nativeBuildInputs = [
+ cmake
ncurses
SDL2
libGL
xorg.libX11
+ installShellFiles
];
cmakeFlags = [
"-DBUILD_GUI=ON"
- "-DCURSES_NEED_NCURSES=TRUE"
- "-DCURSES_NEED_WIDE=TRUE"
+ "-DCMAKE_BUILD_TYPE=Debug"
];
installPhase = ''
@@ -42,7 +43,8 @@ pkgs.stdenv.mkDerivation {
cp kge $out/bin/
installManPage ../docs/kte.1
- installManPage ../docs/kte.1
+ installManPage ../docs/kge.1
+
runHook postInstall
'';
diff --git a/default-nogui.nix b/default-nogui.nix
new file mode 100644
index 0000000..94143e5
--- /dev/null
+++ b/default-nogui.nix
@@ -0,0 +1,42 @@
+{
+ lib,
+ stdenv,
+ cmake,
+ ncurses,
+ installShellFiles,
+ ...
+}:
+let
+ cmakeContent = builtins.readFile ./CMakeLists.txt;
+ cmakeLines = lib.splitString "\n" cmakeContent;
+ versionLine = lib.findFirst (l: builtins.match ".*set\\(KTE_VERSION \".+\"\\).*" l != null) (throw "KTE_VERSION not found in CMakeLists.txt") cmakeLines;
+ version = builtins.head (builtins.match ".*set\\(KTE_VERSION \"(.+)\"\\).*" versionLine);
+in
+stdenv.mkDerivation {
+ pname = "kte";
+ inherit version;
+
+ src = lib.cleanSource ./.;
+
+ nativeBuildInputs = [
+ cmake
+ ncurses
+ installShellFiles
+ ];
+
+ cmakeFlags = [
+ "-DBUILD_GUI=OFF"
+ "-DCMAKE_BUILD_TYPE=Debug"
+ ];
+
+ installPhase = ''
+ runHook preInstall
+
+ mkdir -p $out/bin
+ cp kte $out/bin/
+
+ installManPage ../docs/kte.1
+
+ runHook postInstall
+ '';
+}
diff --git a/default.nix b/default.nix
index 6a401af..fb2d6a4 100644
--- a/default.nix
+++ b/default.nix
@@ -3,6 +3,9 @@
stdenv,
cmake,
ncurses,
+ SDL2,
+ libGL,
+ xorg,
installShellFiles,
...
}:
@@ -13,7 +16,7 @@ let
version = builtins.head (builtins.match ".*set\\(KTE_VERSION \"(.+)\"\\).*" versionLine);
in
stdenv.mkDerivation {
- pname = "ke";
+ pname = "kte";
inherit version;
src = lib.cleanSource ./.;
@@ -21,11 +24,14 @@ stdenv.mkDerivation {
nativeBuildInputs = [
cmake
ncurses
+ SDL2
+ libGL
+ xorg.libX11
installShellFiles
];
cmakeFlags = [
- "-DKTE_USE_PIECE_TABLE=ON"
+ "-DBUILD_GUI=ON"
"-DCMAKE_BUILD_TYPE=Debug"
];
@@ -34,8 +40,10 @@ stdenv.mkDerivation {
mkdir -p $out/bin
cp kte $out/bin/
+ cp kge $out/bin/
installManPage ../docs/kte.1
+ installManPage ../docs/kge.1
runHook postInstall
'';
diff --git a/flake.nix b/flake.nix
index cea4eeb..3f1790d 100644
--- a/flake.nix
+++ b/flake.nix
@@ -12,7 +12,10 @@
in
{
packages.x86_64-linux = {
- default = pkgs.callPackage ./default.nix { };
+ default = pkgs.callPackage ./default-nogui.nix { };
+ kge = pkgs.callPackage ./default-gui.nix { };
+ kte = pkgs.callPackage ./default-nogui.nix { };
+ full = pkgs.callPackage ./default.nix { };
};
};
}
diff --git a/main.cc b/main.cc
index 4a9fe7c..fcd6fb5 100644
--- a/main.cc
+++ b/main.cc
@@ -12,6 +12,7 @@
#include "Command.h"
#include "Frontend.h"
#include "TerminalFrontend.h"
+
#if defined(KTE_BUILD_GUI)
#include "GUIFrontend.h"
#endif
@@ -25,156 +26,52 @@ static void
PrintUsage(const char *prog)
{
std::cerr << "Usage: " << prog << " [OPTIONS] [files]\n"
- << "Options:\n"
- << " -g, --gui Use GUI frontend (if built)\n"
- << " -t, --term Use terminal (ncurses) frontend [default]\n"
- << " -h, --help Show this help and exit\n"
- << " -V, --version Show version and exit\n";
+ << "Options:\n"
+ << " -g, --gui Use GUI frontend (if built)\n"
+ << " -t, --term Use terminal (ncurses) frontend [default]\n"
+ << " -h, --help Show this help and exit\n"
+ << " -V, --version Show version and exit\n";
}
-
-#if defined(KTE_BUILD_GUI)
-// Detach the process from the controlling terminal when running the GUI so the
-// launching terminal can be closed. This mirrors typical GUI app behavior on
-// POSIX systems.
-static void
-DetachFromTerminalIfGUI(bool use_gui)
-{
-#if defined(__APPLE__) || defined(__linux__) || defined(__unix__)
- if (!use_gui)
- return;
-
- // Ignore SIGHUP so closing the terminal won't terminate us.
- signal(SIGHUP, SIG_IGN);
-
- // Helper: redirect stdio to /dev/null and optionally close extra FDs.
- auto redirect_stdio_and_close = []() {
- // Reset file mode creation mask and working directory to a safe default
- umask(0);
- chdir("/");
-
- FILE *fnull_r = fopen("/dev/null", "r");
- if (fnull_r) {
- dup2(fileno(fnull_r), STDIN_FILENO);
- }
- FILE *fnull_w = fopen("/dev/null", "w");
- if (fnull_w) {
- dup2(fileno(fnull_w), STDOUT_FILENO);
- dup2(fileno(fnull_w), STDERR_FILENO);
- }
-
- // Close any other inherited FDs to avoid keeping terminal/pty or pipes open
- long max_fd = sysconf(_SC_OPEN_MAX);
- if (max_fd < 0)
- max_fd = 256; // conservative fallback
- for (long fd = 3; fd < max_fd; ++fd) {
- close(static_cast(fd));
- }
- };
-
-#if defined(__APPLE__)
- // macOS: daemon(3) is deprecated and treated as an error with -Werror.
- // Use double-fork + setsid and redirect stdio to /dev/null.
- pid_t pid = fork();
- if (pid < 0) {
- return;
- }
-
- if (pid > 0) {
- _exit(0);
- }
-
- if (setsid() < 0) {
- return;
- }
-
- pid_t pid2 = fork();
- if (pid2 < 0) {
- return;
- }
-
- if (pid2 > 0) {
- _exit(0);
- }
-
- redirect_stdio_and_close();
-#else
- // Prefer daemon(3) on non-Apple POSIX; fall back to manual detach if it fails.
- if (daemon(0, 0) == 0) {
- redirect_stdio_and_close();
- return;
- }
-
- pid_t pid = fork();
- if (pid < 0) {
- return;
- }
-
- if (pid > 0) {
- _exit(0);
- }
-
- if (setsid() < 0) {
- // bogus check
- }
-
- pid_t pid2 = fork();
- if (pid2 < 0) {
- return;
- }
-
- if (pid2 > 0) {
- _exit(0);
- }
-
- redirect_stdio_and_close();
-#endif
-#else
- (void) use_gui;
-#endif
-}
-#endif
-
-
int
main(int argc, const char *argv[])
{
Editor editor;
// CLI parsing using getopt_long
- bool req_gui = false;
- bool req_term = false;
- bool show_help = false;
+ bool req_gui = false;
+ bool req_term = false;
+ bool show_help = false;
bool show_version = false;
static struct option long_opts[] = {
- {"gui", no_argument, nullptr, 'g'},
- {"term", no_argument, nullptr, 't'},
- {"help", no_argument, nullptr, 'h'},
- {"version", no_argument, nullptr, 'V'},
- {nullptr, 0, nullptr, 0}
+ {"gui", no_argument, nullptr, 'g'},
+ {"term", no_argument, nullptr, 't'},
+ {"help", no_argument, nullptr, 'h'},
+ {"version", no_argument, nullptr, 'V'},
+ {nullptr, 0, nullptr, 0}
};
int opt;
int long_index = 0;
- while ((opt = getopt_long(argc, const_cast(argv), "gthV", long_opts, &long_index)) != -1) {
+ while ((opt = getopt_long(argc, const_cast(argv), "gthV", long_opts, &long_index)) != -1) {
switch (opt) {
- case 'g':
- req_gui = true;
- break;
- case 't':
- req_term = true;
- break;
- case 'h':
- show_help = true;
- break;
- case 'V':
- show_version = true;
- break;
- case '?':
- default:
- PrintUsage(argv[0]);
- return 2;
+ case 'g':
+ req_gui = true;
+ break;
+ case 't':
+ req_term = true;
+ break;
+ case 'h':
+ show_help = true;
+ break;
+ case 'V':
+ show_version = true;
+ break;
+ case '?':
+ default:
+ PrintUsage(argv[0]);
+ return 2;
}
}
@@ -195,7 +92,7 @@ main(int argc, const char *argv[])
#if !defined(KTE_BUILD_GUI)
if (req_gui) {
std::cerr << "kte: GUI not built. Reconfigure with -DBUILD_GUI=ON and required deps installed." <<
- std::endl;
+ std::endl;
return 2;
}
#else
@@ -212,8 +109,6 @@ main(int argc, const char *argv[])
use_gui = false;
#endif
}
- // If using GUI, detach from the controlling terminal so the terminal can be closed.
- DetachFromTerminalIfGUI(use_gui);
#endif
// Open files passed on the CLI; support +N to jump to line N in the next file.
@@ -237,7 +132,7 @@ main(int argc, const char *argv[])
// Clamp to >=1 later; 0 disables.
try {
unsigned long v = std::stoul(p);
- pending_line = static_cast(v);
+ pending_line = static_cast(v);
} catch (...) {
// Ignore malformed huge numbers
pending_line = 0;
@@ -257,7 +152,7 @@ main(int argc, const char *argv[])
// Apply pending +N to the just-opened (current) buffer
if (Buffer *b = editor.CurrentBuffer()) {
std::size_t nrows = b->Nrows();
- std::size_t line = pending_line > 0 ? pending_line - 1 : 0;
+ std::size_t line = pending_line > 0 ? pending_line - 1 : 0;
// 1-based to 0-based
if (nrows > 0) {
if (line >= nrows)
@@ -283,7 +178,7 @@ main(int argc, const char *argv[])
InstallDefaultCommands();
// Select frontend
- std::unique_ptr fe;
+ std::unique_ptr fe;
#if defined(KTE_BUILD_GUI)
if (use_gui) {
fe = std::make_unique();