From d05fcaffa0ef926ef85e23bd70449e18e9f2113e Mon Sep 17 00:00:00 2001 From: Matt Stancliff Date: Thu, 31 Jul 2014 11:58:53 -0400 Subject: Update linenoise accessory files The core linenoise code was being backported, but not the README or example. It's less confusing for users if everything matches across directories. Fix inspired by @thrig Closes #1872 --- deps/linenoise/.gitignore | 4 +++- deps/linenoise/README.markdown | 16 ++++++++++----- deps/linenoise/example.c | 45 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 55 insertions(+), 10 deletions(-) (limited to 'deps') diff --git a/deps/linenoise/.gitignore b/deps/linenoise/.gitignore index 28f258a30..7ab7825f5 100644 --- a/deps/linenoise/.gitignore +++ b/deps/linenoise/.gitignore @@ -1 +1,3 @@ -linenoise_example* +linenoise_example +*.dSYM +history.txt diff --git a/deps/linenoise/README.markdown b/deps/linenoise/README.markdown index 9612da47f..2d21dc4e2 100644 --- a/deps/linenoise/README.markdown +++ b/deps/linenoise/README.markdown @@ -1,8 +1,12 @@ # Linenoise -A minimal, zero-config, BSD licensed, readline replacement. +A minimal, zero-config, BSD licensed, readline replacement used in Redis, +MongoDB, and Android. -News: linenoise is now part of [Android](http://android.git.kernel.org/?p=platform/system/core.git;a=tree;f=liblinenoise;h=56450eaed7f783760e5e6a5993ef75cde2e29dea;hb=HEAD Android)! +* Single and multi line editing mode with the usual key bindings implemented. +* History handling. +* Completion. +* About 1,100 lines of BSD license source code. ## Can a line editing library be 20k lines of code? @@ -10,7 +14,7 @@ Line editing with some support for history is a really important feature for com So what usually happens is either: - * Large programs with configure scripts disabling line editing if readline is not present in the system, or not supporting it at all since readline is GPL licensed and libedit (the BSD clone) is not as known and available as readline is (Readl world example of this problem: Tclsh). + * Large programs with configure scripts disabling line editing if readline is not present in the system, or not supporting it at all since readline is GPL licensed and libedit (the BSD clone) is not as known and available as readline is (Real world example of this problem: Tclsh). * Smaller programs not using a configure script not supporting line editing at all (A problem we had with Redis-cli for instance). The result is a pollution of binaries without line editing support. @@ -23,13 +27,14 @@ Apparently almost every terminal you can happen to use today has some kind of su Since it's so young I guess there are a few bugs, or the lib may not compile or work with some operating system, but it's a matter of a few weeks and eventually we'll get it right, and there will be no excuses for not shipping command line tools without built-in line editing support. -The library is currently less than 400 lines of code. In order to use it in your project just look at the *example.c* file in the source distribution, it is trivial. Linenoise is BSD code, so you can use both in free software and commercial software. +The library is currently about 1100 lines of code. In order to use it in your project just look at the *example.c* file in the source distribution, it is trivial. Linenoise is BSD code, so you can use both in free software and commercial software. ## Tested with... * Linux text only console ($TERM = linux) * Linux KDE terminal application ($TERM = xterm) * Linux xterm ($TERM = xterm) + * Linux Buildroot ($TERM = vt100) * Mac OS X iTerm ($TERM = xterm) * Mac OS X default Terminal.app ($TERM = xterm) * OpenBSD 4.5 through an OSX Terminal.app ($TERM = screen) @@ -40,6 +45,7 @@ Please test it everywhere you can and report back! ## Let's push this forward! -Please fork it and add something interesting and send me a pull request. What's especially interesting are fixes, new key bindings, completion. +Patches should be provided in the respect of linenoise sensibility for small +easy to understand code. Send feedbacks to antirez at gmail diff --git a/deps/linenoise/example.c b/deps/linenoise/example.c index ea0b515c1..a2f0936ed 100644 --- a/deps/linenoise/example.c +++ b/deps/linenoise/example.c @@ -1,5 +1,6 @@ #include #include +#include #include "linenoise.h" @@ -10,16 +11,52 @@ void completion(const char *buf, linenoiseCompletions *lc) { } } -int main(void) { +int main(int argc, char **argv) { char *line; + char *prgname = argv[0]; + /* Parse options, with --multiline we enable multi line editing. */ + while(argc > 1) { + argc--; + argv++; + if (!strcmp(*argv,"--multiline")) { + linenoiseSetMultiLine(1); + printf("Multi-line mode enabled.\n"); + } else if (!strcmp(*argv,"--keycodes")) { + linenoisePrintKeyCodes(); + exit(0); + } else { + fprintf(stderr, "Usage: %s [--multiline] [--keycodes]\n", prgname); + exit(1); + } + } + + /* Set the completion callback. This will be called every time the + * user uses the key. */ linenoiseSetCompletionCallback(completion); + + /* Load history from file. The history file is just a plain text file + * where entries are separated by newlines. */ linenoiseHistoryLoad("history.txt"); /* Load the history at startup */ + + /* Now this is the main loop of the typical linenoise-based application. + * The call to linenoise() will block as long as the user types something + * and presses enter. + * + * The typed string is returned as a malloc() allocated string by + * linenoise, so the user needs to free() it. */ while((line = linenoise("hello> ")) != NULL) { - if (line[0] != '\0') { + /* Do something with the string. */ + if (line[0] != '\0' && line[0] != '/') { printf("echo: '%s'\n", line); - linenoiseHistoryAdd(line); - linenoiseHistorySave("history.txt"); /* Save every new entry */ + linenoiseHistoryAdd(line); /* Add to the history. */ + linenoiseHistorySave("history.txt"); /* Save the history on disk. */ + } else if (!strncmp(line,"/historylen",11)) { + /* The "/historylen" command will change the history len. */ + int len = atoi(line+11); + linenoiseHistorySetMaxLen(len); + } else if (line[0] == '/') { + printf("Unreconized command: %s\n", line); } free(line); } -- cgit v1.2.1