From: Arun Prakash Jana <engineerarun@gmail.com>
Date: Thu, 24 Jan 2019 06:35:13 +0000 (+0530)
Subject: Use libreadline at command prompt
X-Git-Tag: v2.3~90
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=94e4201dc1f6973c4a03e60134c42c762d263baa;p=nnn.git

Use libreadline at command prompt
---

diff --git a/Makefile b/Makefile
index c975dceb..ba4fa7ae 100644
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,7 @@ CFLAGS += -Wall -Wextra -Wno-unused-parameter
 CFLAGS += $(CFLAGS_OPTIMIZATION)
 CFLAGS += $(CFLAGS_CURSES)
 
-LDLIBS += $(LDLIBS_CURSES)
+LDLIBS += -lreadline $(LDLIBS_CURSES)
 
 DISTFILES = src nnn.1 Makefile README.md LICENSE
 SRC = src/nnn.c
diff --git a/README.md b/README.md
index 4990db49..1e559754 100644
--- a/README.md
+++ b/README.md
@@ -133,7 +133,7 @@ Intrigued? Find out [HOW](https://github.com/jarun/nnn/wiki/performance-factors)
 
 #### Dependencies
 
-`nnn` needs a curses library with wide character support (like ncursesw) and standard libc.
+`nnn` needs a curses library with wide character support (like ncursesw), libreadline and standard libc.
 
 #### From a package manager
 
@@ -167,7 +167,7 @@ Packages for Arch Linux, CentOS, Debian, Fedora, Solus, and Ubuntu are available
 
 To cook yourself, download the [latest stable release](https://github.com/jarun/nnn/releases/latest) or clone this repository (*risky*). Then install the dependencies and compile (e.g. on Ubuntu 16.04):
 
-    $ sudo apt-get install pkg-config libncursesw5-dev
+    $ sudo apt-get install pkg-config libncursesw5-dev libreadline6-dev
     $ make
     $ sudo make install
 
diff --git a/packagecore.yaml b/packagecore.yaml
index ebf12368..5270d2b9 100644
--- a/packagecore.yaml
+++ b/packagecore.yaml
@@ -14,6 +14,7 @@ packages:
       - pkg-config
     deps:
       - ncurses
+      - readline
     container: "base/archlinux"
   centos7.2:
     builddeps:
@@ -21,8 +22,10 @@ packages:
       - gcc
       - pkgconfig
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
     commands:
       pre:
         - yum install epel-release
@@ -32,8 +35,10 @@ packages:
       - gcc
       - pkgconfig
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
     commands:
       pre:
         - yum install epel-release
@@ -43,8 +48,10 @@ packages:
       - gcc
       - pkgconfig
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
     commands:
       pre:
         - yum install epel-release
@@ -54,48 +61,60 @@ packages:
       - gcc
       - pkg-config
       - libncursesw5-dev
+      - libreadline-dev
     deps:
       - libncursesw5
+      - libreadline-common
   fedora25:
     builddeps:
       - make
       - gcc
       - pkgconfig
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
   fedora26:
     builddeps:
       - make
       - gcc
       - pkg-config
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
   fedora27:
     builddeps:
       - make
       - gcc
       - pkg-config
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
   fedora28:
     builddeps:
       - make
       - gcc
       - pkg-config
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
   fedora29:
     builddeps:
       - make
       - gcc
       - pkg-config
       - ncurses-devel
+      - readline-devel
     deps:
       - ncurses
+      - readline
 #  opensuse42.3:
 #    builddeps:
 #      - make
@@ -110,13 +129,17 @@ packages:
       - gcc
       - pkg-config
       - libncursesw5-dev
+      - libreadline6-dev
     deps:
       - libncursesw5
+      - libreadline6
   ubuntu18.04:
     builddeps:
       - make
       - gcc
       - pkg-config
       - libncursesw5-dev
+      - libreadline-dev
     deps:
       - libncursesw5
+      - libreadline7
diff --git a/src/nnn.c b/src/nnn.c
index 178eb96b..e516752a 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -78,6 +78,8 @@
 #endif
 #include <locale.h>
 #include <pwd.h>
+#include <readline/history.h>
+#include <readline/readline.h>
 #include <regex.h>
 #include <signal.h>
 #include <stdarg.h>
@@ -3710,9 +3712,14 @@ nochange:
 				}
 				break;
 			default: /* SEL_RUNCMD */
-				tmp = xreadline(NULL, "> ");
-				if (tmp && tmp[0])
+				exitcurses();
+				tmp = readline("nnn> ");
+				refresh();
+				if (tmp && tmp[0]) {
 					spawn(shell, "-c", tmp, path, F_NORMAL | F_SIGINT);
+					add_history(tmp);
+					free(tmp);
+				}
 			}
 
 			/* Continue in navigate-as-you-type mode, if enabled */
@@ -4022,6 +4029,11 @@ int main(int argc, char *argv[])
 	setlocale(LC_ALL, "");
 	crc8init();
 
+	/* Bind TAB to cycling */
+	rl_variable_bind("completion-ignore-case", "on");
+	rl_bind_key('\t', rl_menu_complete);
+	read_history(NULL);
+
 #ifdef DEBUGMODE
 	enabledbg();
 #endif
@@ -4031,6 +4043,8 @@ int main(int argc, char *argv[])
 	browse(ipath);
 	exitcurses();
 
+	write_history(NULL);
+
 	if (cfg.pickraw) {
 		if (copybufpos) {
 			opt = selectiontofd(1);