SF.net SVN: geany: [582] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Tue Jul 18 17:43:31 UTC 2006
Revision: 582
Author: ntrel
Date: 2006-07-18 10:43:22 -0700 (Tue, 18 Jul 2006)
ViewCVS: http://svn.sourceforge.net/geany/?rev=582&view=rev
Log Message:
-----------
Use more POSIX-like syntax for regular expression bracket matching; Prevent searching backwards with a regex (unsupported); Scroll in view after the last replacement for replace all/selection. Also move hiding the replace dialog out of document.c
Modified Paths:
--------------
trunk/ChangeLog
trunk/doc/geany.docbook
trunk/src/callbacks.c
trunk/src/callbacks.h
trunk/src/dialogs.c
trunk/src/document.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-07-18 14:09:01 UTC (rev 581)
+++ trunk/ChangeLog 2006-07-18 17:43:22 UTC (rev 582)
@@ -5,6 +5,12 @@
Add support for back references when replacing with regex.
Improve the speed of replace all/replace in selection.
Don't lose the selection range after replacing in selection.
+ * src/callbacks.c, src/callbacks.h, src/document.c, src/dialogs.c,
+ doc/geany.docbook:
+ Use more POSIX-like syntax for regular expression bracket matching.
+ Prevent searching backwards with a regex (unsupported).
+ Scroll in view after the last replacement for replace all/selection.
+
2006-07-18 Enrico Tröger <enrico.troeger at uvena.de>
Modified: trunk/doc/geany.docbook
===================================================================
--- trunk/doc/geany.docbook 2006-07-18 14:09:01 UTC (rev 581)
+++ trunk/doc/geany.docbook 2006-07-18 17:43:22 UTC (rev 582)
@@ -414,12 +414,15 @@
</para>
</section>
-->
- <section>
+ <section id="searchreplace">
<title>Search and Replace</title>
<para>
- You can use regular expressions in the search dialog, just by activating the check box (see
- the image below). Detailed information about special characters can be found in the
- <xref linkend="regexp"/>.
+ You can use regular expressions in the search and replace dialogs, just by
+ activating the check box (see the image below).
+ The syntax is POSIX-like, as described in <xref linkend="regexp"/>.
+ <note><para>
+ Searching backwards with regular expressions is not supported.
+ </para></note>
<figure>
<title>Search dialog</title>
<graphic fileref="images/find_dialog.jpg"></graphic>
@@ -448,17 +451,17 @@
<entry>Matches any character.</entry>
</row>
<row>
- <entry>\(</entry>
+ <entry>(</entry>
<entry>This marks the start of a region for tagging a match.</entry>
</row>
<row>
- <entry>\)</entry>
+ <entry>)</entry>
<entry>This marks the end of a tagged region.</entry>
</row>
<row>
<entry>\n</entry>
<entry>Where n is 1 through 9 refers to the first through ninth tagged region
- when replacing. For example, if the search string was Fred\([1-9]\)XXX
+ when replacing. For example, if the search string was Fred([1-9])XXX
and the replace string was Sam\1YYY, when applied to Fred2XXX this would
generate Sam2YYY.
</entry>
@@ -475,7 +478,7 @@
<entry>\x</entry>
<entry>This allows you to use a character x that would otherwise have a special
meaning. For example, \[ would be interpreted as [ and not as the start
- of a character set.
+ of a character set. Use \\ for a literal backslash.
</entry>
</row>
<row>
@@ -492,6 +495,10 @@
</entry>
</row>
<row>
+ <entry>^</entry>
+ <entry>This matches the start of a line (unless used inside a set, see above).</entry>
+ </row>
+ <row>
<entry>$</entry>
<entry>This matches the end of a line.</entry>
</row>
Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c 2006-07-18 14:09:01 UTC (rev 581)
+++ trunk/src/callbacks.c 2006-07-18 17:43:22 UTC (rev 582)
@@ -1810,6 +1810,37 @@
void
+on_find_previous1_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ gint idx = document_get_cur_idx();
+
+ if (app->search_text == NULL) return;
+
+ if (search_flags & SCFIND_REGEXP)
+ utils_beep(); //Can't reverse search order for a regex (find next ignores search backwards)
+ else
+ {
+ document_find_text(idx, app->search_text, search_flags,
+ !search_backwards);
+ }
+}
+
+
+void on_find_checkbutton_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ GtkToggleButton *chk_regexp = GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(app->find_dialog), "check_regexp"));
+ GtkWidget *chk_back =
+ lookup_widget(GTK_WIDGET(app->find_dialog), "check_back");
+
+ if (togglebutton == chk_regexp)
+ gtk_widget_set_sensitive(chk_back, ! gtk_toggle_button_get_active(chk_regexp));
+}
+
+
+void
on_find_dialog_response (GtkDialog *dialog,
gint response,
gpointer user_data)
@@ -1850,7 +1881,7 @@
gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), app->search_text);
search_flags = (fl1 ? SCFIND_MATCHCASE : 0) |
(fl2 ? SCFIND_WHOLEWORD : 0) |
- (fl3 ? SCFIND_REGEXP : 0) |
+ (fl3 ? SCFIND_REGEXP | SCFIND_POSIX: 0) |
(fl4 ? SCFIND_WORDSTART : 0);
document_find_text(idx, app->search_text, search_flags, search_backwards);
}
@@ -1867,6 +1898,19 @@
}
+void on_replace_checkbutton_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ GtkToggleButton *chk_regexp = GTK_TOGGLE_BUTTON(
+ lookup_widget(GTK_WIDGET(app->replace_dialog), "check_regexp"));
+ GtkWidget *chk_back =
+ lookup_widget(GTK_WIDGET(app->replace_dialog), "check_back");
+
+ if (togglebutton == chk_regexp)
+ gtk_widget_set_sensitive(chk_back, ! gtk_toggle_button_get_active(chk_regexp));
+}
+
+
void
on_replace_dialog_response (GtkDialog *dialog,
gint response,
@@ -1924,7 +1968,7 @@
search_flags_re = (fl1 ? SCFIND_MATCHCASE : 0) |
(fl2 ? SCFIND_WHOLEWORD : 0) |
- (fl3 ? SCFIND_REGEXP : 0) |
+ (fl3 ? SCFIND_REGEXP | SCFIND_POSIX : 0) |
(fl4 ? SCFIND_WORDSTART : 0);
if (search_in_all_buffers_re && response == GEANY_RESPONSE_REPLACE_ALL)
@@ -1936,6 +1980,7 @@
document_replace_all(i, find, replace, search_flags_re);
}
+ gtk_widget_hide(app->replace_dialog);
}
else
{
@@ -1943,17 +1988,20 @@
{
case GEANY_RESPONSE_REPLACE:
{
- document_replace_text(idx, find, replace, search_flags_re, search_backwards_re);
+ document_replace_text(idx, find, replace, search_flags_re,
+ search_backwards_re);
break;
}
case GEANY_RESPONSE_REPLACE_ALL:
{
document_replace_all(idx, find, replace, search_flags_re);
+ gtk_widget_hide(app->replace_dialog);
break;
}
case GEANY_RESPONSE_REPLACE_SEL:
{
document_replace_sel(idx, find, replace, search_flags_re);
+ gtk_widget_hide(app->replace_dialog);
break;
}
}
@@ -2497,20 +2545,6 @@
void
-on_find_previous1_activate (GtkMenuItem *menuitem,
- gpointer user_data)
-{
- gint idx = document_get_cur_idx();
-
- if (app->search_text)
- {
- document_find_text(idx, app->search_text, search_flags,
- !search_backwards);
- }
-}
-
-
-void
on_go_to_line1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
Modified: trunk/src/callbacks.h
===================================================================
--- trunk/src/callbacks.h 2006-07-18 14:09:01 UTC (rev 581)
+++ trunk/src/callbacks.h 2006-07-18 17:43:22 UTC (rev 582)
@@ -376,6 +376,13 @@
gpointer user_data);
void
+on_find_previous1_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void on_find_checkbutton_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
on_find_dialog_response (GtkDialog *dialog,
gint response,
gpointer user_data);
@@ -384,6 +391,9 @@
on_find_entry_activate (GtkEntry *entry,
gpointer user_data);
+void on_replace_checkbutton_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
void
on_replace_dialog_response (GtkDialog *dialog,
gint response,
@@ -570,10 +580,6 @@
gpointer user_data);
void
-on_find_previous1_activate (GtkMenuItem *menuitem,
- gpointer user_data);
-
-void
on_go_to_line1_activate (GtkMenuItem *menuitem,
gpointer user_data);
Modified: trunk/src/dialogs.c
===================================================================
--- trunk/src/dialogs.c 2006-07-18 14:09:01 UTC (rev 581)
+++ trunk/src/dialogs.c 2006-07-18 17:43:22 UTC (rev 582)
@@ -855,8 +855,10 @@
g_object_set_data_full(G_OBJECT(app->find_dialog), "check_regexp",
gtk_widget_ref(checkbox3), (GDestroyNotify)gtk_widget_unref);
gtk_button_set_focus_on_click(GTK_BUTTON(checkbox3), FALSE);
- gtk_tooltips_set_tip(tooltips, checkbox3,
- _("For detailed information about using regular expressions, please read the documentation."), NULL);
+ gtk_tooltips_set_tip(tooltips, checkbox3, _("Use POSIX-like regular expressions. "
+ "For detailed information about using regular expressions, please read the documentation."), NULL);
+ g_signal_connect(G_OBJECT(checkbox3), "toggled",
+ G_CALLBACK(on_find_checkbutton_toggled), NULL);
checkbox6 = gtk_check_button_new_with_mnemonic(_("_Replace control characters"));
g_object_set_data_full(G_OBJECT(app->find_dialog), "check_escape",
@@ -984,8 +986,10 @@
g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_regexp",
gtk_widget_ref(checkbox3), (GDestroyNotify)gtk_widget_unref);
gtk_button_set_focus_on_click(GTK_BUTTON(checkbox3), FALSE);
- gtk_tooltips_set_tip(tooltips, checkbox3,
- _("For detailed information about using regular expressions, please read the documentation."), NULL);
+ gtk_tooltips_set_tip(tooltips, checkbox3, _("Use POSIX-like regular expressions. "
+ "For detailed information about using regular expressions, please read the documentation."), NULL);
+ g_signal_connect(G_OBJECT(checkbox3), "toggled",
+ G_CALLBACK(on_replace_checkbutton_toggled), NULL);
checkbox7 = gtk_check_button_new_with_mnemonic(_("_Replace control characters"));
g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_escape",
Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c 2006-07-18 14:09:01 UTC (rev 581)
+++ trunk/src/document.c 2006-07-18 17:43:22 UTC (rev 582)
@@ -58,11 +58,10 @@
#include "notebook.h"
-/* Returns -1 if no text found or the new range endpoint after replacing.
- * show_last is whether to select and scroll the last replacement in view. */
+/* Returns -1 if no text found or the new range endpoint after replacing. */
static gint
-document_replace_range(gint idx, const gchar *find_text, const gchar *replace_text, gint flags,
- gint start, gint end, gboolean show_last);
+document_replace_range(gint idx, const gchar *find_text, const gchar *replace_text,
+ gint flags, gint start, gint end);
/* returns the index of the notebook page which has the given filename
@@ -697,7 +696,8 @@
{
gint selection_end, search_pos;
- if (idx == -1 || ! strlen(text)) return;
+ g_return_if_fail(text != NULL);
+ if (idx == -1 || ! *text) return;
selection_end = sci_get_selection_end(doc_list[idx].sci);
if (!inc && sci_can_copy(doc_list[idx].sci))
@@ -735,7 +735,10 @@
{
gint selection_end, selection_start, search_pos;
- if (idx == -1 || ! strlen(text)) return;
+ g_return_if_fail(text != NULL);
+ if (idx == -1 || ! *text) return;
+ // Sci doesn't support searching backwards with a regex
+ if (flags & SCFIND_REGEXP) search_backwards = FALSE;
selection_start = sci_get_selection_start(doc_list[idx].sci);
selection_end = sci_get_selection_end(doc_list[idx].sci);
@@ -768,12 +771,15 @@
}
-void document_replace_text(gint idx, const gchar *find_text, const gchar *replace_text, gint flags, gboolean search_backwards)
+void document_replace_text(gint idx, const gchar *find_text, const gchar *replace_text,
+ gint flags, gboolean search_backwards)
{
gint selection_end, selection_start, search_pos;
g_return_if_fail(find_text != NULL && replace_text != NULL);
if (idx == -1 || ! *find_text) return;
+ // Sci doesn't support searching backwards with a regex
+ if (flags & SCFIND_REGEXP) search_backwards = FALSE;
selection_start = sci_get_selection_start(doc_list[idx].sci);
selection_end = sci_get_selection_end(doc_list[idx].sci);
@@ -809,11 +815,10 @@
}
-/* Returns -1 if no text found or the new range endpoint after replacing.
- * show_last is whether to select and scroll the last replacement in view. */
+/* Returns -1 if no text found or the new range endpoint after replacing. */
static gint
-document_replace_range(gint idx, const gchar *find_text, const gchar *replace_text, gint flags,
- gint start, gint end, gboolean show_last)
+document_replace_range(gint idx, const gchar *find_text, const gchar *replace_text,
+ gint flags, gint start, gint end)
{
gint search_pos;
gint find_len = 0, replace_len = 0;
@@ -850,16 +855,12 @@
}
sci_end_undo_action(doc_list[idx].sci);
- if (match_found && show_last)
- {
- // select the last replacement
- gint sel_start = ttf.chrg.cpMin - replace_len;
- sci_set_selection_start(doc_list[idx].sci, sel_start);
- sci_set_selection_end(doc_list[idx].sci, sel_start + replace_len);
- sci_scroll_caret(doc_list[idx].sci);
- }
if (match_found)
+ {
+ // scroll last match in view.
+ sci_goto_pos(doc_list[idx].sci, ttf.chrg.cpMin, TRUE);
return end;
+ }
else
return -1; //no text was found
}
@@ -881,7 +882,7 @@
}
selection_end = document_replace_range(idx, find_text, replace_text, flags,
- selection_start, selection_end, FALSE);
+ selection_start, selection_end);
if (selection_end == -1)
utils_beep();
else
@@ -890,22 +891,19 @@
sci_set_selection_start(doc_list[idx].sci, selection_start);
sci_set_selection_end(doc_list[idx].sci, selection_end);
}
-
- gtk_widget_hide(app->replace_dialog);
}
-void document_replace_all(gint idx, const gchar *find_text, const gchar *replace_text, gint flags)
+void document_replace_all(gint idx, const gchar *find_text, const gchar *replace_text,
+ gint flags)
{
gint len;
g_return_if_fail(find_text != NULL && replace_text != NULL);
if (idx == -1 || ! *find_text) return;
len = sci_get_length(doc_list[idx].sci);
- if (document_replace_range(idx, find_text, replace_text, flags, 0, len, TRUE) == -1)
+ if (document_replace_range(idx, find_text, replace_text, flags, 0, len) == -1)
utils_beep();
-
- gtk_widget_hide(app->replace_dialog);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list