From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason at zx2c4.com (Jason A. Donenfeld) Date: Tue, 30 Oct 2012 10:56:33 -0600 Subject: [PATCH 2/2] bugfix: make ss-diff correctly handle tab expansion In-Reply-To: <20121030145653.GB378591@plenz.com> References: <1351601762-953642-1-git-send-email-plenz@cis.fu-berlin.de> <1351601762-953642-3-git-send-email-plenz@cis.fu-berlin.de> <20121030145653.GB378591@plenz.com> Message-ID: I haven't reviewed this carefully yet, but off hand, it seems like a tab is always between 1 and 8 spaces long. Let the first column be column 1, and any column be column C. Then, if C % 8 == 1, spaces := 8 if C % 8 == 2, spaces := 7 if C % 8 == 3, spaces := 6 if C % 8 == 4, spaces := 5 if C % 8 == 5, spaces := 4 if C % 8 == 6, spaces := 3 if C % 8 == 7, spaces := 2 if C % 8 == 0, spaces := 1 This is the intuitive approach visually confirmed by mucking around inside of VIM. Now let's play with it for 0 indexed columns. We can just rotate: if C % 8 == 0, spaces := 8 if C % 8 == 1, spaces := 7 if C % 8 == 2, spaces := 6 if C % 8 == 3, spaces := 5 if C % 8 == 4, spaces := 4 if C % 8 == 5, spaces := 3 if C % 8 == 6, spaces := 2 if C % 8 == 7, spaces := 1 The formula is then just: 8 - ( C % 8 ) Which should be a pretty simple way of calculating it, since "the 0-based column we're at" is just the current length. Doing it this way, you don't have to hard code the initial space, since m % n < n.