我在尝试运行维基百科中提供的GNU Readline库示例代码时遇到问题.在这里:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <readline/readline.h>
#include <readline/history.h>
int main()
{
char* input, shell_prompt[100];
// Configure readline to auto-complete paths when the tab key is hit.
rl_bind_key('\t', rl_complete);
for(;;) {
// Create prompt string from user name and current working directory.
snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024));
// Display prompt and read input (n.b. input must be freed after use)...
input = readline(shell_prompt);
// Check for EOF.
if (!input) …Run Code Online (Sandbox Code Playgroud) 我们正在开发一个依赖于GNU readline库的C++软件包,我们通常使用gcc构建(至少要求版本4).现在我们想将它移植到Windows,获得一个静态链接的版本,我们可以重新分发,而无需用户编译.
我尝试了几种方法:
-mno-cygwinMinGW编译器),我们如何获得其中一种工作方法的想法?
试图在macosx上构建Term-Readline-Gnu,无法抱怨libedit并建议使用gnu readline.我怎么做?
这是我尝试过的尝试之一:
首先我静态构建了GNU libreadline v6.2,但没有安装它 - 以确保我没有搞砸具有相同名称的系统版本:
./configure --prefix =/Users/Fred/Downloads/tmp1
使
make install-static
然后尝试构建Term_Readline-Gnu-1.20
cmc:Term-ReadLine-Gnu-1.20 cmc $ perl Makefile.PL --includedir =/Users/cmc/Downloads/tmp1/include --libdir =/Users/Fred/Downloads/tmp1/lib
找到`/usr/lib/libtermcap.dylib'.
gcc-4.2 -I/Users/Fred/Downloads/tmp1/include -arch x86_64 -arch i386 -arch ppc -g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -I/usr/local/include -DHAVE_STRING_H rlver.c -o rlver -L/Users/Fred/Downloads/tmp1/lib -arch x86_64 -arch i386 -arch ppc -L/usr/local/lib -lreadline -ltermcap
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!
您正在使用的libreadline是libedit库.使用GNU Readline Library.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!
克里斯
从编程的角度来看,当您将bash shell设置为使用vi或emacs时
set -o vi
Run Code Online (Sandbox Code Playgroud)
要么
set -o emacs
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么?我一直在读一本书,声称bash shell使用这些编辑器中的任何一个来输入shell本身,但我认为它可能使用了readline.
对不起,长标题.我正在用C开发一个网络程序,它可以在stdout上显示从网络接收的消息,并通过GNU readline库接受stdin上的用户输入.问题是,当用户通过readline在主线程上键入命令时,网络消息到达并输出到stdout,这将生成如下内容:
场景:
输入:1234567890
网络消息:Hello
当用户输入"7"时,网络消息到达
终端的实际输出:
输入> 1234567Hello
890_
有没有办法让这样的输出?
你好
输入> 1234567890_
ps _是光标.
提前致谢!
我readline在我自己的程序中使用(版本 6.3,默认 [non-vi] 模式,Ubuntu 14.04)库,在终端窗口(在 PC 上)中运行。当readline()调用时没有由换行符终止的先前输出时会出现问题。
#include <stdio.h>
#include <readline/readline.h>
void main(void)
{
// Previous output from some other part of application
// which *may* have output stuff *not* terminated with a '\n'
printf("Hello ");
fflush(stdout);
char *in = readline("OK> ");
}
Run Code Online (Sandbox Code Playgroud)
所以这条线看起来像:
Hello OK> <caret here>
Run Code Online (Sandbox Code Playgroud)
如果您键入少量字符(最多 5 个?),然后说Ctrl+U(可能是其他字符)删除您的输入,到目前为止一切似乎都很好 ---readline()将插入符号移回到它自己的提示之后,即删除5 个字符。但是,请尝试输入,例如:
123456 <Ctrl+U>
Run Code Online (Sandbox Code Playgroud)
现在,它会删除回进了Hello,只留下Hell就行了,然后插入符号,即删除6 + 6 = = 12。所以你看:
Hello OK> 123456 <Ctrl+U>
Hell<caret …Run Code Online (Sandbox Code Playgroud) 在 MacOS Mojave 上从 Homebrew 安装 pyenv 后,我在尝试安装任何 python 版本时遇到构建错误。
运行pyenv install任何版本时,构建都会失败并显示错误:
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
Referenced from: /usr/local/bin/awk
Reason: image not found
Run Code Online (Sandbox Code Playgroud) 当我想执行Rails 3控制台时,它抛出这个:
$ script/rails c
/usr/local/rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/irb/completion.rb:9:in `require': no such file to load -- readline (Load Error)
Run Code Online (Sandbox Code Playgroud)
我试着安装libreadline-dev:
$ sudo wajig install libreadline-dev
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
libncurses5-dev libreadline6-dev
Se instalarán los siguientes paquetes NUEVOS:
libncurses5-dev libreadline-dev libreadline6-dev
0 actualizados, 3 se instalarán, 0 para eliminar y 6 no actualizados.
Necesito descargar 1799kB de archivos.
Se utilizarán 7266kB de espacio de disco …Run Code Online (Sandbox Code Playgroud) 我最初的问题是,我想要一种方法来区分在 vi 模式下使用 bash 时是处于 vi 命令模式还是 vi 插入模式。据我所知,从 GNU readline 7.0 开始,有一种方法可以在命令提示符中设置指示器;然而,我想要的是改变光标的形状(即在插入模式下为垂直线,在命令模式下为实心块)。
注意: 我已经尝试将以下内容放入我的 .inputrc 中,这确实起到了作用,但在命令模式下移回行首时引起了一些问题,所以我得出的结论是这不是一个好的选择。
set show-mode-in-prompt on
set vi-cmd-mode-string "\e[2 q"
set vi-ins-mode-string "\e[6 q"
Run Code Online (Sandbox Code Playgroud)
我看到一篇由有同样问题的人写的文章,最终决定自己修补 GNU readline 库,链接如下:
http://blog.mkoskar.com/2010/10/gnu-readline-vi-mode-visualization.html http://blog.mkoskar.com/2010/11/gnu-readline-vi-mode-visualization-2 .html
到目前为止,我已经能够成功应用补丁并编译/安装库(在本地...我更愿意保留安装的未打补丁的版本,以防我想切换回来),但 bash 似乎仍在使用原来的。
以下是重要细节:
1)修补后的库文件(静态和动态)位于我的计算机上的$HOME/.local/lib/。
2)我确定的原始库文件(仅限动态)位于/lib/x86_64-linux-gnu/。
3) 我的 LD_LIBRARY_PATH 环境变量设置$HOME/.local/lib:为我的 .bashrc 中。
即使安装了修补版本并且正确设置了 LD_LIBRARY_PATH 变量,Bash 似乎仍然不使用我修补的 GNU readline 库。我想知道我是否做错了什么?
我希望问题不是 Bash 附带的 readline 库已经静态链接,我想,需要我重新安装 Bash(以及使用该库的任何其他程序,例如 iPython),在修补版本中手动链接阅读线。
解决方案
虽然不是标题中列出的问题的解决方案,但这是我遇到的原始问题的解决方案。浏览 Readline 的手册页后,我发现了以下关于vi-cmd-mode-string和 的描述vi-ins-mode-string:
vi-cmd-mode-string ((cmd)) …Run Code Online (Sandbox Code Playgroud)