diff --git a/highlight.py b/highlight.py index 2966800..8beb7ec 100644 --- a/highlight.py +++ b/highlight.py @@ -101,7 +101,7 @@ class Highlighter: # tokens ahead of where it needs to be #data = self.mode.window.buffer.make_string() #self.mode.lexer.lex(data, start_offset) - if len(self.tokens) > i: + if self.tokens: buf_index = max(self.tokens[i].start - 100, 0) else: buf_index = 0 diff --git a/method.py b/method.py index 1fb9b36..aff7eea 100644 --- a/method.py +++ b/method.py @@ -933,6 +933,66 @@ class SvnBlame(Method): else: w.application.set_error("There was an error (%s)" % (status)) +class CvsStatus(Method): + regex1 = re.compile('^File: (.+?) +?\tStatus: (.*?)$') + regex2 = re.compile('^ Working revision:\t([0-9\.]+)$') + regex3 = re.compile('^ Repository revision:\t([0-9\.]+)\t(.*)$') + regex4 = re.compile('^ Sticky Tag:\t\t\((.*)\)$') + regex5 = re.compile('^ Sticky Date:\t\t\((.*)\)$') + regex6 = re.compile('^ Sticky Options:\t\((.*)\)$') + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.application.set_error("Buffer has no corresponding file") + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs status %r" % path + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if status != 0: + w.application.set_error("Problems with CVS status: %d" % status) + return + + lines = data.split('\n') + + if lines[0].startswith('cvs status: nothing known about '): + w.application.set_error('File is not under CVS control') + return + + m = self.regex1.match(lines[1]) + assert m, "regex1 %r" % lines[1] + ffile = m.group(1) + fstatus = m.group(2) + + m = self.regex2.match(lines[3]) + assert m, "regex2 %r" % lines[3] + wrev = m.group(1) + + m = self.regex3.match(lines[4]) + assert m, "regex3 %r" % lines[4] + rrev = m.group(1) + rpath = m.group(2) + + m = self.regex4.match(lines[5]) + assert m, "regex4 %r" % lines[5] + stag = m.group(1) + + m = self.regex5.match(lines[6]) + assert m, "regex5 %r" % lines[6] + sdate = m.group(1) + + m = self.regex6.match(lines[7]) + assert m, "regex6 %r" % lines[7] + soptions = m.group(1) + + w.application.set_error('%s %s %s/%s [%s|%s|%s]' % \ + (ffile, fstatus, wrev, rrev, stag, sdate, soptions)) + class CvsDiff(Method): '''diff the current file with the version in CVS''' def _execute(self, w, **vargs): @@ -949,6 +1009,72 @@ class CvsDiff(Method): (status, data) = commands.getstatusoutput(cmd) status = status >> 8 + if status == 0: + w.application.set_error("No difference found") + else: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.application.set_error("Differences were found") +class CvsDiff2(Method): + '''diff the current file with the version in CVS''' + rev_regex = re.compile('^[0-9]+\.[0-9]+$') + def _args(self): + return [Argument("revision", type=type(""), prompt="Old Revision: ")] + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.application.set_error("Buffer has no corresponding file") + return + + rev = vargs['revision'] + if not self.rev_regex.match(rev): + w.application.set_error("Could not parse revision: %r" % rev) + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs diff -r %s -u %r" % (rev, path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if status == 0: + w.application.set_error("No difference found") + else: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.application.set_error("Differences were found") +class CvsDiff3(Method): + '''diff the current file with the version in CVS''' + rev_regex = re.compile('^[0-9]+\.[0-9]+$') + def _args(self): + return [Argument("revision1", type=type(""), prompt="Old Revision: "), + Argument("revision2", type=type(""), prompt="New Revision: ")] + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.application.set_error("Buffer has no corresponding file") + return + + rev1 = vargs['revision1'] + if not self.rev_regex.match(rev1): + w.application.set_error("Could not parse revision1: %r" % rev) + return + + rev2 = vargs['revision2'] + if not self.rev_regex.match(rev2): + w.application.set_error("Could not parse revision2: %r" % rev) + return + + + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs diff -r %s -r %s -u %r" % (rev1, rev2, path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + if status == 0: w.application.set_error("No difference found") else: diff --git a/mode_search.py b/mode_search.py index 023ccd3..4bf3742 100644 --- a/mode_search.py +++ b/mode_search.py @@ -16,6 +16,7 @@ class Search(mode.Fundamental): (EndSearch(), ('RETURN', 'C-n', 'C-p', 'C-a', 'C-e', 'C-f', 'C-b')), (CancelSearch(), ('C-]',)), (DeleteLeft(), ('DELETE', 'BACKSPACE',)), + (DeleteLeftWord(), ('M-DELETE', 'M-BACKSPACE',)), ) # add the search actions @@ -81,6 +82,17 @@ class DeleteLeft(method.Method): else: _find_previous(old_window, window, move=False) +class DeleteLeftWord(method.Method): + def execute(self, window, **vargs): + window.kill_left_word() + old_cursor = window.buffer.method.old_cursor + old_window = window.buffer.method.old_window + old_window.goto(old_cursor) + if window.buffer.method.direction == 'next': + _find_next(old_window, window, move=False) + else: + _find_previous(old_window, window, move=False) + class InsertSearchString(method.Method): def __init__(self, s): self.name = 'insert-search-string-%s' % (s) diff --git a/mode_tt.py b/mode_tt.py index be62611..b035049 100644 --- a/mode_tt.py +++ b/mode_tt.py @@ -1,11 +1,12 @@ import sets, sys -import color, commands, default, lex, lex_xml, method, mode, point, regex, tab_xml +import color, commands, default, lex, lex_tt, method, mode, point, regex, tab_xml class Template(mode.Fundamental): def __init__(self, w): mode.Fundamental.__init__(self, w) - self.grammar = lex_xml.XMLGrammar() + #self.grammar = lex_xml.XMLGrammar() + self.grammar = lex_tt.TTGrammar() self.lexer = lex.Lexer(self.grammar) self.add_bindings('close-paren', (')',)) @@ -14,6 +15,7 @@ class Template(mode.Fundamental): self.default_color = color.build('default', 'default') self.colors = { + 'template': color.build('magenta', 'default'), 'markup': color.build('red', 'default'), 'namespace': color.build('magenta', 'default'), 'opentag': color.build('blue', 'default'), @@ -28,4 +30,4 @@ class Template(mode.Fundamental): self.tabber = tab_xml.XMLTabber(self) def name(self): - return "XML" + return "Template"