⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 complete.c

📁 具有IDE功能的编辑器
💻 C
字号:
/* complete.c - brings up a possible word list   Copyright (C) 1996-2000 Paul Sheer   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307, USA. */#define COMPLETION_FILE "/cooledit.completion"/* email address with spaces */#define ALLOW_CHARS_TYPE_A "_#.@-\\/! <>()"/* email address without spaces */#define ALLOW_CHARS_TYPE_B "_#.@-\\/!"/* latex functions */#define ALLOW_CHARS_TYPE_C "\\"/* C functions, and #'s */#define ALLOW_CHARS_TYPE_D "_#"#include "coolwidget.h"#include "mad.h"extern Window main_window;char *loadfile (const char *filename, long *filelen);static char *word_list = 0;static char **words;static long num_completion_words = 0;static int compare_completion (const char **a, const char **b){    return strcmp (*a, *b);}static void load_competion_file (void){    char *f, *n;    long l, i;    f = loadfile (n = catstrs (home_dir, EDIT_DIR COMPLETION_FILE, 0), &l);    if (!f) {	CErrorDialog (main_window, 20, 20, _(" Complete Word "),		_(" You have not yet created a `completion' word list \n" \		      " See the section COMPLETION in the man page for \n creating a personalised word list. \n" \	  " The completion word list should go into the file \n %s "), n);	return;    }    word_list = f;    i = 0;    for (; *f; f++)	if (*f == '\n')	    i++;    while (*f == '\n' || !*f)	/* remove trailing blank lines */	*(f--) = '\0';    words = CMalloc ((i + 4) * sizeof (char *));    i = 1;    f = word_list;    while (*f == '\n')		/* remove leading blank lines */	f++;    words[0] = f;    for (;; f++) {	if (*f == '\n') {	    *f = '\0';	    words[i++] = f + 1;	} else if (*f == '\0') {	    words[i] = 0;	    break;	}    }    num_completion_words = i;    qsort (words, num_completion_words, sizeof (char *),	    (int (*)(const void *, const void *)) compare_completion);}/* w = 0 causes return of the last word. Result must not be free'd */static char *get_current_word (CWidget * w, char *allow_chars){    static char t[1024];    int i;    static char *p;    if (!w)	return p;    p = t + 1023;    *p = '\0';    for (i = 1; i < 1021; i++) {	int c;	c = edit_get_byte (w->editor, w->editor->curs1 - i);	if (strchr (allow_chars, c) || isalnum (c)) {	    *(--p) = c;	    continue;	}	break;    }    return p;}/* result must be free'd, returns 0 on not found */static char **get_possible_words (CWidget * w, char *allow_chars){    char *p, **r;    int i, l, o;    p = get_current_word (w, allow_chars);    l = strlen (p);    if (!l)	return 0;    o = i = num_completion_words / 2;    for (;;) {			/* binary search */	int comp;	i = (i + 1) >> 1;	if (o >= num_completion_words)	/* is this possible ? */	    o = num_completion_words - 1;	if (o < 0)		/* is this possible ? */	    o = 0;	comp = strncmp (words[o], p, l);	if (!comp)	    break;	if (comp < 0)	    o += i;	else	    o -= i;	if (i == 1) {	    if (o >= num_completion_words)		o = num_completion_words - 1;	    if (o < 0)		o = 0;	    if (strncmp (words[o], p, l))		return 0;	}    }    while (o) {			/* find the first word that matches */	if (strncmp (words[o - 1], p, l))	    break;	o--;    }    i = o;    while (words[i]) {		/* find the last word that matches */	if (strncmp (words[i], p, l))	    break;	i++;    }    i -= o;    r = CMalloc ((i + 1) * sizeof (char *));    memcpy (r, words + o, i * sizeof (char *));    r[i] = 0;    return r;}static char *complete_selection_get_line (void *data, int line){    char **s;    s = (char **) data;    if (s[line])	return s[line];    return "";}static int get_selection_complete (char **s){    int i, c = 0;    for (i = 0; s[i]; i++) {	int l;	l = strlen (s[i]);	if (c < l)	    c = l;    }    return CListboxDialog (main_window, 20, 20, c, min (i, 10), 0, 0, 0, i,			   complete_selection_get_line, (void *) s);}static void complete_with_word (CWidget * w, char *s){    s += strlen (get_current_word (0, 0));    while (*s) {	edit_insert (w->editor, *s++);	w->editor->force |= REDRAW_COMPLETELY;    }}void complete_command (CWidget * edit){    char **s;    if (!edit) {	if (word_list) {	    free (word_list);	    word_list = 0;	}	if (words) {	    free (words);	    words = 0;	}	return;    }     if (!word_list)	load_competion_file ();    if (!word_list)	return;    s = get_possible_words (edit, ALLOW_CHARS_TYPE_A);    if (!s)	s = get_possible_words (edit, ALLOW_CHARS_TYPE_B);    if (!s)	s = get_possible_words (edit, ALLOW_CHARS_TYPE_C);    if (!s)	s = get_possible_words (edit, ALLOW_CHARS_TYPE_D);    if (!s)	return;    if (!s[1]) {	complete_with_word (edit, s[0]);    } else {	int i;	i = get_selection_complete (s);	if (i >= 0)	    complete_with_word (edit, s[i]);    }    free (s);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -