[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-commit] qemacs TODO.org qe.h qeconfig.h search.c
From: |
Charlie Gordon |
Subject: |
[Qemacs-commit] qemacs TODO.org qe.h qeconfig.h search.c |
Date: |
Sat, 31 Dec 2016 06:25:25 -0500 (EST) |
CVSROOT: /sources/qemacs
Module name: qemacs
Changes by: Charlie Gordon <chqrlie> 16/12/31 06:25:25
Modified files:
. : TODO.org qe.h qeconfig.h search.c
Log message:
search: improvements
- C-u C-s selects regex searching (not yet implemented)
- `do_isearch()` takes extra argument for argval
- cycle hex and unihex isearch modes on M-C-b instead of C-b and M-b
- toggle regex incremental searching on C-t and M-r
- C-j no longer needs quoting in isearch
- no longer keep lingering search matches after search exits
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/TODO.org?cvsroot=qemacs&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.232&r2=1.233
http://cvs.savannah.gnu.org/viewcvs/qemacs/qeconfig.h?cvsroot=qemacs&r1=1.60&r2=1.61
http://cvs.savannah.gnu.org/viewcvs/qemacs/search.c?cvsroot=qemacs&r1=1.9&r2=1.10
Patches:
Index: TODO.org
===================================================================
RCS file: /sources/qemacs/qemacs/TODO.org,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- TODO.org 27 Dec 2016 11:40:42 -0000 1.19
+++ TODO.org 31 Dec 2016 11:25:25 -0000 1.20
@@ -1,13 +1,12 @@
; TODO list for qemacs
;
; Author: Charles Gordon
-; Updated: 2016-12-23
+; Updated: 2016-12-31
* Needed for release version 5
* Priority 0
-** basic: remove some hotkeys in incremental search: C-b
** basic: reset last command when executing macro
** completion: fix electric behavior
** files: check file date to detect asynchronous modifications on disk
@@ -152,7 +151,6 @@
** search: add low-level accelerator function
** search: use do_isearch to input string for do_search_string
** search: use do_isearch to input string for do_query_replace (might need
recursive edit)
-** search: count-matches
** search: count-words, wc
** search: stats command for word count and mode specific stats
** search: improve speed finally
Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.232
retrieving revision 1.233
diff -u -b -r1.232 -r1.233
--- qe.h 31 Dec 2016 11:12:16 -0000 1.232
+++ qe.h 31 Dec 2016 11:25:25 -0000 1.233
@@ -776,6 +776,11 @@
#define COLORED_MAX_LINE_SIZE 4096
/* colorize & transform a line, lower level then ColorizeFunc */
+/* XXX: should return `len`, the number of valid codepoints copied to
+ * destination excluding the null terminator and newline if present.
+ * Truncation can be detected by testing if a newline is present
+ * at this offset.
+ */
typedef int (*GetColorizedLineFunc)(EditState *s,
unsigned int *buf, int buf_size,
int offset, int *offsetp, int line_num);
@@ -1878,7 +1883,7 @@
void do_write_region(EditState *s, const char *filename);
void isearch_colorize_matches(EditState *s, unsigned int *buf, int len,
int offset);
-void do_isearch(EditState *s, int dir);
+void do_isearch(EditState *s, int dir, int argval);
void do_query_replace(EditState *s, const char *search_str,
const char *replace_str);
void do_replace_string(EditState *s, const char *search_str,
Index: qeconfig.h
===================================================================
RCS file: /sources/qemacs/qemacs/qeconfig.h,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -b -r1.60 -r1.61
--- qeconfig.h 23 Dec 2016 13:00:55 -0000 1.60
+++ qeconfig.h 31 Dec 2016 11:25:25 -0000 1.61
@@ -188,10 +188,10 @@
"s{Count Matches: }|search|"
"v")
/* passing argument should switch to regex incremental search */
- CMD1( KEY_CTRL('r'), KEY_NONE,
- "isearch-backward", do_isearch, -1 )
- CMD1( KEY_CTRL('s'), KEY_NONE,
- "isearch-forward", do_isearch, 1 )
+ CMD3( KEY_CTRL('r'), KEY_NONE,
+ "isearch-backward", do_isearch, ESii, -1, "vui" )
+ CMD3( KEY_CTRL('s'), KEY_NONE,
+ "isearch-forward", do_isearch, ESii, 1, "vui" )
CMD2( KEY_META('%'), KEY_NONE,
"query-replace", do_query_replace, ESss,
"*" "s{Query replace: }|search|"
@@ -471,8 +471,8 @@
CmdDef less_commands[] = {
CMD0( 'q', KEY_CTRL('g'),
"less-exit", do_less_exit)
- CMD1( '/', KEY_NONE,
- "less-isearch", do_isearch, 1)
+ CMD3( '/', KEY_NONE,
+ "less-isearch", do_isearch, ESii, 1, "vui" )
CMD_DEF_END,
};
Index: search.c
===================================================================
RCS file: /sources/qemacs/qemacs/search.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- search.c 23 Dec 2016 19:51:48 -0000 1.9
+++ search.c 31 Dec 2016 11:25:25 -0000 1.10
@@ -30,6 +30,7 @@
#define SEARCH_FLAG_WRAPPED 0x0008
#define SEARCH_FLAG_HEX 0x0010
#define SEARCH_FLAG_UNIHEX 0x0020
+#define SEARCH_FLAG_REGEX 0x0040
/* should separate search string length and number of match positions */
#define SEARCH_LENGTH 256
@@ -51,9 +52,11 @@
unsigned int search_u32[SEARCH_LENGTH];
};
+/* XXX: should store to screen */
ISearchState isearch_state;
-/* store last searched string */
+/* last searched string */
+/* XXX: should store in a buffer as a list */
static unsigned int last_search_u32[SEARCH_LENGTH];
static int last_search_u32_len = 0;
static int last_search_u32_flags = 0;
@@ -212,6 +215,22 @@
}
}
+static void buf_disp_search_flags(buf_t *out, int search_flags) {
+ if (search_flags & SEARCH_FLAG_UNIHEX)
+ buf_puts(out, "Unihex ");
+ if (search_flags & SEARCH_FLAG_HEX)
+ buf_puts(out, "Hex ");
+ if (search_flags & SEARCH_FLAG_IGNORECASE)
+ buf_puts(out, "Folding ");
+ else
+ if (!(search_flags & SEARCH_FLAG_SMARTCASE))
+ buf_puts(out, "Exact ");
+ if (search_flags & SEARCH_FLAG_REGEX)
+ buf_puts(out, "Regex ");
+ if (search_flags & SEARCH_FLAG_WORD)
+ buf_puts(out, "Word ");
+}
+
static void isearch_run(ISearchState *is)
{
EditState *s = is->s;
@@ -301,18 +320,7 @@
buf_puts(out, "Wrapped ");
is->search_flags &= ~SEARCH_FLAG_WRAPPED;
}
- if (is->search_flags & SEARCH_FLAG_UNIHEX)
- buf_puts(out, "Unihex ");
- if (is->search_flags & SEARCH_FLAG_HEX)
- buf_puts(out, "Hex ");
- if (is->search_flags & SEARCH_FLAG_WORD)
- buf_puts(out, "Word ");
- if (is->search_flags & SEARCH_FLAG_IGNORECASE)
- buf_puts(out, "Folding ");
- else
- if (!(is->search_flags & SEARCH_FLAG_SMARTCASE))
- buf_puts(out, "Exact ");
-
+ buf_disp_search_flags(out, is->search_flags);
buf_puts(out, "I-search");
if (is->dir < 0)
buf_puts(out, " backward");
@@ -363,10 +371,15 @@
switch (ch) {
case KEY_DEL:
case KEY_BS:
+ /* cancel last input item from search string */
if (is->pos > 0)
is->pos--;
break;
case KEY_CTRL('g'):
+ /* XXX: when search has failed should cancel input back to what has
been
+ * found successfully.
+ * when search is successful aborts and moves point to starting point.
+ */
s->b->mark = is->saved_mark;
s->offset = is->start_offset;
s->region_style = 0;
@@ -390,7 +403,7 @@
case KEY_CTRL('r'): /* previous match */
is->dir = -1;
addpos:
- /* use last seached string if no input */
+ /* use last searched string if no input */
if (is->search_u32_len == 0 && is->dir == curdir) {
int len = min(last_search_u32_len, SEARCH_LENGTH - is->pos);
memcpy(is->search_u32_flags + is->pos, last_search_u32,
@@ -448,8 +461,7 @@
isearch_grab(is, qs->yank_buffers[qs->yank_current], 0, -1);
}
break;
- case KEY_META('b'):
- case KEY_CTRL('b'):
+ case KEY_META(KEY_CTRL('b')):
/* cycle unihex, hex, normal search */
if (is->search_flags & SEARCH_FLAG_UNIHEX)
is->search_flags ^= SEARCH_FLAG_HEX | SEARCH_FLAG_UNIHEX;
@@ -469,11 +481,16 @@
}
is->search_flags &= ~SEARCH_FLAG_SMARTCASE;
break;
+ case KEY_META('r'):
+ case KEY_CTRL('t'):
+ is->search_flags ^= ~SEARCH_FLAG_REGEX;
+ break;
case KEY_CTRL('l'):
do_center_cursor(s, 1);
break;
default:
- if ((KEY_IS_SPECIAL(ch) || KEY_IS_CONTROL(ch)) && ch != '\t') {
+ if ((KEY_IS_SPECIAL(ch) || KEY_IS_CONTROL(ch)) &&
+ ch != '\t' && ch != KEY_CTRL('j')) {
/* exit search mode */
#if 0
// FIXME: behaviour from qemacs-0.3pre13
@@ -488,9 +505,9 @@
s->region_style = 0;
put_status(s, "Mark saved where search started");
/* repost key */
- if (ch != KEY_RET) {
- /* keep search matches lingering if exit via RET */
+ /* do not keep search matches lingering */
s->isearch_state = NULL;
+ if (ch != KEY_RET) {
unget_key(ch);
}
goto the_end;
@@ -506,7 +523,7 @@
}
/* XXX: handle busy */
-void do_isearch(EditState *s, int dir)
+void do_isearch(EditState *s, int dir, int argval)
{
ISearchState *is = &isearch_state;
EditState *e;
@@ -530,6 +547,9 @@
else
flags |= SEARCH_FLAG_HEX;
}
+ if (argval != NO_ARG)
+ flags |= SEARCH_FLAG_REGEX;
+
is->search_flags = flags;
qe_grab_keys(isearch_key, is);
@@ -688,18 +708,7 @@
}
/* display prompt string */
out = buf_init(&outbuf, ubuf, sizeof(ubuf));
- if (is->search_flags & SEARCH_FLAG_UNIHEX)
- buf_puts(out, "Unihex ");
- if (is->search_flags & SEARCH_FLAG_HEX)
- buf_puts(out, "Hex ");
- if (is->search_flags & SEARCH_FLAG_WORD)
- buf_puts(out, "Word ");
- if (is->search_flags & SEARCH_FLAG_IGNORECASE)
- buf_puts(out, "Folding ");
- else
- if (!(is->search_flags & SEARCH_FLAG_SMARTCASE))
- buf_puts(out, "Exact ");
-
+ buf_disp_search_flags(out, is->search_flags);
buf_puts(out, "Query replace ");
buf_encode_search_str(out, is->search_str);
buf_puts(out, " with ");
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs TODO.org qe.h qeconfig.h search.c,
Charlie Gordon <=