aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2013-09-09 05:38:07 +0200
committerMattias Andrée <maandree@operamail.com>2013-09-09 05:38:07 +0200
commit1b903d85d3d590431412efe604a187e699f6ced6 (patch)
tree4d2baaf25ca89683a089c86ca12a5cbe0cb9b4c7 /src
parentderp (diff)
downloadpytagomacs-1b903d85d3d590431412efe604a187e699f6ced6.tar.gz
pytagomacs-1b903d85d3d590431412efe604a187e699f6ced6.tar.bz2
pytagomacs-1b903d85d3d590431412efe604a187e699f6ced6.tar.xz
use a functor for jumping
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rw-r--r--src/editor.py52
1 files changed, 35 insertions, 17 deletions
diff --git a/src/editor.py b/src/editor.py
index 83a964c..a1225bf 100644
--- a/src/editor.py
+++ b/src/editor.py
@@ -43,6 +43,23 @@ def ctrl(key):
return chr(ord(key) - ord('@'))
+class jump(): ## Lowercase
+ '''
+ Create a cursor jump that can either be included in a print statement
+ as a string or invoked
+
+ @param y:int The row, 1 based
+ @param x:int The column, 1 based
+ @string :str|()→void Functor that can be treated as a string for jumping
+ '''
+ def __init__(self, y, x):
+ self.string = '\033[%i;%iH' % (y, x)
+ def __str__(self):
+ return self.string
+ def __call__(self):
+ print(self.string, end = '')
+
+
class TextArea():
'''
GNU Emacs alike text area
@@ -83,13 +100,13 @@ class TextArea():
self.area, self.name, self.text, self.y = area, name, text, y
def draw(self):
- leftside = '\033[%i;%iH\033[%s34m%s:\033[00m' % (self.area.top + self.y, self.area.left, '01;' if self.area.y == self.y else '', self.name)
+ leftside = '%s\033[%s34m%s:\033[00m' % (jump(self.area.top + self.y, self.area.left), '01;' if self.area.y == self.y else '', self.name)
text = (self.text[self.area.offx if self.area.y == self.y else 0:] + ' ' * self.area.areawidth)[:self.area.areawidth]
if (self.area.y == self.y) and (self.area.mark is not None) and (self.area.mark >= 0):
(a, b) = self.area.get_selection(True)
if a != b:
text = text[:a] + ('\033[44;37m%s\033[00m' % text[a : b]) + text[b:]
- print('%s\033[%i;%iH%s' % (leftside, self.area.top + self.y, self.area.left + self.area.innerleft, text), end='')
+ print('%s%s%s' % (leftside, jump(self.area.top + self.y, self.area.left + self.area.innerleft), text), end='')
def copy(self):
if (self.area.mark is not None) and (self.area.mark >= 0) and (self.area.mark != self.area.x):
@@ -99,7 +116,7 @@ class TextArea():
self.area.killring[:] = self.area.killring[1:]
(a, b) = self.area.get_selection(True)
text = self.text[self.area.offx:][:self.area.areawidth][a : b]
- print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft + a, text), end='')
+ print('%s%s' % (jump(self.area.top + self.y, self.area.left + self.area.innerleft + a), text), end='')
self.area.mark = None
return True
else:
@@ -131,7 +148,7 @@ class TextArea():
if self.area.offx > len(self.text):
self.area.offx = max(len(self.text) - self.area.areawidth, 0)
self.area.mark = None
- print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft, ' ' * self.area.areawidth), end='')
+ print('%s%s' % (jump(self.area.top + self.y, self.area.left + self.area.innerleft), ' ' * self.area.areawidth), end='')
self.draw()
return True
removed = b - a
@@ -144,7 +161,7 @@ class TextArea():
text = self.text[self.area.offx:][:self.area.areawidth]
a = limit(0, self.area.x - self.area.offx, self.area.areawidth)
left = self.area.left + self.area.innerleft + a
- print('\033[%i;%iH%s\033[%i;%iH' % (self.area.top + self.y, left, text[a:] + ' ' * removed, self.area.top + self.y, left), end='')
+ print('%s%s%s' % (jump(self.area.top + self.y, left), text[a:] + ' ' * removed, jump(self.area.top + self.y, left)), end='')
return True
def erase(self):
@@ -156,7 +173,7 @@ class TextArea():
if self.area.x < self.area.offx:
self.area.offx = max(self.area.offx - self.area.areawidth, 0)
self.draw()
- print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='')
+ jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)()
self.delete()
return True
@@ -171,9 +188,9 @@ class TextArea():
self.area.x += len(yanked)
if self.area.x > self.area.offx + self.area.areawidth:
self.area.offx = len(self.text) - self.area.areawidth
- print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft, ' ' * self.area.areawidth), end='')
+ print('%s%s' % (jump(self.area.top + self.y, self.area.left + self.area.innerleft), ' ' * self.area.areawidth), end='')
self.draw()
- print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='')
+ jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)()
return True
def yank_cycle(self):
@@ -197,14 +214,14 @@ class TextArea():
self.area.offx = self.area.x - self.area.areawidth
self.area.offx = max(self.area.offx, 0)
self.draw()
- print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='')
+ jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)()
else:
print('\033[%iD' % -delta, end='')
elif delta > 0:
if self.area.x - self.area.offx > self.area.areawidth:
self.area.offx = self.area.x
self.draw()
- print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft), end='')
+ jump(self.area.top + self.y, self.area.left + self.area.innerleft)()
else:
print('\033[%iC' % delta, end='')
return delta != 0
@@ -232,14 +249,15 @@ class TextArea():
if not override:
y = self.area.top + self.y
xi = self.area.left + self.area.innerleft
- print('\033[%i;%iH\033[%iP' % (y, xi + self.area.areawidth - len(insert), len(insert)), end='')
- print('\033[%i;%iH\033[%i@' % (y, xi + oldx - self.area.offx, len(insert)), end='')
+ print('%s\033[%iP' % (jump(y, xi + self.area.areawidth - len(insert)), len(insert)), end='')
+ print('%s\033[%i@' % (jump(y, xi + oldx - self.area.offx), len(insert)), end='')
print(insert, end='')
else:
self.area.offx = len(self.text) - self.area.areawidth
- print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft, ' ' * self.area.areawidth), end='')
+ jump(self.area.top + self.y, self.area.left + self.area.innerleft)
+ print(' ' * self.area.areawidth, end='')
self.draw()
- print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='')
+ jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)()
def insert(self, insert):
self.override(insert, False)
@@ -255,7 +273,7 @@ class TextArea():
txt = ' (' + text + ') '
y = self.top + self.y
x = self.left + self.innerleft + self.x - self.offx
- print('\033[%i;%iH\033[7m%s-\033[27m\033[%i;%iH' % (self.height - 1, 1, txt + '-' * (self.width - len(txt)), y, x), end='')
+ print('%s\033[7m%s-\033[27m%s' % (jump(self.height - 1, 1), txt + '-' * (self.width - len(txt)), jump(y, x)), end='')
self.last_status = text
def alert(self, text):
@@ -270,7 +288,7 @@ class TextArea():
else:
y = self.top + self.y
x = self.left + self.innerleft + self.x - self.offx
- print('\033[%i;%iH\033[2K%s\033[%i;%iH' % (self.height, 1, text, y, x), end='')
+ print('%s\033[2K%s%s' % (jump(self.height, 1), text, jump(y, x)), end='')
self.alerted = True
self.last_alert = text
@@ -311,7 +329,7 @@ class TextArea():
if self.y != oldy:
self.lines[oldy].draw()
self.lines[self.y].draw()
- print('\033[%i;%iH' % (self.top + self.y, self.left + self.innerleft + self.x - self.offx), end='')
+ jump(self.top + self.y, self.left + self.innerleft + self.x - self.offx)()
(oldy, oldx, oldmark) = (self.y, self.x, self.mark)
if edited:
edited = False