Pergunta

O título é um pouco mais específico do que o meu objetivo real:

Eu tenho um programa de linha de comando que usa GNU Readline, principalmente para o histórico dos comandos (ou seja, recuperar comandos anteriores usando seta para cima) e alguns outros detalhes. Agora a saída do programa aparece intercalada com a entrada do usuário, que às vezes é OK, mas a saída é assíncrona (que vem através de uma conexão de rede em resposta aos comandos de entrada), e que fica por vezes irritantes (por exemplo, se as linhas são emitidos quando o usuário está digitando nova entrada).

Eu gostaria de adicionar um recurso para este programa: a "janela" em separado para a saída. Pensei em usar ncurses para isso. Mas parece que a partir do ncurses FAQ que as duas bibliotecas não são fáceis de usar juntos.

Eu poderia considerar usando Editline ou Tecla vez de Readline, mas não está claro para mim se tanto de quem vai resolver o meu problema. Eu também considerar usar algo diferente de ncurses, incluindo uma biblioteca que fornece os dois tipos de funcionalidade (janelas em modo texto e histórico de comandos), mas eu não sei o que poderia ser melhor.

Oh, e suporte para o texto colorido pode obter pontos de bônus. Eu suspeito que eu possa ser capaz de fazer isso com Readline, talvez por isso é uma preocupação em separado, mas se uma solução para o meu problema também torna mais fácil para adicionar um pouco de cor para a saída, tanto melhor.

Eu estou usando o Ubuntu Hardy (Linux 2.6).

Foi útil?

Solução

Eu tenho feito algumas pesquisas e parece que você está fora de sorte.

Para ncurses alternativas existem SLang , Newt e Turbo Visão . Gíria é muito mais do que a manipulação tela justo e, portanto, mais complexo, mas talvez ele pode ser usado para sua finalidade ?. Newt usa a tela manuseio e é muito mais simples, mas muito simples e-modo de rosca única para o seu propósito, eu acho.

visão Turbo é a biblioteca em modo texto gráficos da Borland, usado por todas as suas ferramentas no final dos anos 80 / início dos anos 90. Borland lançou a fonte código quando o mercado para esse tipo de coisa diminuído, e não há agora uma porta para linux (nota lateral, este projecto parece ter escrito sua implementação visão própria turbo). Que a porta não está morto (não têm havido algumas cvs atualiza este ano que compilou fina (as versões mais antigas não)), mas nenhum dos exemplos de TV que eu encontrei foram até à data e eu só não tenho alguns deles para compilar antes de desistir do resto. Este é um pouco de vergonha, porque a TV era um ambiente agradável de usar. TV é btw C ++ (e eu suponho que você está usando C?).

Para uma alternativa para readline, há libkinput , que talvez funciona juntamente com ncurses (ele diz que pode usar terminfo ncurses. mas estou não tenho certeza se isso significa que ele pode coexiste juntamente com o uso ncurses)?

Talvez uma opção é executar readline "externamente" ao seu programa ncurses usando rlwrap ?

Outras dicas

Eu agora montar um programa simples exemplo no GitHub: https://github.com / ulfalizer / readline-and-ncurses .

Ele suporta redimensionamento terminal de uniforme e eficaz e / caracteres largos vários bytes / combinando. O código tem comentários úteis.

imagem abaixo:

Captura de tela do programa que combina ncurses e readline

Este tinha me batendo a cabeça por algumas horas, por isso só para salvar as pessoas Googling alguma dor:

Se você estiver usando ncurses' builtin manipulador SIGWINCH com KEY_RESIZE, estar ciente de que os conjuntos readline os LINES e meio ambiente COLUMNS variáveis ??por padrão. Estes substituir qualquer cálculo do tamanho dinâmico (geralmente com ioctl() TIOCGWINSZ) que ncurses faria de outra maneira, ou seja, você vai continuar recebendo o tamanho do terminal inicial mesmo após o redimensionamento do terminal.

Isto pode ser evitado através da criação rl_change_environment para 0 antes de inicializar readline.

Update:

Aqui estão algumas informações adicionais eu recolhi das fontes readline:

código de manipulação SIGWINCH do readline (que é usado se rl_catch_sigwinch é 1) faz atualização LINES e COLUMNS, que parece que deve ser suficiente para ncurses. No entanto, quando se utiliza a interface readline alternativo (que faz mais sentido quando se combina readline com ncurses), os manipuladores de sinal (incluindo a um para SIGWINCH) só vai ser instalado para a duração de cada chamada rl_callback_read_char(), ou seja, qualquer redimensionamento do terminal entre duas chamadas para rl_callback_read_char() não será visto por readline.

Eu tenho conseguido o que você descreveu em um programa meu:

http://dpc.ucore.info/lab:xmppconsole

A seguir é a io manipulação de arquivos:

http://github.com/dpc/xmppconsole/blob /master/src/io.c

Assim, verifica-se que gdb usa tanto readline e ncurses. Se você está interessado em fazer isso, eu recomendo que você verifique a sua implementação: http://sourceware.org/git/?p=gdb.git;a=blob;f=gdb/tui/tui-io.c

Eu não tenho certeza qual versão você tentou. A partir de hoje (2012/09/14) É muito simples, só precisamos de ligar a nossa função personalizada para seguir ponteiros de função.

rl_getch_function
rl_redisplay_function
rl_completion_display_matches_hook

Eu fiz algo razoável aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top