Revision: 1120 http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1120&view=re... Author: eht16 Date: 2010-01-10 13:39:08 +0000 (Sun, 10 Jan 2010)
Log Message: ----------- Add new addon 'Strip trailing blank lines' by Eugene Arshinov, thanks.
Modified Paths: -------------- trunk/geany-plugins/addons/AUTHORS trunk/geany-plugins/addons/ChangeLog trunk/geany-plugins/addons/README trunk/geany-plugins/addons/src/Makefile.am trunk/geany-plugins/addons/src/addons.c trunk/geany-plugins/po/POTFILES.in
Added Paths: ----------- trunk/geany-plugins/addons/src/ao_blanklines.c trunk/geany-plugins/addons/src/ao_blanklines.h
Modified: trunk/geany-plugins/addons/AUTHORS =================================================================== --- trunk/geany-plugins/addons/AUTHORS 2010-01-05 23:39:22 UTC (rev 1119) +++ trunk/geany-plugins/addons/AUTHORS 2010-01-10 13:39:08 UTC (rev 1120) @@ -1,2 +1,3 @@ Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> Bert Vermeulen <bert(at)biot(dot)com> +Eugene Arshinov <earshinov(at)gmail(dot)com>
Modified: trunk/geany-plugins/addons/ChangeLog =================================================================== --- trunk/geany-plugins/addons/ChangeLog 2010-01-05 23:39:22 UTC (rev 1119) +++ trunk/geany-plugins/addons/ChangeLog 2010-01-10 13:39:08 UTC (rev 1120) @@ -1,3 +1,11 @@ +2010-01-10 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + + * AUTHORS, README, src/ao_blanklines.c, src/ao_blanklines.h, + src/Makefile.am, src/addons.c: + Add new addon 'Strip trailing blank lines' by Eugene Arshinov, + thanks. + + 2010-01-03 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/ao_tasks.c:
Modified: trunk/geany-plugins/addons/README =================================================================== --- trunk/geany-plugins/addons/README 2010-01-05 23:39:22 UTC (rev 1119) +++ trunk/geany-plugins/addons/README 2010-01-10 13:39:08 UTC (rev 1120) @@ -7,6 +7,7 @@ This plugin adds various small addons to Geany which aren't worth an own plugin but might still useful for people.
+ DocList ^^^^^^^ This addon places a new item in the toolbar and when clicked offers a menu @@ -44,7 +45,14 @@ When double-clicking a word, all occurences of this word are searched and then highlighted (similar to Geany's 'Mark All' Find option).
+Strip trailing blank lines +^^^^^^^^^^^^^^^^^^^^^^^^^^ +This addon removes trailing blank lines from the document when it is +saved. This is useful for filetypes like PHP but unfavorable for +filetypes like C where compilers might warn about a missing trailing +blank line.
+ Downloads ---------
Modified: trunk/geany-plugins/addons/src/Makefile.am =================================================================== --- trunk/geany-plugins/addons/src/Makefile.am 2010-01-05 23:39:22 UTC (rev 1119) +++ trunk/geany-plugins/addons/src/Makefile.am 2010-01-10 13:39:08 UTC (rev 1120) @@ -5,6 +5,7 @@
addons_la_SOURCES = \ addons.h \ + ao_blanklines.h \ ao_doclist.h \ ao_openuri.h \ ao_systray.h \ @@ -12,6 +13,7 @@ ao_markword.h \ ao_tasks.h \ addons.c \ + ao_blanklines.c \ ao_doclist.c \ ao_openuri.c \ ao_systray.c \
Modified: trunk/geany-plugins/addons/src/addons.c =================================================================== --- trunk/geany-plugins/addons/src/addons.c 2010-01-05 23:39:22 UTC (rev 1119) +++ trunk/geany-plugins/addons/src/addons.c 2010-01-10 13:39:08 UTC (rev 1120) @@ -24,6 +24,7 @@
#include "geanyplugin.h"
+#include "ao_blanklines.h" #include "ao_doclist.h" #include "ao_openuri.h" #include "ao_systray.h" @@ -40,7 +41,7 @@
PLUGIN_VERSION_CHECK(165) PLUGIN_SET_INFO(_("Addons"), _("Various small addons for Geany."), VERSION, - "Enrico Tröger, Bert Vermeulen") + "Enrico Tröger, Bert Vermeulen, Eugene Arshinov")
/* Keybinding(s) */ @@ -64,6 +65,7 @@ gboolean enable_systray; gboolean enable_bookmarklist; gboolean enable_markword; + gboolean strip_trailing_blank_lines;
gchar *tasks_token_list; gboolean tasks_scan_all_documents; @@ -85,6 +87,7 @@ static void ao_document_activate_cb(GObject *obj, GeanyDocument *doc, gpointer data); static void ao_document_open_cb(GObject *obj, GeanyDocument *doc, gpointer data); static void ao_document_save_cb(GObject *obj, GeanyDocument *doc, gpointer data); +static void ao_document_before_save_cb(GObject *obj, GeanyDocument *doc, gpointer data); static void ao_document_close_cb(GObject *obj, GeanyDocument *doc, gpointer data); gboolean ao_editor_notify_cb(GObject *object, GeanyEditor *editor, SCNotification *nt, gpointer data); @@ -92,13 +95,14 @@
PluginCallback plugin_callbacks[] = { - { "update-editor-menu", (GCallback) &ao_update_editor_menu_cb, FALSE, NULL }, + { "update-editor-menu", (GCallback) &ao_update_editor_menu_cb, FALSE, NULL }, + { "editor-notify", (GCallback) &ao_editor_notify_cb, TRUE, NULL },
- { "editor-notify", (GCallback) &ao_editor_notify_cb, TRUE, NULL }, { "document-open", (GCallback) &ao_document_open_cb, TRUE, NULL }, { "document-save", (GCallback) &ao_document_save_cb, TRUE, NULL }, { "document-close", (GCallback) &ao_document_close_cb, TRUE, NULL }, { "document-activate", (GCallback) &ao_document_activate_cb, TRUE, NULL }, + { "document-before-save", (GCallback) &ao_document_before_save_cb, TRUE, NULL },
{ NULL, NULL, FALSE, NULL } }; @@ -174,6 +178,14 @@ }
+static void ao_document_before_save_cb(GObject *obj, GeanyDocument *doc, gpointer data) +{ + g_return_if_fail(doc != NULL && doc->is_valid); + + ao_blanklines_on_document_before_save(obj, doc, data); +} + + GtkWidget *ao_image_menu_item_new(const gchar *stock_id, const gchar *label) { GtkWidget *item = gtk_image_menu_item_new_with_label(label); @@ -212,6 +224,8 @@ "addons", "enable_bookmarklist", FALSE); ao_info->enable_markword = utils_get_setting_boolean(config, "addons", "enable_markword", FALSE); + ao_info->strip_trailing_blank_lines = utils_get_setting_boolean(config, + "addons", "strip_trailing_blank_lines", FALSE);
main_locale_init(LOCALEDIR, GETTEXT_PACKAGE); plugin_module_make_resident(geany_plugin); @@ -224,6 +238,8 @@ ao_info->tasks = ao_tasks_new(ao_info->enable_tasks, ao_info->tasks_token_list, ao_info->tasks_scan_all_documents);
+ ao_blanklines_set_enable(ao_info->strip_trailing_blank_lines); + /* setup keybindings */ key_group = plugin_set_key_group(geany_plugin, "addons", KB_COUNT, NULL); keybindings_set_item(key_group, KB_FOCUS_BOOKMARK_LIST, kb_bmlist_activate, @@ -269,6 +285,8 @@ g_object_get_data(G_OBJECT(dialog), "check_bookmarklist")))); ao_info->enable_markword = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( g_object_get_data(G_OBJECT(dialog), "check_markword")))); + ao_info->strip_trailing_blank_lines = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + g_object_get_data(G_OBJECT(dialog), "check_blanklines"))));
g_key_file_load_from_file(config, ao_info->config_file, G_KEY_FILE_NONE, NULL); g_key_file_set_boolean(config, "addons", @@ -282,6 +300,8 @@ g_key_file_set_boolean(config, "addons", "enable_bookmarklist", ao_info->enable_bookmarklist); g_key_file_set_boolean(config, "addons", "enable_markword", ao_info->enable_markword); + g_key_file_set_boolean(config, "addons", "strip_trailing_blank_lines", + ao_info->strip_trailing_blank_lines);
g_object_set(ao_info->doclist, "enable-doclist", ao_info->show_toolbar_doclist_item, NULL); g_object_set(ao_info->openuri, "enable-openuri", ao_info->enable_openuri, NULL); @@ -294,6 +314,7 @@ "scan-all-documents", ao_info->tasks_scan_all_documents, "tokens", ao_info->tasks_token_list, NULL); + ao_blanklines_set_enable(ao_info->strip_trailing_blank_lines);
if (! g_file_test(config_dir, G_FILE_TEST_IS_DIR) && utils_mkdir(config_dir, TRUE) != 0) { @@ -318,6 +339,7 @@ GtkWidget *vbox, *check_doclist, *check_openuri, *check_tasks, *check_systray; GtkWidget *check_bookmarklist, *check_markword, *frame_tasks, *vbox_tasks; GtkWidget *check_tasks_scan_mode, *entry_tasks_tokens, *label_tasks_tokens, *tokens_hbox; + GtkWidget *check_blanklines;
vbox = gtk_vbox_new(FALSE, 6);
@@ -388,6 +410,12 @@ ao_info->enable_markword); gtk_box_pack_start(GTK_BOX(vbox), check_markword, FALSE, FALSE, 3);
+ check_blanklines = gtk_check_button_new_with_label( + _("Strip trailing blank lines")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_blanklines), + ao_info->strip_trailing_blank_lines); + gtk_box_pack_start(GTK_BOX(vbox), check_blanklines, FALSE, FALSE, 3); + g_object_set_data(G_OBJECT(dialog), "check_doclist", check_doclist); g_object_set_data(G_OBJECT(dialog), "check_openuri", check_openuri); g_object_set_data(G_OBJECT(dialog), "check_tasks", check_tasks); @@ -396,6 +424,7 @@ g_object_set_data(G_OBJECT(dialog), "check_systray", check_systray); g_object_set_data(G_OBJECT(dialog), "check_bookmarklist", check_bookmarklist); g_object_set_data(G_OBJECT(dialog), "check_markword", check_markword); + g_object_set_data(G_OBJECT(dialog), "check_blanklines", check_blanklines); g_signal_connect(dialog, "response", G_CALLBACK(ao_configure_response_cb), NULL);
ao_configure_tasks_toggled_cb(GTK_TOGGLE_BUTTON(check_tasks), dialog); @@ -420,6 +449,8 @@ g_object_unref(ao_info->tasks); g_free(ao_info->tasks_token_list);
+ ao_blanklines_set_enable(FALSE); + g_free(ao_info->config_file); g_free(ao_info); }
Added: trunk/geany-plugins/addons/src/ao_blanklines.c =================================================================== --- trunk/geany-plugins/addons/src/ao_blanklines.c (rev 0) +++ trunk/geany-plugins/addons/src/ao_blanklines.c 2010-01-10 13:39:08 UTC (rev 1120) @@ -0,0 +1,92 @@ +/* + * ao_blanklines.c - this file is part of Addons, a Geany plugin + * + * Copyright 2009 Eugene Arshinov earshinov@gmail.com + * + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include "geanyplugin.h" + +#include "addons.h" +#include "ao_blanklines.h" + +static gboolean enabled = FALSE; + +static void editor_strip_trailing_newlines(GeanyEditor *editor) +{ + const gint maxline = sci_get_line_count(editor->sci) - 1; + const gint maxpos = sci_get_line_end_position(editor->sci, maxline); + + gint line, start, end, pos; + gchar ch; + + /* + * Store index of the last non-empty line in `line' and position of the first + * of its trailing spaces in `pos'. If all lines are empty, `line' will + * contain -1, and `pos' will be undefined. If `line' does not contain + * trailing spaces, `pos' will be its end position. + */ + for (line = maxline; line >= 0; line--) + { + start = sci_get_position_from_line(editor->sci, line); + end = sci_get_line_end_position(editor->sci, line); + + /* + * We can't be sure that `geany_data->file_prefs->strip_trailing_spaces' + * setting is set, so we should check for trailing spaces manually. + * Performance overhead of the for loop below is very small anyway, + * so it does not worth checking the setting manually and writing + * additional code. + */ + + for (pos = end-1; pos >= start; pos--) + { + ch = sci_get_char_at(editor->sci, pos); + if (ch != ' ' && ch != '\t') + break; + } + ++pos; + if (pos > start) + break; + } + + if (line == -1 || geany_data->file_prefs->final_new_line) + { + /* leave one newline */ + line++; + pos = sci_get_position_from_line(editor->sci, line); + } + + if (pos < maxpos) + { + /* there are some lines to be removed */ + sci_set_target_start(editor->sci, pos); + sci_set_target_end(editor->sci, maxpos); + sci_replace_target(editor->sci, "", FALSE); + } +} + +void ao_blanklines_set_enable(gboolean enabled_) +{ + enabled = enabled_; +} + +void ao_blanklines_on_document_before_save(GObject *object, GeanyDocument *doc, gpointer data) +{ + if (enabled) + editor_strip_trailing_newlines(doc->editor); +} \ No newline at end of file
Property changes on: trunk/geany-plugins/addons/src/ao_blanklines.c ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native
Added: trunk/geany-plugins/addons/src/ao_blanklines.h =================================================================== --- trunk/geany-plugins/addons/src/ao_blanklines.h (rev 0) +++ trunk/geany-plugins/addons/src/ao_blanklines.h 2010-01-10 13:39:08 UTC (rev 1120) @@ -0,0 +1,30 @@ +/* + * ao_blanklines.h - this file is part of Addons, a Geany plugin + * + * Copyright 2009 Eugene Arshinov earshinov@gmail.com + * + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef __AO_BLANKLINES_H__ +#define __AO_BLANKLINES_H__ + + +void ao_blanklines_set_enable(gboolean enabled_); + +void ao_blanklines_on_document_before_save(GObject *object, GeanyDocument *doc, gpointer data); + +#endif
Property changes on: trunk/geany-plugins/addons/src/ao_blanklines.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native
Modified: trunk/geany-plugins/po/POTFILES.in =================================================================== --- trunk/geany-plugins/po/POTFILES.in 2010-01-05 23:39:22 UTC (rev 1119) +++ trunk/geany-plugins/po/POTFILES.in 2010-01-10 13:39:08 UTC (rev 1120) @@ -8,6 +8,7 @@ addons/src/ao_doclist.c addons/src/ao_bookmarklist.c addons/src/ao_markword.c +addons/src/ao_blanklines.c
#codenav codenav/src/codenavigation.c
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
plugins-commits@lists.geany.org