[geany/geany-plugins] 012769: Merge pull request #141 from scriptum/autoclose-v0.2.1
Frank Lanitz
git-noreply at xxxxx
Mon Sep 8 18:07:07 UTC 2014
Branch: refs/heads/master
Author: Frank Lanitz <frank at frank.uvena.de>
Committer: Frank Lanitz <frank at frank.uvena.de>
Date: Mon, 08 Sep 2014 18:07:07 UTC
Commit: 012769274c4914636f8b5d1cf245116961c6a315
https://github.com/geany/geany-plugins/commit/012769274c4914636f8b5d1cf245116961c6a315
Log Message:
-----------
Merge pull request #141 from scriptum/autoclose-v0.2.1
Autoclose v0.2.1
Modified Paths:
--------------
autoclose/src/autoclose.c
Modified: autoclose/src/autoclose.c
242 lines changed, 126 insertions(+), 116 deletions(-)
===================================================================
@@ -43,19 +43,15 @@ GeanyPlugin *geany_plugin;
GeanyData *geany_data;
GeanyFunctions *geany_functions;
-PLUGIN_VERSION_CHECK(216)
+PLUGIN_VERSION_CHECK(218)
PLUGIN_SET_TRANSLATABLE_INFO(
LOCALEDIR,
GETTEXT_PACKAGE,
_("Auto-close"),
_("Auto-close braces and brackets with lot of features"),
- "0.2",
+ "0.3",
"Pavel Roschin <rpg89(at)post(dot)ru>")
-/* avoid aggresive warnings */
-#undef DOC_VALID
-#define DOC_VALID(doc_ptr) (((doc_ptr) && (doc_ptr)->is_valid))
-
typedef struct {
/* close chars */
gboolean parenthesis;
@@ -77,6 +73,7 @@ typedef struct {
gboolean make_indent_for_cbracket;
gboolean move_cursor_to_beginning;
gboolean improved_cbracket_indent;
+ gboolean whitesmiths_style;
gboolean close_functions;
gboolean bcksp_remove_pair;
gboolean jump_on_tab;
@@ -87,7 +84,6 @@ typedef struct {
static AutocloseInfo *ac_info = NULL;
typedef struct {
- gulong notify_handler[2];
/* used to place the caret after autoclosed items on tab (similar to eclipse) */
gint jump_on_tab;
/* used to reset jump_on_tab when needed */
@@ -256,7 +252,7 @@ get_end_pos(ScintillaObject *sci, gint line)
end = sci_get_line_end_position(sci, line);
ch = char_at(sci, end - 1);
/* ignore spaces and "}" */
- while(isspace_no_newline(ch) || '}' == ch)
+ while (isspace_no_newline(ch) || '}' == ch)
{
end--;
ch = char_at(sci, end - 1);
@@ -361,8 +357,17 @@ improve_indent(
SSM(sci, SCI_ADDTEXT, 2, (sptr_t)"\n\n");
else
SSM(sci, SCI_ADDTEXT, 3, (sptr_t)"\n\n}");
- sci_set_line_indentation(sci, line + 1, indent + indent_width);
- sci_set_line_indentation(sci, line + 2, indent);
+ if (ac_info->whitesmiths_style)
+ {
+ sci_set_line_indentation(sci, line, indent);
+ sci_set_line_indentation(sci, line + 1, indent);
+ sci_set_line_indentation(sci, line + 2, indent);
+ }
+ else
+ {
+ sci_set_line_indentation(sci, line + 1, indent + indent_width);
+ sci_set_line_indentation(sci, line + 2, indent);
+ }
/* move to the end of added line */
end_pos = sci_get_line_end_position(sci, line + 1);
sci_set_current_position(sci, end_pos, TRUE);
@@ -498,11 +503,17 @@ enclose_selection(
start_indent = sci_get_line_indentation(sci, start_line);
indent_width = editor_get_indent_prefs(editor)->width;
sci_set_line_indentation(sci, start_line, start_indent);
- sci_set_line_indentation(sci, start_line + 1, start_indent + indent_width);
- for(i = start_line + 2; i <= end_line; i++)
+ if (!ac_info->whitesmiths_style)
+ sci_set_line_indentation(sci, start_line + 1, start_indent + indent_width);
+ else
+ sci_set_line_indentation(sci, start_line + 1, start_indent);
+ for (i = start_line + 2; i <= end_line; i++)
{
current_indent = sci_get_line_indentation(sci, i);
- sci_set_line_indentation(sci, i, current_indent + indent_width);
+ if (!ac_info->whitesmiths_style)
+ sci_set_line_indentation(sci, i, current_indent + indent_width);
+ else
+ sci_set_line_indentation(sci, i, current_indent);
}
text_end_pos = sci_get_line_end_position(sci, i - 1);
sci_set_current_position(sci, text_end_pos, FALSE);
@@ -529,7 +540,7 @@ enclose_selection(
/* looks like a forward loop but actually lines processed in reverse order */
for (i = 0; i < selections; i++)
{
- if(selection_is_up_down)
+ if (selection_is_up_down)
line = selections - i - 1;
else
line = i;
@@ -589,7 +600,7 @@ check_struct(
gchar ch;
gint line, len;
ch = char_at(sci, pos - 1);
- while(g_ascii_isspace(ch))
+ while (g_ascii_isspace(ch))
{
pos--;
ch = char_at(sci, pos - 1);
@@ -709,13 +720,15 @@ auto_close_chars(
style = sci_get_style_at(sci, pos + lex_offset);
/* add ; after functions */
- if (lexer_cpp_like(lexer, style) &&
- chars_left[0] == '(' &&
- !has_sel &&
- ac_info->close_functions &&
- pos == get_end_pos(sci, line) &&
- sci_get_line_indentation(sci, line) != 0 &&
- !check_define(sci, line))
+ if (
+ !has_sel &&
+ ac_info->close_functions &&
+ chars_left[0] == '(' &&
+ lexer_cpp_like(lexer, style) &&
+ pos == get_end_pos(sci, line) &&
+ sci_get_line_indentation(sci, line) != 0 &&
+ !check_define(sci, line)
+ )
chars_right[1] = ';';
style = sci_get_style_at(sci, pos);
@@ -800,7 +813,6 @@ on_sci_notify(ScintillaObject *sci, gint scn, SCNotification *nt, gpointer user_
data->last_line = new_line;
}
-
static void
on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_data)
{
@@ -810,41 +822,15 @@ on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_data)
sci = doc->editor->sci;
data = g_new0(AutocloseUserData, 1);
- g_return_if_fail(data);
data->doc = doc;
- data->notify_handler[0] = g_signal_connect(G_OBJECT(sci), "sci-notify",
- G_CALLBACK(on_sci_notify), data);
- data->notify_handler[1] = g_signal_connect(G_OBJECT(sci), "key-press-event",
- G_CALLBACK(on_key_press), data);
+ plugin_signal_connect(geany_plugin, G_OBJECT(sci), "sci-notify",
+ FALSE, G_CALLBACK(on_sci_notify), data);
+ plugin_signal_connect(geany_plugin, G_OBJECT(sci), "key-press-event",
+ FALSE, G_CALLBACK(on_key_press), data);
/* This will free the data when the sci is destroyed */
g_object_set_data_full(G_OBJECT(sci), "autoclose-userdata", data, g_free);
}
-static void
-autoclose_handlers_cleanup(void)
-{
- gint i;
-
- foreach_document(i)
- {
- gint j;
- gpointer data;
- ScintillaObject *sci;
- AutocloseUserData *autoclose_data;
-
- sci = documents[i]->editor->sci;
- data = g_object_get_data(G_OBJECT(sci), "autoclose-userdata");
- if(!data)
- continue;
- autoclose_data = (AutocloseUserData*)data;
- for(j = 0; j < 2; j++)
- {
- gulong handler = autoclose_data->notify_handler[j];
- g_signal_handler_disconnect(sci, handler);
- }
- }
-}
-
PluginCallback plugin_callbacks[] =
{
{ "document-open", (GCallback) &on_document_open, FALSE, NULL },
@@ -858,16 +844,15 @@ configure_response_cb(GtkDialog *dialog, gint response, gpointer user_data)
if (response != GTK_RESPONSE_OK && response != GTK_RESPONSE_APPLY)
return;
GKeyFile *config = g_key_file_new();
- gchar *data;
gchar *config_dir = g_path_get_dirname(ac_info->config_file);
g_key_file_load_from_file(config, ac_info->config_file, G_KEY_FILE_NONE, NULL);
-#define SAVE_CONF_BOOL(name) do { \
+#define SAVE_CONF_BOOL(name) G_STMT_START { \
ac_info->name = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( \
- g_object_get_data(G_OBJECT(dialog), "check_" #name))); \
+ g_object_get_data(G_OBJECT(dialog), "check_" #name))); \
g_key_file_set_boolean(config, "autoclose", #name, ac_info->name); \
-} while (0)
+} G_STMT_END
SAVE_CONF_BOOL(parenthesis);
SAVE_CONF_BOOL(abracket);
@@ -887,6 +872,7 @@ configure_response_cb(GtkDialog *dialog, gint response, gpointer user_data)
SAVE_CONF_BOOL(make_indent_for_cbracket);
SAVE_CONF_BOOL(move_cursor_to_beginning);
SAVE_CONF_BOOL(improved_cbracket_indent);
+ SAVE_CONF_BOOL(whitesmiths_style);
SAVE_CONF_BOOL(close_functions);
SAVE_CONF_BOOL(bcksp_remove_pair);
SAVE_CONF_BOOL(jump_on_tab);
@@ -901,6 +887,7 @@ configure_response_cb(GtkDialog *dialog, gint response, gpointer user_data)
else
{
/* write config to file */
+ gchar *data;
data = g_key_file_to_data(config, NULL, NULL);
utils_write_file(ac_info->config_file, data);
g_free(data);
@@ -914,6 +901,7 @@ void
plugin_init(G_GNUC_UNUSED GeanyData *data)
{
guint i;
+
foreach_document(i)
{
on_document_open(NULL, documents[i], NULL);
@@ -948,6 +936,7 @@ plugin_init(G_GNUC_UNUSED GeanyData *data)
GET_CONF_BOOL(make_indent_for_cbracket, TRUE);
GET_CONF_BOOL(move_cursor_to_beginning, TRUE);
GET_CONF_BOOL(improved_cbracket_indent, TRUE);
+ GET_CONF_BOOL(whitesmiths_style, FALSE);
GET_CONF_BOOL(close_functions, TRUE);
GET_CONF_BOOL(bcksp_remove_pair, FALSE);
GET_CONF_BOOL(jump_on_tab, TRUE);
@@ -1020,95 +1009,100 @@ plugin_configure(GtkDialog *dialog)
GtkWidget *widget, *vbox, *frame, *container, *scrollbox;
vbox = gtk_vbox_new(FALSE, 0);
scrollbox = gtk_scrolled_window_new(NULL, NULL);
+ gtk_widget_set_size_request(GTK_WIDGET(scrollbox), 350, 400);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollbox), vbox);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbox),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-#define WIDGET_FRAME(description) do { \
+#define WIDGET_FRAME(description) G_STMT_START { \
container = gtk_vbox_new(FALSE, 0); \
frame = gtk_frame_new(NULL); \
- gtk_frame_set_label(GTK_FRAME(frame), _(description)); \
+ gtk_frame_set_label(GTK_FRAME(frame), description); \
gtk_container_add(GTK_CONTAINER(frame), container); \
gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 3); \
-} while (0)
+} G_STMT_END
-#define WIDGET_CONF_BOOL(name, description, tooltip) do { \
- widget = gtk_check_button_new_with_label(_(description)); \
- if (tooltip) gtk_widget_set_tooltip_text(widget, _(tooltip)); \
+#define WIDGET_CONF_BOOL(name, description, tooltip) G_STMT_START { \
+ widget = gtk_check_button_new_with_label(description); \
+ if (tooltip) gtk_widget_set_tooltip_text(widget, tooltip); \
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ac_info->name); \
gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 3); \
g_object_set_data(G_OBJECT(dialog), "check_" #name, widget); \
-} while (0)
+} G_STMT_END
- WIDGET_FRAME("Auto-close quotes and brackets");
- WIDGET_CONF_BOOL(parenthesis, "Parenthesis ( )",
- "Auto-close parenthesis \"(\" -> \"(|)\"");
+ WIDGET_FRAME(_("Auto-close quotes and brackets"));
+ WIDGET_CONF_BOOL(parenthesis, _("Parenthesis ( )"),
+ _("Auto-close parenthesis \"(\" -> \"(|)\""));
g_signal_connect(widget, "toggled", G_CALLBACK(ac_parenthesis_cb), dialog);
- WIDGET_CONF_BOOL(cbracket, "Curly brackets { }",
- "Auto-close curly brackets \"{\" -> \"{|}\"");
+ WIDGET_CONF_BOOL(cbracket, _("Curly brackets { }"),
+ _("Auto-close curly brackets \"{\" -> \"{|}\""));
g_signal_connect(widget, "toggled", G_CALLBACK(ac_cbracket_cb), dialog);
- WIDGET_CONF_BOOL(sbracket, "Square brackets [ ]",
- "Auto-close square brackets \"[\" -> \"[|]\"");
- WIDGET_CONF_BOOL(abracket, "Angular brackets < >",
- "Auto-close angular brackets \"<\" -> \"<|>\"");
+ WIDGET_CONF_BOOL(sbracket, _("Square brackets [ ]"),
+ _("Auto-close square brackets \"[\" -> \"[|]\""));
+ WIDGET_CONF_BOOL(abracket, _("Angular brackets < >"),
+ _("Auto-close angular brackets \"<\" -> \"<|>\""));
g_signal_connect(widget, "toggled", G_CALLBACK(ac_abracket_htmlonly_cb), dialog);
- WIDGET_CONF_BOOL(abracket_htmlonly, "\tOnly for HTML",
- "Auto-close angular brackets only in HTML documents");
- WIDGET_CONF_BOOL(dquote, "Double quotes \" \"",
- "Auto-close double quotes \" -> \"|\"");
- WIDGET_CONF_BOOL(squote, "Single quotes \' \'",
- "Auto-close single quotes ' -> '|'");
- WIDGET_CONF_BOOL(backquote, "Backquote ` `",
- "Auto-close backquote ` -> `|`");
+ WIDGET_CONF_BOOL(abracket_htmlonly, _("\tOnly for HTML"),
+ _("Auto-close angular brackets only in HTML documents"));
+ WIDGET_CONF_BOOL(dquote, _("Double quotes \" \""),
+ _("Auto-close double quotes \" -> \"|\""));
+ WIDGET_CONF_BOOL(squote, _("Single quotes \' \'"),
+ _("Auto-close single quotes ' -> '|'"));
+ WIDGET_CONF_BOOL(backquote, _("Backquote ` `"),
+ _("Auto-close backquote ` -> `|`"));
g_signal_connect(widget, "toggled", G_CALLBACK(ac_backquote_bashonly_cb), dialog);
- WIDGET_CONF_BOOL(backquote_bashonly, "\tOnly for Bash",
- "Auto-close backquote only in Bash");
+ WIDGET_CONF_BOOL(backquote_bashonly, _("\tOnly for Bash"),
+ _("Auto-close backquote only in Bash"));
- WIDGET_FRAME("Improve curly brackets completion");
- WIDGET_CONF_BOOL(make_indent_for_cbracket, "Indent when enclosing",
- "If you select some text and press \"{\" or \"}\", plugin "
+ WIDGET_FRAME(_("Improve curly brackets completion"));
+ WIDGET_CONF_BOOL(make_indent_for_cbracket, _("Indent when enclosing"),
+ _("If you select some text and press \"{\" or \"}\", plugin "
"will auto-close selected lines and make new block with indent."
"\nYou do not need to select block precisely - block enclosing "
- "takes into account only lines.");
+ "takes into account only lines."));
g_signal_connect(widget, "toggled", G_CALLBACK(ac_make_indent_for_cbracket_cb), dialog);
- WIDGET_CONF_BOOL(move_cursor_to_beginning, "Move cursor to beginning",
- "If you checked \"Indent when enclosing\", moving cursor "
+ WIDGET_CONF_BOOL(move_cursor_to_beginning, _("Move cursor to beginning"),
+ _("If you checked \"Indent when enclosing\", moving cursor "
"to beginning may be useful: usually you make new block "
- "and need to create new statement before this block.");
- WIDGET_CONF_BOOL(improved_cbracket_indent, "Improved auto-indentation",
- "Improved auto-indent for curly brackets: type \"{\" "
+ "and need to create new statement before this block."));
+ WIDGET_CONF_BOOL(improved_cbracket_indent, _("Improved auto-indentation"),
+ _("Improved auto-indent for curly brackets: type \"{\" "
"and then press Enter - plugin will create full indented block. "
- "Works without \"auto-close { }\" checkbox.");
+ "Works without \"auto-close { }\" checkbox."));
+ WIDGET_CONF_BOOL(whitesmiths_style, _("\tWhitesmiths style"),
+ _("This style puts the brace associated with a control statement on "
+ "the next line, indented. Statements within the braces are indented "
+ "to the same level as the braces."));
container = vbox;
- WIDGET_CONF_BOOL(delete_pairing_brace, "Delete pairing character while backspacing first",
- "Check if you want to delete pairing bracket by pressing BackSpace.");
+ WIDGET_CONF_BOOL(delete_pairing_brace, _("Delete pairing character while backspacing first"),
+ _("Check if you want to delete pairing bracket by pressing BackSpace."));
g_signal_connect(widget, "toggled", G_CALLBACK(ac_delete_pairing_brace_cb), dialog);
- WIDGET_CONF_BOOL(suppress_doubling, "Suppress double-completion",
- "Check if you want to allow editor automatically fix mistypes "
- "with brackets: if you type \"{}\" you will get \"{}\", not \"{}}\".");
- WIDGET_CONF_BOOL(enclose_selections, "Enclose selections",
- "Automatically enclose selected text by pressing just one bracket key.");
+ WIDGET_CONF_BOOL(suppress_doubling, _("Suppress double-completion"),
+ _("Check if you want to allow editor automatically fix mistypes "
+ "with brackets: if you type \"{}\" you will get \"{}\", not \"{}}\"."));
+ WIDGET_CONF_BOOL(enclose_selections, _("Enclose selections"),
+ _("Automatically enclose selected text by pressing just one bracket key."));
g_signal_connect(widget, "toggled", G_CALLBACK(ac_enclose_selections_cb), dialog);
- WIDGET_CONF_BOOL(keep_selection, "Keep selection when enclosing",
- "Keep your previously selected text after enclosing.");
+ WIDGET_CONF_BOOL(keep_selection, _("Keep selection when enclosing"),
+ _("Keep your previously selected text after enclosing."));
- WIDGET_FRAME("Behaviour inside comments and strings");
- WIDGET_CONF_BOOL(comments_ac_enable, "Allow auto-closing in strings and comments",
- "Check if you wan to keep auto-closing inside strings and comments too.");
- WIDGET_CONF_BOOL(comments_enclose, "Enclose selections in strings and comments",
- "Check if you wan to enclose selections inside strings and comments too.");
+ WIDGET_FRAME(_("Behaviour inside comments and strings"));
+ WIDGET_CONF_BOOL(comments_ac_enable, _("Allow auto-closing in strings and comments"),
+ _("Check if you wan to keep auto-closing inside strings and comments too."));
+ WIDGET_CONF_BOOL(comments_enclose, _("Enclose selections in strings and comments"),
+ _("Check if you wan to enclose selections inside strings and comments too."));
container = vbox;
- WIDGET_CONF_BOOL(close_functions, "Auto-complete \";\" for functions",
- "Full function auto-closing (works only for C/C++): type \"sin(\" "
- "and you will get \"sin(|);\".");
- WIDGET_CONF_BOOL(bcksp_remove_pair, "Shift+BackSpace removes pairing brace too",
- "Remove left and right brace while pressing Shift+BackSpace.\nTip: "
+ WIDGET_CONF_BOOL(close_functions, _("Auto-complete \";\" for functions"),
+ _("Full function auto-closing (works only for C/C++): type \"sin(\" "
+ "and you will get \"sin(|);\"."));
+ WIDGET_CONF_BOOL(bcksp_remove_pair, _("Shift+BackSpace removes pairing brace too"),
+ _("Remove left and right brace while pressing Shift+BackSpace.\nTip: "
"to completely remove indented block just Shift+BackSpace first \"{\" "
- "or last \"}\".");
- WIDGET_CONF_BOOL(jump_on_tab, "Jump on Tab to enclosed char",
- "Jump behind autoclosed items on Tab press.");
+ "or last \"}\"."));
+ WIDGET_CONF_BOOL(jump_on_tab, _("Jump on Tab to enclosed char"),
+ _("Jump behind autoclosed items on Tab press."));
#undef WIDGET_CONF_BOOL
#undef WIDGET_FRAME
@@ -1124,11 +1118,27 @@ plugin_configure(GtkDialog *dialog)
return scrollbox;
}
+static void
+autoclose_cleanup(void)
+{
+ guint i;
+
+ foreach_document(i)
+ {
+ gpointer data;
+ ScintillaObject *sci;
+
+ sci = documents[i]->editor->sci;
+ data = g_object_steal_data(G_OBJECT(sci), "autoclose-userdata");
+ g_free(data);
+ }
+}
+
/* Called by Geany before unloading the plugin. */
void
plugin_cleanup(void)
{
- autoclose_handlers_cleanup();
+ autoclose_cleanup();
g_free(ac_info->config_file);
g_free(ac_info);
}
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list