هل هناك طريقة لطيفة من التعامل مع المدخلات متعدد الخطوط مع GNU يقوم readline؟

StackOverflow https://stackoverflow.com/questions/161495

  •  03-07-2019
  •  | 
  •  
هل كانت مفيدة؟

المحلول

وأنت على يقين من العلبة.

ويمكنك تحديد خيارات ل'\ ص "و" \ ن' القيم مع

rl_bind_key('\r', return_func);

وreturn_func الخاص بك يمكن أن تقرر الآن ما يجب القيام به مع هذه المفاتيح.

int return_func(int cnt, int key) { ... }

إذا كنت تفعل هذا داخل محطة UNIX، سوف تحتاج إلى معرفة رموز محطة ANSI إذا كنت تريد أن تحرك المؤشر حولها. هناك href="http://en.wikipedia.org/wiki/ANSI_escape_code#Codes" بدءا إشارة على ويكيبيديا.

وفيما يلي بعض نموذج التعليمات البرمجية التي تستخدم يقوم readline لقراءة متعدد الخطوط وسوف تتوقف التحرير عند إدخال في منقوطة (لقد حدد أن مثل EOQ أو نهاية أو الاستعلام). ريدلاين هي قوية للغاية، وهناك الكثير من الاشياء للتعلم.

#include <stdio.h>
#include <unistd.h>
#include <readline/readline.h>
#include <readline/history.h>

int my_startup(void);
int my_bind_cr(int, int);
int my_bind_eoq(int, int);
char *my_readline(void);

int my_eoq; 

int
main(int argc, char *argv[])
{

  if (isatty(STDIN_FILENO)) {
    rl_readline_name = "my";
    rl_startup_hook = my_startup;
    my_readline();
  }
}

int
my_startup(void) 
{
  my_eoq = 0;
  rl_bind_key('\n', my_bind_cr);
  rl_bind_key('\r', my_bind_cr);
  rl_bind_key(';', my_bind_eoq);
}

int
my_bind_cr(int count, int key) {
  if (my_eoq == 1) {
    rl_done = 1;
  }
  printf("\n");
}

int
my_bind_eoq(int count, int key) {
  my_eoq = 1;

  printf(";");
}

char * 
my_readline(void)
{
  char *line;

  if ((line = readline("")) == NULL) {
    return NULL;
  }

  printf("LINE : %s\n", line);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top