mirror of
https://github.com/troglobit/editline.git
synced 2025-06-24 17:01:12 +08:00
Add el_bind_key_in_metamap() from Festival speech-tools.
Support for Meta key binding imported from Festival speech-tools, author Alan W Black <awb()cstr!ed!ac!uk>. Code released under the original license.
This commit is contained in:
parent
0d9ce0ce06
commit
20c55a58da
@ -21,9 +21,15 @@
|
|||||||
#ifndef __EDITLINE_H__
|
#ifndef __EDITLINE_H__
|
||||||
#define __EDITLINE_H__
|
#define __EDITLINE_H__
|
||||||
|
|
||||||
|
/* Command status codes. */
|
||||||
|
typedef enum {
|
||||||
|
CSdone, CSeof, CSmove, CSdispatch, CSstay, CSsignal
|
||||||
|
} el_status_t;
|
||||||
|
|
||||||
/* Editline specific types, despite rl_ prefix. From Heimdal project. */
|
/* Editline specific types, despite rl_ prefix. From Heimdal project. */
|
||||||
typedef char* (*rl_complete_func_t)(char*, int*);
|
typedef char* (*rl_complete_func_t)(char*, int*);
|
||||||
typedef int (*rl_list_possib_func_t)(char*, char***);
|
typedef int (*rl_list_possib_func_t)(char*, char***);
|
||||||
|
typedef el_status_t (*el_keymap_func_t)(void);
|
||||||
|
|
||||||
/* Display 8-bit chars "as-is" or as `M-x'? Toggle with M-m. (Default:0 - "as-is") */
|
/* Display 8-bit chars "as-is" or as `M-x'? Toggle with M-m. (Default:0 - "as-is") */
|
||||||
extern int rl_meta_chars;
|
extern int rl_meta_chars;
|
||||||
@ -33,6 +39,7 @@ rl_complete_func_t rl_set_complete_func(rl_complete_func_t func);
|
|||||||
rl_list_possib_func_t rl_set_list_possib_func(rl_list_possib_func_t func);
|
rl_list_possib_func_t rl_set_list_possib_func(rl_list_possib_func_t func);
|
||||||
|
|
||||||
/* Editline specific functions. */
|
/* Editline specific functions. */
|
||||||
|
void el_bind_key_in_metamap(char c, el_keymap_func_t func);
|
||||||
|
|
||||||
/* For compatibility with FSF readline. */
|
/* For compatibility with FSF readline. */
|
||||||
extern int rl_point;
|
extern int rl_point;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* Main editing routines for editline library.
|
/* Main editing routines for editline library.
|
||||||
*
|
*
|
||||||
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
|
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
|
||||||
|
* Copyright (c) 1998 Alan W. Black <awb@cstr.ed.ac.uk>, for Edinburgh Speech Tools.
|
||||||
*
|
*
|
||||||
* This software is not subject to any license of the American Telephone
|
* This software is not subject to any license of the American Telephone
|
||||||
* and Telegraph Company or of the Regents of the University of California.
|
* and Telegraph Company or of the Regents of the University of California.
|
||||||
@ -42,13 +43,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#define SEPS "\"#$&'()*:;<=>?[\\]^`{|}~\n\t "
|
#define SEPS "\"#$&'()*:;<=>?[\\]^`{|}~\n\t "
|
||||||
|
|
||||||
/*
|
|
||||||
** Command status codes.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
CSdone, CSeof, CSmove, CSdispatch, CSstay, CSsignal
|
|
||||||
} el_status_t;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The type of case-changing to perform.
|
** The type of case-changing to perform.
|
||||||
*/
|
*/
|
||||||
@ -1238,6 +1232,14 @@ static el_status_t accept_line(void)
|
|||||||
return CSdone;
|
return CSdone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SYSTEM_IS_WIN32
|
||||||
|
static el_status_t end_of_input(void)
|
||||||
|
{
|
||||||
|
rl_line_buffer[rl_end] = '\0';
|
||||||
|
return CSeof;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static el_status_t transpose(void)
|
static el_status_t transpose(void)
|
||||||
{
|
{
|
||||||
char c;
|
char c;
|
||||||
@ -1437,7 +1439,7 @@ static el_status_t last_argument(void)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static el_keymap_t Map[] = {
|
static el_keymap_t Map[33] = {
|
||||||
{ CTL('@'), mk_set },
|
{ CTL('@'), mk_set },
|
||||||
{ CTL('A'), beg_line },
|
{ CTL('A'), beg_line },
|
||||||
{ CTL('B'), bk_char },
|
{ CTL('B'), bk_char },
|
||||||
@ -1463,7 +1465,11 @@ static el_keymap_t Map[] = {
|
|||||||
{ CTL('W'), bk_kill_word },
|
{ CTL('W'), bk_kill_word },
|
||||||
{ CTL('X'), exchange },
|
{ CTL('X'), exchange },
|
||||||
{ CTL('Y'), yank },
|
{ CTL('Y'), yank },
|
||||||
{ CTL('Z'), end_line },
|
#ifdef SYSTEM_IS_WIN32
|
||||||
|
{ CTL('Z'), end_of_input },
|
||||||
|
#else
|
||||||
|
{ CTL('Z'), ring_bell },
|
||||||
|
#endif
|
||||||
{ CTL('['), meta },
|
{ CTL('['), meta },
|
||||||
{ CTL(']'), move_to_char },
|
{ CTL(']'), move_to_char },
|
||||||
{ CTL('^'), ring_bell },
|
{ CTL('^'), ring_bell },
|
||||||
@ -1471,7 +1477,7 @@ static el_keymap_t Map[] = {
|
|||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static el_keymap_t MetaMap[]= {
|
static el_keymap_t MetaMap[64]= {
|
||||||
{ CTL('H'), bk_kill_word },
|
{ CTL('H'), bk_kill_word },
|
||||||
{ DEL, bk_kill_word },
|
{ DEL, bk_kill_word },
|
||||||
{ ' ', mk_set },
|
{ ' ', mk_set },
|
||||||
@ -1490,6 +1496,33 @@ static el_keymap_t MetaMap[]= {
|
|||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void el_bind_key_in_metamap(char c, el_keymap_func_t func)
|
||||||
|
{
|
||||||
|
/* Add given function to key map for META keys */
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; MetaMap[i].Key != 0; i++)
|
||||||
|
{
|
||||||
|
if (MetaMap[i].Key == c)
|
||||||
|
{
|
||||||
|
MetaMap[i].Function = func;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A new key so have to add it to end */
|
||||||
|
if (i == 63)
|
||||||
|
{
|
||||||
|
fprintf(stderr,"editline: MetaMap table full, requires increase\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaMap[i].Function = func;
|
||||||
|
MetaMap[i].Key = c;
|
||||||
|
MetaMap[i + 1].Function = 0; /* Zero the last location */
|
||||||
|
MetaMap[i + 1].Key = 0; /* Zero the last location */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local Variables:
|
* Local Variables:
|
||||||
* version-control: t
|
* version-control: t
|
||||||
|
Loading…
Reference in New Issue
Block a user