📄 halcmd_completion.c
字号:
return strdup("all"); } while(next) { hal_comp_t *comp = SHMPTR(next); next = comp->next_ptr; if(comp->type) continue; if(strncmp(text, comp->name, len) == 0) return strdup(comp->name); } rl_attempted_completion_over = 1; return NULL;}static char *comp_generator(const char *text, int state) { static int len; static int next; if(!state) { next = hal_data->comp_list_ptr; len = strlen(text); if(strncmp(text, "all", len) == 0) return strdup("all"); } while(next) { hal_comp_t *comp = SHMPTR(next); next = comp->next_ptr; if ( strncmp(text, comp->name, len) == 0 ) return strdup(comp->name); } rl_attempted_completion_over = 1; return NULL;}static char *rtcomp_generator(const char *text, int state) { static int len; static int next; if(!state) { next = hal_data->comp_list_ptr; len = strlen(text); if(strncmp(text, "all", len) == 0) return strdup("all"); } while(next) { hal_comp_t *comp = SHMPTR(next); next = comp->next_ptr; if(!comp->type) continue; if ( strncmp(text, comp->name, len) == 0 ) return strdup(comp->name); } rl_attempted_completion_over = 1; return NULL;}static char *pin_generator(const char *text, int state) { static int len; static int next; if(!state) { next = hal_data->pin_list_ptr; len = strlen(text); } while(next) { hal_pin_t *pin = SHMPTR(next); next = pin->next_ptr; if ( !writer_match( pin->dir, match_writers ) ) continue; if ( !direction_match( pin->dir, match_direction ) ) continue; if ( match_type != -1 && match_type != pin->type ) continue; if ( strncmp(text, pin->name, len) == 0 ) return strdup(pin->name); } rl_attempted_completion_over = 1; return NULL;}#include <dirent.h>static int startswith(const char *string, const char *stem) { return strncmp(string, stem, strlen(stem)) == 0;}char *loadusr_table[] = {"-W", "-Wn", "-w", "-iw", NULL};static char *loadusr_generator(const char *text, int state) { static int len; static DIR *d; struct dirent *ent; static int doing_table; if(!state) { if(argno == 1) doing_table = 1; string_table = loadusr_table; len = strlen(text); d = opendir(EMC2_BIN_DIR); } if(doing_table) { char *result = table_generator(text, state); if(result) return result; doing_table = 0; } while(d && (ent = readdir(d))) { char *result; if(!startswith(ent->d_name, "hal")) continue; if(startswith(ent->d_name, "halcmd")) continue; if(strncmp(text, ent->d_name, len) != 0) continue; result = strdup(ent->d_name); return result; } closedir(d); return NULL;}static char *loadrt_generator(const char *text, int state) { static int len; static DIR *d; struct dirent *ent; if(!state) { len = strlen(text); d = opendir(EMC2_RTLIB_DIR); } while(d && (ent = readdir(d))) { char *result; if(!strstr(ent->d_name, MODULE_EXT)) continue; if(startswith(ent->d_name, "rtapi.")) continue; if(strncmp(text, ent->d_name, len) != 0) continue; result = strdup(ent->d_name); result[strlen(result) - strlen(MODULE_EXT)] = 0; return result; } closedir(d); return NULL;}static inline int isskip(int ch) { return isspace(ch) || ch == '=' || ch == '<' || ch == '>';}char *nextword(char *s) { s = strchr(s, ' '); if(!s) return NULL; return s+1;}char **completer(const char *text, int start, int end) { int i; char **result = NULL; if(start == 0) return completion_matches_table(text, command_table); for(i=0, argno=0; i<start; i++) { if(isskip(rl_line_buffer[i])) { argno++; while(i<start && isskip(rl_line_buffer[i])) i++; } } match_type = -1; match_writers = -1; match_direction = -1; rtapi_mutex_get(&(hal_data->mutex)); if(startswith(rl_line_buffer, "delsig ") && argno == 1) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "linkps ") && argno == 1) { result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "linkps ") && argno == 2) { check_match_type_pin(rl_line_buffer + 7); result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "net ") && argno == 1) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "net ") && argno == 2) { check_match_type_signal(nextword(rl_line_buffer)); result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "net ") && argno > 2) { check_match_type_signal(nextword(rl_line_buffer)); if(match_type == -1) { check_match_type_pin(nextword(nextword(rl_line_buffer))); if(match_direction == HAL_IN) match_direction = -1; } result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "linksp ") && argno == 1) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "linksp ") && argno == 2) { check_match_type_signal(rl_line_buffer + 7); result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "linkpp ") && argno == 1) { result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "linkpp ") && argno == 2) { check_match_type_pin(rl_line_buffer + 7); result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "unlinkp ") && argno == 1) { result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "setp ") && argno == 1) { result = rl_completion_matches(text, setp_generator); } else if(startswith(rl_line_buffer, "sets ") && argno == 1) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "ptype ") && argno == 1) { result = rl_completion_matches(text, getp_generator); } else if(startswith(rl_line_buffer, "getp ") && argno == 1) { result = rl_completion_matches(text, getp_generator); } else if(startswith(rl_line_buffer, "stype ") && argno == 1) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "gets ") && argno == 1) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "show ") && argno == 1) { result = completion_matches_table(text, show_table); } else if(startswith(rl_line_buffer, "list pin") && argno == 2) { result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "list sig") && argno == 2) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "list param") && argno == 2) { result = rl_completion_matches(text, parameter_generator); } else if(startswith(rl_line_buffer, "list funct") && argno == 2) { result = rl_completion_matches(text, funct_generator); } else if(startswith(rl_line_buffer, "list thread") && argno == 2) { result = rl_completion_matches(text, thread_generator); } else if(startswith(rl_line_buffer, "show pin") && argno == 2) { result = rl_completion_matches(text, pin_generator); } else if(startswith(rl_line_buffer, "show sig") && argno == 2) { result = rl_completion_matches(text, signal_generator); } else if(startswith(rl_line_buffer, "show param") && argno == 2) { result = rl_completion_matches(text, parameter_generator); } else if(startswith(rl_line_buffer, "show funct") && argno == 2) { result = rl_completion_matches(text, funct_generator); } else if(startswith(rl_line_buffer, "show thread") && argno == 2) { result = rl_completion_matches(text, thread_generator); } else if(startswith(rl_line_buffer, "save ") && argno == 1) { result = completion_matches_table(text, save_table); } else if(startswith(rl_line_buffer, "list ") && argno == 1) { result = completion_matches_table(text, list_table); } else if(startswith(rl_line_buffer, "status ") && argno == 1) { result = completion_matches_table(text, status_table); } else if(startswith(rl_line_buffer, "newsig ") && argno == 2) { result = completion_matches_table(text, pintype_table); } else if(startswith(rl_line_buffer, "lock ") && argno == 1) { result = completion_matches_table(text, lock_table); } else if(startswith(rl_line_buffer, "unlock ") && argno == 1) { result = completion_matches_table(text, unlock_table); } else if(startswith(rl_line_buffer, "addf ") && argno == 1) { result = rl_completion_matches(text, funct_generator); } else if(startswith(rl_line_buffer, "addf ") && argno == 2) { result = rl_completion_matches(text, thread_generator); } else if(startswith(rl_line_buffer, "delf ") && argno == 1) { result = rl_completion_matches(text, funct_generator); } else if(startswith(rl_line_buffer, "delf ") && argno == 2) { result = rl_completion_matches(text, thread_generator); } else if(startswith(rl_line_buffer, "help ") && argno == 1) { result = completion_matches_table(text, command_table); } else if(startswith(rl_line_buffer, "unloadusr ") && argno == 1) { result = rl_completion_matches(text, usrcomp_generator); } else if(startswith(rl_line_buffer, "waitusr ") && argno == 1) { result = rl_completion_matches(text, usrcomp_generator); } else if(startswith(rl_line_buffer, "unloadrt ") && argno == 1) { result = rl_completion_matches(text, rtcomp_generator); } else if(startswith(rl_line_buffer, "unload ") && argno == 1) { result = rl_completion_matches(text, comp_generator); } else if(startswith(rl_line_buffer, "source ") && argno == 1) { rtapi_mutex_give(&(hal_data->mutex)); // leaves rl_attempted_completion_over = 0 to complete from filesystem return 0; } else if(startswith(rl_line_buffer, "loadusr ") && argno < 3) { rtapi_mutex_give(&(hal_data->mutex)); // leaves rl_attempted_completion_over = 0 to complete from filesystem return rl_completion_matches(text, loadusr_generator); } else if(startswith(rl_line_buffer, "loadrt ") && argno == 1) { result = rl_completion_matches(text, loadrt_generator); } rtapi_mutex_give(&(hal_data->mutex)); rl_attempted_completion_over = 1; return result;}void halcmd_init_readline() { rl_readline_name = "halcmd"; rl_attempted_completion_function = completer;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -