parent
b145f252c8
commit
2a7fb0d165
|
@ -11,7 +11,7 @@ from point2 import Point
|
||||||
#import mode_replace, mode_xml, mode_console, mode_sh, mode_text, mode_which
|
#import mode_replace, mode_xml, mode_console, mode_sh, mode_text, mode_which
|
||||||
#import mode_mutt, mode_sql, mode_javascript, mode_diff, mode_blame, mode_tt
|
#import mode_mutt, mode_sql, mode_javascript, mode_diff, mode_blame, mode_tt
|
||||||
import mode2, mode_mini, mode_python, mode_perl, mode_search, mode_replace
|
import mode2, mode_mini, mode_python, mode_perl, mode_search, mode_replace
|
||||||
import mode_xml
|
import mode_xml, mode_life
|
||||||
|
|
||||||
def run(buffers, jump_to_line=None, init_mode=None):
|
def run(buffers, jump_to_line=None, init_mode=None):
|
||||||
# save terminal state so we can restore it when the program exits
|
# save terminal state so we can restore it when the program exits
|
||||||
|
@ -94,6 +94,7 @@ class Application(object):
|
||||||
# 'text': mode_text.Text,
|
# 'text': mode_text.Text,
|
||||||
# 'which': mode_which.Which,
|
# 'which': mode_which.Which,
|
||||||
'xml': mode_xml.XML,
|
'xml': mode_xml.XML,
|
||||||
|
'life': mode_life.Life,
|
||||||
# 'mutt': mode_mutt.Mutt,
|
# 'mutt': mode_mutt.Mutt,
|
||||||
# 'sql': mode_sql.Sql,
|
# 'sql': mode_sql.Sql,
|
||||||
# 'javascript': mode_javascript.Javascript,
|
# 'javascript': mode_javascript.Javascript,
|
||||||
|
@ -745,7 +746,7 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
# we will support using +19 as the first argument to indicate opening the
|
# we will support using +19 as the first argument to indicate opening the
|
||||||
# first file on line 19 (same as -g 19 or --goto 19)
|
# first file on line 19 (same as -g 19 or --goto 19)
|
||||||
if len(sys.argv) > 1 and args[0].startswith('+'):
|
if len(args) > 0 and args[0].startswith('+'):
|
||||||
opts.goto = int(args[0][1:])
|
opts.goto = int(args[0][1:])
|
||||||
args = args[1:]
|
args = args[1:]
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
import re, sets, string, sys
|
||||||
|
import color, commands, default, lex2, method, mode2, regex, tab2
|
||||||
|
from point2 import Point
|
||||||
|
from lex2 import Grammar, ConstantRule, PatternRule, ContextPatternRule, \
|
||||||
|
RegionRule, DualRegionRule
|
||||||
|
|
||||||
|
class Life(mode2.Fundamental):
|
||||||
|
def __init__(self, w):
|
||||||
|
mode2.Fundamental.__init__(self, w)
|
||||||
|
self.add_action(LifeShiftLeft())
|
||||||
|
self.add_action(LifeShiftRight())
|
||||||
|
self.add_action_and_bindings(LifeDoTurn(), ('M-RETURN',))
|
||||||
|
for c in string.letters + string.digits + string.punctuation:
|
||||||
|
self.add_action_and_bindings(LifeInsertString(c), c)
|
||||||
|
self.token = 'o'
|
||||||
|
w.buffer.set_lines(self.normalize_board(), force=True)
|
||||||
|
w.goto_beginning()
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
return "Life"
|
||||||
|
def normalize_board(self):
|
||||||
|
lines = self.window.buffer.lines
|
||||||
|
s = ' ' * (self.window.width-1)
|
||||||
|
newlines = [s] * (self.window.height-1)
|
||||||
|
for i in range(0, min(len(lines), (self.window.height-1))):
|
||||||
|
chars = [' '] * (self.window.width-1)
|
||||||
|
for j in range(0, min(len(lines[i]), (self.window.height-1))):
|
||||||
|
if lines[i][j] != ' ':
|
||||||
|
chars[j] = self.token
|
||||||
|
newlines[i] = ''.join(chars)
|
||||||
|
return newlines
|
||||||
|
|
||||||
|
class LifeShiftLeft(method.Method):
|
||||||
|
def _execute(self, w, **vargs):
|
||||||
|
newlines = list(w.buffer.lines)
|
||||||
|
for i in range(0, len(newlines)):
|
||||||
|
newlines[i] = newlines[i][10:] + newlines[i][:10]
|
||||||
|
w.buffer.set_lines(newlines)
|
||||||
|
w.goto_beginning()
|
||||||
|
class LifeShiftRight(method.Method):
|
||||||
|
def _execute(self, w, **vargs):
|
||||||
|
newlines = list(w.buffer.lines)
|
||||||
|
for i in range(0, len(newlines)):
|
||||||
|
newlines[i] = newlines[i][-10:] + newlines[i][:-10]
|
||||||
|
w.buffer.set_lines(newlines)
|
||||||
|
w.goto_beginning()
|
||||||
|
|
||||||
|
# insert text
|
||||||
|
class LifeInsertString(method.Method):
|
||||||
|
_is_method = False
|
||||||
|
def __init__(self, s):
|
||||||
|
self.name = "life-insert-string-%s" % (s)
|
||||||
|
self.args = []
|
||||||
|
self.help = "Insert %r into the current buffer." % s
|
||||||
|
self.string = s
|
||||||
|
def _execute(self, w, **vargs):
|
||||||
|
if w.cursor_char() == '\n':
|
||||||
|
return
|
||||||
|
w.right_delete()
|
||||||
|
w.insert_string_at_cursor(w.mode.token)
|
||||||
|
|
||||||
|
class LifeDoTurn(method.Method):
|
||||||
|
'''Run a turn of life on the current buffer'''
|
||||||
|
def _execute(self, w, **vargs):
|
||||||
|
lines = w.mode.normalize_board()
|
||||||
|
newlines = list(lines)
|
||||||
|
w.buffer.set_lines(lines)
|
||||||
|
w.goto_beginning()
|
||||||
|
for y in range(0, (w.height-1)):
|
||||||
|
line = list(newlines[y])
|
||||||
|
for x in range(0, (w.width-1)):
|
||||||
|
on = lines[y][x] != ' '
|
||||||
|
count = 0
|
||||||
|
for (i,j) in ((-1, -1), (-1, 0), (-1, 1), (0, 1),
|
||||||
|
(0, -1), (1, -1), (1, 0), (1, 1)):
|
||||||
|
y2 = (y + i) % (w.height-2)
|
||||||
|
x2 = (x + j) % (w.width-2)
|
||||||
|
if lines[y2][x2] != ' ':
|
||||||
|
count += 1
|
||||||
|
if count == 3 or count == 2 and on:
|
||||||
|
line[x] = w.mode.token
|
||||||
|
else:
|
||||||
|
line[x] = ' '
|
||||||
|
newlines[y] = ''.join(line)
|
||||||
|
w.buffer.set_lines(newlines)
|
||||||
|
w.goto_beginning()
|
|
@ -112,7 +112,7 @@ class PerlTabber(tab2.StackTabber):
|
||||||
if not highlighter.tokens[y]:
|
if not highlighter.tokens[y]:
|
||||||
return False
|
return False
|
||||||
t = highlighter.tokens[y][0]
|
t = highlighter.tokens[y][0]
|
||||||
return t.name == 'keyword' and t.string == 'sub':
|
return t.name == 'keyword' and t.string == 'sub'
|
||||||
def _handle_open_token(self, currlvl, y, i):
|
def _handle_open_token(self, currlvl, y, i):
|
||||||
currlvl = tab2.StackTabber._handle_open_token(self, currlvl, y, i)
|
currlvl = tab2.StackTabber._handle_open_token(self, currlvl, y, i)
|
||||||
return currlvl
|
return currlvl
|
||||||
|
|
|
@ -128,7 +128,7 @@ class PythonTabber(tab2.Tabber):
|
||||||
if not highlighter.tokens[y]:
|
if not highlighter.tokens[y]:
|
||||||
return False
|
return False
|
||||||
t = highlighter.tokens[y][0]
|
t = highlighter.tokens[y][0]
|
||||||
return t.name == 'keyword' and t.string == 'def':
|
return t.name == 'keyword' and t.string == 'def'
|
||||||
|
|
||||||
def __init__(self, m):
|
def __init__(self, m):
|
||||||
tab2.Tabber.__init__(self, m)
|
tab2.Tabber.__init__(self, m)
|
||||||
|
|
Loading…
Reference in New Issue