[PATCH] filediff: Display offset with tabs expanded in the status bar



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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]