diff --git a/src/cursor.d b/src/cursor.d index fe2148c9..7ee7172e 100644 --- a/src/cursor.d +++ b/src/cursor.d @@ -4,8 +4,6 @@ class Cursor { int x, y; int lastX; - int offset; - this() {} this(int x, int y) { diff --git a/src/main.d b/src/main.d index 5aa68c1a..e32a240e 100644 --- a/src/main.d +++ b/src/main.d @@ -7,6 +7,8 @@ import clipboard; import std.stdio; import std.file: readText, exists, isDir; +extern(C) int isatty(int); + void main(string[] args) { string filename = ""; string fileTxt = ""; @@ -24,7 +26,7 @@ void main(string[] args) { } } } else { - if (stdin.size != 0) { + if (!isatty(0)) { foreach (line; stdin.byLine()) { fileTxt ~= line ~ "\n"; } diff --git a/src/view.d b/src/view.d index 25fb3c5e..b12c7363 100644 --- a/src/view.d +++ b/src/view.d @@ -66,6 +66,14 @@ class View { cursor.y = xy[1]; } + int getCharPosition(int lineNum, int visualPosition) { + int numTabs = numOccurences(buf.lines[lineNum].replaceAll(regex("\t"), "\t" ~ emptyString(tabSize-1))[0 .. visualPosition], '\t'); + foreach (i; 0 .. numTabs) { + visualPosition -= tabSize-1; + } + return visualPosition; + } + void cursorUp() { if (cursor.y > 0) { cursor.y--; @@ -126,10 +134,8 @@ class View { } else if (e.key == Key.arrowLeft) { cursorLeft(); } else if (e.key == Key.mouseLeft) { - auto eventX = e.x; cursor.y = e.y + topline; - eventX -= buf.lines[cursor.y][0 .. cursor.x].numOccurences('\t') * (tabSize-1); - cursor.x = eventX - xOffset; + cursor.x = getCharPosition(cursor.y, e.x) - xOffset; if (cursor.y - topline > height-1) { cursor.y = height + topline-1; } @@ -180,7 +186,6 @@ class View { topline = cursor.y - height+1; } - cursor.offset = buf.lines[cursor.y][0 .. cursor.x].numOccurences('\t') * (tabSize-1); } } @@ -219,7 +224,8 @@ class View { if (cursor.y - topline < 0 || cursor.y - topline > height-1) { hideCursor(); } else { - setCursor(cursor.x + xOffset + cursor.offset, cursor.y - topline); + auto voffset = buf.lines[cursor.y][0 .. cursor.x].numOccurences('\t') * (tabSize-1); + setCursor(cursor.x + xOffset + voffset, cursor.y - topline); } sl.display();