This patch adds to the filediff status bar the offset in the current
line, considering the tab width.  Currently, the offset considers only
one column for a tab.  The offset with expanded tabs computes how many
columns each really takes.  For example, with a tab width of 8 and the
cursor at the end of this line:

<tab><tab>hello

the offset with expanded tabs will be of 22.  The two tabs account for
16, "hello" for 5, but since the offset is 1-based, the total is 22.

If the line is:

hello<tab>

the offset with expanded tabs will be of 9.

I would need help with the translations though.  I have updated en_CA
(the one I'm using), but I think they all need to be updated as well to
add the additional %i somewhere.  Otherwise, the number of format
specifiers in the format strings will not match the number of passed
values, and Python will complain.
---
 meld/filediff.py | 26 ++++++++++++++++++++++++--
 po/en_CA.po      |  4 ++--
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/meld/filediff.py b/meld/filediff.py
index 12a5678c..ef8af6ef 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -74,6 +74,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
 
     __gsettings_bindings__ = (
         ('ignore-blank-lines', 'ignore-blank-lines'),
+        ('indent-width', 'tab-width'),
     )
 
     ignore_blank_lines = GObject.property(
@@ -83,6 +84,13 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         default=False,
     )
 
+    tab_width = GObject.property(
+        type=int,
+        nick="Tab width",
+        blurb="Width of a tab character",
+        default=8,
+    )
+
     differ = Differ
 
     keylookup = {
@@ -310,7 +318,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
     # Abbreviations for insert and overwrite that fit in the status bar
     _insert_overwrite_text = (_("INS"), _("OVR"))
     # Abbreviation for line, column so that it will fit in the status bar
-    _line_column_text = _("Ln %i, Col %i")
+    _line_column_text = _("Ln %i, Col %i (%i)")
 
     def on_cursor_position_changed(self, buf, pspec, force=False):
         pane = self.textbuffer.index(buf)
@@ -323,8 +331,22 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         offset = cursor_it.get_line_offset()
         line = cursor_it.get_line()
 
+        tab_width = self.props.tab_width
+        offset_tabs_expanded = 0
+
+        # Compute the offset with tabs expanded
+        cursor_it.backward_chars(offset)
+        for i in range(offset):
+            if cursor_it.get_char() == '\t':
+                offset_tabs_expanded += tab_width
+                offset_tabs_expanded -= offset_tabs_expanded % tab_width
+            else:
+                offset_tabs_expanded += 1
+
+            cursor_it.forward_char()
+
         insert_overwrite = self._insert_overwrite_text[self.textview_overwrite]
-        line_column = self._line_column_text % (line + 1, offset + 1)
+        line_column = self._line_column_text % (line + 1, offset + 1, 
offset_tabs_expanded + 1)
         self.status_info_labels[0].set_text(insert_overwrite)
         self.status_info_labels[1].set_text(line_column)
 
diff --git a/po/en_CA.po b/po/en_CA.po
index 6327ded1..c7e8e6ac 100644
--- a/po/en_CA.po
+++ b/po/en_CA.po
@@ -151,8 +151,8 @@ msgstr "INS,OVR"
 #. Abbreviation for line, column so that it will fit in the status bar
 #: filediff.py:216
 #, python-format
-msgid "Ln %i, Col %i"
-msgstr "Ln %i, Col %i"
+msgid "Ln %i, Col %i (%i)"
+msgstr "Ln %i, Col %i (%i)"
 
 #: filediff.py:274
 #, python-format
-- 
2.12.2

_______________________________________________
meld-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/meld-list

Reply via email to