SF.net SVN: geany:[4025] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Fri Jul 24 15:44:15 UTC 2009
Revision: 4025
http://geany.svn.sourceforge.net/geany/?rev=4025&view=rev
Author: ntrel
Date: 2009-07-24 15:44:14 +0000 (Fri, 24 Jul 2009)
Log Message:
-----------
Add 'Reflow lines/paragraph' keybinding, defaults to Ctrl-J.
Heavily based on a patch by Eugene Arshinov (thanks).
Add sci_lines_split(), sci_lines_join(), sci_text_width(),
editor_strip_line_trailing_spaces().
Modified Paths:
--------------
trunk/ChangeLog
trunk/THANKS
trunk/doc/geany.html
trunk/doc/geany.txt
trunk/src/editor.c
trunk/src/editor.h
trunk/src/keybindings.c
trunk/src/keybindings.h
trunk/src/sciwrappers.c
trunk/src/sciwrappers.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/ChangeLog 2009-07-24 15:44:14 UTC (rev 4025)
@@ -4,6 +4,13 @@
Use full styleset_foo[_init] function name as argument to
init_styleset_case() and styleset_case() macros so it's easier to
understand the code.
+ * src/keybindings.c, src/keybindings.h, src/sciwrappers.c,
+ src/sciwrappers.h, src/editor.c, src/editor.h, THANKS,
+ doc/geany.txt, doc/geany.html:
+ Add 'Reflow lines/paragraph' keybinding, defaults to Ctrl-J.
+ Heavily based on a patch by Eugene Arshinov (thanks).
+ Add sci_lines_split(), sci_lines_join(), sci_text_width(),
+ editor_strip_line_trailing_spaces().
2009-07-24 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/THANKS
===================================================================
--- trunk/THANKS 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/THANKS 2009-07-24 15:44:14 UTC (rev 4025)
@@ -65,7 +65,7 @@
Simon Treny <simon(dot)treny(at)free(dot)fr> - Documents sidebar stock icons patch
Elias Pschernig <elias(at)users(dot)sourceforge(dot)net> - Recent Projects menu patch
Jesse Mayes <plasmasheep(at)gmail(dot)com> - Tango'ish Save All icon
-Eugene Arshinov <earshinov(at)gmail(dot)com> - Reload color schemes via menu patch
+Eugene Arshinov <earshinov(at)gmail(dot)com> - Reload color schemes, split lines KB patches
Translators:
------------
Modified: trunk/doc/geany.html
===================================================================
--- trunk/doc/geany.html 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/doc/geany.html 2009-07-24 15:44:14 UTC (rev 4025)
@@ -6,7 +6,7 @@
<meta name="generator" content="Docutils 0.4: http://docutils.sourceforge.net/" />
<title>Geany</title>
<meta name="authors" content="Enrico Tröger Nick Treleaven Frank Lanitz" />
-<meta name="date" content="2009-07-09" />
+<meta name="date" content="2009-07-14" />
<style type="text/css">
/*
@@ -139,7 +139,7 @@
<br />Nick Treleaven
<br />Frank Lanitz</td></tr>
<tr><th class="docinfo-name">Date:</th>
-<td>2009-07-09</td></tr>
+<td>2009-07-14</td></tr>
<tr><th class="docinfo-name">Version:</th>
<td>0.18</td></tr>
</tbody>
@@ -2956,6 +2956,11 @@
line (if there is no selection) to the
embedded Terminal (VTE).</td>
</tr>
+<tr><td>Reflow lines/paragraph</td>
+<td> </td>
+<td>Reformat selected lines or current paragraph,
+breaking lines at the long line marker.</td>
+</tr>
<tr><td><strong>Settings</strong></td>
<td> </td>
<td> </td>
@@ -4983,7 +4988,7 @@
<div class="footer">
<hr class="footer" />
<a class="reference" href="geany.txt">View document source</a>.
-Generated on: 2009-07-14 11:22 UTC.
+Generated on: 2009-07-24 15:29 UTC.
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
</div>
Modified: trunk/doc/geany.txt
===================================================================
--- trunk/doc/geany.txt 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/doc/geany.txt 2009-07-24 15:44:14 UTC (rev 4025)
@@ -2678,7 +2678,10 @@
line (if there is no selection) to the
embedded Terminal (VTE).
+Reflow lines/paragraph Reformat selected lines or current paragraph,
+ breaking lines at the long line marker.
+
**Settings**
Preferences Ctrl-Alt-P Opens preferences dialog.
Modified: trunk/src/editor.c
===================================================================
--- trunk/src/editor.c 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/src/editor.c 2009-07-24 15:44:14 UTC (rev 4025)
@@ -101,7 +101,6 @@
static void close_block(GeanyEditor *editor, gint pos);
static void editor_highlight_braces(GeanyEditor *editor, gint cur_pos);
static void editor_auto_latex(GeanyEditor *editor, gint pos);
-static void editor_strip_line_trailing_spaces(GeanyEditor *editor, gint line);
void editor_snippets_free(void)
@@ -4307,7 +4306,7 @@
}
-static void editor_strip_line_trailing_spaces(GeanyEditor *editor, gint line)
+void editor_strip_line_trailing_spaces(GeanyEditor *editor, gint line)
{
gint line_start = sci_get_position_from_line(editor->sci, line);
gint line_end = sci_get_line_end_position(editor->sci, line);
Modified: trunk/src/editor.h
===================================================================
--- trunk/src/editor.h 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/src/editor.h 2009-07-24 15:44:14 UTC (rev 4025)
@@ -100,7 +100,7 @@
gboolean show_white_space;
gboolean show_indent_guide;
gboolean show_line_endings;
- gint long_line_type;
+ gint long_line_type; /* 0 - line, 1 - background, 2 - none */
gint long_line_column;
gchar *long_line_color;
gboolean show_markers_margin; /* view menu */
@@ -251,6 +251,8 @@
void editor_replace_spaces(GeanyEditor *editor);
+void editor_strip_line_trailing_spaces(GeanyEditor *editor, gint line);
+
void editor_strip_trailing_spaces(GeanyEditor *editor);
void editor_ensure_final_newline(GeanyEditor *editor);
Modified: trunk/src/keybindings.c
===================================================================
--- trunk/src/keybindings.c 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/src/keybindings.c 2009-07-24 15:44:14 UTC (rev 4025)
@@ -320,6 +320,8 @@
GDK_3, GDK_CONTROL_MASK, "edit_sendtocmd3", _("Send to Custom Command 3"), NULL);
keybindings_set_item(group, GEANY_KEYS_FORMAT_SENDTOVTE, cb_func_format_action,
0, 0, "edit_sendtovte", _("Send Selection to Terminal"), LW(send_selection_to_vte1));
+ keybindings_set_item(group, GEANY_KEYS_FORMAT_REFLOWPARAGRAPH, cb_func_format_action,
+ GDK_j, GDK_CONTROL_MASK, "format_reflowparagraph", _("Reflow lines/paragraph"), NULL);
group = ADD_KB_GROUP(INSERT, _("Insert"));
@@ -1910,6 +1912,145 @@
}
+static void join_lines(GeanyEditor *editor)
+{
+ gint start, end, i;
+
+ start = sci_get_line_from_position(editor->sci,
+ sci_get_selection_start(editor->sci));
+ end = sci_get_line_from_position(editor->sci,
+ sci_get_selection_end(editor->sci));
+
+ /* if there is only one line in selection, join it with the following one */
+ if (end == start)
+ end = start + 1;
+
+ /*
+ * remove trailing spaces for every line except the last one
+ * so that these spaces won't appear within text after joining
+ */
+ for (i = start; i < end; i++)
+ editor_strip_line_trailing_spaces(editor, i);
+
+ /* remove starting spaces from second and following lines due to the same reason */
+ for (i = start+1; i <= end; i++)
+ sci_set_line_indentation(editor->sci, i, 0);
+
+ /*
+ * SCI_LINESJOIN automatically adds spaces between joined lines, including
+ * empty ones. We should drop empty lines if we want only one space to be
+ * inserted (see also example below). I don't think we should care of that.
+ */
+
+ sci_target_start(editor->sci,
+ sci_get_position_from_line(editor->sci, start));
+ sci_target_end(editor->sci,
+ sci_get_position_from_line(editor->sci, end));
+ sci_lines_join(editor->sci);
+
+ /*
+ * Example: joining
+ *
+ * [TAB]if (something_wrong)
+ * [TAB]{
+ * [TAB][TAB]
+ * [TAB][TAB]exit(1);[SPACE][SPACE]
+ * [TAB]}[SPACE]
+ *
+ * gives
+ *
+ * [TAB]if (something_wrong) { exit(1); }[SPACE]
+ */
+}
+
+
+static void split_lines(GeanyEditor *editor)
+{
+ gint start, indent, linescount, i;
+
+ /* do nothing if long line marker is disabled */
+ if (editor_prefs.long_line_type == 2)
+ return;
+
+ start = sci_get_line_from_position(editor->sci,
+ sci_get_selection_start(editor->sci));
+
+ /*
+ * If several lines are selected, first join them.
+ * This allows to reformat text paragraphs easily.
+ */
+ if (sci_get_lines_selected(editor->sci) > 1)
+ join_lines(editor);
+
+ /*
+ * If this line is short enough, just return
+ */
+ if (editor_prefs.long_line_column >
+ sci_get_line_end_position(editor->sci, start) -
+ sci_get_position_from_line(editor->sci, start))
+ {
+ return;
+ }
+
+ /*
+ * We have to manipulate line indentation so that indentation
+ * of the resulting lines would be consistent. For example,
+ * the result of splitting "[TAB]very long content":
+ *
+ * +-------------+-------------+
+ * | proper | wrong |
+ * +-------------+-------------+
+ * | [TAB]very | [TAB]very |
+ * | [TAB]long | long |
+ * | [TAB]content| content |
+ * +-------------+-------------+
+ */
+ indent = sci_get_line_indentation(editor->sci, start);
+ sci_set_line_indentation(editor->sci, start, 0);
+
+ /*
+ * Use sci_get_line_count() to determine how many new lines
+ * appeared during splitting. SCI_LINESSPLIT should better return
+ * this value itself...
+ */
+ sci_target_from_selection(editor->sci);
+ linescount = sci_get_line_count(editor->sci);
+ sci_lines_split(editor->sci,
+ (editor_prefs.long_line_column - indent) *
+ sci_text_width(editor->sci, STYLE_DEFAULT, " "));
+ linescount = sci_get_line_count(editor->sci) - linescount;
+
+ /* Fix indentation. */
+ for (i = start; i <= start + linescount; i++)
+ sci_set_line_indentation(editor->sci, i, indent);
+}
+
+
+static void reflow_paragraph(GeanyEditor *editor)
+{
+ ScintillaObject *sci = editor->sci;
+ gboolean sel;
+
+ sci_start_undo_action(sci);
+ sel = sci_has_selection(sci);
+ if (!sel)
+ {
+ gint line, pos;
+
+ keybindings_send_command(GEANY_KEY_GROUP_SELECT, GEANY_KEYS_SELECT_PARAGRAPH);
+ /* deselect last line break */
+ pos = sci_get_selection_end(sci);
+ line = sci_get_line_from_position(sci, pos);
+ pos = sci_get_line_end_position(sci, line - 1);
+ sci_set_selection_end(sci, pos);
+ }
+ split_lines(editor);
+ if (!sel)
+ sci_set_anchor(sci, -1);
+ sci_end_undo_action(sci);
+}
+
+
/* common function for format keybindings, only valid when scintilla has focus. */
static void cb_func_format_action(guint key_id)
{
@@ -1964,6 +2105,9 @@
case GEANY_KEYS_FORMAT_SENDTOVTE:
on_send_selection_to_vte1_activate(NULL, NULL);
break;
+ case GEANY_KEYS_FORMAT_REFLOWPARAGRAPH:
+ reflow_paragraph(doc->editor);
+ break;
}
}
Modified: trunk/src/keybindings.h
===================================================================
--- trunk/src/keybindings.h 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/src/keybindings.h 2009-07-24 15:44:14 UTC (rev 4025)
@@ -174,6 +174,7 @@
GEANY_KEYS_FORMAT_SENDTOCMD2,
GEANY_KEYS_FORMAT_SENDTOCMD3,
GEANY_KEYS_FORMAT_SENDTOVTE,
+ GEANY_KEYS_FORMAT_REFLOWPARAGRAPH,
GEANY_KEYS_FORMAT_COUNT
};
Modified: trunk/src/sciwrappers.c
===================================================================
--- trunk/src/sciwrappers.c 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/src/sciwrappers.c 2009-07-24 15:44:14 UTC (rev 4025)
@@ -46,8 +46,9 @@
gchar tmp_str[15];
gint len = SSM(sci, SCI_GETLINECOUNT, 0, 0);
gint width;
+
g_snprintf(tmp_str, 15, "_%d%d", len, extra_width);
- width = SSM(sci, SCI_TEXTWIDTH, STYLE_LINENUMBER, (sptr_t) tmp_str);
+ width = sci_text_width(sci, STYLE_LINENUMBER, tmp_str);
SSM (sci, SCI_SETMARGINWIDTHN, 0, width);
SSM (sci, SCI_SETMARGINSENSITIVEN, 0, FALSE); /* use default behaviour */
}
@@ -709,8 +710,12 @@
}
+/* removes a selection if pos < 0 */
void sci_set_anchor(ScintillaObject *sci, gint pos)
{
+ if (pos < 0)
+ pos = sci_get_current_position(sci);
+
SSM(sci, SCI_SETANCHOR, pos, 0);
}
@@ -863,7 +868,7 @@
}
- void sci_target_start(ScintillaObject *sci, gint start)
+void sci_target_start(ScintillaObject *sci, gint start)
{
SSM(sci, SCI_SETTARGETSTART, start, 0);
}
@@ -1084,4 +1089,17 @@
return SSM(sci, SCI_POSITIONAFTER, start, 0);
}
+void sci_lines_split(ScintillaObject *sci, gint pixelWidth)
+{
+ SSM(sci, SCI_LINESSPLIT, pixelWidth, 0);
+}
+void sci_lines_join(ScintillaObject *sci)
+{
+ SSM(sci, SCI_LINESJOIN, 0, 0);
+}
+
+gint sci_text_width(ScintillaObject *sci, gint styleNumber, const gchar *text)
+{
+ return SSM(sci, SCI_TEXTWIDTH, styleNumber, (sptr_t) text);
+}
Modified: trunk/src/sciwrappers.h
===================================================================
--- trunk/src/sciwrappers.h 2009-07-24 14:31:43 UTC (rev 4024)
+++ trunk/src/sciwrappers.h 2009-07-24 15:44:14 UTC (rev 4025)
@@ -59,7 +59,7 @@
gint sci_get_col_from_position (ScintillaObject* sci, gint position);
gint sci_get_line_from_position (ScintillaObject* sci, gint position);
-gint sci_get_position_from_line (ScintillaObject* sci, gint line );
+gint sci_get_position_from_line (ScintillaObject* sci, gint line);
gint sci_get_current_position (ScintillaObject* sci);
void sci_set_current_position (ScintillaObject* sci, gint position, gboolean scroll_to_caret);
void sci_set_current_line (ScintillaObject* sci, gint line);
@@ -176,4 +176,8 @@
gint sci_get_target_end (ScintillaObject *sci);
gint sci_get_position_after (ScintillaObject *sci, gint start);
+void sci_lines_split (ScintillaObject *sci, gint pixelWidth);
+void sci_lines_join (ScintillaObject *sci);
+gint sci_text_width (ScintillaObject *sci, int styleNumber, const char * text);
+
#endif
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