هل هناك طريقة لطيفة من التعامل مع المدخلات متعدد الخطوط مع GNU يقوم readline؟
-
03-07-2019 - |
سؤال
وطلبي لديه واجهة سطر الأوامر، وأنا أفكر في استخدام rel="noreferrer"> لتقديم التاريخ، وسطر الأوامر للتحرير، الخ.
والمشكلة هي أن صاياي يمكن أن تكون طويلة جدا ومعقدة (اعتقد SQL) وأود أن تسمح للمستخدمين بنشر الأوامر عبر خطوط متعددة لجعلها أكثر قابلية للقراءة في التاريخ.
هل من الممكن القيام بذلك في يقوم readline (ربما عن طريق تحديد الفرق بين السطر ونهايته القيادة)؟
وأو أن أكون أفضل حالا تنفيذ سطر الأوامر بلدي (ولكن ربما باستخدام rel="noreferrer"> )؟
المحلول
وأنت على يقين من العلبة.
ويمكنك تحديد خيارات ل'\ ص "و" \ ن' القيم مع
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);
}